Skip to content

Commit bdbb78b

Browse files
authored
Merge pull request #6 from fillmln/cli-prep
cli-client: Initialization
2 parents 4abcb03 + 853ce7a commit bdbb78b

14 files changed

+342
-0
lines changed

cli-client/LICENSE

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2021 Elon Charge
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

cli-client/README.md

+53
Original file line numberDiff line numberDiff line change
@@ -1 +1,54 @@
11
# CLI
2+
3+
## Installation
4+
5+
The below commands have been tested on Ubuntu LTS 18.04.
6+
7+
1. Install requirements
8+
9+
```bash
10+
$ sudo apt install python3 python3-pip
11+
$ pip3 install virtualenv
12+
```
13+
14+
2. Create & activate virtual environment
15+
16+
```bash
17+
$ python3 -m venv .venv
18+
$ source .venv/bin/activate
19+
```
20+
21+
3. Install requirements
22+
23+
```bash
24+
$ pip3 install -r requirements.txt
25+
```
26+
27+
4. Generate distribution package
28+
29+
```bash
30+
$ python3 setup.py sdist bdist_wheel
31+
```
32+
33+
5. Install built distribution
34+
35+
```bash
36+
$ pip3 install dist/ev_group53-<version>-py3-none-any.whl
37+
```
38+
39+
## Usage
40+
41+
Produced executable `ev_group53` can be called upon in the following fashion:
42+
43+
```bash
44+
$ ev_group53 SCOPE --param1 value1 [--param2 value2 ...] --format fff --apikey kkk
45+
```
46+
47+
Mandatory arguments:
48+
49+
- `--format {csv,json}`: Desired output format
50+
- `--apikey <alphanumeric-string>`: API token
51+
52+
For a complete list of the available functionalities and their corresponding
53+
parameters, refer to the executable's help scripts (starting from
54+
`ev_group53 -h`)

cli-client/ev_group53/__init__.py

Whitespace-only changes.

cli-client/ev_group53/__main__.py

+204
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
import argparse
2+
import sys
3+
4+
from ev_group53.methods.session import login, logout
5+
from ev_group53.methods.user import usermod, users
6+
from ev_group53.methods.system import healthcheck, sessionupd, resetsessions
7+
from ev_group53.methods.point import sessions_per_point
8+
from ev_group53.methods.station import sessions_per_station
9+
from ev_group53.methods.ev import sessions_per_ev
10+
11+
METHOD_MAP = {'healthcheck': healthcheck,
12+
'resetsessions': resetsessions,
13+
'login': login,
14+
'logout': logout,
15+
'SessionsPerPoint': sessions_per_point,
16+
'SessionsPerStation': sessions_per_station,
17+
'SessionsPerEV': sessions_per_ev}
18+
19+
def function_caller(args):
20+
if args.command != "Admin":
21+
METHOD_MAP[args.command](args)
22+
else:
23+
if args.usermod:
24+
usermod(args)
25+
elif args.users:
26+
users(args)
27+
elif args.sessionupd:
28+
sessionupd(args)
29+
elif args.healthcheck:
30+
healthcheck(args)
31+
elif args.resetsessions:
32+
resetsessions(args)
33+
34+
def broken_admin_dependencies(args):
35+
usermod_violation = (args.usermod == True and
36+
(args.username == None or args.passw == None))
37+
sessionupd_violation = (args.sessionupd == True and
38+
args.source == None)
39+
40+
if usermod_violation or sessionupd_violation:
41+
return True
42+
return False
43+
44+
def main():
45+
parser = argparse.ArgumentParser()
46+
subparsers = parser.add_subparsers(help="Available functionalities",
47+
dest="command")
48+
49+
parent_parser = argparse.ArgumentParser(add_help=False)
50+
parent_parser.add_argument(
51+
"--format",
52+
help="select desired output format (supported: csv, json)",
53+
choices=["csv", "json"],
54+
required=True
55+
)
56+
parent_parser.add_argument(
57+
"--apikey",
58+
help="provide API token",
59+
required=True
60+
)
61+
62+
healthcheck_parser = subparsers.add_parser("healthcheck",
63+
help="perform system healthcheck",
64+
parents=[parent_parser])
65+
66+
resetsessions_parser = subparsers.add_parser("resetsessions",
67+
help="reset charge sessions",
68+
parents=[parent_parser])
69+
70+
login_parser = subparsers.add_parser("login",
71+
help="login using your credentials",
72+
parents=[parent_parser])
73+
login_parser.add_argument(
74+
"--username",
75+
help="enter your username",
76+
required=True
77+
)
78+
login_parser.add_argument(
79+
"--passw",
80+
help="enter your password",
81+
required=True
82+
)
83+
84+
logout_parser = subparsers.add_parser("logout",
85+
help="logout",
86+
parents=[parent_parser])
87+
88+
sessions_per_point_parser = subparsers.add_parser("SessionsPerPoint",
89+
help="show selected point's charge sessions for specific interval",
90+
parents=[parent_parser])
91+
sessions_per_point_parser.add_argument(
92+
"--point",
93+
help="specify point",
94+
required=True
95+
)
96+
sessions_per_point_parser.add_argument(
97+
"--datefrom",
98+
help="enter starting date of interval",
99+
required=True
100+
)
101+
sessions_per_point_parser.add_argument(
102+
"--dateto",
103+
help="enter ending date of interval",
104+
required=True
105+
)
106+
107+
sessions_per_station_parser = subparsers.add_parser("SessionsPerStation",
108+
help="show selected station's charge sessions for specific interval",
109+
parents=[parent_parser])
110+
sessions_per_station_parser.add_argument(
111+
"--station",
112+
help="specify station",
113+
required=True
114+
)
115+
sessions_per_station_parser.add_argument(
116+
"--datefrom",
117+
help="enter starting date of interval",
118+
required=True
119+
)
120+
sessions_per_station_parser.add_argument(
121+
"--dateto",
122+
help="enter ending date of interval",
123+
required=True
124+
)
125+
126+
sessions_per_ev_parser = subparsers.add_parser("SessionsPerEV",
127+
help="show EV's charge sessions for specific interval",
128+
parents=[parent_parser])
129+
sessions_per_ev_parser.add_argument(
130+
"--ev",
131+
help="specify ev",
132+
required=True
133+
)
134+
sessions_per_ev_parser.add_argument(
135+
"--datefrom",
136+
help="enter starting date of interval",
137+
required=True
138+
)
139+
sessions_per_ev_parser.add_argument(
140+
"--dateto",
141+
help="enter ending date of interval",
142+
required=True
143+
)
144+
145+
admin_parser = subparsers.add_parser("Admin",
146+
help="perform administrative operations",
147+
parents=[parent_parser])
148+
admin_group = admin_parser.add_mutually_exclusive_group(required=True)
149+
admin_group.add_argument(
150+
"--usermod",
151+
help="create user or update its password (--username,--passw required)",
152+
action="store_true"
153+
)
154+
admin_group.add_argument(
155+
"--users",
156+
help="show user's status",
157+
default=None
158+
)
159+
admin_group.add_argument(
160+
"--sessionupd",
161+
help="upload csv file containing charge sessions (--source required)",
162+
action="store_true"
163+
)
164+
admin_group.add_argument(
165+
"--healthcheck",
166+
help="perform system healthcheck",
167+
action="store_true"
168+
)
169+
admin_group.add_argument(
170+
"--resetsessions",
171+
help="reset charge sessions",
172+
action="store_true"
173+
)
174+
admin_parser.add_argument(
175+
"--username",
176+
help="enter username",
177+
default=None
178+
)
179+
admin_parser.add_argument(
180+
"--passw",
181+
help="enter password",
182+
default=None
183+
)
184+
admin_parser.add_argument(
185+
"--source",
186+
help="csv filename",
187+
default=None
188+
)
189+
190+
args = parser.parse_args()
191+
192+
print(args)
193+
194+
if len(sys.argv) == 1:
195+
parser.print_help(sys.stderr)
196+
sys.exit(1)
197+
elif args.command == "Admin" and broken_admin_dependencies(args):
198+
admin_parser.print_help(sys.stderr)
199+
sys.exit(1)
200+
201+
function_caller(args)
202+
203+
if __name__ == "__main__":
204+
main()

cli-client/ev_group53/methods/__init__.py

Whitespace-only changes.

cli-client/ev_group53/methods/ev.py

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
def sessions_per_ev(args):
2+
print("sessions_per_ev")
+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
def sessions_per_point(args):
2+
print("sessions_per_point")
+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
def login(args):
2+
print("login")
3+
4+
def logout(args):
5+
print("logout")
+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
def sessions_per_station(args):
2+
print("sessions_per_station")
+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
def healthcheck(args):
2+
print("healthcheck")
3+
4+
def sessionupd(args):
5+
print("sessionupd")
6+
7+
def resetsessions(args):
8+
print("resetsessions")

cli-client/ev_group53/methods/user.py

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
def usermod(args):
2+
print("usermod")
3+
4+
def users(args):
5+
print("users")

cli-client/requirements.txt

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
setuptools==51.1.2
2+
wheel==0.36.2

cli-client/setup.cfg

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[metadata]
2+
description-file = README.md

cli-client/setup.py

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import os
2+
3+
from setuptools import setup, find_packages
4+
5+
def get_long_desc():
6+
with open("README.md", "r") as readme:
7+
desc = readme.read()
8+
9+
return desc
10+
11+
def setup_package():
12+
setup(
13+
name='ev_group53',
14+
version='0.1.0',
15+
description='CLI Client for elon-charge API',
16+
long_description=get_long_desc(),
17+
url='https://github.com/fillmln/elon-charge',
18+
license='MIT',
19+
long_description_content_type='text/markdown',
20+
packages=find_packages(),
21+
install_requires=[],
22+
entry_points = {
23+
'console_scripts': [
24+
'ev_group53=ev_group53.__main__:main',
25+
],
26+
},
27+
classifiers=[
28+
'License :: OSI Approved :: MIT License',
29+
'Programming Language :: Python :: 3'
30+
],
31+
author = 'Elon Charge',
32+
author_email = '[email protected]'
33+
)
34+
35+
if __name__ == '__main__':
36+
setup_package()

0 commit comments

Comments
 (0)