argenta 0.4.5__py3-none-any.whl → 0.4.7__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 CHANGED
@@ -1,3 +1,3 @@
1
1
  __all__ = ["App"]
2
2
 
3
- from .entity import App
3
+ from .models import App
@@ -0,0 +1,8 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass
5
+ class PredeterminedMessages:
6
+ USAGE = '[b dim]Usage[/b dim]: [i]<command> <[green]flags[/green]>[/i]'
7
+ HELP = '[b dim]Help[/b dim]: [i]<command>[/i] [b red]--help[/b red]'
8
+
argenta/app/exceptions.py CHANGED
@@ -23,8 +23,3 @@ class NoRegisteredHandlersException(Exception):
23
23
  self.router_name = router_name
24
24
  def __str__(self):
25
25
  return f"No Registered Handlers Found For '{self.router_name}'"
26
-
27
-
28
- class IncorrectNumberOfHandlerArgsException(Exception):
29
- def __str__(self):
30
- return "Incorrect Input Flags Handler has incorrect number of arguments"
argenta/app/models.py ADDED
@@ -0,0 +1,209 @@
1
+ from typing import Callable
2
+ from rich.console import Console
3
+ from art import text2art
4
+ import re
5
+
6
+ from argenta.command.models import Command, InputCommand
7
+ from argenta.router import Router
8
+ from argenta.router.defaults import system_router
9
+ from argenta.command.exceptions import (UnprocessedInputFlagException,
10
+ RepeatedInputFlagsException,
11
+ EmptyInputCommandException,
12
+ BaseInputCommandException)
13
+ from argenta.app.exceptions import (InvalidRouterInstanceException,
14
+ InvalidDescriptionMessagePatternException,
15
+ NoRegisteredRoutersException,
16
+ NoRegisteredHandlersException)
17
+ from argenta.app.registered_routers.entity import RegisteredRouters
18
+
19
+
20
+
21
+ class BaseApp:
22
+ def __init__(self,
23
+ prompt: str = '[italic dim bold]What do you want to do?\n',
24
+ initial_message: str = 'Argenta',
25
+ farewell_message: str = 'See you',
26
+ exit_command: str = 'Q',
27
+ exit_command_description: str = 'Exit command',
28
+ system_points_title: str = 'System points:',
29
+ ignore_command_register: bool = True,
30
+ line_separate: str = '-----',
31
+ repeat_command_groups: bool = True,
32
+ print_func: Callable[[str], None] = Console().print) -> None:
33
+ self._prompt = prompt
34
+ self._print_func = print_func
35
+ self._exit_command = exit_command
36
+ self._exit_command_description = exit_command_description
37
+ self._system_points_title = system_points_title
38
+ self._line_separate = line_separate
39
+ self._ignore_command_register = ignore_command_register
40
+ self._repeat_command_groups_description = repeat_command_groups
41
+
42
+ self.farewell_message = farewell_message
43
+ self.initial_message = initial_message
44
+
45
+ self._description_message_pattern: str = '[bold red][{command}][/bold red] [blue dim]*=*=*[/blue dim] [bold yellow italic]{description}'
46
+ self._registered_routers: RegisteredRouters = RegisteredRouters()
47
+ self._messages_on_startup = []
48
+
49
+ self.invalid_input_flags_handler: Callable[[str], None] = lambda raw_command: print_func(f'[red bold]Incorrect flag syntax: {raw_command}')
50
+ self.repeated_input_flags_handler: Callable[[str], None] = lambda raw_command: print_func(f'[red bold]Repeated input flags: {raw_command}')
51
+ self.empty_input_command_handler: Callable[[], None] = lambda: print_func('[red bold]Empty input command')
52
+ self.unknown_command_handler: Callable[[InputCommand], None] = lambda command: print_func(f"[red bold]Unknown command: {command.get_trigger()}")
53
+ self.exit_command_handler: Callable[[], None] = lambda: print_func(self.farewell_message)
54
+
55
+ self._setup_default_view(is_initial_message_default=initial_message == 'Argenta',
56
+ is_farewell_message_default=farewell_message == 'See you',
57
+ is_line_separate_default=line_separate == '-----')
58
+
59
+
60
+ def _setup_default_view(self, is_initial_message_default: bool,
61
+ is_farewell_message_default: bool,
62
+ is_line_separate_default: bool):
63
+ if is_initial_message_default:
64
+ self.initial_message = f'\n[bold red]{text2art('Argenta', font='tarty1')}\n\n'
65
+ if is_farewell_message_default:
66
+ self.farewell_message = (f'[bold red]\n{text2art('\nSee you\n', font='chanky')}[/bold red]\n'
67
+ f'[red i]github.com/koloideal/Argenta[/red i] | '
68
+ f'[red bold i]made by kolo[/red bold i]\n')
69
+ if is_line_separate_default:
70
+ self._line_separate = f'\n[dim]{"-" * 50}\n'
71
+
72
+
73
+ def _validate_number_of_routers(self) -> None:
74
+ if not self._registered_routers:
75
+ raise NoRegisteredRoutersException()
76
+
77
+
78
+ def _validate_included_routers(self) -> None:
79
+ for router in self._registered_routers:
80
+ if not router.get_command_handlers():
81
+ raise NoRegisteredHandlersException(router.get_name())
82
+
83
+
84
+ def _is_exit_command(self, command: InputCommand):
85
+ if command.get_trigger().lower() == self._exit_command.lower():
86
+ if self._ignore_command_register:
87
+ system_router.input_command_handler(command)
88
+ return True
89
+ elif command.get_trigger() == self._exit_command:
90
+ system_router.input_command_handler(command)
91
+ return True
92
+ return False
93
+
94
+
95
+ def _is_unknown_command(self, command: InputCommand):
96
+ for router_entity in self._registered_routers:
97
+ for command_handler in router_entity.get_command_handlers():
98
+ handled_command_trigger = command_handler.get_handled_command().get_trigger()
99
+ if handled_command_trigger.lower() == command.get_trigger().lower() and self._ignore_command_register:
100
+ return False
101
+ elif handled_command_trigger == command.get_trigger():
102
+ return False
103
+ self.unknown_command_handler(command)
104
+ return True
105
+
106
+
107
+ def _print_command_group_description(self):
108
+ for registered_router in self._registered_routers:
109
+ self._print_func(registered_router.get_title())
110
+ for command_handler in registered_router.get_command_handlers():
111
+ self._print_func(self._description_message_pattern.format(
112
+ command=command_handler.get_handled_command().get_trigger(),
113
+ description=command_handler.get_handled_command().get_description()))
114
+ self._print_func('')
115
+
116
+
117
+ def _error_handler(self, error: BaseInputCommandException, raw_command: str) -> None:
118
+ match error:
119
+ case UnprocessedInputFlagException():
120
+ self.invalid_input_flags_handler(raw_command)
121
+ case RepeatedInputFlagsException():
122
+ self.repeated_input_flags_handler(raw_command)
123
+ case EmptyInputCommandException():
124
+ self.empty_input_command_handler()
125
+
126
+
127
+
128
+ class App(BaseApp):
129
+ def start_polling(self) -> None:
130
+ self._setup_system_router()
131
+ self._validate_number_of_routers()
132
+ self._validate_included_routers()
133
+
134
+ self._print_func(self.initial_message)
135
+
136
+ for message in self._messages_on_startup:
137
+ self._print_func(message)
138
+
139
+ if not self._repeat_command_groups_description:
140
+ self._print_command_group_description()
141
+
142
+ while True:
143
+ if self._repeat_command_groups_description:
144
+ self._print_command_group_description()
145
+
146
+ raw_command: str = Console().input(self._prompt)
147
+
148
+ try:
149
+ input_command: InputCommand = InputCommand.parse(raw_command=raw_command)
150
+ except BaseInputCommandException as error:
151
+ self._print_func(self._line_separate)
152
+ self._error_handler(error, raw_command)
153
+ self._print_func(self._line_separate)
154
+ continue
155
+
156
+ if self._is_exit_command(input_command):
157
+ return
158
+
159
+ self._print_func(self._line_separate)
160
+
161
+ if self._is_unknown_command(input_command):
162
+ self._print_func(self._line_separate)
163
+ continue
164
+
165
+ for registered_router in self._registered_routers:
166
+ registered_router.input_command_handler(input_command)
167
+
168
+ self._print_func(self._line_separate)
169
+ if not self._repeat_command_groups_description:
170
+ self._print_func(self._prompt)
171
+
172
+
173
+ def include_router(self, router: Router) -> None:
174
+ if not isinstance(router, Router):
175
+ raise InvalidRouterInstanceException()
176
+
177
+ router.set_ignore_command_register(self._ignore_command_register)
178
+ self._registered_routers.add_registered_router(router)
179
+
180
+
181
+ def include_routers(self, *routers: Router) -> None:
182
+ for router in routers:
183
+ self.include_router(router)
184
+
185
+
186
+ def add_message_on_startup(self, message: str) -> None:
187
+ self._messages_on_startup.append(message)
188
+
189
+
190
+ def set_description_message_pattern(self, pattern: str) -> None:
191
+ first_check = re.match(r'.*{command}.*', pattern)
192
+ second_check = re.match(r'.*{description}.*', pattern)
193
+
194
+ if bool(first_check) and bool(second_check):
195
+ self._description_message_pattern: str = pattern
196
+ else:
197
+ raise InvalidDescriptionMessagePatternException(pattern)
198
+
199
+
200
+ def _setup_system_router(self):
201
+ system_router.set_title(self._system_points_title)
202
+ @system_router.command(Command(self._exit_command, self._exit_command_description))
203
+ def exit_command():
204
+ self.exit_command_handler()
205
+
206
+ if system_router not in self._registered_routers.get_registered_routers():
207
+ self.include_router(system_router)
208
+
209
+
@@ -1,12 +1,16 @@
1
1
  from argenta.command.flag.models import InputFlag, Flag
2
2
 
3
3
 
4
- class UnprocessedInputFlagException(Exception):
4
+ class BaseInputCommandException(Exception):
5
+ pass
6
+
7
+
8
+ class UnprocessedInputFlagException(BaseInputCommandException):
5
9
  def __str__(self):
6
10
  return "Unprocessed Input Flags"
7
11
 
8
12
 
9
- class RepeatedInputFlagsException(Exception):
13
+ class RepeatedInputFlagsException(BaseInputCommandException):
10
14
  def __init__(self, flag: Flag | InputFlag):
11
15
  self.flag = flag
12
16
  def __str__(self):
@@ -14,6 +18,6 @@ class RepeatedInputFlagsException(Exception):
14
18
  f"Duplicate flag was detected in the input: '{self.flag.get_string_entity()}'")
15
19
 
16
20
 
17
- class EmptyInputCommandException(Exception):
21
+ class EmptyInputCommandException(BaseInputCommandException):
18
22
  def __str__(self):
19
- return "Input Command is empty"
23
+ return "Input Command is empty"
@@ -27,7 +27,7 @@ class InputFlag(BaseFlag):
27
27
  super().__init__(name, prefix)
28
28
  self._flag_value = value
29
29
 
30
- def get_value(self):
30
+ def get_value(self) -> str | None:
31
31
  return self._flag_value
32
32
 
33
33
  def set_value(self, value):
argenta/command/models.py CHANGED
@@ -83,7 +83,8 @@ class InputCommand(BaseCommand, Generic[InputCommandType]):
83
83
 
84
84
  if current_flag_name:
85
85
  if not len(list_of_tokens) == k+1:
86
- if not list_of_tokens[k+1].startswith('-'): continue
86
+ if not list_of_tokens[k+1].startswith('-'):
87
+ continue
87
88
 
88
89
  input_flag = InputFlag(name=current_flag_name[current_flag_name.rfind('-')+1:],
89
90
  prefix=cast(Literal['-', '--', '---'],
@@ -8,8 +8,8 @@ class CommandHandler:
8
8
  self.handler = handler
9
9
  self.handled_command = handled_command
10
10
 
11
- def handling(self, input_flags: InputFlags):
12
- if input_flags.get_flags():
11
+ def handling(self, input_flags: InputFlags = None):
12
+ if input_flags is not None:
13
13
  self.handler(input_flags)
14
14
  else:
15
15
  self.handler()
argenta/router/entity.py CHANGED
@@ -22,7 +22,6 @@ class Router:
22
22
 
23
23
  self._command_handlers: CommandHandlers = CommandHandlers()
24
24
  self._ignore_command_register: bool = False
25
-
26
25
  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 ''}")
27
26
 
28
27
 
@@ -51,23 +50,20 @@ class Router:
51
50
  def input_command_handler(self, input_command: InputCommand):
52
51
  input_command_name: str = input_command.get_trigger()
53
52
  input_command_flags: InputFlags = input_command.get_input_flags()
53
+
54
54
  for command_handler in self._command_handlers:
55
55
  handle_command = command_handler.get_handled_command()
56
56
  if input_command_name.lower() == handle_command.get_trigger().lower():
57
- if handle_command.get_registered_flags():
58
- if input_command_flags:
59
- for flag in input_command_flags:
60
- is_valid = handle_command.validate_input_flag(flag)
61
- if not is_valid:
62
- self._not_valid_flag_handler(flag)
63
- return
64
- command_handler.handling(input_command_flags)
65
- return
57
+ if handle_command.get_registered_flags().get_flags():
58
+ if input_command_flags.get_flags():
59
+ if self._validate_input_flags(handle_command, input_command_flags):
60
+ command_handler.handling(input_command_flags)
61
+ return
66
62
  else:
67
- command_handler.handling({})
63
+ command_handler.handling(input_command_flags)
68
64
  return
69
65
  else:
70
- if input_command_flags:
66
+ if input_command_flags.get_flags():
71
67
  self._not_valid_flag_handler(input_command_flags[0])
72
68
  return
73
69
  else:
@@ -75,6 +71,15 @@ class Router:
75
71
  return
76
72
 
77
73
 
74
+ def _validate_input_flags(self, handle_command: Command, input_flags: InputFlags):
75
+ for flag in input_flags:
76
+ is_valid = handle_command.validate_input_flag(flag)
77
+ if not is_valid:
78
+ self._not_valid_flag_handler(flag)
79
+ return False
80
+ return True
81
+
82
+
78
83
  @staticmethod
79
84
  def _validate_command(command: Command):
80
85
  command_name: str = command.get_trigger()
@@ -119,11 +124,3 @@ class Router:
119
124
 
120
125
  def set_title(self, title: str):
121
126
  self._title = title
122
-
123
-
124
- def get_all_commands(self) -> list[str]:
125
- all_commands: list[str] = []
126
- for command_handler in self._command_handlers:
127
- all_commands.append(command_handler.get_handled_command().get_trigger())
128
-
129
- return all_commands
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: argenta
3
- Version: 0.4.5
3
+ Version: 0.4.7
4
4
  Summary: python library for creating custom shells
5
5
  License: MIT
6
6
  Author: kolo
@@ -11,6 +11,8 @@ Classifier: Programming Language :: Python :: 3
11
11
  Classifier: Programming Language :: Python :: 3.11
12
12
  Classifier: Programming Language :: Python :: 3.12
13
13
  Classifier: Programming Language :: Python :: 3.13
14
+ Requires-Dist: art (>=6.4,<7.0)
15
+ Requires-Dist: rich (>=14.0.0,<15.0.0)
14
16
  Description-Content-Type: text/markdown
15
17
 
16
18
  # Argenta
@@ -20,6 +22,9 @@ Description-Content-Type: text/markdown
20
22
  ## Описание
21
23
  **Argenta** — Python library for creating custom shells
22
24
 
25
+ ![prewiev](https://github.com/koloideal/Argenta/blob/kolo/imgs/mock_app_preview_last.png?raw=True)
26
+ Пример внешнего вида TUI, написанного с помощью Argenta
27
+
23
28
  ---
24
29
 
25
30
  # Установка
@@ -107,33 +112,29 @@ def handler_with_flags(flags: InputFlags):
107
112
 
108
113
  ### Конструктор
109
114
  ```python
110
- App(prompt: str = 'Enter a command',
111
- initial_greeting: str = '\nHello, I am Argenta\n',
112
- farewell_message: str = '\nGoodBye\n',
115
+ App(prompt: str = 'What do you want to do?\n',
116
+ initial_message: str = 'Argenta',
117
+ farewell_message: str = 'See you',
113
118
  exit_command: str = 'Q',
114
119
  exit_command_description: str = 'Exit command',
115
120
  system_points_title: str = 'System points:',
116
- ignore_exit_command_register: bool = True,
117
- ignore_command_register: bool = False,
118
- line_separate: str = '',
119
- command_group_description_separate: str = '',
121
+ ignore_command_register: bool = True,
122
+ line_separate: str = '-----',
120
123
  repeat_command_groups: bool = True,
121
- print_func: Callable[[str], None] = print)
124
+ print_func: Callable[[str], None] = Console().print)
122
125
  ```
123
126
  **Аргументы:**
124
127
  - **name : mean**
125
128
  - `prompt` (`str`): Сообщение перед вводом команды.
126
- - `initial_greeting` (`str`): Приветственное сообщение при запуске.
129
+ - `initial_message` (`str`): Приветственное сообщение при запуске.
127
130
  - `farewell_message` (`str`): Сообщение при выходе.
128
131
  - `exit_command` (`str`): Команда выхода (по умолчанию `'Q'`).
129
132
  - `exit_command_description` (`str`): Описание команды выхода.
130
133
  - `system_points_title` (`str`): Заголовок перед списком системных команд.
131
- - `ignore_exit_command_register` (`bool`): Игнорировать регистр команды выхода.
132
134
  - `ignore_command_register` (`bool`): Игнорировать регистр всех команд.
133
135
  - `line_separate` (`str`): Разделительная строка между командами.
134
- - `command_group_description_separate` (`str`): Разделитель между группами команд.
135
136
  - `repeat_command_groups` (`bool`): Повторять описание команд перед вводом.
136
- - `print_func` (`Callable[[str], None]`): Функция вывода текста в терминал (по умолчанию `print`).
137
+ - `print_func` (`Callable[[str], None]`): Функция вывода текста в терминал.
137
138
 
138
139
  ---
139
140
 
@@ -143,94 +144,83 @@ App(prompt: str = 'Enter a command',
143
144
 
144
145
  #### **.start_polling() -> `None`**
145
146
 
146
- *method mean* **::** запускает цикл обработки ввода
147
+ *method mean* **::** Запускает цикл обработки ввода
147
148
 
148
149
  ---
149
150
 
150
151
  #### **.include_router(router: Router) -> `None`**
151
152
 
152
- *param* `router: Router` **::** регистрируемый роутер
153
+ *param* `router: Router` **::** Регистрируемый роутер
153
154
  *required* **::** True
154
155
 
155
- *method mean* **::** регистрирует роутер в оболочке
156
+ *method mean* **::** Регистрирует роутер в оболочке
156
157
 
157
158
  ---
158
159
 
159
- #### **.set_initial_message(message: str) -> `None`**
160
+ #### **.include_routers(\*routers: Router) -> `None`**
160
161
 
161
- *param* `message: str` **::** устанавливаемое приветственное сообщение
162
- *required* **::** True
163
- *example* **::** `"Hello, I'm a example app"`
162
+ *param* `routers: Router` **::** Неограниченное количество регистрируемых роутеров
163
+ *required* **::** True
164
164
 
165
- *method mean* **::** устанавливает сообщение, которое будет отображено при запуске программы
165
+ *method mean* **::** Регистрирует роутер в оболочке
166
166
 
167
167
  ---
168
168
 
169
- #### **.set_farewell_message(message: str) -> `None`**
169
+ #### **.set_description_message_pattern(pattern: str) -> `None`**
170
170
 
171
- *param* `message: str` **::** устанавливаемое сообщение при выходе
171
+ *param* `pattern: str` **::** Паттерн описания команды при её выводе в консоль
172
172
  *required* **::** True
173
- *example* **::** `"GoodBye !"`
173
+ *example* **::** `"[{command}] *=*=* {description}"`
174
174
 
175
- *method mean* **::** устанавливает сообщение, которое будет отображено при выходе
175
+ *method mean* **::** Устанавливает паттерн описания команд, который будет использован
176
+ при выводе в консоль
176
177
 
177
178
  ---
178
179
 
179
- #### **.set_description_message_pattern(pattern: str) -> `None`**
180
+ #### **.add_message_on_startup(message: str) -> `None`**
180
181
 
181
- *param* `pattern: str` **::** паттерн описания команды при её выводе в консоль
182
+ *param* `message: str` **::** Сообщение, которое будет выведено при запуске приложения
182
183
  *required* **::** True
183
- *example* **::** `"[{command}] *=*=* {description}"`
184
+ *example* **::** `Message on startup`
184
185
 
185
- *method mean* **::** устанавливает паттерн описания команд, который будет использован
186
+ *method mean* **::** Устанавливает паттерн описания команд, который будет использован
186
187
  при выводе в консоль
187
188
 
188
189
  ---
190
+
189
191
  <a name="custom_handler"></a>
190
- #### **.set_repeated_input_flags_handler(handler: Callable[[str], None]) -> `None`**
192
+ #### **.repeated_input_flags_handler: `Callable[[str], None])`**
191
193
 
192
- *param* `handler: Callable[[str], None]` **::** функция или лямбда функция, которой будет передано управление при
193
- вводе юзером повторяющихся флагов
194
- *required* **::** True
195
194
  *example* **::** `lambda raw_command: print_func(f'Repeated input flags: "{raw_command}"')`
196
195
 
197
- *method mean* **::** устанавливает функцию, которой будет передано управление при
196
+ *attr mean* **::** Устанавливает функцию, которой будет передано управление при
198
197
  вводе юзером повторяющихся флагов
199
198
 
200
199
  ---
201
200
 
202
- #### **.set_invalid_input_flags_handler(self, handler: Callable[[str], None]) -> `None`**
201
+ #### **.invalid_input_flags_handler: `Callable[[str], None])`**
203
202
 
204
- *param* `handler: Callable[[str], None]` **::** функция или лямбда функция, которой будет передано управление при
205
- вводе юзером команды с некорректным синтаксисом флагов
206
- *required* **::** True
207
203
  *example* **::** `lambda raw_command: print_func(f'Incorrect flag syntax: "{raw_command}"')`
208
204
 
209
- *method mean* **::** устанавливает функцию, которой будет передано управление при
205
+ *attr mean* **::** Устанавливает функцию, которой будет передано управление при
210
206
  вводе юзером команды с некорректным синтаксисом флагов
211
207
 
212
208
  ---
213
209
 
214
- #### **.set_unknown_command_handler(self, handler: Callable[[str], None]) -> `None`**
210
+ #### **.unknown_command_handler: `Callable[[str], None]`**
215
211
 
216
- *param* `handler: Callable[[str], None]` **::** функция или лямбда функция, которой будет передано управление при
217
- вводе юзером неизвестной команды
218
- *required* **::** True
219
212
  *example* **::** `lambda command: print_func(f"Unknown command: {command.get_string_entity()}")`
220
213
 
221
- *method mean* **::** устанавливает функцию, которой будет передано управление при
214
+ *attr mean* **::** Устанавливает функцию, которой будет передано управление при
222
215
  вводе юзером неизвестной команды
223
216
 
224
217
  ---
225
218
 
226
- #### **.set_empty_command_handler(self, handler: Callable[[str], None]) -> `None`**
219
+ #### **.empty_command_handler: `Callable[[str], None])`**
227
220
 
228
- *param* `handler: Callable[[str], None]` **::** функция или лямбда функция, которой будет передано управление при
229
- вводе юзером пустой команды
230
- *required* **::** True
231
221
  *example* **::** `lambda: print_func(f'Empty input command')`
232
222
 
233
- *method mean* **::** устанавливает функцию, которой будет передано управление при
223
+ *attr mean* **::** Устанавливает функцию, которой будет передано управление при
234
224
  вводе юзером пустой команды
235
225
 
236
226
  ---
@@ -248,6 +238,9 @@ App(prompt: str = 'Enter a command',
248
238
  `RepeatedCommandInDifferentRoutersException`. Исключение вызывается только при наличии пересекающихся команд
249
239
  у __<u>разных</u>__ роутеров
250
240
 
241
+ - Наиболее частые сообщение при запуске предопределены и доступны для быстрого
242
+ использования: `argenta.app.defaults.PredeterminedMessages`
243
+
251
244
 
252
245
 
253
246
 
@@ -256,9 +249,7 @@ App(prompt: str = 'Enter a command',
256
249
  - `InvalidRouterInstanceException` — Переданный объект в метод `App().include_router()` не является экземпляром класса `Router`.
257
250
  - `InvalidDescriptionMessagePatternException` — Неправильный формат паттерна описания команд.
258
251
  - `IncorrectNumberOfHandlerArgsException` — У обработчика нестандартного поведения зарегистрировано неверное количество аргументов(в большинстве случаев у него должен быть один аргумент).
259
- - `NoRegisteredRoutersException` — Отсутствуют зарегистрированные роутеры.
260
252
  - `NoRegisteredHandlersException` — У роутера нет ни одного обработчика команд.
261
- - `RepeatedCommandInDifferentRoutersException` — Одна и та же команда зарегистрирована в разных роутерах.
262
253
 
263
254
  ---
264
255
 
@@ -286,32 +277,27 @@ Router(title: str = 'Commands group title:',
286
277
 
287
278
  #### **command(command: Command)**
288
279
 
289
- *param* `command: Command` **::** экземпляр класса `Command`, который определяет строковый триггер команды,
280
+ *param* `command: Command` **::** Экземпляр класса `Command`, который определяет строковый триггер команды,
290
281
  допустимые флаги команды и другое
291
282
  *required* **::** True
292
283
  *example* **::** `Command(command='ssh', description='connect via ssh')`
293
284
 
294
- *method mean* **::** декоратор, который регистрирует функцию как обработчик команды
285
+ *method mean* **::** Декоратор, который регистрирует функцию как обработчик команды
295
286
 
296
287
  ---
297
288
 
298
289
  #### **.get_name() -> `str`**
299
290
 
300
- *method mean* **::** возвращает установленное название роутера
291
+ *method mean* **::** Возвращает установленное название роутера
301
292
 
302
293
  ---
303
294
 
304
295
  #### **.get_title() -> `str`**
305
296
 
306
- *method mean* **::** возвращает установленный заголовок группы команд данного роутера
297
+ *method mean* **::** Возвращает установленный заголовок группы команд данного роутера
307
298
 
308
299
  ---
309
300
 
310
- #### **.get_all_commands() -> `list[str]`**
311
-
312
- *method mean* **::** возвращает все зарегистрированные команды для данного роутера
313
-
314
- ---
315
301
 
316
302
  ### Исключения
317
303
  - `RepeatedFlagNameException` - Повторяющиеся зарегистрированные флаги в команде
@@ -342,19 +328,19 @@ Command(trigger: str,
342
328
 
343
329
  #### **.get_trigger() -> `str`**
344
330
 
345
- *method mean* **::** возвращает строковый триггер экземпляра
331
+ *method mean* **::** Возвращает строковый триггер экземпляра
346
332
 
347
333
  ---
348
334
 
349
335
  #### **.get_description() -> `str`**
350
336
 
351
- *method mean* **::** возвращает описание команды
337
+ *method mean* **::** Возвращает описание команды
352
338
 
353
339
  ---
354
340
 
355
341
  #### **.get_registered_flags() -> `Flags | None`**
356
342
 
357
- *method mean* **::** возвращает зарегистрированные флаги экземпляра
343
+ *method mean* **::** Возвращает зарегистрированные флаги экземпляра
358
344
 
359
345
  ---
360
346
 
@@ -376,18 +362,18 @@ Command(trigger: str,
376
362
 
377
363
  ### Конструктор
378
364
  ```python
379
- Flag(flag_name: str,
380
- flag_prefix: typing.Literal['-', '--', '---'] = '-',
381
- possible_flag_values: list[str] | typing.Pattern[str] | False = True)
365
+ Flag(name: str,
366
+ prefix: typing.Literal['-', '--', '---'] = '-',
367
+ possible_values: list[str] | typing.Pattern[str] | False = True)
382
368
  ```
383
369
 
384
370
  ---
385
371
 
386
372
  **Аргументы:**
387
373
  - **name : mean**
388
- - `flag_name` (`str`): Имя флага
389
- - `flag_prefix` (`Literal['-', '--', '---']`): Префикс команды, допустимым значением является от одного до трёх минусов
390
- - `possible_flag_values` (`list[str] | Pattern[str] | bool`): Множество допустимых значений флага, может быть задано
374
+ - `name` (`str`): Имя флага
375
+ - `prefix` (`Literal['-', '--', '---']`): Префикс команды, допустимым значением является от одного до трёх минусов
376
+ - `possible_values` (`list[str] | Pattern[str] | bool`): Множество допустимых значений флага, может быть задано
391
377
  списком с допустимыми значениями или регулярным выражением (рекомендуется `re.compile(r'example exspression')`), при значении
392
378
  аргумента `False` у введённого флага не может быть значения, иначе будет вызвано исключение и обработано соответствующим
393
379
  еррор-хэндлером
@@ -400,19 +386,60 @@ Flag(flag_name: str,
400
386
 
401
387
  #### **.get_string_entity() -> `str`**
402
388
 
403
- *method mean* **::** возвращает строковое представление флага(префикс + имя)
389
+ *method mean* **::** Возвращает строковое представление флага(префикс + имя)
404
390
 
405
391
  ---
406
392
 
407
- #### **.get_flag_name() -> `str`**
393
+ #### **.get_name() -> `str`**
408
394
 
409
- *method mean* **::** возвращает имя флага
395
+ *method mean* **::** Возвращает имя флага
410
396
 
411
397
  ---
412
398
 
413
- #### **.get_flag_prefix() -> `str`**
399
+ #### **.get_prefix() -> `str`**
400
+
401
+ *method mean* **::** Возвращает префикс флага
402
+
403
+ ---
414
404
 
415
- *method mean* **::** возвращает префикс флага
405
+ ## *class* :: `InputFlag`
406
+ Класс, экземпляры которого являются введёнными флагами команды, передаётся в хэндлер команды
407
+ через `InputFlags`
408
+
409
+ ---
410
+
411
+ ### Примечания
412
+
413
+ - Наиболее часто используемые флаги предопределены и доступны для быстрого использования:
414
+ `argenta.command.flag.defaults.PredeterminedFlags`
415
+
416
+ ---
417
+
418
+
419
+ ### Конструктор
420
+ ```python
421
+ InputFlag(name: str,
422
+ prefix: typing.Literal['-', '--', '---'] = '-',
423
+ value: str = None)
424
+ ```
425
+
426
+ ---
427
+
428
+ **Аргументы:**
429
+ - **name : mean**
430
+ - `name` (`str`): Имя флага
431
+ - `prefix` (`Literal['-', '--', '---']`): Префикс команды, допустимым значением является от одного до трёх минусов
432
+ - `value` (`str`): Значение введённого флага, если оно есть
433
+
434
+ ---
435
+
436
+ ### ***methods***
437
+
438
+ ---
439
+
440
+ #### **.get_value() -> `str | None`**
441
+
442
+ *method mean* **::** Возвращает значение введённого флага
416
443
 
417
444
  ---
418
445
 
@@ -423,7 +450,7 @@ Flag(flag_name: str,
423
450
 
424
451
  ### Конструктор
425
452
  ```python
426
- Flags(*flagы: Flag)
453
+ Flags(*flags: Flag)
427
454
  ```
428
455
 
429
456
  ---
@@ -440,7 +467,66 @@ Flags(*flagы: Flag)
440
467
 
441
468
  #### **.get_flags() -> `list[Flag]`**
442
469
 
443
- *method mean* **::** возвращает зарегистрированные флаги
470
+ *method mean* **::** Возвращает зарегистрированные флаги
471
+
472
+ ---
473
+
474
+ #### **.add_flag(flag: Flag) -> `None`**
475
+
476
+ *method mean* **::** Добавляет флаг в группу
477
+
478
+ ---
479
+
480
+ #### **.add_flags(flags: list[Flag]) -> `None`**
481
+
482
+ *method mean* **::** Добавляет флаги в группу
483
+
484
+ ---
485
+
486
+ #### **.get_flag(name: str) -> `Flag | None`**
487
+
488
+ *param* `name: str` **::** Строковый триггер флага без префикса
489
+ *required* **::** True
490
+ *example* **::** `'host'`
491
+
492
+ *method mean* **::** Возвращает флаг по его триггеру или `None`, если флаг не найден
493
+
494
+ ---
495
+
496
+ ## *class* :: `InputFlags`
497
+ Класс, объединяющий список введённых флагов в один объект, передаётся соответствующему хэндлеру
498
+ в качестве аргумента
499
+
500
+ ### Конструктор
501
+ ```python
502
+ InputFlags(*flags: Flag)
503
+ ```
504
+
505
+ ---
506
+
507
+ **Аргументы:**
508
+ - **name : mean**
509
+ - `*flags` (`InputFlag`): Неограниченное количество передаваемых флагов
510
+
511
+ ---
512
+
513
+ ### ***methods***
514
+
515
+ ---
516
+
517
+ #### **.get_flags() -> `list[Flag]`**
518
+
519
+ *method mean* **::** Возвращает введённые флаги
520
+
521
+ ---
522
+
523
+ #### **.get_flag(name: str) -> `InputFlag | None`**
524
+
525
+ *param* `name: str` **::** Строковый триггер флага без префикса
526
+ *required* **::** True
527
+ *example* **::** `'host'`
528
+
529
+ *method mean* **::** Возвращает введённый флаг по его триггеру или `None`, если флаг не найден
444
530
 
445
531
  ---
446
532
 
@@ -1,24 +1,25 @@
1
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
2
+ argenta/app/__init__.py,sha256=Slm_0b1yaXeJ78zUpo_sDSEzYuTSj3_DhRU6wU8XU9Q,46
3
+ argenta/app/defaults.py,sha256=7ej4G-4dieMlichfuQhw5XgabF15X-vAa8k02ZfkdUs,234
4
+ argenta/app/exceptions.py,sha256=uCkb1VqEIZQuVDY0ZsfDc3yCbySwLpV5CdIT7iaGYRM,928
5
+ argenta/app/models.py,sha256=IDC048SZP-jiw66x6ipz-lYOY7-CyD3mk-GHT8AyqCo,9338
5
6
  argenta/app/registered_routers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
7
  argenta/app/registered_routers/entity.py,sha256=OQZyrF4eoCoDHzRJ22zZxhNEx-bOUDu7NZIFDfO-fuY,688
7
8
  argenta/command/__init__.py,sha256=Yx5Zl5Diwhjs8SZrsYEBNJscTMxWkLP0nqPvAJZtu30,52
8
- argenta/command/exceptions.py,sha256=J3kNY6CFoOxJXsZ23Bfl6f5uVUSiKZfwiGPBmlOwN5M,578
9
+ argenta/command/exceptions.py,sha256=HOgddtXLDgk9Wx6c_GnzW3bMAMU5CuUnUyxjW3cVHRo,687
9
10
  argenta/command/flag/__init__.py,sha256=Ew-ZRFVY7sC_PMvavN0AEcsvdYGHkLAPOYMrReY3NC0,116
10
11
  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
12
+ argenta/command/flag/models.py,sha256=IY0FHyAFD9O1ZxSaq6NR9gSTkldoQGrKVoGrAbnmEuA,3769
13
+ argenta/command/models.py,sha256=4MoO22EijeoMGmwYi88BSnBrip8fre2KpULGt8-NouY,4434
13
14
  argenta/router/__init__.py,sha256=uP58EfcmtK2NuMBQaspD_Gmq3LqgDXus4rfB6hp9Uig,52
14
15
  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_handler/entity.py,sha256=8sWhP89c0FavFBITJmH9c8wNn2ipW_6-_obzjkwXueU,646
16
17
  argenta/router/command_handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
18
  argenta/router/command_handlers/entity.py,sha256=KgFKjAMUr_mOcn9xahTxMUKB6lIxXgqCuAsuc4TgP6E,747
18
19
  argenta/router/defaults.py,sha256=huftOg1HMjrT_R2SHHOL4eJ5uZHspNEYBSg-mCq9xhU,126
19
- argenta/router/entity.py,sha256=-88RWF2IEKBUwM7zfUiN0rrDjVpU94m4y5nuspld5ao,5073
20
+ argenta/router/entity.py,sha256=afQn5jrDBrcd5QUzeBwRPfazOO6x0yYSXcmvHYhJpDw,4997
20
21
  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,,
22
+ argenta-0.4.7.dist-info/LICENSE,sha256=zmqoGh2n5rReBv4s8wPxF_gZEZDgauJYSPMuPczgOiU,1082
23
+ argenta-0.4.7.dist-info/METADATA,sha256=Yq80fNHrGnZheM_3OpCM-BTsPEL93ItT1Z8ikKAh0rs,19205
24
+ argenta-0.4.7.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
25
+ argenta-0.4.7.dist-info/RECORD,,
argenta/app/entity.py DELETED
@@ -1,262 +0,0 @@
1
- from typing import Callable
2
- from inspect import getfullargspec
3
- import re
4
-
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,
9
- RepeatedInputFlagsException,
10
- EmptyInputCommandException)
11
- from argenta.app.exceptions import (InvalidRouterInstanceException,
12
- InvalidDescriptionMessagePatternException,
13
- NoRegisteredRoutersException,
14
- NoRegisteredHandlersException,
15
- IncorrectNumberOfHandlerArgsException)
16
- from argenta.app.registered_routers.entity import RegisteredRouters
17
-
18
-
19
- class App:
20
- def __init__(self,
21
- prompt: str = 'Enter a command',
22
- initial_message: str = '\nHello, I am Argenta\n',
23
- farewell_message: str = '\nGoodBye\n',
24
- invalid_input_flags_message: str = 'Invalid input flags',
25
- exit_command: str = 'Q',
26
- exit_command_description: str = 'Exit command',
27
- system_points_title: str = 'System points:',
28
- ignore_exit_command_register: bool = True,
29
- ignore_command_register: bool = False,
30
- line_separate: str = '',
31
- command_group_description_separate: str = '',
32
- repeat_command_groups: bool = True,
33
- messages_on_startup: list[str] = None,
34
- print_func: Callable[[str], None] = print) -> None:
35
- self.prompt = prompt
36
- self.print_func = print_func
37
- self.exit_command = exit_command
38
- self.exit_command_description = exit_command_description
39
- self.system_points_title = system_points_title
40
- self.ignore_exit_command_register = ignore_exit_command_register
41
- self.farewell_message = farewell_message
42
- self.initial_message = initial_message
43
- self.invalid_input_flags_message = invalid_input_flags_message
44
- self.line_separate = line_separate
45
- self.command_group_description_separate = command_group_description_separate
46
- self.ignore_command_register = ignore_command_register
47
- self.repeat_command_groups = repeat_command_groups
48
- self.messages_on_startup = messages_on_startup if messages_on_startup else []
49
-
50
- self._description_message_pattern: str = '[{command}] *=*=* {description}'
51
- self._registered_routers: RegisteredRouters = RegisteredRouters()
52
- self._invalid_input_flags_handler: Callable[[str], None] = lambda raw_command: print_func(f'Incorrect flag syntax: "{raw_command}"')
53
- self._repeated_input_flags_handler: Callable[[str], None] = lambda raw_command: print_func(f'Repeated input flags: "{raw_command}"')
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)
57
-
58
-
59
- def start_polling(self) -> None:
60
- self._setup_system_router()
61
- self._validate_number_of_routers()
62
- self._validate_included_routers()
63
-
64
- self.print_func(self.initial_message)
65
-
66
- for message in self.messages_on_startup:
67
- self.print_func(message)
68
-
69
- if not self.repeat_command_groups:
70
- self._print_command_group_description()
71
- self.print_func(self.prompt)
72
-
73
- while True:
74
- if self.repeat_command_groups:
75
- self._print_command_group_description()
76
- self.print_func(self.prompt)
77
-
78
- raw_command: str = input()
79
-
80
- try:
81
- input_command: InputCommand = InputCommand.parse(raw_command=raw_command)
82
- except (UnprocessedInputFlagException,
83
- RepeatedInputFlagsException,
84
- EmptyInputCommandException) as error:
85
- self.print_func(self.line_separate)
86
- self._error_handler(error, raw_command)
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
- is_exit = self._is_exit_command(input_command)
94
- if is_exit:
95
- return
96
-
97
- self.print_func(self.line_separate)
98
- is_unknown_command: bool = self._check_is_command_unknown(input_command)
99
-
100
- if is_unknown_command:
101
- self.print_func(self.line_separate)
102
- self.print_func(self.command_group_description_separate)
103
- if not self.repeat_command_groups:
104
- self.print_func(self.prompt)
105
- continue
106
-
107
- for registered_router in self._registered_routers:
108
- registered_router.input_command_handler(input_command)
109
-
110
- self.print_func(self.line_separate)
111
- self.print_func(self.command_group_description_separate)
112
- if not self.repeat_command_groups:
113
- self.print_func(self.prompt)
114
-
115
-
116
- def set_initial_message(self, message: str) -> None:
117
- self.initial_message: str = message
118
-
119
-
120
- def set_farewell_message(self, message: str) -> None:
121
- self.farewell_message: str = message
122
-
123
-
124
- def set_description_message_pattern(self, pattern: str) -> None:
125
- first_check = re.match(r'.*{command}.*', pattern)
126
- second_check = re.match(r'.*{description}.*', pattern)
127
-
128
- if bool(first_check) and bool(second_check):
129
- self._description_message_pattern: str = pattern
130
- else:
131
- raise InvalidDescriptionMessagePatternException(pattern)
132
-
133
-
134
- def set_invalid_input_flags_handler(self, handler: Callable[[str], None]) -> None:
135
- args = getfullargspec(handler).args
136
- if len(args) != 1:
137
- raise IncorrectNumberOfHandlerArgsException()
138
- else:
139
- self._invalid_input_flags_handler = handler
140
-
141
-
142
- def set_repeated_input_flags_handler(self, handler: Callable[[str], None]) -> None:
143
- args = getfullargspec(handler).args
144
- if len(args) != 1:
145
- raise IncorrectNumberOfHandlerArgsException()
146
- else:
147
- self._repeated_input_flags_handler = handler
148
-
149
-
150
- def set_unknown_command_handler(self, handler: Callable[[str], None]) -> None:
151
- args = getfullargspec(handler).args
152
- if len(args) != 1:
153
- raise IncorrectNumberOfHandlerArgsException()
154
- else:
155
- self._unknown_command_handler = handler
156
-
157
-
158
- def set_empty_command_handler(self, handler: Callable[[str], None]) -> None:
159
- args = getfullargspec(handler).args
160
- if len(args) != 1:
161
- raise IncorrectNumberOfHandlerArgsException()
162
- else:
163
- self._empty_input_command_handler = handler
164
-
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
-
178
- def include_router(self, router: Router) -> None:
179
- if not isinstance(router, Router):
180
- raise InvalidRouterInstanceException()
181
-
182
- router.set_ignore_command_register(self.ignore_command_register)
183
- self._registered_routers.add_registered_router(router)
184
-
185
-
186
- def include_routers(self, *routers: Router) -> None:
187
- for router in routers:
188
- self.include_router(router)
189
-
190
-
191
- def _validate_number_of_routers(self) -> None:
192
- if not self._registered_routers:
193
- raise NoRegisteredRoutersException()
194
-
195
-
196
- def _validate_included_routers(self) -> None:
197
- for router in self._registered_routers:
198
- if not router.get_command_handlers():
199
- raise NoRegisteredHandlersException(router.get_name())
200
-
201
-
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)
209
-
210
-
211
- def _is_exit_command(self, command: InputCommand):
212
- if command.get_trigger().lower() == self.exit_command.lower():
213
- if self.ignore_exit_command_register:
214
- system_router.input_command_handler(command)
215
- return True
216
- else:
217
- if command.get_trigger() == self.exit_command:
218
- system_router.input_command_handler(command)
219
- return True
220
- return False
221
-
222
-
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():
228
- if self.ignore_command_register:
229
- return False
230
- else:
231
- if handled_command_trigger == command.get_trigger():
232
- return False
233
- self._unknown_command_handler(command)
234
- return True
235
-
236
-
237
- def _print_command_group_description(self):
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():
241
- self.print_func(self._description_message_pattern.format(
242
- command=command_handler.get_handled_command().get_trigger(),
243
- description=command_handler.get_handled_command().get_description()
244
- )
245
- )
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
-