argenta 0.4.6__tar.gz → 0.4.8__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 (27) hide show
  1. {argenta-0.4.6 → argenta-0.4.8}/PKG-INFO +190 -79
  2. {argenta-0.4.6 → argenta-0.4.8}/README.md +188 -77
  3. argenta-0.4.8/argenta/app/dividing_line/models.py +24 -0
  4. {argenta-0.4.6 → argenta-0.4.8}/argenta/app/models.py +45 -23
  5. {argenta-0.4.6 → argenta-0.4.8}/argenta/command/flag/models.py +1 -1
  6. {argenta-0.4.6 → argenta-0.4.8}/argenta/command/models.py +1 -0
  7. argenta-0.4.8/argenta/router/command_handlers/__init__.py +0 -0
  8. {argenta-0.4.6 → argenta-0.4.8}/pyproject.toml +2 -2
  9. {argenta-0.4.6 → argenta-0.4.8}/LICENSE +0 -0
  10. {argenta-0.4.6 → argenta-0.4.8}/argenta/__init__.py +0 -0
  11. {argenta-0.4.6 → argenta-0.4.8}/argenta/app/__init__.py +0 -0
  12. {argenta-0.4.6 → argenta-0.4.8}/argenta/app/defaults.py +0 -0
  13. {argenta-0.4.6/argenta/app/registered_routers → argenta-0.4.8/argenta/app/dividing_line}/__init__.py +0 -0
  14. {argenta-0.4.6 → argenta-0.4.8}/argenta/app/exceptions.py +0 -0
  15. {argenta-0.4.6/argenta/router/command_handler → argenta-0.4.8/argenta/app/registered_routers}/__init__.py +0 -0
  16. {argenta-0.4.6 → argenta-0.4.8}/argenta/app/registered_routers/entity.py +0 -0
  17. {argenta-0.4.6 → argenta-0.4.8}/argenta/command/__init__.py +0 -0
  18. {argenta-0.4.6 → argenta-0.4.8}/argenta/command/exceptions.py +0 -0
  19. {argenta-0.4.6 → argenta-0.4.8}/argenta/command/flag/__init__.py +0 -0
  20. {argenta-0.4.6 → argenta-0.4.8}/argenta/command/flag/defaults.py +0 -0
  21. {argenta-0.4.6 → argenta-0.4.8}/argenta/router/__init__.py +0 -0
  22. {argenta-0.4.6/argenta/router/command_handlers → argenta-0.4.8/argenta/router/command_handler}/__init__.py +0 -0
  23. {argenta-0.4.6 → argenta-0.4.8}/argenta/router/command_handler/entity.py +0 -0
  24. {argenta-0.4.6 → argenta-0.4.8}/argenta/router/command_handlers/entity.py +0 -0
  25. {argenta-0.4.6 → argenta-0.4.8}/argenta/router/defaults.py +0 -0
  26. {argenta-0.4.6 → argenta-0.4.8}/argenta/router/entity.py +0 -0
  27. {argenta-0.4.6 → argenta-0.4.8}/argenta/router/exceptions.py +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: argenta
3
- Version: 0.4.6
4
- Summary: python library for creating custom shells
3
+ Version: 0.4.8
4
+ Summary: Python library for creating TUI
5
5
  License: MIT
6
6
  Author: kolo
7
7
  Author-email: kolo.is.main@gmail.com
@@ -22,7 +22,7 @@ Description-Content-Type: text/markdown
22
22
  ## Описание
23
23
  **Argenta** — Python library for creating custom shells
24
24
 
25
- ![prewiev](imgs/mock_app_preview_last.png)
25
+ ![prewiev](https://github.com/koloideal/Argenta/blob/kolo/imgs/mock_app_preview_last.png?raw=True)
26
26
  Пример внешнего вида TUI, написанного с помощью Argenta
27
27
 
28
28
  ---
@@ -112,33 +112,29 @@ def handler_with_flags(flags: InputFlags):
112
112
 
113
113
  ### Конструктор
114
114
  ```python
115
- App(prompt: str = 'Enter a command',
116
- initial_greeting: str = '\nHello, I am Argenta\n',
117
- 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',
118
118
  exit_command: str = 'Q',
119
119
  exit_command_description: str = 'Exit command',
120
120
  system_points_title: str = 'System points:',
121
- ignore_exit_command_register: bool = True,
122
- ignore_command_register: bool = False,
123
- line_separate: str = '',
124
- command_group_description_separate: str = '',
121
+ ignore_command_register: bool = True,
122
+ dividing_line: StaticDividingLine | DynamicDividingLine = StaticDividingLine(),
125
123
  repeat_command_groups: bool = True,
126
- print_func: Callable[[str], None] = print)
124
+ print_func: Callable[[str], None] = Console().print)
127
125
  ```
128
126
  **Аргументы:**
129
127
  - **name : mean**
130
128
  - `prompt` (`str`): Сообщение перед вводом команды.
131
- - `initial_greeting` (`str`): Приветственное сообщение при запуске.
129
+ - `initial_message` (`str`): Приветственное сообщение при запуске.
132
130
  - `farewell_message` (`str`): Сообщение при выходе.
133
131
  - `exit_command` (`str`): Команда выхода (по умолчанию `'Q'`).
134
132
  - `exit_command_description` (`str`): Описание команды выхода.
135
133
  - `system_points_title` (`str`): Заголовок перед списком системных команд.
136
- - `ignore_exit_command_register` (`bool`): Игнорировать регистр команды выхода.
137
134
  - `ignore_command_register` (`bool`): Игнорировать регистр всех команд.
138
- - `line_separate` (`str`): Разделительная строка между командами.
139
- - `command_group_description_separate` (`str`): Разделитель между группами команд.
135
+ - `dividing_line` (`StaticDividingLine | DynamicDividingLine`): Разделительная строка.
140
136
  - `repeat_command_groups` (`bool`): Повторять описание команд перед вводом.
141
- - `print_func` (`Callable[[str], None]`): Функция вывода текста в терминал (по умолчанию `print`).
137
+ - `print_func` (`Callable[[str], None]`): Функция вывода текста в терминал.
142
138
 
143
139
  ---
144
140
 
@@ -148,94 +144,83 @@ App(prompt: str = 'Enter a command',
148
144
 
149
145
  #### **.start_polling() -> `None`**
150
146
 
151
- *method mean* **::** запускает цикл обработки ввода
147
+ *method mean* **::** Запускает цикл обработки ввода
152
148
 
153
149
  ---
154
150
 
155
151
  #### **.include_router(router: Router) -> `None`**
156
152
 
157
- *param* `router: Router` **::** регистрируемый роутер
153
+ *param* `router: Router` **::** Регистрируемый роутер
158
154
  *required* **::** True
159
155
 
160
- *method mean* **::** регистрирует роутер в оболочке
156
+ *method mean* **::** Регистрирует роутер в оболочке
161
157
 
162
158
  ---
163
159
 
164
- #### **.set_initial_message(message: str) -> `None`**
160
+ #### **.include_routers(\*routers: Router) -> `None`**
165
161
 
166
- *param* `message: str` **::** устанавливаемое приветственное сообщение
167
- *required* **::** True
168
- *example* **::** `"Hello, I'm a example app"`
162
+ *param* `routers: Router` **::** Неограниченное количество регистрируемых роутеров
163
+ *required* **::** True
169
164
 
170
- *method mean* **::** устанавливает сообщение, которое будет отображено при запуске программы
165
+ *method mean* **::** Регистрирует роутер в оболочке
171
166
 
172
167
  ---
173
168
 
174
- #### **.set_farewell_message(message: str) -> `None`**
169
+ #### **.set_description_message_pattern(pattern: str) -> `None`**
175
170
 
176
- *param* `message: str` **::** устанавливаемое сообщение при выходе
171
+ *param* `pattern: str` **::** Паттерн описания команды при её выводе в консоль
177
172
  *required* **::** True
178
- *example* **::** `"GoodBye !"`
173
+ *example* **::** `"[{command}] *=*=* {description}"`
179
174
 
180
- *method mean* **::** устанавливает сообщение, которое будет отображено при выходе
175
+ *method mean* **::** Устанавливает паттерн описания команд, который будет использован
176
+ при выводе в консоль
181
177
 
182
178
  ---
183
179
 
184
- #### **.set_description_message_pattern(pattern: str) -> `None`**
180
+ #### **.add_message_on_startup(message: str) -> `None`**
185
181
 
186
- *param* `pattern: str` **::** паттерн описания команды при её выводе в консоль
182
+ *param* `message: str` **::** Сообщение, которое будет выведено при запуске приложения
187
183
  *required* **::** True
188
- *example* **::** `"[{command}] *=*=* {description}"`
184
+ *example* **::** `Message on startup`
189
185
 
190
- *method mean* **::** устанавливает паттерн описания команд, который будет использован
186
+ *method mean* **::** Устанавливает паттерн описания команд, который будет использован
191
187
  при выводе в консоль
192
188
 
193
189
  ---
190
+
194
191
  <a name="custom_handler"></a>
195
- #### **.set_repeated_input_flags_handler(handler: Callable[[str], None]) -> `None`**
192
+ #### **.repeated_input_flags_handler: `Callable[[str], None])`**
196
193
 
197
- *param* `handler: Callable[[str], None]` **::** функция или лямбда функция, которой будет передано управление при
198
- вводе юзером повторяющихся флагов
199
- *required* **::** True
200
194
  *example* **::** `lambda raw_command: print_func(f'Repeated input flags: "{raw_command}"')`
201
195
 
202
- *method mean* **::** устанавливает функцию, которой будет передано управление при
196
+ *attr mean* **::** Устанавливает функцию, которой будет передано управление при
203
197
  вводе юзером повторяющихся флагов
204
198
 
205
199
  ---
206
200
 
207
- #### **.set_invalid_input_flags_handler(self, handler: Callable[[str], None]) -> `None`**
201
+ #### **.invalid_input_flags_handler: `Callable[[str], None])`**
208
202
 
209
- *param* `handler: Callable[[str], None]` **::** функция или лямбда функция, которой будет передано управление при
210
- вводе юзером команды с некорректным синтаксисом флагов
211
- *required* **::** True
212
203
  *example* **::** `lambda raw_command: print_func(f'Incorrect flag syntax: "{raw_command}"')`
213
204
 
214
- *method mean* **::** устанавливает функцию, которой будет передано управление при
205
+ *attr mean* **::** Устанавливает функцию, которой будет передано управление при
215
206
  вводе юзером команды с некорректным синтаксисом флагов
216
207
 
217
208
  ---
218
209
 
219
- #### **.set_unknown_command_handler(self, handler: Callable[[str], None]) -> `None`**
210
+ #### **.unknown_command_handler: `Callable[[str], None]`**
220
211
 
221
- *param* `handler: Callable[[str], None]` **::** функция или лямбда функция, которой будет передано управление при
222
- вводе юзером неизвестной команды
223
- *required* **::** True
224
212
  *example* **::** `lambda command: print_func(f"Unknown command: {command.get_string_entity()}")`
225
213
 
226
- *method mean* **::** устанавливает функцию, которой будет передано управление при
214
+ *attr mean* **::** Устанавливает функцию, которой будет передано управление при
227
215
  вводе юзером неизвестной команды
228
216
 
229
217
  ---
230
218
 
231
- #### **.set_empty_command_handler(self, handler: Callable[[str], None]) -> `None`**
219
+ #### **.empty_command_handler: `Callable[[str], None])`**
232
220
 
233
- *param* `handler: Callable[[str], None]` **::** функция или лямбда функция, которой будет передано управление при
234
- вводе юзером пустой команды
235
- *required* **::** True
236
221
  *example* **::** `lambda: print_func(f'Empty input command')`
237
222
 
238
- *method mean* **::** устанавливает функцию, которой будет передано управление при
223
+ *attr mean* **::** Устанавливает функцию, которой будет передано управление при
239
224
  вводе юзером пустой команды
240
225
 
241
226
  ---
@@ -253,6 +238,9 @@ App(prompt: str = 'Enter a command',
253
238
  `RepeatedCommandInDifferentRoutersException`. Исключение вызывается только при наличии пересекающихся команд
254
239
  у __<u>разных</u>__ роутеров
255
240
 
241
+ - Наиболее частые сообщение при запуске предопределены и доступны для быстрого
242
+ использования: `argenta.app.defaults.PredeterminedMessages`
243
+
256
244
 
257
245
 
258
246
 
@@ -261,9 +249,37 @@ App(prompt: str = 'Enter a command',
261
249
  - `InvalidRouterInstanceException` — Переданный объект в метод `App().include_router()` не является экземпляром класса `Router`.
262
250
  - `InvalidDescriptionMessagePatternException` — Неправильный формат паттерна описания команд.
263
251
  - `IncorrectNumberOfHandlerArgsException` — У обработчика нестандартного поведения зарегистрировано неверное количество аргументов(в большинстве случаев у него должен быть один аргумент).
264
- - `NoRegisteredRoutersException` — Отсутствуют зарегистрированные роутеры.
265
252
  - `NoRegisteredHandlersException` — У роутера нет ни одного обработчика команд.
266
- - `RepeatedCommandInDifferentRoutersException` — Одна и та же команда зарегистрирована в разных роутерах.
253
+
254
+ ---
255
+
256
+ ## *class* :: `StaticDivideLine`
257
+ Класс, экземпляр которого представляет собой строковый разделитель фиксированной длины
258
+
259
+ ### Конструктор
260
+ ```python
261
+ StaticDivideLine(unit_part: str = '-',
262
+ length: int = 25)
263
+ ```
264
+
265
+ **Аргументы:**
266
+ - **name : mean**
267
+ - `unit_part` (`str`): Единичная часть строкового разделителя
268
+ - `length` (`int`): Длина строкового разделителя
269
+
270
+ ---
271
+
272
+ ## *class* :: `DinamicDivideLine`
273
+ Строковый разделитель динамической длины, которая определяется длиной обрамляемого вывода команды
274
+
275
+ ### Конструктор
276
+ ```python
277
+ DinamicDivideLine(unit_part: str = '-')
278
+ ```
279
+
280
+ **Аргументы:**
281
+ - **name : mean**
282
+ - `unit_part` (`str`): Единичная часть строкового разделителя
267
283
 
268
284
  ---
269
285
 
@@ -291,32 +307,27 @@ Router(title: str = 'Commands group title:',
291
307
 
292
308
  #### **command(command: Command)**
293
309
 
294
- *param* `command: Command` **::** экземпляр класса `Command`, который определяет строковый триггер команды,
310
+ *param* `command: Command` **::** Экземпляр класса `Command`, который определяет строковый триггер команды,
295
311
  допустимые флаги команды и другое
296
312
  *required* **::** True
297
313
  *example* **::** `Command(command='ssh', description='connect via ssh')`
298
314
 
299
- *method mean* **::** декоратор, который регистрирует функцию как обработчик команды
315
+ *method mean* **::** Декоратор, который регистрирует функцию как обработчик команды
300
316
 
301
317
  ---
302
318
 
303
319
  #### **.get_name() -> `str`**
304
320
 
305
- *method mean* **::** возвращает установленное название роутера
321
+ *method mean* **::** Возвращает установленное название роутера
306
322
 
307
323
  ---
308
324
 
309
325
  #### **.get_title() -> `str`**
310
326
 
311
- *method mean* **::** возвращает установленный заголовок группы команд данного роутера
327
+ *method mean* **::** Возвращает установленный заголовок группы команд данного роутера
312
328
 
313
329
  ---
314
330
 
315
- #### **.get_all_commands() -> `list[str]`**
316
-
317
- *method mean* **::** возвращает все зарегистрированные команды для данного роутера
318
-
319
- ---
320
331
 
321
332
  ### Исключения
322
333
  - `RepeatedFlagNameException` - Повторяющиеся зарегистрированные флаги в команде
@@ -347,19 +358,19 @@ Command(trigger: str,
347
358
 
348
359
  #### **.get_trigger() -> `str`**
349
360
 
350
- *method mean* **::** возвращает строковый триггер экземпляра
361
+ *method mean* **::** Возвращает строковый триггер экземпляра
351
362
 
352
363
  ---
353
364
 
354
365
  #### **.get_description() -> `str`**
355
366
 
356
- *method mean* **::** возвращает описание команды
367
+ *method mean* **::** Возвращает описание команды
357
368
 
358
369
  ---
359
370
 
360
371
  #### **.get_registered_flags() -> `Flags | None`**
361
372
 
362
- *method mean* **::** возвращает зарегистрированные флаги экземпляра
373
+ *method mean* **::** Возвращает зарегистрированные флаги экземпляра
363
374
 
364
375
  ---
365
376
 
@@ -381,18 +392,18 @@ Command(trigger: str,
381
392
 
382
393
  ### Конструктор
383
394
  ```python
384
- Flag(flag_name: str,
385
- flag_prefix: typing.Literal['-', '--', '---'] = '-',
386
- possible_flag_values: list[str] | typing.Pattern[str] | False = True)
395
+ Flag(name: str,
396
+ prefix: typing.Literal['-', '--', '---'] = '-',
397
+ possible_values: list[str] | typing.Pattern[str] | False = True)
387
398
  ```
388
399
 
389
400
  ---
390
401
 
391
402
  **Аргументы:**
392
403
  - **name : mean**
393
- - `flag_name` (`str`): Имя флага
394
- - `flag_prefix` (`Literal['-', '--', '---']`): Префикс команды, допустимым значением является от одного до трёх минусов
395
- - `possible_flag_values` (`list[str] | Pattern[str] | bool`): Множество допустимых значений флага, может быть задано
404
+ - `name` (`str`): Имя флага
405
+ - `prefix` (`Literal['-', '--', '---']`): Префикс команды, допустимым значением является от одного до трёх минусов
406
+ - `possible_values` (`list[str] | Pattern[str] | bool`): Множество допустимых значений флага, может быть задано
396
407
  списком с допустимыми значениями или регулярным выражением (рекомендуется `re.compile(r'example exspression')`), при значении
397
408
  аргумента `False` у введённого флага не может быть значения, иначе будет вызвано исключение и обработано соответствующим
398
409
  еррор-хэндлером
@@ -405,19 +416,60 @@ Flag(flag_name: str,
405
416
 
406
417
  #### **.get_string_entity() -> `str`**
407
418
 
408
- *method mean* **::** возвращает строковое представление флага(префикс + имя)
419
+ *method mean* **::** Возвращает строковое представление флага(префикс + имя)
420
+
421
+ ---
422
+
423
+ #### **.get_name() -> `str`**
424
+
425
+ *method mean* **::** Возвращает имя флага
426
+
427
+ ---
428
+
429
+ #### **.get_prefix() -> `str`**
430
+
431
+ *method mean* **::** Возвращает префикс флага
432
+
433
+ ---
434
+
435
+ ## *class* :: `InputFlag`
436
+ Класс, экземпляры которого являются введёнными флагами команды, передаётся в хэндлер команды
437
+ через `InputFlags`
438
+
439
+ ---
440
+
441
+ ### Примечания
442
+
443
+ - Наиболее часто используемые флаги предопределены и доступны для быстрого использования:
444
+ `argenta.command.flag.defaults.PredeterminedFlags`
445
+
446
+ ---
447
+
448
+
449
+ ### Конструктор
450
+ ```python
451
+ InputFlag(name: str,
452
+ prefix: typing.Literal['-', '--', '---'] = '-',
453
+ value: str = None)
454
+ ```
409
455
 
410
456
  ---
411
457
 
412
- #### **.get_flag_name() -> `str`**
458
+ **Аргументы:**
459
+ - **name : mean**
460
+ - `name` (`str`): Имя флага
461
+ - `prefix` (`Literal['-', '--', '---']`): Префикс команды, допустимым значением является от одного до трёх минусов
462
+ - `value` (`str`): Значение введённого флага, если оно есть
413
463
 
414
- *method mean* **::** возвращает имя флага
464
+ ---
465
+
466
+ ### ***methods***
415
467
 
416
468
  ---
417
469
 
418
- #### **.get_flag_prefix() -> `str`**
470
+ #### **.get_value() -> `str | None`**
419
471
 
420
- *method mean* **::** возвращает префикс флага
472
+ *method mean* **::** Возвращает значение введённого флага
421
473
 
422
474
  ---
423
475
 
@@ -428,7 +480,7 @@ Flag(flag_name: str,
428
480
 
429
481
  ### Конструктор
430
482
  ```python
431
- Flags(*flagы: Flag)
483
+ Flags(*flags: Flag)
432
484
  ```
433
485
 
434
486
  ---
@@ -445,7 +497,66 @@ Flags(*flagы: Flag)
445
497
 
446
498
  #### **.get_flags() -> `list[Flag]`**
447
499
 
448
- *method mean* **::** возвращает зарегистрированные флаги
500
+ *method mean* **::** Возвращает зарегистрированные флаги
501
+
502
+ ---
503
+
504
+ #### **.add_flag(flag: Flag) -> `None`**
505
+
506
+ *method mean* **::** Добавляет флаг в группу
507
+
508
+ ---
509
+
510
+ #### **.add_flags(flags: list[Flag]) -> `None`**
511
+
512
+ *method mean* **::** Добавляет флаги в группу
513
+
514
+ ---
515
+
516
+ #### **.get_flag(name: str) -> `Flag | None`**
517
+
518
+ *param* `name: str` **::** Строковый триггер флага без префикса
519
+ *required* **::** True
520
+ *example* **::** `'host'`
521
+
522
+ *method mean* **::** Возвращает флаг по его триггеру или `None`, если флаг не найден
523
+
524
+ ---
525
+
526
+ ## *class* :: `InputFlags`
527
+ Класс, объединяющий список введённых флагов в один объект, передаётся соответствующему хэндлеру
528
+ в качестве аргумента
529
+
530
+ ### Конструктор
531
+ ```python
532
+ InputFlags(*flags: Flag)
533
+ ```
534
+
535
+ ---
536
+
537
+ **Аргументы:**
538
+ - **name : mean**
539
+ - `*flags` (`InputFlag`): Неограниченное количество передаваемых флагов
540
+
541
+ ---
542
+
543
+ ### ***methods***
544
+
545
+ ---
546
+
547
+ #### **.get_flags() -> `list[Flag]`**
548
+
549
+ *method mean* **::** Возвращает введённые флаги
550
+
551
+ ---
552
+
553
+ #### **.get_flag(name: str) -> `InputFlag | None`**
554
+
555
+ *param* `name: str` **::** Строковый триггер флага без префикса
556
+ *required* **::** True
557
+ *example* **::** `'host'`
558
+
559
+ *method mean* **::** Возвращает введённый флаг по его триггеру или `None`, если флаг не найден
449
560
 
450
561
  ---
451
562
 
@@ -5,7 +5,7 @@
5
5
  ## Описание
6
6
  **Argenta** — Python library for creating custom shells
7
7
 
8
- ![prewiev](imgs/mock_app_preview_last.png)
8
+ ![prewiev](https://github.com/koloideal/Argenta/blob/kolo/imgs/mock_app_preview_last.png?raw=True)
9
9
  Пример внешнего вида TUI, написанного с помощью Argenta
10
10
 
11
11
  ---
@@ -95,33 +95,29 @@ def handler_with_flags(flags: InputFlags):
95
95
 
96
96
  ### Конструктор
97
97
  ```python
98
- App(prompt: str = 'Enter a command',
99
- initial_greeting: str = '\nHello, I am Argenta\n',
100
- farewell_message: str = '\nGoodBye\n',
98
+ App(prompt: str = 'What do you want to do?\n',
99
+ initial_message: str = 'Argenta',
100
+ farewell_message: str = 'See you',
101
101
  exit_command: str = 'Q',
102
102
  exit_command_description: str = 'Exit command',
103
103
  system_points_title: str = 'System points:',
104
- ignore_exit_command_register: bool = True,
105
- ignore_command_register: bool = False,
106
- line_separate: str = '',
107
- command_group_description_separate: str = '',
104
+ ignore_command_register: bool = True,
105
+ dividing_line: StaticDividingLine | DynamicDividingLine = StaticDividingLine(),
108
106
  repeat_command_groups: bool = True,
109
- print_func: Callable[[str], None] = print)
107
+ print_func: Callable[[str], None] = Console().print)
110
108
  ```
111
109
  **Аргументы:**
112
110
  - **name : mean**
113
111
  - `prompt` (`str`): Сообщение перед вводом команды.
114
- - `initial_greeting` (`str`): Приветственное сообщение при запуске.
112
+ - `initial_message` (`str`): Приветственное сообщение при запуске.
115
113
  - `farewell_message` (`str`): Сообщение при выходе.
116
114
  - `exit_command` (`str`): Команда выхода (по умолчанию `'Q'`).
117
115
  - `exit_command_description` (`str`): Описание команды выхода.
118
116
  - `system_points_title` (`str`): Заголовок перед списком системных команд.
119
- - `ignore_exit_command_register` (`bool`): Игнорировать регистр команды выхода.
120
117
  - `ignore_command_register` (`bool`): Игнорировать регистр всех команд.
121
- - `line_separate` (`str`): Разделительная строка между командами.
122
- - `command_group_description_separate` (`str`): Разделитель между группами команд.
118
+ - `dividing_line` (`StaticDividingLine | DynamicDividingLine`): Разделительная строка.
123
119
  - `repeat_command_groups` (`bool`): Повторять описание команд перед вводом.
124
- - `print_func` (`Callable[[str], None]`): Функция вывода текста в терминал (по умолчанию `print`).
120
+ - `print_func` (`Callable[[str], None]`): Функция вывода текста в терминал.
125
121
 
126
122
  ---
127
123
 
@@ -131,94 +127,83 @@ App(prompt: str = 'Enter a command',
131
127
 
132
128
  #### **.start_polling() -> `None`**
133
129
 
134
- *method mean* **::** запускает цикл обработки ввода
130
+ *method mean* **::** Запускает цикл обработки ввода
135
131
 
136
132
  ---
137
133
 
138
134
  #### **.include_router(router: Router) -> `None`**
139
135
 
140
- *param* `router: Router` **::** регистрируемый роутер
136
+ *param* `router: Router` **::** Регистрируемый роутер
141
137
  *required* **::** True
142
138
 
143
- *method mean* **::** регистрирует роутер в оболочке
139
+ *method mean* **::** Регистрирует роутер в оболочке
144
140
 
145
141
  ---
146
142
 
147
- #### **.set_initial_message(message: str) -> `None`**
143
+ #### **.include_routers(\*routers: Router) -> `None`**
148
144
 
149
- *param* `message: str` **::** устанавливаемое приветственное сообщение
150
- *required* **::** True
151
- *example* **::** `"Hello, I'm a example app"`
145
+ *param* `routers: Router` **::** Неограниченное количество регистрируемых роутеров
146
+ *required* **::** True
152
147
 
153
- *method mean* **::** устанавливает сообщение, которое будет отображено при запуске программы
148
+ *method mean* **::** Регистрирует роутер в оболочке
154
149
 
155
150
  ---
156
151
 
157
- #### **.set_farewell_message(message: str) -> `None`**
152
+ #### **.set_description_message_pattern(pattern: str) -> `None`**
158
153
 
159
- *param* `message: str` **::** устанавливаемое сообщение при выходе
154
+ *param* `pattern: str` **::** Паттерн описания команды при её выводе в консоль
160
155
  *required* **::** True
161
- *example* **::** `"GoodBye !"`
156
+ *example* **::** `"[{command}] *=*=* {description}"`
162
157
 
163
- *method mean* **::** устанавливает сообщение, которое будет отображено при выходе
158
+ *method mean* **::** Устанавливает паттерн описания команд, который будет использован
159
+ при выводе в консоль
164
160
 
165
161
  ---
166
162
 
167
- #### **.set_description_message_pattern(pattern: str) -> `None`**
163
+ #### **.add_message_on_startup(message: str) -> `None`**
168
164
 
169
- *param* `pattern: str` **::** паттерн описания команды при её выводе в консоль
165
+ *param* `message: str` **::** Сообщение, которое будет выведено при запуске приложения
170
166
  *required* **::** True
171
- *example* **::** `"[{command}] *=*=* {description}"`
167
+ *example* **::** `Message on startup`
172
168
 
173
- *method mean* **::** устанавливает паттерн описания команд, который будет использован
169
+ *method mean* **::** Устанавливает паттерн описания команд, который будет использован
174
170
  при выводе в консоль
175
171
 
176
172
  ---
173
+
177
174
  <a name="custom_handler"></a>
178
- #### **.set_repeated_input_flags_handler(handler: Callable[[str], None]) -> `None`**
175
+ #### **.repeated_input_flags_handler: `Callable[[str], None])`**
179
176
 
180
- *param* `handler: Callable[[str], None]` **::** функция или лямбда функция, которой будет передано управление при
181
- вводе юзером повторяющихся флагов
182
- *required* **::** True
183
177
  *example* **::** `lambda raw_command: print_func(f'Repeated input flags: "{raw_command}"')`
184
178
 
185
- *method mean* **::** устанавливает функцию, которой будет передано управление при
179
+ *attr mean* **::** Устанавливает функцию, которой будет передано управление при
186
180
  вводе юзером повторяющихся флагов
187
181
 
188
182
  ---
189
183
 
190
- #### **.set_invalid_input_flags_handler(self, handler: Callable[[str], None]) -> `None`**
184
+ #### **.invalid_input_flags_handler: `Callable[[str], None])`**
191
185
 
192
- *param* `handler: Callable[[str], None]` **::** функция или лямбда функция, которой будет передано управление при
193
- вводе юзером команды с некорректным синтаксисом флагов
194
- *required* **::** True
195
186
  *example* **::** `lambda raw_command: print_func(f'Incorrect flag syntax: "{raw_command}"')`
196
187
 
197
- *method mean* **::** устанавливает функцию, которой будет передано управление при
188
+ *attr mean* **::** Устанавливает функцию, которой будет передано управление при
198
189
  вводе юзером команды с некорректным синтаксисом флагов
199
190
 
200
191
  ---
201
192
 
202
- #### **.set_unknown_command_handler(self, handler: Callable[[str], None]) -> `None`**
193
+ #### **.unknown_command_handler: `Callable[[str], None]`**
203
194
 
204
- *param* `handler: Callable[[str], None]` **::** функция или лямбда функция, которой будет передано управление при
205
- вводе юзером неизвестной команды
206
- *required* **::** True
207
195
  *example* **::** `lambda command: print_func(f"Unknown command: {command.get_string_entity()}")`
208
196
 
209
- *method mean* **::** устанавливает функцию, которой будет передано управление при
197
+ *attr mean* **::** Устанавливает функцию, которой будет передано управление при
210
198
  вводе юзером неизвестной команды
211
199
 
212
200
  ---
213
201
 
214
- #### **.set_empty_command_handler(self, handler: Callable[[str], None]) -> `None`**
202
+ #### **.empty_command_handler: `Callable[[str], None])`**
215
203
 
216
- *param* `handler: Callable[[str], None]` **::** функция или лямбда функция, которой будет передано управление при
217
- вводе юзером пустой команды
218
- *required* **::** True
219
204
  *example* **::** `lambda: print_func(f'Empty input command')`
220
205
 
221
- *method mean* **::** устанавливает функцию, которой будет передано управление при
206
+ *attr mean* **::** Устанавливает функцию, которой будет передано управление при
222
207
  вводе юзером пустой команды
223
208
 
224
209
  ---
@@ -236,6 +221,9 @@ App(prompt: str = 'Enter a command',
236
221
  `RepeatedCommandInDifferentRoutersException`. Исключение вызывается только при наличии пересекающихся команд
237
222
  у __<u>разных</u>__ роутеров
238
223
 
224
+ - Наиболее частые сообщение при запуске предопределены и доступны для быстрого
225
+ использования: `argenta.app.defaults.PredeterminedMessages`
226
+
239
227
 
240
228
 
241
229
 
@@ -244,9 +232,37 @@ App(prompt: str = 'Enter a command',
244
232
  - `InvalidRouterInstanceException` — Переданный объект в метод `App().include_router()` не является экземпляром класса `Router`.
245
233
  - `InvalidDescriptionMessagePatternException` — Неправильный формат паттерна описания команд.
246
234
  - `IncorrectNumberOfHandlerArgsException` — У обработчика нестандартного поведения зарегистрировано неверное количество аргументов(в большинстве случаев у него должен быть один аргумент).
247
- - `NoRegisteredRoutersException` — Отсутствуют зарегистрированные роутеры.
248
235
  - `NoRegisteredHandlersException` — У роутера нет ни одного обработчика команд.
249
- - `RepeatedCommandInDifferentRoutersException` — Одна и та же команда зарегистрирована в разных роутерах.
236
+
237
+ ---
238
+
239
+ ## *class* :: `StaticDivideLine`
240
+ Класс, экземпляр которого представляет собой строковый разделитель фиксированной длины
241
+
242
+ ### Конструктор
243
+ ```python
244
+ StaticDivideLine(unit_part: str = '-',
245
+ length: int = 25)
246
+ ```
247
+
248
+ **Аргументы:**
249
+ - **name : mean**
250
+ - `unit_part` (`str`): Единичная часть строкового разделителя
251
+ - `length` (`int`): Длина строкового разделителя
252
+
253
+ ---
254
+
255
+ ## *class* :: `DinamicDivideLine`
256
+ Строковый разделитель динамической длины, которая определяется длиной обрамляемого вывода команды
257
+
258
+ ### Конструктор
259
+ ```python
260
+ DinamicDivideLine(unit_part: str = '-')
261
+ ```
262
+
263
+ **Аргументы:**
264
+ - **name : mean**
265
+ - `unit_part` (`str`): Единичная часть строкового разделителя
250
266
 
251
267
  ---
252
268
 
@@ -274,32 +290,27 @@ Router(title: str = 'Commands group title:',
274
290
 
275
291
  #### **command(command: Command)**
276
292
 
277
- *param* `command: Command` **::** экземпляр класса `Command`, который определяет строковый триггер команды,
293
+ *param* `command: Command` **::** Экземпляр класса `Command`, который определяет строковый триггер команды,
278
294
  допустимые флаги команды и другое
279
295
  *required* **::** True
280
296
  *example* **::** `Command(command='ssh', description='connect via ssh')`
281
297
 
282
- *method mean* **::** декоратор, который регистрирует функцию как обработчик команды
298
+ *method mean* **::** Декоратор, который регистрирует функцию как обработчик команды
283
299
 
284
300
  ---
285
301
 
286
302
  #### **.get_name() -> `str`**
287
303
 
288
- *method mean* **::** возвращает установленное название роутера
304
+ *method mean* **::** Возвращает установленное название роутера
289
305
 
290
306
  ---
291
307
 
292
308
  #### **.get_title() -> `str`**
293
309
 
294
- *method mean* **::** возвращает установленный заголовок группы команд данного роутера
310
+ *method mean* **::** Возвращает установленный заголовок группы команд данного роутера
295
311
 
296
312
  ---
297
313
 
298
- #### **.get_all_commands() -> `list[str]`**
299
-
300
- *method mean* **::** возвращает все зарегистрированные команды для данного роутера
301
-
302
- ---
303
314
 
304
315
  ### Исключения
305
316
  - `RepeatedFlagNameException` - Повторяющиеся зарегистрированные флаги в команде
@@ -330,19 +341,19 @@ Command(trigger: str,
330
341
 
331
342
  #### **.get_trigger() -> `str`**
332
343
 
333
- *method mean* **::** возвращает строковый триггер экземпляра
344
+ *method mean* **::** Возвращает строковый триггер экземпляра
334
345
 
335
346
  ---
336
347
 
337
348
  #### **.get_description() -> `str`**
338
349
 
339
- *method mean* **::** возвращает описание команды
350
+ *method mean* **::** Возвращает описание команды
340
351
 
341
352
  ---
342
353
 
343
354
  #### **.get_registered_flags() -> `Flags | None`**
344
355
 
345
- *method mean* **::** возвращает зарегистрированные флаги экземпляра
356
+ *method mean* **::** Возвращает зарегистрированные флаги экземпляра
346
357
 
347
358
  ---
348
359
 
@@ -364,18 +375,18 @@ Command(trigger: str,
364
375
 
365
376
  ### Конструктор
366
377
  ```python
367
- Flag(flag_name: str,
368
- flag_prefix: typing.Literal['-', '--', '---'] = '-',
369
- possible_flag_values: list[str] | typing.Pattern[str] | False = True)
378
+ Flag(name: str,
379
+ prefix: typing.Literal['-', '--', '---'] = '-',
380
+ possible_values: list[str] | typing.Pattern[str] | False = True)
370
381
  ```
371
382
 
372
383
  ---
373
384
 
374
385
  **Аргументы:**
375
386
  - **name : mean**
376
- - `flag_name` (`str`): Имя флага
377
- - `flag_prefix` (`Literal['-', '--', '---']`): Префикс команды, допустимым значением является от одного до трёх минусов
378
- - `possible_flag_values` (`list[str] | Pattern[str] | bool`): Множество допустимых значений флага, может быть задано
387
+ - `name` (`str`): Имя флага
388
+ - `prefix` (`Literal['-', '--', '---']`): Префикс команды, допустимым значением является от одного до трёх минусов
389
+ - `possible_values` (`list[str] | Pattern[str] | bool`): Множество допустимых значений флага, может быть задано
379
390
  списком с допустимыми значениями или регулярным выражением (рекомендуется `re.compile(r'example exspression')`), при значении
380
391
  аргумента `False` у введённого флага не может быть значения, иначе будет вызвано исключение и обработано соответствующим
381
392
  еррор-хэндлером
@@ -388,19 +399,60 @@ Flag(flag_name: str,
388
399
 
389
400
  #### **.get_string_entity() -> `str`**
390
401
 
391
- *method mean* **::** возвращает строковое представление флага(префикс + имя)
402
+ *method mean* **::** Возвращает строковое представление флага(префикс + имя)
403
+
404
+ ---
405
+
406
+ #### **.get_name() -> `str`**
407
+
408
+ *method mean* **::** Возвращает имя флага
409
+
410
+ ---
411
+
412
+ #### **.get_prefix() -> `str`**
413
+
414
+ *method mean* **::** Возвращает префикс флага
415
+
416
+ ---
417
+
418
+ ## *class* :: `InputFlag`
419
+ Класс, экземпляры которого являются введёнными флагами команды, передаётся в хэндлер команды
420
+ через `InputFlags`
421
+
422
+ ---
423
+
424
+ ### Примечания
425
+
426
+ - Наиболее часто используемые флаги предопределены и доступны для быстрого использования:
427
+ `argenta.command.flag.defaults.PredeterminedFlags`
428
+
429
+ ---
430
+
431
+
432
+ ### Конструктор
433
+ ```python
434
+ InputFlag(name: str,
435
+ prefix: typing.Literal['-', '--', '---'] = '-',
436
+ value: str = None)
437
+ ```
392
438
 
393
439
  ---
394
440
 
395
- #### **.get_flag_name() -> `str`**
441
+ **Аргументы:**
442
+ - **name : mean**
443
+ - `name` (`str`): Имя флага
444
+ - `prefix` (`Literal['-', '--', '---']`): Префикс команды, допустимым значением является от одного до трёх минусов
445
+ - `value` (`str`): Значение введённого флага, если оно есть
396
446
 
397
- *method mean* **::** возвращает имя флага
447
+ ---
448
+
449
+ ### ***methods***
398
450
 
399
451
  ---
400
452
 
401
- #### **.get_flag_prefix() -> `str`**
453
+ #### **.get_value() -> `str | None`**
402
454
 
403
- *method mean* **::** возвращает префикс флага
455
+ *method mean* **::** Возвращает значение введённого флага
404
456
 
405
457
  ---
406
458
 
@@ -411,7 +463,7 @@ Flag(flag_name: str,
411
463
 
412
464
  ### Конструктор
413
465
  ```python
414
- Flags(*flagы: Flag)
466
+ Flags(*flags: Flag)
415
467
  ```
416
468
 
417
469
  ---
@@ -428,7 +480,66 @@ Flags(*flagы: Flag)
428
480
 
429
481
  #### **.get_flags() -> `list[Flag]`**
430
482
 
431
- *method mean* **::** возвращает зарегистрированные флаги
483
+ *method mean* **::** Возвращает зарегистрированные флаги
484
+
485
+ ---
486
+
487
+ #### **.add_flag(flag: Flag) -> `None`**
488
+
489
+ *method mean* **::** Добавляет флаг в группу
490
+
491
+ ---
492
+
493
+ #### **.add_flags(flags: list[Flag]) -> `None`**
494
+
495
+ *method mean* **::** Добавляет флаги в группу
496
+
497
+ ---
498
+
499
+ #### **.get_flag(name: str) -> `Flag | None`**
500
+
501
+ *param* `name: str` **::** Строковый триггер флага без префикса
502
+ *required* **::** True
503
+ *example* **::** `'host'`
504
+
505
+ *method mean* **::** Возвращает флаг по его триггеру или `None`, если флаг не найден
506
+
507
+ ---
508
+
509
+ ## *class* :: `InputFlags`
510
+ Класс, объединяющий список введённых флагов в один объект, передаётся соответствующему хэндлеру
511
+ в качестве аргумента
512
+
513
+ ### Конструктор
514
+ ```python
515
+ InputFlags(*flags: Flag)
516
+ ```
517
+
518
+ ---
519
+
520
+ **Аргументы:**
521
+ - **name : mean**
522
+ - `*flags` (`InputFlag`): Неограниченное количество передаваемых флагов
523
+
524
+ ---
525
+
526
+ ### ***methods***
527
+
528
+ ---
529
+
530
+ #### **.get_flags() -> `list[Flag]`**
531
+
532
+ *method mean* **::** Возвращает введённые флаги
533
+
534
+ ---
535
+
536
+ #### **.get_flag(name: str) -> `InputFlag | None`**
537
+
538
+ *param* `name: str` **::** Строковый триггер флага без префикса
539
+ *required* **::** True
540
+ *example* **::** `'host'`
541
+
542
+ *method mean* **::** Возвращает введённый флаг по его триггеру или `None`, если флаг не найден
432
543
 
433
544
  ---
434
545
 
@@ -0,0 +1,24 @@
1
+ class BaseDividingLine:
2
+ def __init__(self, unit_part: str = '-'):
3
+ self.unit_part = unit_part
4
+
5
+ def get_unit_part(self):
6
+ if len(self.unit_part) == 0:
7
+ return ' '
8
+ else:
9
+ return self.unit_part[0]
10
+
11
+ class StaticDividingLine(BaseDividingLine):
12
+ def __init__(self, unit_part: str = '-', length: int = 25):
13
+ super().__init__(unit_part)
14
+ self.length = length
15
+
16
+ def get_full_line(self):
17
+ return f'\n[dim]{self.length * self.get_unit_part()}[/dim]\n'
18
+
19
+
20
+ class DynamicDividingLine(BaseDividingLine):
21
+ def get_full_line(self, length: int):
22
+ return f'\n[dim]{self.get_unit_part() * length}[/dim]\n'
23
+
24
+
@@ -1,11 +1,14 @@
1
1
  from typing import Callable
2
2
  from rich.console import Console
3
3
  from art import text2art
4
+ from contextlib import redirect_stdout
5
+ import io
4
6
  import re
5
7
 
6
8
  from argenta.command.models import Command, InputCommand
7
9
  from argenta.router import Router
8
10
  from argenta.router.defaults import system_router
11
+ from argenta.app.dividing_line.models import StaticDividingLine, DynamicDividingLine
9
12
  from argenta.command.exceptions import (UnprocessedInputFlagException,
10
13
  RepeatedInputFlagsException,
11
14
  EmptyInputCommandException,
@@ -27,7 +30,7 @@ class BaseApp:
27
30
  exit_command_description: str = 'Exit command',
28
31
  system_points_title: str = 'System points:',
29
32
  ignore_command_register: bool = True,
30
- line_separate: str = '-----',
33
+ dividing_line: StaticDividingLine | DynamicDividingLine = StaticDividingLine(),
31
34
  repeat_command_groups: bool = True,
32
35
  print_func: Callable[[str], None] = Console().print) -> None:
33
36
  self._prompt = prompt
@@ -35,7 +38,7 @@ class BaseApp:
35
38
  self._exit_command = exit_command
36
39
  self._exit_command_description = exit_command_description
37
40
  self._system_points_title = system_points_title
38
- self._line_separate = line_separate
41
+ self._dividing_line = dividing_line
39
42
  self._ignore_command_register = ignore_command_register
40
43
  self._repeat_command_groups_description = repeat_command_groups
41
44
 
@@ -53,21 +56,17 @@ class BaseApp:
53
56
  self.exit_command_handler: Callable[[], None] = lambda: print_func(self.farewell_message)
54
57
 
55
58
  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 == '-----')
59
+ is_farewell_message_default=farewell_message == 'See you')
58
60
 
59
61
 
60
62
  def _setup_default_view(self, is_initial_message_default: bool,
61
- is_farewell_message_default: bool,
62
- is_line_separate_default: bool):
63
+ is_farewell_message_default: bool):
63
64
  if is_initial_message_default:
64
65
  self.initial_message = f'\n[bold red]{text2art('Argenta', font='tarty1')}\n\n'
65
66
  if is_farewell_message_default:
66
67
  self.farewell_message = (f'[bold red]\n{text2art('\nSee you\n', font='chanky')}[/bold red]\n'
67
68
  f'[red i]github.com/koloideal/Argenta[/red i] | '
68
69
  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
70
 
72
71
 
73
72
  def _validate_number_of_routers(self) -> None:
@@ -100,7 +99,15 @@ class BaseApp:
100
99
  return False
101
100
  elif handled_command_trigger == command.get_trigger():
102
101
  return False
103
- self.unknown_command_handler(command)
102
+ if isinstance(self._dividing_line, StaticDividingLine):
103
+ self._print_func(self._dividing_line.get_full_line())
104
+ self.unknown_command_handler(command)
105
+ self._print_func(self._dividing_line.get_full_line())
106
+ elif isinstance(self._dividing_line, DynamicDividingLine):
107
+ with redirect_stdout(io.StringIO()) as f:
108
+ self.unknown_command_handler(command)
109
+ res: str = f.getvalue()
110
+ self._print_framed_text_with_dynamic_line(res)
104
111
  return True
105
112
 
106
113
 
@@ -124,6 +131,15 @@ class BaseApp:
124
131
  self.empty_input_command_handler()
125
132
 
126
133
 
134
+ def _print_framed_text_with_dynamic_line(self, text: str):
135
+ clear_text = re.sub(r'\u001b\[[0-9;]*m', '', text)
136
+ max_length_line = max([len(line) for line in clear_text.split('\n')])
137
+ max_length_line = max_length_line if 10 <= max_length_line <= 80 else 80 if max_length_line > 80 else 10
138
+ self._print_func(self._dividing_line.get_full_line(max_length_line))
139
+ print(text.strip('\n'))
140
+ self._print_func(self._dividing_line.get_full_line(max_length_line))
141
+
142
+
127
143
 
128
144
  class App(BaseApp):
129
145
  def start_polling(self) -> None:
@@ -148,29 +164,35 @@ class App(BaseApp):
148
164
  try:
149
165
  input_command: InputCommand = InputCommand.parse(raw_command=raw_command)
150
166
  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
-
155
- if not self._repeat_command_groups_description:
156
- self._print_func(self._prompt)
167
+ if isinstance(self._dividing_line, StaticDividingLine):
168
+ self._print_func(self._dividing_line.get_full_line())
169
+ self._error_handler(error, raw_command)
170
+ self._print_func(self._dividing_line.get_full_line())
171
+ elif isinstance(self._dividing_line, DynamicDividingLine):
172
+ with redirect_stdout(io.StringIO()) as f:
173
+ self._error_handler(error, raw_command)
174
+ res: str = f.getvalue()
175
+ self._print_framed_text_with_dynamic_line(res)
157
176
  continue
158
177
 
159
178
  if self._is_exit_command(input_command):
160
179
  return
161
180
 
162
- self._print_func(self._line_separate)
163
-
164
181
  if self._is_unknown_command(input_command):
165
- self._print_func(self._line_separate)
166
- if not self._repeat_command_groups_description:
167
- self._print_func(self._prompt)
168
182
  continue
169
183
 
170
- for registered_router in self._registered_routers:
171
- registered_router.input_command_handler(input_command)
184
+ if isinstance(self._dividing_line, StaticDividingLine):
185
+ self._print_func(self._dividing_line.get_full_line())
186
+ for registered_router in self._registered_routers:
187
+ registered_router.input_command_handler(input_command)
188
+ self._print_func(self._dividing_line.get_full_line())
189
+ elif isinstance(self._dividing_line, DynamicDividingLine):
190
+ with redirect_stdout(io.StringIO()) as f:
191
+ for registered_router in self._registered_routers:
192
+ registered_router.input_command_handler(input_command)
193
+ res: str = f.getvalue()
194
+ self._print_framed_text_with_dynamic_line(res)
172
195
 
173
- self._print_func(self._line_separate)
174
196
  if not self._repeat_command_groups_description:
175
197
  self._print_func(self._prompt)
176
198
 
@@ -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):
@@ -60,6 +60,7 @@ class InputCommand(BaseCommand, Generic[InputCommandType]):
60
60
  def get_input_flags(self) -> InputFlags:
61
61
  return self._input_flags
62
62
 
63
+
63
64
  @staticmethod
64
65
  def parse(raw_command: str) -> InputCommandType:
65
66
  if not raw_command:
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "argenta"
3
- version = "0.4.6"
4
- description = "python library for creating custom shells"
3
+ version = "0.4.8"
4
+ description = "Python library for creating TUI"
5
5
  authors = [
6
6
  {name = "kolo", email = "kolo.is.main@gmail.com"}
7
7
  ]
File without changes
File without changes
File without changes
File without changes