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.
- {argenta-0.4.6 → argenta-0.4.8}/PKG-INFO +190 -79
- {argenta-0.4.6 → argenta-0.4.8}/README.md +188 -77
- argenta-0.4.8/argenta/app/dividing_line/models.py +24 -0
- {argenta-0.4.6 → argenta-0.4.8}/argenta/app/models.py +45 -23
- {argenta-0.4.6 → argenta-0.4.8}/argenta/command/flag/models.py +1 -1
- {argenta-0.4.6 → argenta-0.4.8}/argenta/command/models.py +1 -0
- argenta-0.4.8/argenta/router/command_handlers/__init__.py +0 -0
- {argenta-0.4.6 → argenta-0.4.8}/pyproject.toml +2 -2
- {argenta-0.4.6 → argenta-0.4.8}/LICENSE +0 -0
- {argenta-0.4.6 → argenta-0.4.8}/argenta/__init__.py +0 -0
- {argenta-0.4.6 → argenta-0.4.8}/argenta/app/__init__.py +0 -0
- {argenta-0.4.6 → argenta-0.4.8}/argenta/app/defaults.py +0 -0
- {argenta-0.4.6/argenta/app/registered_routers → argenta-0.4.8/argenta/app/dividing_line}/__init__.py +0 -0
- {argenta-0.4.6 → argenta-0.4.8}/argenta/app/exceptions.py +0 -0
- {argenta-0.4.6/argenta/router/command_handler → argenta-0.4.8/argenta/app/registered_routers}/__init__.py +0 -0
- {argenta-0.4.6 → argenta-0.4.8}/argenta/app/registered_routers/entity.py +0 -0
- {argenta-0.4.6 → argenta-0.4.8}/argenta/command/__init__.py +0 -0
- {argenta-0.4.6 → argenta-0.4.8}/argenta/command/exceptions.py +0 -0
- {argenta-0.4.6 → argenta-0.4.8}/argenta/command/flag/__init__.py +0 -0
- {argenta-0.4.6 → argenta-0.4.8}/argenta/command/flag/defaults.py +0 -0
- {argenta-0.4.6 → argenta-0.4.8}/argenta/router/__init__.py +0 -0
- {argenta-0.4.6/argenta/router/command_handlers → argenta-0.4.8/argenta/router/command_handler}/__init__.py +0 -0
- {argenta-0.4.6 → argenta-0.4.8}/argenta/router/command_handler/entity.py +0 -0
- {argenta-0.4.6 → argenta-0.4.8}/argenta/router/command_handlers/entity.py +0 -0
- {argenta-0.4.6 → argenta-0.4.8}/argenta/router/defaults.py +0 -0
- {argenta-0.4.6 → argenta-0.4.8}/argenta/router/entity.py +0 -0
- {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.
|
4
|
-
Summary:
|
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
|
-

|
25
|
+

|
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 = '
|
116
|
-
|
117
|
-
farewell_message: str = '
|
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
|
-
|
122
|
-
|
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
|
-
- `
|
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
|
-
- `
|
139
|
-
- `command_group_description_separate` (`str`): Разделитель между группами команд.
|
135
|
+
- `dividing_line` (`StaticDividingLine | DynamicDividingLine`): Разделительная строка.
|
140
136
|
- `repeat_command_groups` (`bool`): Повторять описание команд перед вводом.
|
141
|
-
- `print_func` (`Callable[[str], None]`): Функция вывода текста в
|
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
|
-
#### **.
|
160
|
+
#### **.include_routers(\*routers: Router) -> `None`**
|
165
161
|
|
166
|
-
*param* `
|
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
|
-
#### **.
|
169
|
+
#### **.set_description_message_pattern(pattern: str) -> `None`**
|
175
170
|
|
176
|
-
*param* `
|
171
|
+
*param* `pattern: str` **::** Паттерн описания команды при её выводе в консоль
|
177
172
|
*required* **::** True
|
178
|
-
*example* **::** `"
|
173
|
+
*example* **::** `"[{command}] *=*=* {description}"`
|
179
174
|
|
180
|
-
*method mean* **::**
|
175
|
+
*method mean* **::** Устанавливает паттерн описания команд, который будет использован
|
176
|
+
при выводе в консоль
|
181
177
|
|
182
178
|
---
|
183
179
|
|
184
|
-
#### **.
|
180
|
+
#### **.add_message_on_startup(message: str) -> `None`**
|
185
181
|
|
186
|
-
*param* `
|
182
|
+
*param* `message: str` **::** Сообщение, которое будет выведено при запуске приложения
|
187
183
|
*required* **::** True
|
188
|
-
*example* **::** `
|
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
|
-
#### **.
|
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
|
-
*
|
196
|
+
*attr mean* **::** Устанавливает функцию, которой будет передано управление при
|
203
197
|
вводе юзером повторяющихся флагов
|
204
198
|
|
205
199
|
---
|
206
200
|
|
207
|
-
#### **.
|
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
|
-
*
|
205
|
+
*attr mean* **::** Устанавливает функцию, которой будет передано управление при
|
215
206
|
вводе юзером команды с некорректным синтаксисом флагов
|
216
207
|
|
217
208
|
---
|
218
209
|
|
219
|
-
#### **.
|
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
|
-
*
|
214
|
+
*attr mean* **::** Устанавливает функцию, которой будет передано управление при
|
227
215
|
вводе юзером неизвестной команды
|
228
216
|
|
229
217
|
---
|
230
218
|
|
231
|
-
#### **.
|
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
|
-
*
|
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
|
-
|
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` **::**
|
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(
|
385
|
-
|
386
|
-
|
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
|
-
- `
|
394
|
-
- `
|
395
|
-
- `
|
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
|
-
|
458
|
+
**Аргументы:**
|
459
|
+
- **name : mean**
|
460
|
+
- `name` (`str`): Имя флага
|
461
|
+
- `prefix` (`Literal['-', '--', '---']`): Префикс команды, допустимым значением является от одного до трёх минусов
|
462
|
+
- `value` (`str`): Значение введённого флага, если оно есть
|
413
463
|
|
414
|
-
|
464
|
+
---
|
465
|
+
|
466
|
+
### ***methods***
|
415
467
|
|
416
468
|
---
|
417
469
|
|
418
|
-
#### **.
|
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(*
|
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
|
-

|
8
|
+

|
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 = '
|
99
|
-
|
100
|
-
farewell_message: str = '
|
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
|
-
|
105
|
-
|
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
|
-
- `
|
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
|
-
- `
|
122
|
-
- `command_group_description_separate` (`str`): Разделитель между группами команд.
|
118
|
+
- `dividing_line` (`StaticDividingLine | DynamicDividingLine`): Разделительная строка.
|
123
119
|
- `repeat_command_groups` (`bool`): Повторять описание команд перед вводом.
|
124
|
-
- `print_func` (`Callable[[str], None]`): Функция вывода текста в
|
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
|
-
#### **.
|
143
|
+
#### **.include_routers(\*routers: Router) -> `None`**
|
148
144
|
|
149
|
-
*param* `
|
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
|
-
#### **.
|
152
|
+
#### **.set_description_message_pattern(pattern: str) -> `None`**
|
158
153
|
|
159
|
-
*param* `
|
154
|
+
*param* `pattern: str` **::** Паттерн описания команды при её выводе в консоль
|
160
155
|
*required* **::** True
|
161
|
-
*example* **::** `"
|
156
|
+
*example* **::** `"[{command}] *=*=* {description}"`
|
162
157
|
|
163
|
-
*method mean* **::**
|
158
|
+
*method mean* **::** Устанавливает паттерн описания команд, который будет использован
|
159
|
+
при выводе в консоль
|
164
160
|
|
165
161
|
---
|
166
162
|
|
167
|
-
#### **.
|
163
|
+
#### **.add_message_on_startup(message: str) -> `None`**
|
168
164
|
|
169
|
-
*param* `
|
165
|
+
*param* `message: str` **::** Сообщение, которое будет выведено при запуске приложения
|
170
166
|
*required* **::** True
|
171
|
-
*example* **::** `
|
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
|
-
#### **.
|
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
|
-
*
|
179
|
+
*attr mean* **::** Устанавливает функцию, которой будет передано управление при
|
186
180
|
вводе юзером повторяющихся флагов
|
187
181
|
|
188
182
|
---
|
189
183
|
|
190
|
-
#### **.
|
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
|
-
*
|
188
|
+
*attr mean* **::** Устанавливает функцию, которой будет передано управление при
|
198
189
|
вводе юзером команды с некорректным синтаксисом флагов
|
199
190
|
|
200
191
|
---
|
201
192
|
|
202
|
-
#### **.
|
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
|
-
*
|
197
|
+
*attr mean* **::** Устанавливает функцию, которой будет передано управление при
|
210
198
|
вводе юзером неизвестной команды
|
211
199
|
|
212
200
|
---
|
213
201
|
|
214
|
-
#### **.
|
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
|
-
*
|
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
|
-
|
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` **::**
|
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(
|
368
|
-
|
369
|
-
|
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
|
-
- `
|
377
|
-
- `
|
378
|
-
- `
|
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
|
-
|
441
|
+
**Аргументы:**
|
442
|
+
- **name : mean**
|
443
|
+
- `name` (`str`): Имя флага
|
444
|
+
- `prefix` (`Literal['-', '--', '---']`): Префикс команды, допустимым значением является от одного до трёх минусов
|
445
|
+
- `value` (`str`): Значение введённого флага, если оно есть
|
396
446
|
|
397
|
-
|
447
|
+
---
|
448
|
+
|
449
|
+
### ***methods***
|
398
450
|
|
399
451
|
---
|
400
452
|
|
401
|
-
#### **.
|
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(*
|
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
|
-
|
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.
|
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.
|
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
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
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
|
-
|
171
|
-
|
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
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{argenta-0.4.6/argenta/app/registered_routers → argenta-0.4.8/argenta/app/dividing_line}/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|