argenta 0.3.4__tar.gz → 0.3.6__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.3.6/PKG-INFO +452 -0
- argenta-0.3.6/README.md +436 -0
- argenta-0.3.6/argenta/app/__init__.py +1 -0
- {argenta-0.3.4 → argenta-0.3.6}/argenta/app/entity.py +24 -14
- {argenta-0.3.4 → argenta-0.3.6}/argenta/app/exceptions.py +5 -0
- argenta-0.3.6/argenta/command/__init__.py +1 -0
- {argenta-0.3.4 → argenta-0.3.6}/argenta/command/entity.py +19 -36
- argenta-0.3.6/argenta/command/exceptions.py +19 -0
- argenta-0.3.6/argenta/command/params/flag/__init__.py +2 -0
- {argenta-0.3.4 → argenta-0.3.6}/argenta/command/params/flag/entity.py +5 -6
- {argenta-0.3.4 → argenta-0.3.6}/argenta/command/params/flag/flags_group/entity.py +12 -1
- argenta-0.3.6/argenta/router/__init__.py +1 -0
- {argenta-0.3.4 → argenta-0.3.6}/argenta/router/entity.py +22 -53
- {argenta-0.3.4 → argenta-0.3.6}/argenta/router/exceptions.py +1 -11
- {argenta-0.3.4 → argenta-0.3.6}/pyproject.toml +2 -2
- argenta-0.3.4/PKG-INFO +0 -289
- argenta-0.3.4/README.md +0 -273
- argenta-0.3.4/argenta/app/__init__.py +0 -3
- argenta-0.3.4/argenta/command/exceptions.py +0 -39
- argenta-0.3.4/argenta/command/params/flag/__init__.py +0 -0
- argenta-0.3.4/argenta/command/params/flag/flags_group/__init__.py +0 -0
- argenta-0.3.4/argenta/router/__init__.py +0 -2
- {argenta-0.3.4 → argenta-0.3.6}/LICENSE +0 -0
- {argenta-0.3.4 → argenta-0.3.6}/argenta/__init__.py +0 -0
- {argenta-0.3.4/argenta/command → argenta-0.3.6/argenta/command/params}/__init__.py +0 -0
- {argenta-0.3.4/argenta/command/params → argenta-0.3.6/argenta/command/params/flag/flags_group}/__init__.py +0 -0
argenta-0.3.6/PKG-INFO
ADDED
@@ -0,0 +1,452 @@
|
|
1
|
+
Metadata-Version: 2.3
|
2
|
+
Name: argenta
|
3
|
+
Version: 0.3.6
|
4
|
+
Summary: python library for creating custom shells
|
5
|
+
License: MIT
|
6
|
+
Author: kolo
|
7
|
+
Author-email: kolo.is.main@gmail.com
|
8
|
+
Requires-Python: >=3.11
|
9
|
+
Classifier: License :: OSI Approved :: MIT License
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
11
|
+
Classifier: Programming Language :: Python :: 3.11
|
12
|
+
Classifier: Programming Language :: Python :: 3.12
|
13
|
+
Classifier: Programming Language :: Python :: 3.13
|
14
|
+
Description-Content-Type: text/markdown
|
15
|
+
|
16
|
+
# Argenta
|
17
|
+
|
18
|
+
---
|
19
|
+
|
20
|
+
## Описание
|
21
|
+
**Argenta** — Python library for creating custom shells
|
22
|
+
|
23
|
+
---
|
24
|
+
|
25
|
+
# Установка
|
26
|
+
```bash
|
27
|
+
pip install argenta
|
28
|
+
```
|
29
|
+
or
|
30
|
+
```bash
|
31
|
+
poetry add argenta
|
32
|
+
```
|
33
|
+
|
34
|
+
---
|
35
|
+
|
36
|
+
# Быстрый старт
|
37
|
+
|
38
|
+
Пример простейшей оболочки с командой без флагов
|
39
|
+
```python
|
40
|
+
# routers.py
|
41
|
+
from argenta.router import Router
|
42
|
+
from argenta.command import Command
|
43
|
+
|
44
|
+
|
45
|
+
router = Router()
|
46
|
+
|
47
|
+
@router.command(Command("hello"))
|
48
|
+
def handler():
|
49
|
+
print("Hello, world!")
|
50
|
+
```
|
51
|
+
|
52
|
+
```python
|
53
|
+
# main.py
|
54
|
+
from argenta.app import App
|
55
|
+
from routers import router
|
56
|
+
|
57
|
+
app: App = App()
|
58
|
+
|
59
|
+
def main() -> None:
|
60
|
+
app.include_router(router)
|
61
|
+
app.start_polling()
|
62
|
+
|
63
|
+
|
64
|
+
if __name__ == '__main__':
|
65
|
+
main()
|
66
|
+
```
|
67
|
+
Пример оболочки с командой, у которой зарегистрированы флаги
|
68
|
+
|
69
|
+
```python
|
70
|
+
# routers.py
|
71
|
+
import re
|
72
|
+
from argenta.router import Router
|
73
|
+
from argenta.command import Command
|
74
|
+
from argenta.command.params.flag import FlagsGroup, Flag
|
75
|
+
|
76
|
+
router = Router()
|
77
|
+
|
78
|
+
list_of_flags = [
|
79
|
+
Flag(flag_name='host',
|
80
|
+
flag_prefix='--',
|
81
|
+
possible_flag_values=re.compile(r'^192.168.\d{1,3}.\d{1,3}$')),
|
82
|
+
Flag(flag_name='port',
|
83
|
+
flag_prefix='---',
|
84
|
+
possible_flag_values=re.compile(r'^[0-9]{1,4}$'))
|
85
|
+
]
|
86
|
+
|
87
|
+
|
88
|
+
@router.command(Command("hello"))
|
89
|
+
def handler():
|
90
|
+
print("Hello, world!")
|
91
|
+
|
92
|
+
|
93
|
+
@router.command(Command(trigger="ssh",
|
94
|
+
description='connect via ssh',
|
95
|
+
flags=FlagsGroup(list_of_flags)))
|
96
|
+
def handler_with_flags(flags: dict):
|
97
|
+
for flag in flags:
|
98
|
+
print(f'Flag name: {flag['name']}\n
|
99
|
+
f'Flag value: {flag['value']}')
|
100
|
+
```
|
101
|
+
|
102
|
+
---
|
103
|
+
|
104
|
+
# *classes* :
|
105
|
+
|
106
|
+
---
|
107
|
+
|
108
|
+
## *class* :: `App`
|
109
|
+
Класс, определяющий поведение и состояние оболочки
|
110
|
+
|
111
|
+
### Конструктор
|
112
|
+
```python
|
113
|
+
App(prompt: str = 'Enter a command',
|
114
|
+
initial_greeting: str = '\nHello, I am Argenta\n',
|
115
|
+
farewell_message: str = '\nGoodBye\n',
|
116
|
+
exit_command: str = 'Q',
|
117
|
+
exit_command_description: str = 'Exit command',
|
118
|
+
system_points_title: str = 'System points:',
|
119
|
+
ignore_exit_command_register: bool = True,
|
120
|
+
ignore_command_register: bool = False,
|
121
|
+
line_separate: str = '',
|
122
|
+
command_group_description_separate: str = '',
|
123
|
+
repeat_command_groups: bool = True,
|
124
|
+
print_func: Callable[[str], None] = print)
|
125
|
+
```
|
126
|
+
**Аргументы:**
|
127
|
+
- **name : mean**
|
128
|
+
- `prompt` (`str`): Сообщение перед вводом команды.
|
129
|
+
- `initial_greeting` (`str`): Приветственное сообщение при запуске.
|
130
|
+
- `farewell_message` (`str`): Сообщение при выходе.
|
131
|
+
- `exit_command` (`str`): Команда выхода (по умолчанию `'Q'`).
|
132
|
+
- `exit_command_description` (`str`): Описание команды выхода.
|
133
|
+
- `system_points_title` (`str`): Заголовок перед списком системных команд.
|
134
|
+
- `ignore_exit_command_register` (`bool`): Игнорировать регистр команды выхода.
|
135
|
+
- `ignore_command_register` (`bool`): Игнорировать регистр всех команд.
|
136
|
+
- `line_separate` (`str`): Разделительная строка между командами.
|
137
|
+
- `command_group_description_separate` (`str`): Разделитель между группами команд.
|
138
|
+
- `repeat_command_groups` (`bool`): Повторять описание команд перед вводом.
|
139
|
+
- `print_func` (`Callable[[str], None]`): Функция вывода текста в терминал (по умолчанию `print`).
|
140
|
+
|
141
|
+
---
|
142
|
+
|
143
|
+
### ***methods***
|
144
|
+
|
145
|
+
---
|
146
|
+
|
147
|
+
**App().**`start_polling() -> None`
|
148
|
+
|
149
|
+
*method mean* **::** запускает жизненный цикл приложения
|
150
|
+
|
151
|
+
---
|
152
|
+
|
153
|
+
**App().**`include_router(router: Router) -> None`
|
154
|
+
|
155
|
+
*param* `router: Router` **::** регистрируемый роутер
|
156
|
+
|
157
|
+
*method mean* **::** регистрирует роутер в приложении
|
158
|
+
|
159
|
+
---
|
160
|
+
|
161
|
+
**App().**`set_initial_message(message: str) -> None`
|
162
|
+
|
163
|
+
*param* `message: str` **::** устанавливаемое приветственное сообщение
|
164
|
+
*example* **::** `"Hello, I'm a example app"`
|
165
|
+
|
166
|
+
*method mean* **::** устанавливает сообщение, которое будет отображено при запуске программы
|
167
|
+
|
168
|
+
---
|
169
|
+
|
170
|
+
**App().**`set_farewell_message(message: str) -> None`
|
171
|
+
|
172
|
+
*param* `message: str` **::** устанавливаемое сообщение при выходе
|
173
|
+
*example* **::** `"GoodBye !"`
|
174
|
+
|
175
|
+
*method mean* **::** устанавливает сообщение, которое будет отображено при выходе
|
176
|
+
|
177
|
+
---
|
178
|
+
|
179
|
+
**App().**`set_description_message_pattern(pattern: str) -> None`
|
180
|
+
|
181
|
+
*param* `pattern: str` **::** паттерн описания команды при её выводе в консоль
|
182
|
+
*example* **::** `"[{command}] *=*=* {description}"`
|
183
|
+
|
184
|
+
*method mean* **::** устанавливает паттерн описания команд, который будет использован
|
185
|
+
при выводе в консоль
|
186
|
+
|
187
|
+
---
|
188
|
+
|
189
|
+
**App().**`set_repeated_input_flags_handler(handler: Callable[[str], None]) -> None`
|
190
|
+
|
191
|
+
*param* `handler: Callable[[str], None]` **::** функция или лямбда функция, которой будет передано управление при
|
192
|
+
вводе юзером повторяющихся флагов
|
193
|
+
*example* **::** `lambda raw_command: print_func(f'Repeated input flags: "{raw_command}"')`
|
194
|
+
|
195
|
+
*method mean* **::** устанавливает функцию, которой будет передано управление при
|
196
|
+
вводе юзером повторяющихся флагов
|
197
|
+
|
198
|
+
---
|
199
|
+
|
200
|
+
**App().**`set_invalid_input_flags_handler(self, handler: Callable[[str], None]) -> None`
|
201
|
+
|
202
|
+
*param* `handler: Callable[[str], None]` **::** функция или лямбда функция, которой будет передано управление при
|
203
|
+
вводе юзером команды с некорректным синтаксисом флагов
|
204
|
+
*example* **::** `lambda raw_command: print_func(f'Incorrect flag syntax: "{raw_command}"')`
|
205
|
+
|
206
|
+
*method mean* **::** устанавливает функцию, которой будет передано управление при
|
207
|
+
вводе юзером команды с некорректным синтаксисом флагов
|
208
|
+
|
209
|
+
---
|
210
|
+
|
211
|
+
**App().**`set_unknown_command_handler(self, handler: Callable[[str], None]) -> None`
|
212
|
+
|
213
|
+
*param* `handler: Callable[[str], None]` **::** функция или лямбда функция, которой будет передано управление при
|
214
|
+
вводе юзером неизвестной команды
|
215
|
+
*example* **::** `lambda command: print_func(f"Unknown command: {command.get_string_entity()}")`
|
216
|
+
|
217
|
+
*method mean* **::** устанавливает функцию, которой будет передано управление при
|
218
|
+
вводе юзером неизвестной команды
|
219
|
+
|
220
|
+
---
|
221
|
+
|
222
|
+
**App().**`set_empty_command_handler(self, handler: Callable[[str], None]) -> None`
|
223
|
+
|
224
|
+
*param* `handler: Callable[[str], None]` **::** функция или лямбда функция, которой будет передано управление при
|
225
|
+
вводе юзером пустой команды
|
226
|
+
*example* **::** `lambda: print_func(f'Empty input command')`
|
227
|
+
|
228
|
+
*method mean* **::** устанавливает функцию, которой будет передано управление при
|
229
|
+
вводе юзером пустой команды
|
230
|
+
|
231
|
+
---
|
232
|
+
|
233
|
+
### Примечания
|
234
|
+
|
235
|
+
- В устанавливаемом паттерне сообщения описания команды необходимы быть два ключевых слова:
|
236
|
+
`command` и `description`, каждое из которых должно быть заключено в фигурные скобки, после обработки
|
237
|
+
паттерна на места этих ключевых слов будут подставлены соответствующие значения команды, при отсутствии
|
238
|
+
этих двух ключевых слов будет вызвано исключение `InvalidDescriptionMessagePatternException`
|
239
|
+
|
240
|
+
- Команды приложения не должны повторяться, при значении атрибута `ignore_command_register` равным `True`
|
241
|
+
допускается создание обработчиков для разных регистров одинаковых символов в команде, для примера `u` и `U`,
|
242
|
+
при значении атрибута `ignore_command_register` класса `App` равным `False` тот же пример вызывает исключение
|
243
|
+
`RepeatedCommandInDifferentRoutersException`. Исключение вызывается только при наличии пересекающихся команд
|
244
|
+
у __<u>разных</u>__ роутеров
|
245
|
+
|
246
|
+
|
247
|
+
|
248
|
+
|
249
|
+
### Исключения
|
250
|
+
|
251
|
+
- `InvalidRouterInstanceException` — Переданный объект в метод `App().include_router()` не является экземпляром класса `Router`.
|
252
|
+
- `InvalidDescriptionMessagePatternException` — Неправильный формат паттерна описания команд.
|
253
|
+
- `IncorrectNumberOfHandlerArgsException` — У обработчика нестандартного поведения зарегистрировано неверное количество аргументов(в большинстве случаев у него должен быть один аргумент).
|
254
|
+
- `NoRegisteredRoutersException` — Отсутствуют зарегистрированные роутеры.
|
255
|
+
- `NoRegisteredHandlersException` — У роутера нет ни одного обработчика команд.
|
256
|
+
- `RepeatedCommandInDifferentRoutersException` — Одна и та же команда зарегистрирована в разных роутерах.
|
257
|
+
|
258
|
+
---
|
259
|
+
|
260
|
+
## *class* :: `Router`
|
261
|
+
Класс, который определяет и конфигурирует обработчики команд
|
262
|
+
|
263
|
+
### Конструктор
|
264
|
+
```python
|
265
|
+
Router(title: str = 'Commands group title:',
|
266
|
+
name: str = 'subordinate')
|
267
|
+
```
|
268
|
+
|
269
|
+
|
270
|
+
|
271
|
+
**Аргументы:**
|
272
|
+
- **name : mean**
|
273
|
+
- `title` (`str`): Заголовок группы команд.
|
274
|
+
- `name` (`str`): Персональное название роутера
|
275
|
+
|
276
|
+
---
|
277
|
+
|
278
|
+
### ***methods***
|
279
|
+
|
280
|
+
---
|
281
|
+
|
282
|
+
**`@`Router().**`command(command: Command)`
|
283
|
+
|
284
|
+
*param* `command: Command` **::** экземпляр класса `Command`, который определяет строковый триггер команды,
|
285
|
+
допустимые флаги команды и другое
|
286
|
+
*example* **::** `Command(command='ssh', description='connect via ssh')`
|
287
|
+
|
288
|
+
*method mean* **::** декоратор, который регистрирует функцию как обработчик команды
|
289
|
+
|
290
|
+
---
|
291
|
+
|
292
|
+
**Router().**`get_name() -> str`
|
293
|
+
|
294
|
+
*method mean* **::** возвращает установленное название роутера
|
295
|
+
|
296
|
+
---
|
297
|
+
|
298
|
+
**Router().**`get_title() -> str`
|
299
|
+
|
300
|
+
*method mean* **::** возвращает установленный заголовок группы команд данного роутера
|
301
|
+
|
302
|
+
---
|
303
|
+
|
304
|
+
**Router().**`get_all_commands() -> list[str]`
|
305
|
+
|
306
|
+
*method mean* **::** возвращает все зарегистрированные команды для данного роутера
|
307
|
+
|
308
|
+
---
|
309
|
+
|
310
|
+
### Исключения
|
311
|
+
- `RepeatedCommandException` - Одна и та же команда зарегистрирована в одном роутере
|
312
|
+
- `RepeatedFlagNameException` - Повторяющиеся зарегистрированные флаги в команде
|
313
|
+
- `TooManyTransferredArgsException` - Слишком много зарегистрированных аргументов у обработчика команды
|
314
|
+
- `RequiredArgumentNotPassedException` - Не зарегистрирован обязательный аргумент у обработчика команды(аргумент, через который будут переданы флаги введённой команды)
|
315
|
+
- `IncorrectNumberOfHandlerArgsException` - У обработчика нестандартного поведения зарегистрировано неверное количество аргументов(в большинстве случаев у него должен быть один аргумент)
|
316
|
+
|
317
|
+
---
|
318
|
+
|
319
|
+
## *class* :: `Command`
|
320
|
+
Класс, экземпляр которого определяет строковый триггер хэндлера и конфигурирует его атрибуты
|
321
|
+
|
322
|
+
### Конструктор
|
323
|
+
```python
|
324
|
+
Command(trigger: str,
|
325
|
+
description: str = None,
|
326
|
+
flags: Flag | FlagsGroup = None)
|
327
|
+
```
|
328
|
+
|
329
|
+
**Аргументы:**
|
330
|
+
- **name : mean**
|
331
|
+
- `trigger` (`str`): Строковый триггер
|
332
|
+
- `description` (`str`): Описание команды, которое будет выведено в консоль при запуске оболочки
|
333
|
+
- `flags` (`Flag | FlagsGroup`): Флаги, которые будут обработаны при их наличии во вводе юзера
|
334
|
+
|
335
|
+
---
|
336
|
+
|
337
|
+
**Command().**`get_trigger() -> str`
|
338
|
+
|
339
|
+
*method mean* **::** возвращает строковый триггер экземпляра
|
340
|
+
|
341
|
+
---
|
342
|
+
|
343
|
+
**Command().**`get_description() -> str`
|
344
|
+
|
345
|
+
*method mean* **::** возвращает описание команды
|
346
|
+
|
347
|
+
---
|
348
|
+
|
349
|
+
**Command().**`get_registered_flags() -> FlagsGroup | None`
|
350
|
+
|
351
|
+
*method mean* **::** возвращает зарегистрированные флаги экземпляра
|
352
|
+
|
353
|
+
---
|
354
|
+
|
355
|
+
### Исключения
|
356
|
+
- `UnprocessedInputFlagException` - Некорректный синтаксис ввода команды
|
357
|
+
- `RepeatedInputFlagsException` - Повторяющиеся флаги во введённой команде
|
358
|
+
- `EmptyInputCommandException` - Введённая команда является пустой(не содержит символов)
|
359
|
+
|
360
|
+
**Примечание**
|
361
|
+
Все вышеуказанные исключения класса `Command` вызываются в рантайме запущенным экземпляром класса
|
362
|
+
`App`, а также по дефолту обрабатываются, при желании можно задать пользовательские
|
363
|
+
обработчики для этих исключений ([подробнее см.](#methods-))
|
364
|
+
|
365
|
+
---
|
366
|
+
|
367
|
+
## *class* :: `Flag`
|
368
|
+
Класс, экземпляры которого в большинстве случаев должны передаваться при создании
|
369
|
+
экземпляра класса `Command` для регистрации допустимого флага при вводе юзером команды
|
370
|
+
|
371
|
+
### Конструктор
|
372
|
+
```python
|
373
|
+
Flag(flag_name: str,
|
374
|
+
flag_prefix: Literal['-', '--', '---'] = '-',
|
375
|
+
ignore_flag_value_register: bool = False,
|
376
|
+
possible_flag_values: list[str] | Pattern[str] = False)
|
377
|
+
```
|
378
|
+
|
379
|
+
---
|
380
|
+
|
381
|
+
**Аргументы:**
|
382
|
+
- **name : mean**
|
383
|
+
- `flag_name` (`str`): Имя флага
|
384
|
+
- `flag_prefix` (`Literal['-', '--', '---']`): Префикс команды, допустимым значением является от одного до трёх минусов
|
385
|
+
- `ignore_flag_value_register` (`bool`): Будет ли игнорироваться регистр значения введённого флага
|
386
|
+
- `possible_flag_values` (`list[str] | Pattern[str]`): Множество допустимых значений флага, может быть задано
|
387
|
+
списком с допустимыми значениями или регулярным выражением (рекомендуется `re.compile(r'example exspression')`)
|
388
|
+
|
389
|
+
---
|
390
|
+
|
391
|
+
### ***methods***
|
392
|
+
|
393
|
+
---
|
394
|
+
|
395
|
+
**Flag().**`get_sring_entity() -> str`
|
396
|
+
|
397
|
+
*method mean* **::** возвращает строковое представление флага(префикс + имя)
|
398
|
+
|
399
|
+
---
|
400
|
+
|
401
|
+
**Flag().**`get_flag_name() -> str`
|
402
|
+
|
403
|
+
*method mean* **::** возвращает имя флага
|
404
|
+
|
405
|
+
---
|
406
|
+
|
407
|
+
**Flag().**`get_flag_prefix() -> str`
|
408
|
+
|
409
|
+
*method mean* **::** возвращает префикс флага
|
410
|
+
|
411
|
+
---
|
412
|
+
|
413
|
+
## *class* :: `FlagsGroup`
|
414
|
+
Класс, объединяющий список флагов в один объект, используется в качестве
|
415
|
+
передаваемого аргумента `flags` экземпляру класса `Command`, при регистрации
|
416
|
+
хэндлера
|
417
|
+
|
418
|
+
### Конструктор
|
419
|
+
```python
|
420
|
+
FlagsGroup(flags: list[Flag] = None)
|
421
|
+
```
|
422
|
+
|
423
|
+
---
|
424
|
+
|
425
|
+
**Аргументы:**
|
426
|
+
- **name : mean**
|
427
|
+
- `flags` (`list[Flag]`): Список флагов, которые будут объединены в одну группу
|
428
|
+
|
429
|
+
---
|
430
|
+
|
431
|
+
### ***methods***
|
432
|
+
|
433
|
+
---
|
434
|
+
|
435
|
+
**FlagsGroup().**`get_flags() -> list[Flag]`
|
436
|
+
|
437
|
+
*method mean* **::** возвращает зарегистрированные флаги
|
438
|
+
|
439
|
+
---
|
440
|
+
|
441
|
+
# Тесты
|
442
|
+
|
443
|
+
Запуск тестов:
|
444
|
+
|
445
|
+
```bash
|
446
|
+
python -m unittest discover
|
447
|
+
```
|
448
|
+
or
|
449
|
+
```bash
|
450
|
+
python -m unittest discover -v
|
451
|
+
```
|
452
|
+
|