argenta 0.4.0__py3-none-any.whl → 0.4.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- argenta/app/__init__.py +2 -0
- argenta/app/entity.py +81 -80
- argenta/app/exceptions.py +0 -5
- argenta/app/registered_routers/__init__.py +0 -0
- argenta/app/registered_routers/entity.py +21 -0
- argenta/command/__init__.py +3 -1
- argenta/command/exceptions.py +2 -2
- argenta/command/flag/__init__.py +4 -2
- argenta/command/flag/defaults.py +12 -12
- argenta/command/flag/models.py +140 -0
- argenta/command/models.py +105 -0
- argenta/router/__init__.py +3 -0
- argenta/router/command_handler/__init__.py +0 -0
- argenta/router/command_handler/entity.py +21 -0
- argenta/router/command_handlers/__init__.py +0 -0
- argenta/router/command_handlers/entity.py +21 -0
- argenta/router/defaults.py +5 -0
- argenta/router/entity.py +41 -36
- argenta/router/exceptions.py +1 -6
- {argenta-0.4.0.dist-info → argenta-0.4.5.dist-info}/METADATA +14 -15
- argenta-0.4.5.dist-info/RECORD +24 -0
- {argenta-0.4.0.dist-info → argenta-0.4.5.dist-info}/WHEEL +1 -1
- argenta/command/entity.py +0 -110
- argenta/command/flag/entity.py +0 -49
- argenta/command/flag/flags_group/__init__.py +0 -1
- argenta/command/flag/flags_group/entity.py +0 -35
- argenta-0.4.0.dist-info/RECORD +0 -19
- {argenta-0.4.0.dist-info → argenta-0.4.5.dist-info}/LICENSE +0 -0
argenta/app/__init__.py
CHANGED
argenta/app/entity.py
CHANGED
@@ -2,17 +2,18 @@ from typing import Callable
|
|
2
2
|
from inspect import getfullargspec
|
3
3
|
import re
|
4
4
|
|
5
|
-
from
|
6
|
-
from
|
7
|
-
from
|
5
|
+
from argenta.command.models import Command, InputCommand
|
6
|
+
from argenta.router import Router
|
7
|
+
from argenta.router.defaults import system_router
|
8
|
+
from argenta.command.exceptions import (UnprocessedInputFlagException,
|
8
9
|
RepeatedInputFlagsException,
|
9
10
|
EmptyInputCommandException)
|
10
|
-
from .exceptions import (InvalidRouterInstanceException,
|
11
|
+
from argenta.app.exceptions import (InvalidRouterInstanceException,
|
11
12
|
InvalidDescriptionMessagePatternException,
|
12
13
|
NoRegisteredRoutersException,
|
13
14
|
NoRegisteredHandlersException,
|
14
|
-
RepeatedCommandInDifferentRoutersException,
|
15
15
|
IncorrectNumberOfHandlerArgsException)
|
16
|
+
from argenta.app.registered_routers.entity import RegisteredRouters
|
16
17
|
|
17
18
|
|
18
19
|
class App:
|
@@ -29,6 +30,7 @@ class App:
|
|
29
30
|
line_separate: str = '',
|
30
31
|
command_group_description_separate: str = '',
|
31
32
|
repeat_command_groups: bool = True,
|
33
|
+
messages_on_startup: list[str] = None,
|
32
34
|
print_func: Callable[[str], None] = print) -> None:
|
33
35
|
self.prompt = prompt
|
34
36
|
self.print_func = print_func
|
@@ -43,23 +45,27 @@ class App:
|
|
43
45
|
self.command_group_description_separate = command_group_description_separate
|
44
46
|
self.ignore_command_register = ignore_command_register
|
45
47
|
self.repeat_command_groups = repeat_command_groups
|
48
|
+
self.messages_on_startup = messages_on_startup if messages_on_startup else []
|
46
49
|
|
47
|
-
self._routers: list[Router] = []
|
48
50
|
self._description_message_pattern: str = '[{command}] *=*=* {description}'
|
49
|
-
self.
|
51
|
+
self._registered_routers: RegisteredRouters = RegisteredRouters()
|
50
52
|
self._invalid_input_flags_handler: Callable[[str], None] = lambda raw_command: print_func(f'Incorrect flag syntax: "{raw_command}"')
|
51
53
|
self._repeated_input_flags_handler: Callable[[str], None] = lambda raw_command: print_func(f'Repeated input flags: "{raw_command}"')
|
52
|
-
self._empty_input_command_handler: Callable[[], None] = lambda: print_func(
|
53
|
-
self._unknown_command_handler: Callable[[
|
54
|
+
self._empty_input_command_handler: Callable[[], None] = lambda: print_func('Empty input command')
|
55
|
+
self._unknown_command_handler: Callable[[InputCommand], None] = lambda command: print_func(f"Unknown command: {command.get_trigger()}")
|
56
|
+
self._exit_command_handler: Callable[[], None] = lambda: print_func(self.farewell_message)
|
54
57
|
|
55
58
|
|
56
59
|
def start_polling(self) -> None:
|
60
|
+
self._setup_system_router()
|
57
61
|
self._validate_number_of_routers()
|
58
62
|
self._validate_included_routers()
|
59
|
-
self._validate_all_router_commands()
|
60
63
|
|
61
64
|
self.print_func(self.initial_message)
|
62
65
|
|
66
|
+
for message in self.messages_on_startup:
|
67
|
+
self.print_func(message)
|
68
|
+
|
63
69
|
if not self.repeat_command_groups:
|
64
70
|
self._print_command_group_description()
|
65
71
|
self.print_func(self.prompt)
|
@@ -72,35 +78,19 @@ class App:
|
|
72
78
|
raw_command: str = input()
|
73
79
|
|
74
80
|
try:
|
75
|
-
input_command:
|
76
|
-
except UnprocessedInputFlagException
|
81
|
+
input_command: InputCommand = InputCommand.parse(raw_command=raw_command)
|
82
|
+
except (UnprocessedInputFlagException,
|
83
|
+
RepeatedInputFlagsException,
|
84
|
+
EmptyInputCommandException) as error:
|
77
85
|
self.print_func(self.line_separate)
|
78
|
-
self.
|
86
|
+
self._error_handler(error, raw_command)
|
79
87
|
self.print_func(self.line_separate)
|
80
88
|
|
81
89
|
if not self.repeat_command_groups:
|
82
90
|
self.print_func(self.prompt)
|
83
91
|
continue
|
84
92
|
|
85
|
-
|
86
|
-
self.print_func(self.line_separate)
|
87
|
-
self._repeated_input_flags_handler(raw_command)
|
88
|
-
self.print_func(self.line_separate)
|
89
|
-
|
90
|
-
if not self.repeat_command_groups:
|
91
|
-
self.print_func(self.prompt)
|
92
|
-
continue
|
93
|
-
|
94
|
-
except EmptyInputCommandException:
|
95
|
-
self.print_func(self.line_separate)
|
96
|
-
self._empty_input_command_handler()
|
97
|
-
self.print_func(self.line_separate)
|
98
|
-
|
99
|
-
if not self.repeat_command_groups:
|
100
|
-
self.print_func(self.prompt)
|
101
|
-
continue
|
102
|
-
|
103
|
-
is_exit = self._is_exit_command(input_command.get_trigger())
|
93
|
+
is_exit = self._is_exit_command(input_command)
|
104
94
|
if is_exit:
|
105
95
|
return
|
106
96
|
|
@@ -114,8 +104,8 @@ class App:
|
|
114
104
|
self.print_func(self.prompt)
|
115
105
|
continue
|
116
106
|
|
117
|
-
for
|
118
|
-
|
107
|
+
for registered_router in self._registered_routers:
|
108
|
+
registered_router.input_command_handler(input_command)
|
119
109
|
|
120
110
|
self.print_func(self.line_separate)
|
121
111
|
self.print_func(self.command_group_description_separate)
|
@@ -173,89 +163,100 @@ class App:
|
|
173
163
|
self._empty_input_command_handler = handler
|
174
164
|
|
175
165
|
|
166
|
+
def set_exit_command_handler(self, handler: Callable[[], None]) -> None:
|
167
|
+
args = getfullargspec(handler).args
|
168
|
+
if len(args) != 0:
|
169
|
+
raise IncorrectNumberOfHandlerArgsException()
|
170
|
+
else:
|
171
|
+
self._exit_command_handler = handler
|
172
|
+
|
173
|
+
|
174
|
+
def add_message_on_startup(self, message: str) -> None:
|
175
|
+
self.messages_on_startup.append(message)
|
176
|
+
|
177
|
+
|
176
178
|
def include_router(self, router: Router) -> None:
|
177
179
|
if not isinstance(router, Router):
|
178
180
|
raise InvalidRouterInstanceException()
|
179
181
|
|
180
182
|
router.set_ignore_command_register(self.ignore_command_register)
|
181
|
-
self.
|
183
|
+
self._registered_routers.add_registered_router(router)
|
182
184
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
'commands': command_entities})
|
185
|
+
|
186
|
+
def include_routers(self, *routers: Router) -> None:
|
187
|
+
for router in routers:
|
188
|
+
self.include_router(router)
|
188
189
|
|
189
190
|
|
190
191
|
def _validate_number_of_routers(self) -> None:
|
191
|
-
if not self.
|
192
|
+
if not self._registered_routers:
|
192
193
|
raise NoRegisteredRoutersException()
|
193
194
|
|
194
195
|
|
195
196
|
def _validate_included_routers(self) -> None:
|
196
|
-
for router in self.
|
197
|
-
if not router.
|
197
|
+
for router in self._registered_routers:
|
198
|
+
if not router.get_command_handlers():
|
198
199
|
raise NoRegisteredHandlersException(router.get_name())
|
199
200
|
|
200
201
|
|
201
|
-
def
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
202
|
+
def _setup_system_router(self):
|
203
|
+
system_router.set_title(self.system_points_title)
|
204
|
+
@system_router.command(Command(self.exit_command, self.exit_command_description))
|
205
|
+
def exit_command():
|
206
|
+
self._exit_command_handler()
|
207
|
+
if system_router not in self._registered_routers.get_registered_routers():
|
208
|
+
self.include_router(system_router)
|
208
209
|
|
209
|
-
for router_entity in routers_without_current_router:
|
210
|
-
if len(set(current_router_all_commands).intersection(set(router_entity['entity'].get_all_commands()))) > 0:
|
211
|
-
raise RepeatedCommandInDifferentRoutersException()
|
212
|
-
if self.ignore_command_register:
|
213
|
-
if len(set([x.lower() for x in current_router_all_commands]).intersection(set([x.lower() for x in router_entity['entity'].get_all_commands()]))) > 0:
|
214
|
-
raise RepeatedCommandInDifferentRoutersException()
|
215
210
|
|
216
|
-
|
217
|
-
|
218
|
-
if command.lower() == self.exit_command.lower():
|
211
|
+
def _is_exit_command(self, command: InputCommand):
|
212
|
+
if command.get_trigger().lower() == self.exit_command.lower():
|
219
213
|
if self.ignore_exit_command_register:
|
220
|
-
|
214
|
+
system_router.input_command_handler(command)
|
221
215
|
return True
|
222
216
|
else:
|
223
|
-
if command == self.exit_command:
|
224
|
-
|
217
|
+
if command.get_trigger() == self.exit_command:
|
218
|
+
system_router.input_command_handler(command)
|
225
219
|
return True
|
226
220
|
return False
|
227
221
|
|
228
222
|
|
229
|
-
def _check_is_command_unknown(self, command:
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
if
|
223
|
+
def _check_is_command_unknown(self, command: InputCommand):
|
224
|
+
for router_entity in self._registered_routers:
|
225
|
+
for command_handler in router_entity.get_command_handlers():
|
226
|
+
handled_command_trigger = command_handler.get_handled_command().get_trigger()
|
227
|
+
if handled_command_trigger.lower() == command.get_trigger().lower():
|
234
228
|
if self.ignore_command_register:
|
235
229
|
return False
|
236
230
|
else:
|
237
|
-
if
|
231
|
+
if handled_command_trigger == command.get_trigger():
|
238
232
|
return False
|
239
233
|
self._unknown_command_handler(command)
|
240
234
|
return True
|
241
235
|
|
242
236
|
|
243
237
|
def _print_command_group_description(self):
|
244
|
-
for
|
245
|
-
self.print_func(
|
246
|
-
for
|
238
|
+
for registered_router in self._registered_routers:
|
239
|
+
self.print_func(registered_router.get_title())
|
240
|
+
for command_handler in registered_router.get_command_handlers():
|
247
241
|
self.print_func(self._description_message_pattern.format(
|
248
|
-
command=
|
249
|
-
description=
|
242
|
+
command=command_handler.get_handled_command().get_trigger(),
|
243
|
+
description=command_handler.get_handled_command().get_description()
|
250
244
|
)
|
251
245
|
)
|
252
246
|
self.print_func(self.command_group_description_separate)
|
253
247
|
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
248
|
+
|
249
|
+
def _error_handler(self,
|
250
|
+
error: UnprocessedInputFlagException |
|
251
|
+
RepeatedInputFlagsException |
|
252
|
+
EmptyInputCommandException,
|
253
|
+
raw_command: str) -> None:
|
254
|
+
match error:
|
255
|
+
case UnprocessedInputFlagException():
|
256
|
+
self._invalid_input_flags_handler(raw_command)
|
257
|
+
case RepeatedInputFlagsException():
|
258
|
+
self._repeated_input_flags_handler(raw_command)
|
259
|
+
case EmptyInputCommandException():
|
260
|
+
self._empty_input_command_handler()
|
261
|
+
|
261
262
|
|
argenta/app/exceptions.py
CHANGED
@@ -25,11 +25,6 @@ class NoRegisteredHandlersException(Exception):
|
|
25
25
|
return f"No Registered Handlers Found For '{self.router_name}'"
|
26
26
|
|
27
27
|
|
28
|
-
class RepeatedCommandInDifferentRoutersException(Exception):
|
29
|
-
def __str__(self):
|
30
|
-
return "Commands in different handlers cannot be repeated"
|
31
|
-
|
32
|
-
|
33
28
|
class IncorrectNumberOfHandlerArgsException(Exception):
|
34
29
|
def __str__(self):
|
35
30
|
return "Incorrect Input Flags Handler has incorrect number of arguments"
|
File without changes
|
@@ -0,0 +1,21 @@
|
|
1
|
+
from argenta.router import Router
|
2
|
+
|
3
|
+
|
4
|
+
class RegisteredRouters:
|
5
|
+
def __init__(self, registered_routers: list[Router] = None) -> None:
|
6
|
+
self._registered_routers = registered_routers if registered_routers else []
|
7
|
+
|
8
|
+
def get_registered_routers(self) -> list[Router]:
|
9
|
+
return self._registered_routers
|
10
|
+
|
11
|
+
def add_registered_router(self, router: Router):
|
12
|
+
self._registered_routers.append(router)
|
13
|
+
|
14
|
+
def add_registered_routers(self, *routers: Router):
|
15
|
+
self._registered_routers.extend(routers)
|
16
|
+
|
17
|
+
def __iter__(self):
|
18
|
+
return iter(self._registered_routers)
|
19
|
+
|
20
|
+
def __next__(self):
|
21
|
+
return next(iter(self._registered_routers))
|
argenta/command/__init__.py
CHANGED
argenta/command/exceptions.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
from argenta.command.flag.
|
1
|
+
from argenta.command.flag.models import InputFlag, Flag
|
2
2
|
|
3
3
|
|
4
4
|
class UnprocessedInputFlagException(Exception):
|
@@ -7,7 +7,7 @@ class UnprocessedInputFlagException(Exception):
|
|
7
7
|
|
8
8
|
|
9
9
|
class RepeatedInputFlagsException(Exception):
|
10
|
-
def __init__(self, flag: Flag):
|
10
|
+
def __init__(self, flag: Flag | InputFlag):
|
11
11
|
self.flag = flag
|
12
12
|
def __str__(self):
|
13
13
|
return ("Repeated Input Flags\n"
|
argenta/command/flag/__init__.py
CHANGED
argenta/command/flag/defaults.py
CHANGED
@@ -1,21 +1,21 @@
|
|
1
1
|
from dataclasses import dataclass
|
2
|
-
from argenta.command.flag import Flag
|
2
|
+
from argenta.command.flag.models import Flag
|
3
3
|
import re
|
4
4
|
|
5
5
|
|
6
6
|
@dataclass
|
7
|
-
class
|
8
|
-
|
9
|
-
|
7
|
+
class PredeterminedFlags:
|
8
|
+
HELP = Flag(name='help', possible_values=False)
|
9
|
+
SHORT_HELP = Flag(name='h', prefix='-', possible_values=False)
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
INFO = Flag(name='info', possible_values=False)
|
12
|
+
SHORT_INFO = Flag(name='i', prefix='-', possible_values=False)
|
13
13
|
|
14
|
-
|
15
|
-
|
14
|
+
ALL = Flag(name='all', possible_values=False)
|
15
|
+
SHORT_ALL = Flag(name='a', prefix='-', possible_values=False)
|
16
16
|
|
17
|
-
|
18
|
-
|
17
|
+
HOST = Flag(name='host', possible_values=re.compile(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$'))
|
18
|
+
SHORT_HOST = Flag(name='h', prefix='-', possible_values=re.compile(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$'))
|
19
19
|
|
20
|
-
|
21
|
-
|
20
|
+
PORT = Flag(name='port', possible_values=re.compile(r'^\d{1,5}$'))
|
21
|
+
SHORT_PORT = Flag(name='p', prefix='-', possible_values=re.compile(r'^\d{1,5}$'))
|
@@ -0,0 +1,140 @@
|
|
1
|
+
from typing import Literal, Pattern
|
2
|
+
from abc import ABC, abstractmethod
|
3
|
+
|
4
|
+
|
5
|
+
class BaseFlag:
|
6
|
+
def __init__(self, name: str,
|
7
|
+
prefix: Literal['-', '--', '---'] = '--'):
|
8
|
+
self._name = name
|
9
|
+
self._prefix = prefix
|
10
|
+
|
11
|
+
def get_string_entity(self):
|
12
|
+
string_entity: str = self._prefix + self._name
|
13
|
+
return string_entity
|
14
|
+
|
15
|
+
def get_name(self):
|
16
|
+
return self._name
|
17
|
+
|
18
|
+
def get_prefix(self):
|
19
|
+
return self._prefix
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
class InputFlag(BaseFlag):
|
24
|
+
def __init__(self, name: str,
|
25
|
+
prefix: Literal['-', '--', '---'] = '--',
|
26
|
+
value: str = None):
|
27
|
+
super().__init__(name, prefix)
|
28
|
+
self._flag_value = value
|
29
|
+
|
30
|
+
def get_value(self):
|
31
|
+
return self._flag_value
|
32
|
+
|
33
|
+
def set_value(self, value):
|
34
|
+
self._flag_value = value
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
class Flag(BaseFlag):
|
39
|
+
def __init__(self, name: str,
|
40
|
+
prefix: Literal['-', '--', '---'] = '--',
|
41
|
+
possible_values: list[str] | Pattern[str] | False = True):
|
42
|
+
super().__init__(name, prefix)
|
43
|
+
self.possible_values = possible_values
|
44
|
+
|
45
|
+
def validate_input_flag_value(self, input_flag_value: str | None):
|
46
|
+
if self.possible_values is False:
|
47
|
+
if input_flag_value is None:
|
48
|
+
return True
|
49
|
+
else:
|
50
|
+
return False
|
51
|
+
elif isinstance(self.possible_values, Pattern):
|
52
|
+
if isinstance(input_flag_value, str):
|
53
|
+
is_valid = bool(self.possible_values.match(input_flag_value))
|
54
|
+
if bool(is_valid):
|
55
|
+
return True
|
56
|
+
else:
|
57
|
+
return False
|
58
|
+
else:
|
59
|
+
return False
|
60
|
+
|
61
|
+
elif isinstance(self.possible_values, list):
|
62
|
+
if input_flag_value in self.possible_values:
|
63
|
+
return True
|
64
|
+
else:
|
65
|
+
return False
|
66
|
+
else:
|
67
|
+
return True
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
class BaseFlags(ABC):
|
72
|
+
__slots__ = ('_flags',)
|
73
|
+
|
74
|
+
@abstractmethod
|
75
|
+
def get_flags(self):
|
76
|
+
pass
|
77
|
+
|
78
|
+
@abstractmethod
|
79
|
+
def add_flag(self, flag: Flag | InputFlag):
|
80
|
+
pass
|
81
|
+
|
82
|
+
@abstractmethod
|
83
|
+
def add_flags(self, flags: list[Flag] | list[InputFlag]):
|
84
|
+
pass
|
85
|
+
|
86
|
+
@abstractmethod
|
87
|
+
def get_flag(self, name: str):
|
88
|
+
pass
|
89
|
+
|
90
|
+
def __iter__(self):
|
91
|
+
return iter(self._flags)
|
92
|
+
|
93
|
+
def __next__(self):
|
94
|
+
return next(iter(self))
|
95
|
+
|
96
|
+
def __getitem__(self, item):
|
97
|
+
return self._flags[item]
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
class Flags(BaseFlags, ABC):
|
102
|
+
def __init__(self, *flags: Flag):
|
103
|
+
self._flags = flags if flags else []
|
104
|
+
|
105
|
+
def get_flags(self) -> list[Flag]:
|
106
|
+
return self._flags
|
107
|
+
|
108
|
+
def add_flag(self, flag: Flag):
|
109
|
+
self._flags.append(flag)
|
110
|
+
|
111
|
+
def add_flags(self, flags: list[Flag]):
|
112
|
+
self._flags.extend(flags)
|
113
|
+
|
114
|
+
def get_flag(self, name: str) -> Flag | None:
|
115
|
+
if name in [flag.get_name() for flag in self._flags]:
|
116
|
+
return list(filter(lambda flag: flag.get_name() == name, self._flags))[0]
|
117
|
+
else:
|
118
|
+
return None
|
119
|
+
|
120
|
+
|
121
|
+
|
122
|
+
class InputFlags(BaseFlags, ABC):
|
123
|
+
def __init__(self, *flags: InputFlag):
|
124
|
+
self._flags = flags if flags else []
|
125
|
+
|
126
|
+
def get_flags(self) -> list[InputFlag]:
|
127
|
+
return self._flags
|
128
|
+
|
129
|
+
def add_flag(self, flag: InputFlag):
|
130
|
+
self._flags.append(flag)
|
131
|
+
|
132
|
+
def add_flags(self, flags: list[InputFlag]):
|
133
|
+
self._flags.extend(flags)
|
134
|
+
|
135
|
+
def get_flag(self, name: str) -> InputFlag | None:
|
136
|
+
if name in [flag.get_name() for flag in self._flags]:
|
137
|
+
return list(filter(lambda flag: flag.get_name() == name, self._flags))[0]
|
138
|
+
else:
|
139
|
+
return None
|
140
|
+
|
@@ -0,0 +1,105 @@
|
|
1
|
+
from argenta.command.flag.models import Flag, InputFlag, Flags, InputFlags
|
2
|
+
from argenta.command.exceptions import (UnprocessedInputFlagException,
|
3
|
+
RepeatedInputFlagsException,
|
4
|
+
EmptyInputCommandException)
|
5
|
+
from typing import Generic, TypeVar, cast, Literal
|
6
|
+
|
7
|
+
|
8
|
+
InputCommandType = TypeVar('InputCommandType')
|
9
|
+
|
10
|
+
|
11
|
+
class BaseCommand:
|
12
|
+
def __init__(self, trigger: str):
|
13
|
+
self._trigger = trigger
|
14
|
+
|
15
|
+
def get_trigger(self) -> str:
|
16
|
+
return self._trigger
|
17
|
+
|
18
|
+
|
19
|
+
class Command(BaseCommand):
|
20
|
+
def __init__(self, trigger: str,
|
21
|
+
description: str = None,
|
22
|
+
flags: Flag | Flags = None):
|
23
|
+
super().__init__(trigger)
|
24
|
+
self._registered_flags: Flags = flags if isinstance(flags, Flags) else Flags(flags) if isinstance(flags, Flag) else Flags()
|
25
|
+
self._description = f'description for "{self._trigger}" command' if not description else description
|
26
|
+
|
27
|
+
def get_registered_flags(self) -> Flags:
|
28
|
+
return self._registered_flags
|
29
|
+
|
30
|
+
def validate_input_flag(self, flag: InputFlag):
|
31
|
+
registered_flags: Flags | None = self.get_registered_flags()
|
32
|
+
if registered_flags:
|
33
|
+
if isinstance(registered_flags, Flag):
|
34
|
+
if registered_flags.get_string_entity() == flag.get_string_entity():
|
35
|
+
is_valid = registered_flags.validate_input_flag_value(flag.get_value())
|
36
|
+
if is_valid:
|
37
|
+
return True
|
38
|
+
else:
|
39
|
+
for registered_flag in registered_flags:
|
40
|
+
if registered_flag.get_string_entity() == flag.get_string_entity():
|
41
|
+
is_valid = registered_flag.validate_input_flag_value(flag.get_value())
|
42
|
+
if is_valid:
|
43
|
+
return True
|
44
|
+
return False
|
45
|
+
|
46
|
+
def get_description(self) -> str:
|
47
|
+
return self._description
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
class InputCommand(BaseCommand, Generic[InputCommandType]):
|
52
|
+
def __init__(self, trigger: str,
|
53
|
+
input_flags: InputFlag | InputFlags = None):
|
54
|
+
super().__init__(trigger)
|
55
|
+
self._input_flags: InputFlags = input_flags if isinstance(input_flags, InputFlags) else InputFlags(input_flags) if isinstance(input_flags, InputFlag) else InputFlags()
|
56
|
+
|
57
|
+
def _set_input_flags(self, input_flags: InputFlags):
|
58
|
+
self._input_flags = input_flags
|
59
|
+
|
60
|
+
def get_input_flags(self) -> InputFlags:
|
61
|
+
return self._input_flags
|
62
|
+
|
63
|
+
@staticmethod
|
64
|
+
def parse(raw_command: str) -> InputCommandType:
|
65
|
+
if not raw_command:
|
66
|
+
raise EmptyInputCommandException()
|
67
|
+
|
68
|
+
list_of_tokens = raw_command.split()
|
69
|
+
command = list_of_tokens.pop(0)
|
70
|
+
|
71
|
+
input_flags: InputFlags = InputFlags()
|
72
|
+
current_flag_name, current_flag_value = None, None
|
73
|
+
|
74
|
+
for k, _ in enumerate(list_of_tokens):
|
75
|
+
if _.startswith('-'):
|
76
|
+
if current_flag_name or len(_) < 2 or len(_[:_.rfind('-')]) > 3:
|
77
|
+
raise UnprocessedInputFlagException()
|
78
|
+
current_flag_name = _
|
79
|
+
else:
|
80
|
+
if not current_flag_name:
|
81
|
+
raise UnprocessedInputFlagException()
|
82
|
+
current_flag_value = _
|
83
|
+
|
84
|
+
if current_flag_name:
|
85
|
+
if not len(list_of_tokens) == k+1:
|
86
|
+
if not list_of_tokens[k+1].startswith('-'): continue
|
87
|
+
|
88
|
+
input_flag = InputFlag(name=current_flag_name[current_flag_name.rfind('-')+1:],
|
89
|
+
prefix=cast(Literal['-', '--', '---'],
|
90
|
+
current_flag_name[:current_flag_name.rfind('-')+1]),
|
91
|
+
value=current_flag_value)
|
92
|
+
|
93
|
+
all_flags = [flag.get_string_entity() for flag in input_flags.get_flags()]
|
94
|
+
if input_flag.get_string_entity() not in all_flags:
|
95
|
+
input_flags.add_flag(input_flag)
|
96
|
+
else:
|
97
|
+
raise RepeatedInputFlagsException(input_flag)
|
98
|
+
|
99
|
+
current_flag_name, current_flag_value = None, None
|
100
|
+
|
101
|
+
if any([current_flag_name, current_flag_value]):
|
102
|
+
raise UnprocessedInputFlagException()
|
103
|
+
else:
|
104
|
+
return InputCommand(trigger=command, input_flags=input_flags)
|
105
|
+
|
argenta/router/__init__.py
CHANGED
File without changes
|
@@ -0,0 +1,21 @@
|
|
1
|
+
from typing import Callable
|
2
|
+
from argenta.command import Command
|
3
|
+
from argenta.command.flag.models import InputFlags
|
4
|
+
|
5
|
+
|
6
|
+
class CommandHandler:
|
7
|
+
def __init__(self, handler: Callable[[], None] | Callable[[InputFlags], None], handled_command: Command):
|
8
|
+
self.handler = handler
|
9
|
+
self.handled_command = handled_command
|
10
|
+
|
11
|
+
def handling(self, input_flags: InputFlags):
|
12
|
+
if input_flags.get_flags():
|
13
|
+
self.handler(input_flags)
|
14
|
+
else:
|
15
|
+
self.handler()
|
16
|
+
|
17
|
+
def get_handler(self):
|
18
|
+
return self.handler
|
19
|
+
|
20
|
+
def get_handled_command(self):
|
21
|
+
return self.handled_command
|
File without changes
|
@@ -0,0 +1,21 @@
|
|
1
|
+
from argenta.router.command_handler.entity import CommandHandler
|
2
|
+
|
3
|
+
|
4
|
+
class CommandHandlers:
|
5
|
+
def __init__(self, command_handlers: list[CommandHandler] = None):
|
6
|
+
self.command_handlers = command_handlers if command_handlers else []
|
7
|
+
|
8
|
+
def get_command_handlers(self) -> list[CommandHandler]:
|
9
|
+
return self.command_handlers
|
10
|
+
|
11
|
+
def add_command_handler(self, command_handler: CommandHandler):
|
12
|
+
self.command_handlers.append(command_handler)
|
13
|
+
|
14
|
+
def add_command_handlers(self, *command_handlers: CommandHandler):
|
15
|
+
self.command_handlers.extend(command_handlers)
|
16
|
+
|
17
|
+
def __iter__(self):
|
18
|
+
return iter(self.command_handlers)
|
19
|
+
|
20
|
+
def __next__(self):
|
21
|
+
return next(iter(self.command_handlers))
|
argenta/router/entity.py
CHANGED
@@ -1,26 +1,26 @@
|
|
1
1
|
from typing import Callable, Any
|
2
2
|
from inspect import getfullargspec
|
3
3
|
|
4
|
-
from
|
5
|
-
from argenta.command.
|
6
|
-
from argenta.
|
7
|
-
from
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
4
|
+
from argenta.command import Command
|
5
|
+
from argenta.command.models import InputCommand
|
6
|
+
from argenta.router.command_handlers.entity import CommandHandlers
|
7
|
+
from argenta.router.command_handler.entity import CommandHandler
|
8
|
+
from argenta.command.flag.models import Flag, Flags, InputFlags
|
9
|
+
from argenta.router.exceptions import (RepeatedFlagNameException,
|
10
|
+
TooManyTransferredArgsException,
|
11
|
+
RequiredArgumentNotPassedException,
|
12
|
+
IncorrectNumberOfHandlerArgsException,
|
13
|
+
TriggerCannotContainSpacesException)
|
13
14
|
|
14
15
|
|
15
16
|
class Router:
|
16
17
|
def __init__(self,
|
17
18
|
title: str = 'Commands group title:',
|
18
19
|
name: str = 'Default'):
|
19
|
-
|
20
20
|
self._title = title
|
21
21
|
self._name = name
|
22
22
|
|
23
|
-
self.
|
23
|
+
self._command_handlers: CommandHandlers = CommandHandlers()
|
24
24
|
self._ignore_command_register: bool = False
|
25
25
|
|
26
26
|
self._not_valid_flag_handler: Callable[[Flag], None] = lambda flag: print(f"Undefined or incorrect input flag: {flag.get_string_entity()}{(' '+flag.get_value()) if flag.get_value() else ''}")
|
@@ -31,14 +31,15 @@ class Router:
|
|
31
31
|
|
32
32
|
def command_decorator(func):
|
33
33
|
Router._validate_func_args(command, func)
|
34
|
-
self.
|
35
|
-
|
34
|
+
self._command_handlers.add_command_handler(CommandHandler(func, command))
|
35
|
+
|
36
36
|
def wrapper(*args, **kwargs):
|
37
37
|
return func(*args, **kwargs)
|
38
38
|
return wrapper
|
39
39
|
|
40
40
|
return command_decorator
|
41
41
|
|
42
|
+
|
42
43
|
def set_invalid_input_flag_handler(self, func):
|
43
44
|
processed_args = getfullargspec(func).args
|
44
45
|
if len(processed_args) != 1:
|
@@ -47,40 +48,40 @@ class Router:
|
|
47
48
|
self._not_valid_flag_handler = func
|
48
49
|
|
49
50
|
|
50
|
-
def input_command_handler(self, input_command:
|
51
|
+
def input_command_handler(self, input_command: InputCommand):
|
51
52
|
input_command_name: str = input_command.get_trigger()
|
52
|
-
input_command_flags:
|
53
|
-
for
|
54
|
-
|
55
|
-
|
53
|
+
input_command_flags: InputFlags = input_command.get_input_flags()
|
54
|
+
for command_handler in self._command_handlers:
|
55
|
+
handle_command = command_handler.get_handled_command()
|
56
|
+
if input_command_name.lower() == handle_command.get_trigger().lower():
|
57
|
+
if handle_command.get_registered_flags():
|
56
58
|
if input_command_flags:
|
57
59
|
for flag in input_command_flags:
|
58
|
-
is_valid =
|
60
|
+
is_valid = handle_command.validate_input_flag(flag)
|
59
61
|
if not is_valid:
|
60
62
|
self._not_valid_flag_handler(flag)
|
61
63
|
return
|
62
|
-
|
64
|
+
command_handler.handling(input_command_flags)
|
65
|
+
return
|
63
66
|
else:
|
64
|
-
|
67
|
+
command_handler.handling({})
|
68
|
+
return
|
65
69
|
else:
|
66
70
|
if input_command_flags:
|
67
71
|
self._not_valid_flag_handler(input_command_flags[0])
|
68
72
|
return
|
69
73
|
else:
|
70
|
-
|
74
|
+
command_handler.handling()
|
75
|
+
return
|
71
76
|
|
72
77
|
|
73
|
-
|
78
|
+
@staticmethod
|
79
|
+
def _validate_command(command: Command):
|
74
80
|
command_name: str = command.get_trigger()
|
75
81
|
if command_name.find(' ') != -1:
|
76
82
|
raise TriggerCannotContainSpacesException()
|
77
|
-
if command_name in self.get_all_commands():
|
78
|
-
raise RepeatedCommandException()
|
79
|
-
if self._ignore_command_register:
|
80
|
-
if command_name.lower() in [x.lower() for x in self.get_all_commands()]:
|
81
|
-
raise RepeatedCommandException()
|
82
83
|
|
83
|
-
flags:
|
84
|
+
flags: Flags = command.get_registered_flags()
|
84
85
|
if flags:
|
85
86
|
flags_name: list = [x.get_string_entity().lower() for x in flags]
|
86
87
|
if len(set(flags_name)) < len(flags_name):
|
@@ -91,12 +92,12 @@ class Router:
|
|
91
92
|
def _validate_func_args(command: Command, func: Callable):
|
92
93
|
registered_args = command.get_registered_flags()
|
93
94
|
transferred_args = getfullargspec(func).args
|
94
|
-
if registered_args and transferred_args:
|
95
|
+
if registered_args.get_flags() and transferred_args:
|
95
96
|
if len(transferred_args) != 1:
|
96
97
|
raise TooManyTransferredArgsException()
|
97
|
-
elif registered_args and not transferred_args:
|
98
|
+
elif registered_args.get_flags() and not transferred_args:
|
98
99
|
raise RequiredArgumentNotPassedException()
|
99
|
-
elif not registered_args and transferred_args:
|
100
|
+
elif not registered_args.get_flags() and transferred_args:
|
100
101
|
raise TooManyTransferredArgsException()
|
101
102
|
|
102
103
|
|
@@ -104,8 +105,8 @@ class Router:
|
|
104
105
|
self._ignore_command_register = ignore_command_register
|
105
106
|
|
106
107
|
|
107
|
-
def
|
108
|
-
return self.
|
108
|
+
def get_command_handlers(self) -> CommandHandlers:
|
109
|
+
return self._command_handlers
|
109
110
|
|
110
111
|
|
111
112
|
def get_name(self) -> str:
|
@@ -116,9 +117,13 @@ class Router:
|
|
116
117
|
return self._title
|
117
118
|
|
118
119
|
|
120
|
+
def set_title(self, title: str):
|
121
|
+
self._title = title
|
122
|
+
|
123
|
+
|
119
124
|
def get_all_commands(self) -> list[str]:
|
120
125
|
all_commands: list[str] = []
|
121
|
-
for
|
122
|
-
all_commands.append(
|
126
|
+
for command_handler in self._command_handlers:
|
127
|
+
all_commands.append(command_handler.get_handled_command().get_trigger())
|
123
128
|
|
124
129
|
return all_commands
|
argenta/router/exceptions.py
CHANGED
@@ -1,11 +1,6 @@
|
|
1
|
-
class RepeatedCommandException(Exception):
|
2
|
-
def __str__(self):
|
3
|
-
return "Commands in handler cannot be repeated"
|
4
|
-
|
5
|
-
|
6
1
|
class RepeatedFlagNameException(Exception):
|
7
2
|
def __str__(self):
|
8
|
-
return "Repeated
|
3
|
+
return "Repeated registered_flag name in register command"
|
9
4
|
|
10
5
|
|
11
6
|
class TooManyTransferredArgsException(Exception):
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: argenta
|
3
|
-
Version: 0.4.
|
3
|
+
Version: 0.4.5
|
4
4
|
Summary: python library for creating custom shells
|
5
5
|
License: MIT
|
6
6
|
Author: kolo
|
@@ -71,14 +71,14 @@ if __name__ == '__main__':
|
|
71
71
|
import re
|
72
72
|
from argenta.router import Router
|
73
73
|
from argenta.command import Command
|
74
|
-
from argenta.command.flag import
|
74
|
+
from argenta.command.flag import Flags, Flag, InputFlags
|
75
75
|
|
76
76
|
router = Router()
|
77
77
|
|
78
|
-
registered_flags =
|
79
|
-
Flag(
|
80
|
-
|
81
|
-
|
78
|
+
registered_flags = Flags(
|
79
|
+
Flag(name='host',
|
80
|
+
prefix='--',
|
81
|
+
possible_values=re.compile(r'^192.168.\d{1,3}.\d{1,3}$')),
|
82
82
|
Flag('port', '--', re.compile(r'^[0-9]{1,4}$')))
|
83
83
|
|
84
84
|
|
@@ -90,10 +90,10 @@ def handler():
|
|
90
90
|
@router.command(Command(trigger="ssh",
|
91
91
|
description='connect via ssh',
|
92
92
|
flags=registered_flags))
|
93
|
-
def handler_with_flags(flags:
|
93
|
+
def handler_with_flags(flags: InputFlags):
|
94
94
|
for flag in flags:
|
95
|
-
print(f'Flag name: {flag
|
96
|
-
f'Flag value: {flag
|
95
|
+
print(f'Flag name: {flag.get_name()}\n'
|
96
|
+
f'Flag value: {flag.get_value()}')
|
97
97
|
```
|
98
98
|
|
99
99
|
---
|
@@ -314,7 +314,6 @@ Router(title: str = 'Commands group title:',
|
|
314
314
|
---
|
315
315
|
|
316
316
|
### Исключения
|
317
|
-
- `RepeatedCommandException` - Одна и та же команда зарегистрирована в одном роутере
|
318
317
|
- `RepeatedFlagNameException` - Повторяющиеся зарегистрированные флаги в команде
|
319
318
|
- `TooManyTransferredArgsException` - Слишком много зарегистрированных аргументов у обработчика команды
|
320
319
|
- `RequiredArgumentNotPassedException` - Не зарегистрирован обязательный аргумент у обработчика команды(аргумент, через который будут переданы флаги введённой команды)
|
@@ -330,14 +329,14 @@ Router(title: str = 'Commands group title:',
|
|
330
329
|
```python
|
331
330
|
Command(trigger: str,
|
332
331
|
description: str = None,
|
333
|
-
flags: Flag |
|
332
|
+
flags: Flag | Flags = None)
|
334
333
|
```
|
335
334
|
|
336
335
|
**Аргументы:**
|
337
336
|
- **name : mean**
|
338
337
|
- `trigger` (`str`): Строковый триггер
|
339
338
|
- `description` (`str`): Описание команды, которое будет выведено в консоль при запуске оболочки
|
340
|
-
- `flags` (`Flag |
|
339
|
+
- `flags` (`Flag | Flags`): Флаги, которые будут обработаны при их наличии во вводе юзера
|
341
340
|
|
342
341
|
---
|
343
342
|
|
@@ -353,7 +352,7 @@ Command(trigger: str,
|
|
353
352
|
|
354
353
|
---
|
355
354
|
|
356
|
-
#### **.get_registered_flags() -> `
|
355
|
+
#### **.get_registered_flags() -> `Flags | None`**
|
357
356
|
|
358
357
|
*method mean* **::** возвращает зарегистрированные флаги экземпляра
|
359
358
|
|
@@ -417,14 +416,14 @@ Flag(flag_name: str,
|
|
417
416
|
|
418
417
|
---
|
419
418
|
|
420
|
-
## *class* :: `
|
419
|
+
## *class* :: `Flags`
|
421
420
|
Класс, объединяющий список флагов в один объект, используется в качестве
|
422
421
|
передаваемого аргумента `flags` экземпляру класса `Command`, при регистрации
|
423
422
|
хэндлера
|
424
423
|
|
425
424
|
### Конструктор
|
426
425
|
```python
|
427
|
-
|
426
|
+
Flags(*flagы: Flag)
|
428
427
|
```
|
429
428
|
|
430
429
|
---
|
@@ -0,0 +1,24 @@
|
|
1
|
+
argenta/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
+
argenta/app/__init__.py,sha256=5BZcyJqfexO8t43j1LkWUB5BtGtZXpkR7170YvfeM30,46
|
3
|
+
argenta/app/entity.py,sha256=3oo3eCiUockvTQVjGnkt17yEno8aRshohGTGEox87P4,11195
|
4
|
+
argenta/app/exceptions.py,sha256=hItqsh76Fq6FfeanHqX8dvF00ERHXbQYjap5UODwg3o,1095
|
5
|
+
argenta/app/registered_routers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
6
|
+
argenta/app/registered_routers/entity.py,sha256=OQZyrF4eoCoDHzRJ22zZxhNEx-bOUDu7NZIFDfO-fuY,688
|
7
|
+
argenta/command/__init__.py,sha256=Yx5Zl5Diwhjs8SZrsYEBNJscTMxWkLP0nqPvAJZtu30,52
|
8
|
+
argenta/command/exceptions.py,sha256=J3kNY6CFoOxJXsZ23Bfl6f5uVUSiKZfwiGPBmlOwN5M,578
|
9
|
+
argenta/command/flag/__init__.py,sha256=Ew-ZRFVY7sC_PMvavN0AEcsvdYGHkLAPOYMrReY3NC0,116
|
10
|
+
argenta/command/flag/defaults.py,sha256=ktKmDT0rSSBoFUghTlEQ6OletoFxCiD37hRzO73mUUc,875
|
11
|
+
argenta/command/flag/models.py,sha256=X1MFpAtnUX6mi1huycAtwAPXPeh9YFO-lH91TNyD3G4,3755
|
12
|
+
argenta/command/models.py,sha256=ZVgJjS2uZbO2YaRYaXeT8a-IfO1IOiylWJXOMsx6fJw,4409
|
13
|
+
argenta/router/__init__.py,sha256=uP58EfcmtK2NuMBQaspD_Gmq3LqgDXus4rfB6hp9Uig,52
|
14
|
+
argenta/router/command_handler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
15
|
+
argenta/router/command_handler/entity.py,sha256=-qV_Ysw6WcklW0WN5nAD8U3QLbqBNGT-WeMFHuhfrf4,639
|
16
|
+
argenta/router/command_handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
17
|
+
argenta/router/command_handlers/entity.py,sha256=KgFKjAMUr_mOcn9xahTxMUKB6lIxXgqCuAsuc4TgP6E,747
|
18
|
+
argenta/router/defaults.py,sha256=huftOg1HMjrT_R2SHHOL4eJ5uZHspNEYBSg-mCq9xhU,126
|
19
|
+
argenta/router/entity.py,sha256=-88RWF2IEKBUwM7zfUiN0rrDjVpU94m4y5nuspld5ao,5073
|
20
|
+
argenta/router/exceptions.py,sha256=tdeaR8zDvnytgRYo_wQWKHt3if2brapgauIhhMIsTsA,678
|
21
|
+
argenta-0.4.5.dist-info/LICENSE,sha256=zmqoGh2n5rReBv4s8wPxF_gZEZDgauJYSPMuPczgOiU,1082
|
22
|
+
argenta-0.4.5.dist-info/METADATA,sha256=qI8PsEalTHJ7WYK4mB1Zer4n8rxafBMEO9rbp2qkcsg,18031
|
23
|
+
argenta-0.4.5.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
|
24
|
+
argenta-0.4.5.dist-info/RECORD,,
|
argenta/command/entity.py
DELETED
@@ -1,110 +0,0 @@
|
|
1
|
-
from argenta.command.flag.entity import Flag
|
2
|
-
from argenta.command.flag.flags_group import FlagsGroup
|
3
|
-
from .exceptions import (UnprocessedInputFlagException,
|
4
|
-
RepeatedInputFlagsException,
|
5
|
-
EmptyInputCommandException)
|
6
|
-
|
7
|
-
from typing import Generic, TypeVar, cast, Literal
|
8
|
-
|
9
|
-
|
10
|
-
CommandType = TypeVar('CommandType')
|
11
|
-
|
12
|
-
|
13
|
-
class Command(Generic[CommandType]):
|
14
|
-
def __init__(self, trigger: str,
|
15
|
-
description: str = None,
|
16
|
-
flags: Flag | FlagsGroup = None):
|
17
|
-
self._trigger = trigger
|
18
|
-
self._description = f'description for "{self._trigger}" command' if not description else description
|
19
|
-
self._registered_flags: FlagsGroup | None = flags if isinstance(flags, FlagsGroup) else FlagsGroup(flags) if isinstance(flags, Flag) else flags
|
20
|
-
self._input_flags: FlagsGroup | None = None
|
21
|
-
|
22
|
-
|
23
|
-
def get_trigger(self) -> str:
|
24
|
-
return self._trigger
|
25
|
-
|
26
|
-
|
27
|
-
def get_description(self) -> str:
|
28
|
-
return self._description
|
29
|
-
|
30
|
-
|
31
|
-
def get_registered_flags(self) -> FlagsGroup | None:
|
32
|
-
return self._registered_flags
|
33
|
-
|
34
|
-
|
35
|
-
def validate_input_flag(self, flag: Flag):
|
36
|
-
registered_flags: FlagsGroup | None = self.get_registered_flags()
|
37
|
-
if registered_flags:
|
38
|
-
if isinstance(registered_flags, Flag):
|
39
|
-
if registered_flags.get_string_entity() == flag.get_string_entity():
|
40
|
-
is_valid = registered_flags.validate_input_flag_value(flag.get_value())
|
41
|
-
if is_valid:
|
42
|
-
return True
|
43
|
-
else:
|
44
|
-
for registered_flag in registered_flags:
|
45
|
-
if registered_flag.get_string_entity() == flag.get_string_entity():
|
46
|
-
is_valid = registered_flag.validate_input_flag_value(flag.get_value())
|
47
|
-
if is_valid:
|
48
|
-
return True
|
49
|
-
return False
|
50
|
-
|
51
|
-
|
52
|
-
def _set_input_flags(self, input_flags: FlagsGroup):
|
53
|
-
self._input_flags = input_flags
|
54
|
-
|
55
|
-
def get_input_flags(self) -> FlagsGroup:
|
56
|
-
return self._input_flags
|
57
|
-
|
58
|
-
@staticmethod
|
59
|
-
def parse_input_command(raw_command: str) -> CommandType:
|
60
|
-
if not raw_command:
|
61
|
-
raise EmptyInputCommandException()
|
62
|
-
list_of_tokens = raw_command.split()
|
63
|
-
command = list_of_tokens[0]
|
64
|
-
list_of_tokens.pop(0)
|
65
|
-
|
66
|
-
flags: FlagsGroup = FlagsGroup()
|
67
|
-
current_flag_name = None
|
68
|
-
current_flag_value = None
|
69
|
-
for k, _ in enumerate(list_of_tokens):
|
70
|
-
if _.startswith('-'):
|
71
|
-
flag_prefix_last_symbol_index = _.rfind('-')
|
72
|
-
if current_flag_name or len(_) < 2 or len(_[:flag_prefix_last_symbol_index]) > 3:
|
73
|
-
raise UnprocessedInputFlagException()
|
74
|
-
else:
|
75
|
-
current_flag_name = _
|
76
|
-
else:
|
77
|
-
if not current_flag_name:
|
78
|
-
raise UnprocessedInputFlagException()
|
79
|
-
else:
|
80
|
-
current_flag_value = _
|
81
|
-
if current_flag_name:
|
82
|
-
if not len(list_of_tokens) == k+1:
|
83
|
-
if not list_of_tokens[k+1].startswith('-'):
|
84
|
-
continue
|
85
|
-
flag_prefix_last_symbol_index = current_flag_name.rfind('-')
|
86
|
-
flag_prefix = current_flag_name[:flag_prefix_last_symbol_index+1]
|
87
|
-
flag_name = current_flag_name[flag_prefix_last_symbol_index+1:]
|
88
|
-
input_flag = Flag(flag_name=flag_name,
|
89
|
-
flag_prefix=cast(Literal['-', '--', '---'], flag_prefix))
|
90
|
-
input_flag.set_value(current_flag_value)
|
91
|
-
|
92
|
-
all_flags = [x.get_string_entity() for x in flags.get_flags()]
|
93
|
-
if input_flag.get_string_entity() not in all_flags:
|
94
|
-
flags.add_flag(input_flag)
|
95
|
-
else:
|
96
|
-
raise RepeatedInputFlagsException(input_flag)
|
97
|
-
|
98
|
-
current_flag_name = None
|
99
|
-
current_flag_value = None
|
100
|
-
if any([current_flag_name, current_flag_value]):
|
101
|
-
raise UnprocessedInputFlagException()
|
102
|
-
if len(flags.get_flags()) == 0:
|
103
|
-
return Command(trigger=command)
|
104
|
-
else:
|
105
|
-
input_command = Command(trigger=command)
|
106
|
-
input_command._set_input_flags(flags)
|
107
|
-
return input_command
|
108
|
-
|
109
|
-
|
110
|
-
|
argenta/command/flag/entity.py
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
from typing import Literal, Pattern
|
2
|
-
|
3
|
-
|
4
|
-
class Flag:
|
5
|
-
def __init__(self, flag_name: str,
|
6
|
-
flag_prefix: Literal['-', '--', '---'] = '--',
|
7
|
-
possible_flag_values: list[str] | Pattern[str] | False = True):
|
8
|
-
self._flag_name = flag_name
|
9
|
-
self._flag_prefix = flag_prefix
|
10
|
-
self.possible_flag_values = possible_flag_values
|
11
|
-
|
12
|
-
self._flag_value = None
|
13
|
-
|
14
|
-
def get_string_entity(self):
|
15
|
-
string_entity: str = self._flag_prefix + self._flag_name
|
16
|
-
return string_entity
|
17
|
-
|
18
|
-
def get_flag_name(self):
|
19
|
-
return self._flag_name
|
20
|
-
|
21
|
-
def get_flag_prefix(self):
|
22
|
-
return self._flag_prefix
|
23
|
-
|
24
|
-
def get_value(self):
|
25
|
-
return self._flag_value
|
26
|
-
|
27
|
-
def set_value(self, value):
|
28
|
-
self._flag_value = value
|
29
|
-
|
30
|
-
def validate_input_flag_value(self, input_flag_value: str | None):
|
31
|
-
if self.possible_flag_values is False:
|
32
|
-
if input_flag_value is None:
|
33
|
-
return True
|
34
|
-
else:
|
35
|
-
return False
|
36
|
-
elif isinstance(self.possible_flag_values, Pattern):
|
37
|
-
is_valid = bool(self.possible_flag_values.match(input_flag_value))
|
38
|
-
if bool(is_valid):
|
39
|
-
return True
|
40
|
-
else:
|
41
|
-
return False
|
42
|
-
|
43
|
-
elif isinstance(self.possible_flag_values, list):
|
44
|
-
if input_flag_value in self.possible_flag_values:
|
45
|
-
return True
|
46
|
-
else:
|
47
|
-
return False
|
48
|
-
else:
|
49
|
-
return True
|
@@ -1 +0,0 @@
|
|
1
|
-
from .entity import FlagsGroup
|
@@ -1,35 +0,0 @@
|
|
1
|
-
from argenta.command.flag import Flag
|
2
|
-
|
3
|
-
|
4
|
-
class FlagsGroup:
|
5
|
-
def __init__(self, *flags: Flag):
|
6
|
-
self._flags: list[Flag] = [] if not flags else flags
|
7
|
-
|
8
|
-
def get_flags(self) -> list[Flag]:
|
9
|
-
return self._flags
|
10
|
-
|
11
|
-
def add_flag(self, flag: Flag):
|
12
|
-
self._flags.append(flag)
|
13
|
-
|
14
|
-
def add_flags(self, flags: list[Flag]):
|
15
|
-
self._flags.extend(flags)
|
16
|
-
|
17
|
-
def unparse_to_dict(self):
|
18
|
-
result_dict: dict[str, dict] = {}
|
19
|
-
for flag in self._flags:
|
20
|
-
result_dict[flag.get_flag_name()] = {
|
21
|
-
'name': flag.get_flag_name(),
|
22
|
-
'string_entity': flag.get_string_entity(),
|
23
|
-
'prefix': flag.get_flag_prefix(),
|
24
|
-
'value': flag.get_value()
|
25
|
-
}
|
26
|
-
return result_dict
|
27
|
-
|
28
|
-
def __iter__(self):
|
29
|
-
return iter(self._flags)
|
30
|
-
|
31
|
-
def __next__(self):
|
32
|
-
return next(iter(self))
|
33
|
-
|
34
|
-
def __getitem__(self, item):
|
35
|
-
return self._flags[item]
|
argenta-0.4.0.dist-info/RECORD
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
argenta/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
argenta/app/__init__.py,sha256=NoKJpO5inI4bEtptNj7BZtNpGQidCNoFSw2-JoK6P98,25
|
3
|
-
argenta/app/entity.py,sha256=oBaC6a_pYL6_VuiKieJD7HWGk0OqcJbrTtVab_23Qbk,11561
|
4
|
-
argenta/app/exceptions.py,sha256=ruI_MwJQtBLrnWxJbKlSRE50c5FjnZ9qXJma34kPZhk,1253
|
5
|
-
argenta/command/__init__.py,sha256=yRSj5CtLjxwjKiokUGdSmuBZPOF_qheRyG0NW1pv7vo,27
|
6
|
-
argenta/command/entity.py,sha256=uICQk5zaD_IG52q2IpFTDiGkTK0G6guPR6Eb9Y-3n0E,4454
|
7
|
-
argenta/command/exceptions.py,sha256=ZhJS_ThdmTgGnZqhSfCfkT_VcfkHTiAU7hAgrme6gQY,555
|
8
|
-
argenta/command/flag/__init__.py,sha256=y6rJLdag5qxONg1CzcP7gi6rCeix9UsG1AVANX3fnJs,68
|
9
|
-
argenta/command/flag/defaults.py,sha256=FjmqepLflYhp2yQcH2bCLi8nip9Bihb5d_HInuEWD4I,1037
|
10
|
-
argenta/command/flag/entity.py,sha256=osMAh-PVP_1MhRhe4Zf1NmJu5NJWAyY6oOKT9mtZnWw,1542
|
11
|
-
argenta/command/flag/flags_group/__init__.py,sha256=f1q3albNnoQYrY56Exb75oh62miTdxD0ALo5aBWW9_g,30
|
12
|
-
argenta/command/flag/flags_group/entity.py,sha256=NcyKjC_N-8d4xARkVCLSK8-PoPrKjSlIbR4SHSa7_us,985
|
13
|
-
argenta/router/__init__.py,sha256=vIU2o3JJ7misRm9mUzUQw5HdverdMDfvHNzkWuYFRBY,26
|
14
|
-
argenta/router/entity.py,sha256=bt5m9UU0SWUZ1IfBkXzRUqGXL4LnlYw4-2jG7_8-Xuw,5124
|
15
|
-
argenta/router/exceptions.py,sha256=NseEKrhwvG-H5_qdN-hzq83eJ98jku-PzHspz4CG9PM,796
|
16
|
-
argenta-0.4.0.dist-info/LICENSE,sha256=zmqoGh2n5rReBv4s8wPxF_gZEZDgauJYSPMuPczgOiU,1082
|
17
|
-
argenta-0.4.0.dist-info/METADATA,sha256=CISs8tZ2ll1si5pavXwxi2iqhek8Ma5ktYHQqEs2ahs,18187
|
18
|
-
argenta-0.4.0.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
|
19
|
-
argenta-0.4.0.dist-info/RECORD,,
|
File without changes
|