argenta 0.4.0__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.
Files changed (32) hide show
  1. {argenta-0.4.0 → argenta-0.4.5}/PKG-INFO +14 -15
  2. {argenta-0.4.0 → argenta-0.4.5}/README.md +13 -14
  3. {argenta-0.4.0 → argenta-0.4.5}/argenta/app/__init__.py +2 -0
  4. {argenta-0.4.0 → argenta-0.4.5}/argenta/app/entity.py +81 -80
  5. {argenta-0.4.0 → argenta-0.4.5}/argenta/app/exceptions.py +0 -5
  6. argenta-0.4.5/argenta/app/registered_routers/__init__.py +0 -0
  7. argenta-0.4.5/argenta/app/registered_routers/entity.py +21 -0
  8. argenta-0.4.5/argenta/command/__init__.py +3 -0
  9. {argenta-0.4.0 → argenta-0.4.5}/argenta/command/exceptions.py +2 -2
  10. argenta-0.4.5/argenta/command/flag/__init__.py +4 -0
  11. argenta-0.4.5/argenta/command/flag/defaults.py +21 -0
  12. argenta-0.4.5/argenta/command/flag/models.py +140 -0
  13. argenta-0.4.5/argenta/command/models.py +105 -0
  14. argenta-0.4.5/argenta/router/__init__.py +4 -0
  15. argenta-0.4.5/argenta/router/command_handler/__init__.py +0 -0
  16. argenta-0.4.5/argenta/router/command_handler/entity.py +21 -0
  17. argenta-0.4.5/argenta/router/command_handlers/__init__.py +0 -0
  18. argenta-0.4.5/argenta/router/command_handlers/entity.py +21 -0
  19. argenta-0.4.5/argenta/router/defaults.py +5 -0
  20. {argenta-0.4.0 → argenta-0.4.5}/argenta/router/entity.py +41 -36
  21. {argenta-0.4.0 → argenta-0.4.5}/argenta/router/exceptions.py +1 -6
  22. {argenta-0.4.0 → argenta-0.4.5}/pyproject.toml +1 -1
  23. argenta-0.4.0/argenta/command/__init__.py +0 -1
  24. argenta-0.4.0/argenta/command/entity.py +0 -110
  25. argenta-0.4.0/argenta/command/flag/__init__.py +0 -2
  26. argenta-0.4.0/argenta/command/flag/defaults.py +0 -21
  27. argenta-0.4.0/argenta/command/flag/entity.py +0 -49
  28. argenta-0.4.0/argenta/command/flag/flags_group/__init__.py +0 -1
  29. argenta-0.4.0/argenta/command/flag/flags_group/entity.py +0 -35
  30. argenta-0.4.0/argenta/router/__init__.py +0 -1
  31. {argenta-0.4.0 → argenta-0.4.5}/LICENSE +0 -0
  32. {argenta-0.4.0 → argenta-0.4.5}/argenta/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: argenta
3
- Version: 0.4.0
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 FlagsGroup, Flag
74
+ from argenta.command.flag import Flags, Flag, InputFlags
75
75
 
76
76
  router = Router()
77
77
 
78
- registered_flags = FlagsGroup(
79
- Flag(flag_name='host',
80
- flag_prefix='--',
81
- possible_flag_values=re.compile(r'^192.168.\d{1,3}.\d{1,3}$')),
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: dict):
93
+ def handler_with_flags(flags: InputFlags):
94
94
  for flag in flags:
95
- print(f'Flag name: {flag['name']}\n'
96
- f'Flag value: {flag['value']}')
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 | FlagsGroup = None)
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 | FlagsGroup`): Флаги, которые будут обработаны при их наличии во вводе юзера
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() -> `FlagsGroup | None`**
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* :: `FlagsGroup`
419
+ ## *class* :: `Flags`
421
420
  Класс, объединяющий список флагов в один объект, используется в качестве
422
421
  передаваемого аргумента `flags` экземпляру класса `Command`, при регистрации
423
422
  хэндлера
424
423
 
425
424
  ### Конструктор
426
425
  ```python
427
- FlagsGroup(*flagы: Flag)
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 FlagsGroup, Flag
59
+ from argenta.command.flag import Flags, Flag, InputFlags
60
60
 
61
61
  router = Router()
62
62
 
63
- registered_flags = FlagsGroup(
64
- Flag(flag_name='host',
65
- flag_prefix='--',
66
- possible_flag_values=re.compile(r'^192.168.\d{1,3}.\d{1,3}$')),
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: dict):
78
+ def handler_with_flags(flags: InputFlags):
79
79
  for flag in flags:
80
- print(f'Flag name: {flag['name']}\n'
81
- f'Flag value: {flag['value']}')
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 | FlagsGroup = None)
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 | FlagsGroup`): Флаги, которые будут обработаны при их наличии во вводе юзера
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() -> `FlagsGroup | None`**
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* :: `FlagsGroup`
404
+ ## *class* :: `Flags`
406
405
  Класс, объединяющий список флагов в один объект, используется в качестве
407
406
  передаваемого аргумента `flags` экземпляру класса `Command`, при регистрации
408
407
  хэндлера
409
408
 
410
409
  ### Конструктор
411
410
  ```python
412
- FlagsGroup(*flagы: Flag)
411
+ Flags(*flagы: Flag)
413
412
  ```
414
413
 
415
414
  ---
@@ -1 +1,3 @@
1
+ __all__ = ["App"]
2
+
1
3
  from .entity import App
@@ -2,17 +2,18 @@ from typing import Callable
2
2
  from inspect import getfullargspec
3
3
  import re
4
4
 
5
- from ..command.entity import Command
6
- from ..router.entity import Router
7
- from ..command.exceptions import (UnprocessedInputFlagException,
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._registered_router_entities: list[dict[str, str | list[dict[str, Callable[[], None] | Command]] | Router]] = []
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(f'Empty input command')
53
- self._unknown_command_handler: Callable[[Command], None] = lambda command: print_func(f"Unknown command: {command.get_trigger()}")
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: Command = Command.parse_input_command(raw_command=raw_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._invalid_input_flags_handler(raw_command)
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
- except RepeatedInputFlagsException:
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 router in self._routers:
118
- router.input_command_handler(input_command)
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._routers.append(router)
183
+ self._registered_routers.add_registered_router(router)
182
184
 
183
- command_entities: list[dict[str, Callable[[], None] | Command]] = router.get_command_entities()
184
- self._registered_router_entities.append({'name': router.get_name(),
185
- 'title': router.get_title(),
186
- 'entity': router,
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._routers:
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._routers:
197
- if not router.get_command_entities():
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 _validate_all_router_commands(self) -> None:
202
- for idx in range(len(self._registered_router_entities)):
203
- current_router: Router = self._registered_router_entities[idx]['entity']
204
- routers_without_current_router = self._registered_router_entities.copy()
205
- routers_without_current_router.pop(idx)
206
-
207
- current_router_all_commands: list[str] = current_router.get_all_commands()
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
- def _is_exit_command(self, command: str):
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
- self.print_func(self.farewell_message)
214
+ system_router.input_command_handler(command)
221
215
  return True
222
216
  else:
223
- if command == self.exit_command:
224
- self.print_func(self.farewell_message)
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: Command):
230
- registered_router_entities: list[dict[str, str | list[dict[str, Callable[[], None] | Command]] | Router]] = self._registered_router_entities
231
- for router_entity in registered_router_entities:
232
- for command_entity in router_entity['commands']:
233
- if command_entity['command'].get_trigger().lower() == command.get_trigger().lower():
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 command_entity['command'].get_trigger() == command.get_trigger():
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 router_entity in self._registered_router_entities:
245
- self.print_func(router_entity['title'])
246
- for command_entity in router_entity['commands']:
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=command_entity['command'].get_trigger(),
249
- description=command_entity['command'].get_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
- self.print_func(self.system_points_title)
255
- self.print_func(self._description_message_pattern.format(
256
- command=self.exit_command,
257
- description=self.exit_command_description
258
- )
259
- )
260
- self.print_func(self.command_group_description_separate)
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
 
@@ -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"
@@ -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))
@@ -0,0 +1,3 @@
1
+ __all__ = ["Command"]
2
+
3
+ from .models import Command
@@ -1,4 +1,4 @@
1
- from argenta.command.flag.entity import 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,4 @@
1
+ __all__ = ('InputFlags', 'InputFlag', 'Flag', 'Flags')
2
+
3
+
4
+ from .models import InputFlags, InputFlag, Flags, Flag
@@ -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
+
@@ -0,0 +1,4 @@
1
+ __all__ = ["Router"]
2
+
3
+
4
+ from .entity import Router
@@ -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
@@ -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))
@@ -0,0 +1,5 @@
1
+ from argenta.router import Router
2
+
3
+
4
+ system_router = Router(title='System points:',
5
+ name='System')
@@ -1,26 +1,26 @@
1
1
  from typing import Callable, Any
2
2
  from inspect import getfullargspec
3
3
 
4
- from ..command.entity import Command
5
- from argenta.command.flag.entity import Flag
6
- from argenta.command.flag.flags_group import FlagsGroup
7
- from ..router.exceptions import (RepeatedCommandException,
8
- RepeatedFlagNameException,
9
- TooManyTransferredArgsException,
10
- RequiredArgumentNotPassedException,
11
- IncorrectNumberOfHandlerArgsException,
12
- TriggerCannotContainSpacesException)
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._command_entities: list[dict[str, Callable[[], None] | Command]] = []
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._command_entities.append({'handler_func': func,
35
- 'command': command})
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: Command):
51
+ def input_command_handler(self, input_command: InputCommand):
51
52
  input_command_name: str = input_command.get_trigger()
52
- input_command_flags: FlagsGroup = input_command.get_input_flags()
53
- for command_entity in self._command_entities:
54
- if input_command_name.lower() == command_entity['command'].get_trigger().lower():
55
- if command_entity['command'].get_registered_flags():
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 = command_entity['command'].validate_input_flag(flag)
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
- return command_entity['handler_func'](input_command_flags.unparse_to_dict())
64
+ command_handler.handling(input_command_flags)
65
+ return
63
66
  else:
64
- return command_entity['handler_func']({})
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
- return command_entity['handler_func']()
74
+ command_handler.handling()
75
+ return
71
76
 
72
77
 
73
- def _validate_command(self, command: Command):
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: FlagsGroup = command.get_registered_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 get_command_entities(self) -> list[dict[str, Callable[[], None] | Command]]:
108
- return self._command_entities
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 command_entity in self._command_entities:
122
- all_commands.append(command_entity['command'].get_trigger())
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
@@ -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 flag name in register command"
3
+ return "Repeated registered_flag name in register command"
9
4
 
10
5
 
11
6
  class TooManyTransferredArgsException(Exception):
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "argenta"
3
- version = "0.4.0"
3
+ version = "0.4.5"
4
4
  description = "python library for creating custom shells"
5
5
  authors = [
6
6
  {name = "kolo", email = "kolo.is.main@gmail.com"}
@@ -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,2 +0,0 @@
1
- from .entity import Flag
2
- from .flags_group.entity import FlagsGroup
@@ -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