argenta 0.4.1__tar.gz → 0.4.5__tar.gz
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-0.4.1 → argenta-0.4.5}/PKG-INFO +14 -15
- {argenta-0.4.1 → argenta-0.4.5}/README.md +13 -14
- {argenta-0.4.1 → argenta-0.4.5}/argenta/app/__init__.py +2 -0
- {argenta-0.4.1 → argenta-0.4.5}/argenta/app/entity.py +50 -70
- {argenta-0.4.1 → argenta-0.4.5}/argenta/app/exceptions.py +0 -5
- argenta-0.4.5/argenta/app/registered_routers/__init__.py +0 -0
- argenta-0.4.5/argenta/app/registered_routers/entity.py +21 -0
- argenta-0.4.5/argenta/command/__init__.py +3 -0
- {argenta-0.4.1 → argenta-0.4.5}/argenta/command/exceptions.py +2 -2
- argenta-0.4.5/argenta/command/flag/__init__.py +4 -0
- argenta-0.4.5/argenta/command/flag/defaults.py +21 -0
- argenta-0.4.5/argenta/command/flag/models.py +140 -0
- argenta-0.4.5/argenta/command/models.py +105 -0
- argenta-0.4.5/argenta/router/__init__.py +4 -0
- argenta-0.4.5/argenta/router/command_handler/__init__.py +0 -0
- argenta-0.4.5/argenta/router/command_handler/entity.py +21 -0
- argenta-0.4.5/argenta/router/command_handlers/__init__.py +0 -0
- argenta-0.4.5/argenta/router/command_handlers/entity.py +21 -0
- {argenta-0.4.1 → argenta-0.4.5}/argenta/router/entity.py +37 -36
- {argenta-0.4.1 → argenta-0.4.5}/argenta/router/exceptions.py +1 -6
- {argenta-0.4.1 → argenta-0.4.5}/pyproject.toml +1 -1
- argenta-0.4.1/argenta/command/__init__.py +0 -1
- argenta-0.4.1/argenta/command/entity.py +0 -110
- argenta-0.4.1/argenta/command/flag/__init__.py +0 -2
- argenta-0.4.1/argenta/command/flag/defaults.py +0 -21
- argenta-0.4.1/argenta/command/flag/entity.py +0 -49
- argenta-0.4.1/argenta/command/flag/flags_group/__init__.py +0 -1
- argenta-0.4.1/argenta/command/flag/flags_group/entity.py +0 -35
- argenta-0.4.1/argenta/router/__init__.py +0 -1
- {argenta-0.4.1 → argenta-0.4.5}/LICENSE +0 -0
- {argenta-0.4.1 → argenta-0.4.5}/argenta/__init__.py +0 -0
- {argenta-0.4.1 → argenta-0.4.5}/argenta/router/defaults.py +0 -0
@@ -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
|
---
|
@@ -56,14 +56,14 @@ if __name__ == '__main__':
|
|
56
56
|
import re
|
57
57
|
from argenta.router import Router
|
58
58
|
from argenta.command import Command
|
59
|
-
from argenta.command.flag import
|
59
|
+
from argenta.command.flag import Flags, Flag, InputFlags
|
60
60
|
|
61
61
|
router = Router()
|
62
62
|
|
63
|
-
registered_flags =
|
64
|
-
Flag(
|
65
|
-
|
66
|
-
|
63
|
+
registered_flags = Flags(
|
64
|
+
Flag(name='host',
|
65
|
+
prefix='--',
|
66
|
+
possible_values=re.compile(r'^192.168.\d{1,3}.\d{1,3}$')),
|
67
67
|
Flag('port', '--', re.compile(r'^[0-9]{1,4}$')))
|
68
68
|
|
69
69
|
|
@@ -75,10 +75,10 @@ def handler():
|
|
75
75
|
@router.command(Command(trigger="ssh",
|
76
76
|
description='connect via ssh',
|
77
77
|
flags=registered_flags))
|
78
|
-
def handler_with_flags(flags:
|
78
|
+
def handler_with_flags(flags: InputFlags):
|
79
79
|
for flag in flags:
|
80
|
-
print(f'Flag name: {flag
|
81
|
-
f'Flag value: {flag
|
80
|
+
print(f'Flag name: {flag.get_name()}\n'
|
81
|
+
f'Flag value: {flag.get_value()}')
|
82
82
|
```
|
83
83
|
|
84
84
|
---
|
@@ -299,7 +299,6 @@ Router(title: str = 'Commands group title:',
|
|
299
299
|
---
|
300
300
|
|
301
301
|
### Исключения
|
302
|
-
- `RepeatedCommandException` - Одна и та же команда зарегистрирована в одном роутере
|
303
302
|
- `RepeatedFlagNameException` - Повторяющиеся зарегистрированные флаги в команде
|
304
303
|
- `TooManyTransferredArgsException` - Слишком много зарегистрированных аргументов у обработчика команды
|
305
304
|
- `RequiredArgumentNotPassedException` - Не зарегистрирован обязательный аргумент у обработчика команды(аргумент, через который будут переданы флаги введённой команды)
|
@@ -315,14 +314,14 @@ Router(title: str = 'Commands group title:',
|
|
315
314
|
```python
|
316
315
|
Command(trigger: str,
|
317
316
|
description: str = None,
|
318
|
-
flags: Flag |
|
317
|
+
flags: Flag | Flags = None)
|
319
318
|
```
|
320
319
|
|
321
320
|
**Аргументы:**
|
322
321
|
- **name : mean**
|
323
322
|
- `trigger` (`str`): Строковый триггер
|
324
323
|
- `description` (`str`): Описание команды, которое будет выведено в консоль при запуске оболочки
|
325
|
-
- `flags` (`Flag |
|
324
|
+
- `flags` (`Flag | Flags`): Флаги, которые будут обработаны при их наличии во вводе юзера
|
326
325
|
|
327
326
|
---
|
328
327
|
|
@@ -338,7 +337,7 @@ Command(trigger: str,
|
|
338
337
|
|
339
338
|
---
|
340
339
|
|
341
|
-
#### **.get_registered_flags() -> `
|
340
|
+
#### **.get_registered_flags() -> `Flags | None`**
|
342
341
|
|
343
342
|
*method mean* **::** возвращает зарегистрированные флаги экземпляра
|
344
343
|
|
@@ -402,14 +401,14 @@ Flag(flag_name: str,
|
|
402
401
|
|
403
402
|
---
|
404
403
|
|
405
|
-
## *class* :: `
|
404
|
+
## *class* :: `Flags`
|
406
405
|
Класс, объединяющий список флагов в один объект, используется в качестве
|
407
406
|
передаваемого аргумента `flags` экземпляру класса `Command`, при регистрации
|
408
407
|
хэндлера
|
409
408
|
|
410
409
|
### Конструктор
|
411
410
|
```python
|
412
|
-
|
411
|
+
Flags(*flagы: Flag)
|
413
412
|
```
|
414
413
|
|
415
414
|
---
|
@@ -2,18 +2,18 @@ from typing import Callable
|
|
2
2
|
from inspect import getfullargspec
|
3
3
|
import re
|
4
4
|
|
5
|
-
from argenta.command import Command
|
5
|
+
from argenta.command.models import Command, InputCommand
|
6
6
|
from argenta.router import Router
|
7
7
|
from argenta.router.defaults import system_router
|
8
8
|
from argenta.command.exceptions import (UnprocessedInputFlagException,
|
9
9
|
RepeatedInputFlagsException,
|
10
10
|
EmptyInputCommandException)
|
11
|
-
from .exceptions import (InvalidRouterInstanceException,
|
11
|
+
from argenta.app.exceptions import (InvalidRouterInstanceException,
|
12
12
|
InvalidDescriptionMessagePatternException,
|
13
13
|
NoRegisteredRoutersException,
|
14
14
|
NoRegisteredHandlersException,
|
15
|
-
RepeatedCommandInDifferentRoutersException,
|
16
15
|
IncorrectNumberOfHandlerArgsException)
|
16
|
+
from argenta.app.registered_routers.entity import RegisteredRouters
|
17
17
|
|
18
18
|
|
19
19
|
class App:
|
@@ -47,13 +47,12 @@ class App:
|
|
47
47
|
self.repeat_command_groups = repeat_command_groups
|
48
48
|
self.messages_on_startup = messages_on_startup if messages_on_startup else []
|
49
49
|
|
50
|
-
self._routers: list[Router] = []
|
51
50
|
self._description_message_pattern: str = '[{command}] *=*=* {description}'
|
52
|
-
self.
|
51
|
+
self._registered_routers: RegisteredRouters = RegisteredRouters()
|
53
52
|
self._invalid_input_flags_handler: Callable[[str], None] = lambda raw_command: print_func(f'Incorrect flag syntax: "{raw_command}"')
|
54
53
|
self._repeated_input_flags_handler: Callable[[str], None] = lambda raw_command: print_func(f'Repeated input flags: "{raw_command}"')
|
55
|
-
self._empty_input_command_handler: Callable[[], None] = lambda: print_func(
|
56
|
-
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()}")
|
57
56
|
self._exit_command_handler: Callable[[], None] = lambda: print_func(self.farewell_message)
|
58
57
|
|
59
58
|
|
@@ -61,7 +60,6 @@ class App:
|
|
61
60
|
self._setup_system_router()
|
62
61
|
self._validate_number_of_routers()
|
63
62
|
self._validate_included_routers()
|
64
|
-
self._validate_all_router_commands()
|
65
63
|
|
66
64
|
self.print_func(self.initial_message)
|
67
65
|
|
@@ -80,28 +78,12 @@ class App:
|
|
80
78
|
raw_command: str = input()
|
81
79
|
|
82
80
|
try:
|
83
|
-
input_command:
|
84
|
-
except UnprocessedInputFlagException
|
81
|
+
input_command: InputCommand = InputCommand.parse(raw_command=raw_command)
|
82
|
+
except (UnprocessedInputFlagException,
|
83
|
+
RepeatedInputFlagsException,
|
84
|
+
EmptyInputCommandException) as error:
|
85
85
|
self.print_func(self.line_separate)
|
86
|
-
self.
|
87
|
-
self.print_func(self.line_separate)
|
88
|
-
|
89
|
-
if not self.repeat_command_groups:
|
90
|
-
self.print_func(self.prompt)
|
91
|
-
continue
|
92
|
-
|
93
|
-
except RepeatedInputFlagsException:
|
94
|
-
self.print_func(self.line_separate)
|
95
|
-
self._repeated_input_flags_handler(raw_command)
|
96
|
-
self.print_func(self.line_separate)
|
97
|
-
|
98
|
-
if not self.repeat_command_groups:
|
99
|
-
self.print_func(self.prompt)
|
100
|
-
continue
|
101
|
-
|
102
|
-
except EmptyInputCommandException:
|
103
|
-
self.print_func(self.line_separate)
|
104
|
-
self._empty_input_command_handler()
|
86
|
+
self._error_handler(error, raw_command)
|
105
87
|
self.print_func(self.line_separate)
|
106
88
|
|
107
89
|
if not self.repeat_command_groups:
|
@@ -122,8 +104,8 @@ class App:
|
|
122
104
|
self.print_func(self.prompt)
|
123
105
|
continue
|
124
106
|
|
125
|
-
for
|
126
|
-
|
107
|
+
for registered_router in self._registered_routers:
|
108
|
+
registered_router.input_command_handler(input_command)
|
127
109
|
|
128
110
|
self.print_func(self.line_separate)
|
129
111
|
self.print_func(self.command_group_description_separate)
|
@@ -198,53 +180,35 @@ class App:
|
|
198
180
|
raise InvalidRouterInstanceException()
|
199
181
|
|
200
182
|
router.set_ignore_command_register(self.ignore_command_register)
|
201
|
-
self.
|
183
|
+
self._registered_routers.add_registered_router(router)
|
202
184
|
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
'commands': command_entities})
|
185
|
+
|
186
|
+
def include_routers(self, *routers: Router) -> None:
|
187
|
+
for router in routers:
|
188
|
+
self.include_router(router)
|
208
189
|
|
209
190
|
|
210
191
|
def _validate_number_of_routers(self) -> None:
|
211
|
-
if not self.
|
192
|
+
if not self._registered_routers:
|
212
193
|
raise NoRegisteredRoutersException()
|
213
194
|
|
214
195
|
|
215
196
|
def _validate_included_routers(self) -> None:
|
216
|
-
for router in self.
|
217
|
-
if not router.
|
197
|
+
for router in self._registered_routers:
|
198
|
+
if not router.get_command_handlers():
|
218
199
|
raise NoRegisteredHandlersException(router.get_name())
|
219
200
|
|
220
201
|
|
221
|
-
def _validate_all_router_commands(self) -> None:
|
222
|
-
for idx in range(len(self._registered_router_entities)):
|
223
|
-
current_router: Router = self._registered_router_entities[idx]['entity']
|
224
|
-
routers_without_current_router = self._registered_router_entities.copy()
|
225
|
-
routers_without_current_router.pop(idx)
|
226
|
-
|
227
|
-
current_router_all_commands: list[str] = current_router.get_all_commands()
|
228
|
-
|
229
|
-
for router_entity in routers_without_current_router:
|
230
|
-
if len(set(current_router_all_commands).intersection(set(router_entity['entity'].get_all_commands()))) > 0:
|
231
|
-
raise RepeatedCommandInDifferentRoutersException()
|
232
|
-
if self.ignore_command_register:
|
233
|
-
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:
|
234
|
-
raise RepeatedCommandInDifferentRoutersException()
|
235
|
-
|
236
|
-
|
237
202
|
def _setup_system_router(self):
|
238
203
|
system_router.set_title(self.system_points_title)
|
239
204
|
@system_router.command(Command(self.exit_command, self.exit_command_description))
|
240
205
|
def exit_command():
|
241
206
|
self._exit_command_handler()
|
242
|
-
|
243
|
-
if system_router not in [router['entity'] for router in self._registered_router_entities]:
|
207
|
+
if system_router not in self._registered_routers.get_registered_routers():
|
244
208
|
self.include_router(system_router)
|
245
209
|
|
246
210
|
|
247
|
-
def _is_exit_command(self, command:
|
211
|
+
def _is_exit_command(self, command: InputCommand):
|
248
212
|
if command.get_trigger().lower() == self.exit_command.lower():
|
249
213
|
if self.ignore_exit_command_register:
|
250
214
|
system_router.input_command_handler(command)
|
@@ -256,27 +220,43 @@ class App:
|
|
256
220
|
return False
|
257
221
|
|
258
222
|
|
259
|
-
def _check_is_command_unknown(self, command:
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
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():
|
264
228
|
if self.ignore_command_register:
|
265
229
|
return False
|
266
230
|
else:
|
267
|
-
if
|
231
|
+
if handled_command_trigger == command.get_trigger():
|
268
232
|
return False
|
269
233
|
self._unknown_command_handler(command)
|
270
234
|
return True
|
271
235
|
|
272
236
|
|
273
237
|
def _print_command_group_description(self):
|
274
|
-
for
|
275
|
-
self.print_func(
|
276
|
-
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():
|
277
241
|
self.print_func(self._description_message_pattern.format(
|
278
|
-
command=
|
279
|
-
description=
|
242
|
+
command=command_handler.get_handled_command().get_trigger(),
|
243
|
+
description=command_handler.get_handled_command().get_description()
|
280
244
|
)
|
281
245
|
)
|
282
246
|
self.print_func(self.command_group_description_separate)
|
247
|
+
|
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
|
+
|
262
|
+
|
@@ -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))
|
@@ -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"
|
@@ -0,0 +1,21 @@
|
|
1
|
+
from dataclasses import dataclass
|
2
|
+
from argenta.command.flag.models import Flag
|
3
|
+
import re
|
4
|
+
|
5
|
+
|
6
|
+
@dataclass
|
7
|
+
class PredeterminedFlags:
|
8
|
+
HELP = Flag(name='help', possible_values=False)
|
9
|
+
SHORT_HELP = Flag(name='h', prefix='-', possible_values=False)
|
10
|
+
|
11
|
+
INFO = Flag(name='info', possible_values=False)
|
12
|
+
SHORT_INFO = Flag(name='i', prefix='-', possible_values=False)
|
13
|
+
|
14
|
+
ALL = Flag(name='all', possible_values=False)
|
15
|
+
SHORT_ALL = Flag(name='a', prefix='-', possible_values=False)
|
16
|
+
|
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
|
+
|
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
|
+
|
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))
|
@@ -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:
|
@@ -122,7 +123,7 @@ class Router:
|
|
122
123
|
|
123
124
|
def get_all_commands(self) -> list[str]:
|
124
125
|
all_commands: list[str] = []
|
125
|
-
for
|
126
|
-
all_commands.append(
|
126
|
+
for command_handler in self._command_handlers:
|
127
|
+
all_commands.append(command_handler.get_handled_command().get_trigger())
|
127
128
|
|
128
129
|
return all_commands
|
@@ -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 +0,0 @@
|
|
1
|
-
from .entity import Command
|
@@ -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
|
-
|
@@ -1,21 +0,0 @@
|
|
1
|
-
from dataclasses import dataclass
|
2
|
-
from argenta.command.flag import Flag
|
3
|
-
import re
|
4
|
-
|
5
|
-
|
6
|
-
@dataclass
|
7
|
-
class DefaultFlags:
|
8
|
-
help_flag = Flag(flag_name='help', possible_flag_values=False)
|
9
|
-
short_help_flag = Flag(flag_name='h', flag_prefix='-', possible_flag_values=False)
|
10
|
-
|
11
|
-
info_flag = Flag(flag_name='info', possible_flag_values=False)
|
12
|
-
short_info_flag = Flag(flag_name='i', flag_prefix='-', possible_flag_values=False)
|
13
|
-
|
14
|
-
all_flag = Flag(flag_name='all', possible_flag_values=False)
|
15
|
-
short_all_flag = Flag(flag_name='a', flag_prefix='-', possible_flag_values=False)
|
16
|
-
|
17
|
-
host_flag = Flag(flag_name='host', possible_flag_values=re.compile(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$'))
|
18
|
-
short_host_flag = Flag(flag_name='h', flag_prefix='-', possible_flag_values=re.compile(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$'))
|
19
|
-
|
20
|
-
port_flag = Flag(flag_name='port', possible_flag_values=re.compile(r'^\d{1,5}$'))
|
21
|
-
short_port_flag = Flag(flag_name='p', flag_prefix='-', possible_flag_values=re.compile(r'^\d{1,5}$'))
|
@@ -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]
|
@@ -1 +0,0 @@
|
|
1
|
-
from .entity import Router
|
File without changes
|
File without changes
|
File without changes
|