argenta 1.0.1__tar.gz → 1.0.3__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-1.0.1 → argenta-1.0.3}/PKG-INFO +10 -2
- {argenta-1.0.1 → argenta-1.0.3}/README.md +8 -0
- argenta-1.0.3/mock/local_test.py +89 -0
- {argenta-1.0.1 → argenta-1.0.3}/pyproject.toml +2 -2
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/app/defaults.py +2 -4
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/app/models.py +59 -76
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/router/entity.py +4 -6
- {argenta-1.0.1 → argenta-1.0.3}/tests/unit_tests/test_app.py +2 -2
- argenta-1.0.1/mock/local_test.py +0 -89
- {argenta-1.0.1 → argenta-1.0.3}/.github/workflows/ruff.yml +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/.github/workflows/tests.yml +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/.gitignore +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/LICENSE +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/imgs/argenta_banner.png +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/imgs/argenta_logo.png +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/imgs/argenta_logo_strip.png +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/imgs/argenta_logo_strip.svg +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/imgs/mock_app_preview1.png +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/imgs/mock_app_preview2.png +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/imgs/mock_app_preview3.png +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/imgs/mock_app_preview4.png +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/mock/__init__.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/mock/default_mock_app/__init__.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/mock/default_mock_app/main.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/mock/mock_app/__init__.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/mock/mock_app/handlers/__init__.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/mock/mock_app/handlers/handlers_implementation/__init__.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/mock/mock_app/handlers/handlers_implementation/help_command.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/mock/mock_app/handlers/routers.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/mock/mock_app/main.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/__init__.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/__init__.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/app/__init__.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/app/autocompleter/__init__.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/app/autocompleter/entity.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/app/dividing_line/__init__.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/app/dividing_line/models.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/app/registered_routers/__init__.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/app/registered_routers/entity.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/command/__init__.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/command/exceptions.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/command/flag/__init__.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/command/flag/defaults.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/command/flag/models.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/command/flags/__init__.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/command/flags/models.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/command/models.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/orchestrator/__init__.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/orchestrator/argparser/__init__.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/orchestrator/argparser/arguments/__init__.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/orchestrator/argparser/arguments/models.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/orchestrator/argparser/entity.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/orchestrator/entity.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/response/__init__.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/response/entity.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/response/status.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/router/__init__.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/router/command_handler/__init__.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/router/command_handler/entity.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/router/defaults.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/src/argenta/router/exceptions.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/tests/__init__.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/tests/system_tests/__init__.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/tests/system_tests/test_system_handling_non_standard_behavior.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/tests/system_tests/test_system_handling_normal_behavior.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/tests/unit_tests/__init__.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/tests/unit_tests/test_command.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/tests/unit_tests/test_dividing_line.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/tests/unit_tests/test_flag.py +0 -0
- {argenta-1.0.1 → argenta-1.0.3}/tests/unit_tests/test_router.py +0 -0
@@ -1,11 +1,11 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: argenta
|
3
|
-
Version: 1.0.
|
3
|
+
Version: 1.0.3
|
4
4
|
Summary: Python library for building modular CLI applications
|
5
5
|
Author-email: kolo <kolo.is.main@gmail.com>
|
6
6
|
License: MIT
|
7
7
|
License-File: LICENSE
|
8
|
-
Requires-Python:
|
8
|
+
Requires-Python: >=3.8
|
9
9
|
Requires-Dist: art<7.0,>=6.4
|
10
10
|
Requires-Dist: pyreadline3>=3.5.4
|
11
11
|
Requires-Dist: rich<15.0.0,>=14.0.0
|
@@ -65,6 +65,14 @@ def main() -> None:
|
|
65
65
|
if __name__ == '__main__':
|
66
66
|
main()
|
67
67
|
```
|
68
|
+
|
69
|
+
---
|
70
|
+
|
71
|
+
# Фичи в разработке
|
72
|
+
|
73
|
+
- Полноценная поддержка автокомплитера на Linux
|
74
|
+
- Возможность настройки захвата stdout при обработке хэндлером ввода
|
75
|
+
|
68
76
|
## Полная [документация](https://argenta-docs.vercel.app) | MIT 2025 kolo | made by [kolo](https://t.me/kolo_id)
|
69
77
|
|
70
78
|
|
@@ -52,6 +52,14 @@ def main() -> None:
|
|
52
52
|
if __name__ == '__main__':
|
53
53
|
main()
|
54
54
|
```
|
55
|
+
|
56
|
+
---
|
57
|
+
|
58
|
+
# Фичи в разработке
|
59
|
+
|
60
|
+
- Полноценная поддержка автокомплитера на Linux
|
61
|
+
- Возможность настройки захвата stdout при обработке хэндлером ввода
|
62
|
+
|
55
63
|
## Полная [документация](https://argenta-docs.vercel.app) | MIT 2025 kolo | made by [kolo](https://t.me/kolo_id)
|
56
64
|
|
57
65
|
|
@@ -0,0 +1,89 @@
|
|
1
|
+
from argenta.router import Router
|
2
|
+
from argenta.command import Command
|
3
|
+
from argenta.response import Response
|
4
|
+
from argenta.response.status import Status
|
5
|
+
from argenta.command.flag import Flag
|
6
|
+
from argenta.command.flags import Flags
|
7
|
+
from argenta.app import App
|
8
|
+
from argenta.orchestrator import Orchestrator
|
9
|
+
|
10
|
+
# Создание маршрутизатора
|
11
|
+
file_router = Router("Операции с файлами")
|
12
|
+
|
13
|
+
# Определение флагов для команды копирования
|
14
|
+
copy_flags = Flags(
|
15
|
+
Flag('source', '--'),
|
16
|
+
Flag('destination', '--'),
|
17
|
+
Flag('recursive', '--', False), # Булевый флаг без значения
|
18
|
+
Flag('force', '-', False) # Короткий булевый флаг
|
19
|
+
)
|
20
|
+
@file_router.command(Command('case', aliases=['cp', 'ch']))
|
21
|
+
def handler(response: Response):
|
22
|
+
print('test')
|
23
|
+
|
24
|
+
# Регистрация команды копирования
|
25
|
+
@file_router.command(Command(
|
26
|
+
trigger="ch",
|
27
|
+
description="Копирование файлов",
|
28
|
+
flags=copy_flags,
|
29
|
+
aliases=["cp"]
|
30
|
+
))
|
31
|
+
def copy_files(response: Response):
|
32
|
+
# Получаем значения корректных флагов
|
33
|
+
source = None
|
34
|
+
destination = None
|
35
|
+
recursive = False
|
36
|
+
force = False
|
37
|
+
|
38
|
+
for flag in response.valid_flags:
|
39
|
+
if flag.get_name() == "source":
|
40
|
+
source = flag.get_value()
|
41
|
+
elif flag.get_name() == "destination":
|
42
|
+
destination = flag.get_value()
|
43
|
+
elif flag.get_name() == "recursive":
|
44
|
+
recursive = True
|
45
|
+
elif flag.get_name() == "force":
|
46
|
+
force = True
|
47
|
+
|
48
|
+
# Проверка обязательных параметров
|
49
|
+
if not source or not destination:
|
50
|
+
print("Ошибка: необходимо указать источник и назначение")
|
51
|
+
return
|
52
|
+
|
53
|
+
print(f"Копирование из {source} в {destination}")
|
54
|
+
if recursive:
|
55
|
+
print("Рекурсивное копирование включено")
|
56
|
+
if force:
|
57
|
+
print("Принудительное копирование включено")
|
58
|
+
|
59
|
+
# Обработка неопределенных флагов
|
60
|
+
if response.undefined_flags:
|
61
|
+
print("\nПредупреждение: обнаружены незарегистрированные флаги:")
|
62
|
+
for flag in response.undefined_flags:
|
63
|
+
print(f" - {flag.get_name()}" +
|
64
|
+
(f" = {flag.get_value()}" if flag.get_value() else ""))
|
65
|
+
|
66
|
+
# Обработка флагов с некорректными значениями
|
67
|
+
if response.invalid_value_flags:
|
68
|
+
print("\nПредупреждение: обнаружены флаги с некорректными значениями:")
|
69
|
+
for flag in response.invalid_value_flags:
|
70
|
+
print(f" - {flag.get_name()} = {flag.get_value()}")
|
71
|
+
|
72
|
+
# Принятие решения на основе статуса
|
73
|
+
if response.status != Status.ALL_FLAGS_VALID:
|
74
|
+
print("\nВыполнение с предупреждениями из-за проблем с флагами.")
|
75
|
+
|
76
|
+
|
77
|
+
|
78
|
+
app = App()
|
79
|
+
app.include_router(file_router)
|
80
|
+
orchestrator = Orchestrator()
|
81
|
+
|
82
|
+
orchestrator.start_polling(app)
|
83
|
+
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
|
@@ -1,9 +1,9 @@
|
|
1
1
|
[project]
|
2
2
|
name = "argenta"
|
3
|
-
version = "1.0.
|
3
|
+
version = "1.0.3"
|
4
4
|
description = "Python library for building modular CLI applications"
|
5
5
|
authors = [{ name = "kolo", email = "kolo.is.main@gmail.com" }]
|
6
|
-
requires-python = ">=3.
|
6
|
+
requires-python = ">=3.8"
|
7
7
|
readme = "README.md"
|
8
8
|
license = { text = "MIT" }
|
9
9
|
dependencies = [
|
@@ -1,12 +1,10 @@
|
|
1
|
-
from
|
1
|
+
from enum import Enum
|
2
2
|
|
3
3
|
|
4
|
-
|
5
|
-
class PredefinedMessages:
|
4
|
+
class PredefinedMessages(Enum):
|
6
5
|
"""
|
7
6
|
Public. A dataclass with predetermined messages for quick use
|
8
7
|
"""
|
9
|
-
|
10
8
|
USAGE = "[b dim]Usage[/b dim]: [i]<command> <[green]flags[/green]>[/i]"
|
11
9
|
HELP = "[b dim]Help[/b dim]: [i]<command>[/i] [b red]--help[/b red]"
|
12
10
|
AUTOCOMPLETE = "[b dim]Autocomplete[/b dim]: [i]<part>[/i] [bold]<tab>"
|
@@ -22,20 +22,18 @@ from argenta.response import Response
|
|
22
22
|
|
23
23
|
|
24
24
|
class BaseApp:
|
25
|
-
def __init__(
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
print_func: Callable[[str], None],
|
38
|
-
) -> None:
|
25
|
+
def __init__(self,
|
26
|
+
prompt: str,
|
27
|
+
initial_message: str,
|
28
|
+
farewell_message: str,
|
29
|
+
exit_command: Command,
|
30
|
+
system_router_title: str | None,
|
31
|
+
ignore_command_register: bool,
|
32
|
+
dividing_line: StaticDividingLine | DynamicDividingLine,
|
33
|
+
repeat_command_groups: bool,
|
34
|
+
override_system_messages: bool,
|
35
|
+
autocompleter: AutoCompleter,
|
36
|
+
print_func: Callable[[str], None]) -> None:
|
39
37
|
self._prompt = prompt
|
40
38
|
self._print_func = print_func
|
41
39
|
self._exit_command = exit_command
|
@@ -49,30 +47,18 @@ class BaseApp:
|
|
49
47
|
self._farewell_message = farewell_message
|
50
48
|
self._initial_message = initial_message
|
51
49
|
|
52
|
-
self._description_message_gen: Callable[[str, str], str] = (
|
53
|
-
lambda command, description: f"[{command}] *=*=* {description}"
|
54
|
-
)
|
50
|
+
self._description_message_gen: Callable[[str, str], str] = (lambda command, description: f"[{command}] *=*=* {description}")
|
55
51
|
self._registered_routers: RegisteredRouters = RegisteredRouters()
|
56
52
|
self._messages_on_startup: list[str] = []
|
57
53
|
|
58
|
-
self.
|
54
|
+
self._all_registered_triggers_in_lower_case: list[str] = []
|
59
55
|
self._all_registered_triggers_in_default_case: list[str] = []
|
60
56
|
|
61
|
-
self._incorrect_input_syntax_handler: Callable[[str], None] = (
|
62
|
-
|
63
|
-
)
|
64
|
-
self.
|
65
|
-
|
66
|
-
)
|
67
|
-
self._empty_input_command_handler: Callable[[], None] = lambda: print_func(
|
68
|
-
"Empty input command"
|
69
|
-
)
|
70
|
-
self._unknown_command_handler: Callable[[InputCommand], None] = (
|
71
|
-
lambda command: print_func(f"Unknown command: {command.get_trigger()}")
|
72
|
-
)
|
73
|
-
self._exit_command_handler: Callable[[Response], None] = (
|
74
|
-
lambda response: print_func(self._farewell_message)
|
75
|
-
)
|
57
|
+
self._incorrect_input_syntax_handler: Callable[[str], None] = (lambda raw_command: print_func(f"Incorrect flag syntax: {raw_command}"))
|
58
|
+
self._repeated_input_flags_handler: Callable[[str], None] = (lambda raw_command: print_func(f"Repeated input flags: {raw_command}"))
|
59
|
+
self._empty_input_command_handler: Callable[[], None] = lambda: print_func("Empty input command")
|
60
|
+
self._unknown_command_handler: Callable[[InputCommand], None] = (lambda command: print_func(f"Unknown command: {command.get_trigger()}"))
|
61
|
+
self._exit_command_handler: Callable[[Response], None] = (lambda response: print_func(self._farewell_message))
|
76
62
|
|
77
63
|
def set_description_message_pattern(self, _: Callable[[str, str], str]) -> None:
|
78
64
|
"""
|
@@ -208,7 +194,7 @@ class BaseApp:
|
|
208
194
|
"""
|
209
195
|
input_command_trigger = command.get_trigger()
|
210
196
|
if self._ignore_command_register:
|
211
|
-
if input_command_trigger.lower() in self.
|
197
|
+
if input_command_trigger.lower() in self._all_registered_triggers_in_lower_case:
|
212
198
|
return False
|
213
199
|
else:
|
214
200
|
if input_command_trigger in self._all_registered_triggers_in_default_case:
|
@@ -249,7 +235,7 @@ class BaseApp:
|
|
249
235
|
|
250
236
|
def _most_similar_command(self, unknown_command: str) -> str | None:
|
251
237
|
all_commands = (
|
252
|
-
self.
|
238
|
+
self._all_registered_triggers_in_lower_case
|
253
239
|
if self._ignore_command_register
|
254
240
|
else self._all_registered_triggers_in_default_case
|
255
241
|
)
|
@@ -318,21 +304,22 @@ class BaseApp:
|
|
318
304
|
self._setup_system_router()
|
319
305
|
|
320
306
|
for router_entity in self._registered_routers:
|
321
|
-
self._all_registered_triggers_in_default_case.extend(
|
322
|
-
|
323
|
-
)
|
324
|
-
self._all_registered_triggers_in_default_case.extend(
|
325
|
-
router_entity.get_aliases()
|
326
|
-
)
|
307
|
+
self._all_registered_triggers_in_default_case.extend(router_entity.get_triggers())
|
308
|
+
self._all_registered_triggers_in_default_case.extend(router_entity.get_aliases())
|
327
309
|
|
328
|
-
self.
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
[x.lower() for x in router_entity.get_aliases()]
|
333
|
-
)
|
310
|
+
self._all_registered_triggers_in_lower_case.extend([x.lower() for x in router_entity.get_triggers()])
|
311
|
+
self._all_registered_triggers_in_lower_case.extend([x.lower() for x in router_entity.get_aliases()])
|
312
|
+
|
313
|
+
self._autocompleter.initial_setup(self._all_registered_triggers_in_lower_case)
|
334
314
|
|
335
|
-
self.
|
315
|
+
if self._ignore_command_register:
|
316
|
+
for cmd in set(self._all_registered_triggers_in_lower_case):
|
317
|
+
if self._all_registered_triggers_in_lower_case.count(cmd) != 1:
|
318
|
+
Console().print(f"\n[b red]WARNING:[/b red] Overlapping trigger or alias: [b blue]{cmd}[/b blue]")
|
319
|
+
else:
|
320
|
+
for cmd in set(self._all_registered_triggers_in_default_case):
|
321
|
+
if self._all_registered_triggers_in_default_case.count(cmd) != 1:
|
322
|
+
Console().print(f"\n[b red]WARNING:[/b red] Overlapping trigger or alias: [b blue]{cmd}[/b blue]")
|
336
323
|
|
337
324
|
if not self._override_system_messages:
|
338
325
|
self._setup_default_view()
|
@@ -349,20 +336,18 @@ class BaseApp:
|
|
349
336
|
|
350
337
|
|
351
338
|
class App(BaseApp):
|
352
|
-
def __init__(
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
print_func: Callable[[str], None] = Console().print,
|
365
|
-
) -> None:
|
339
|
+
def __init__(self,
|
340
|
+
prompt: str = "What do you want to do?\n",
|
341
|
+
initial_message: str = "Argenta\n",
|
342
|
+
farewell_message: str = "\nSee you\n",
|
343
|
+
exit_command: Command = Command("Q", "Exit command"),
|
344
|
+
system_router_title: str | None = "System points:",
|
345
|
+
ignore_command_register: bool = True,
|
346
|
+
dividing_line: StaticDividingLine | DynamicDividingLine = StaticDividingLine(),
|
347
|
+
repeat_command_groups: bool = True,
|
348
|
+
override_system_messages: bool = False,
|
349
|
+
autocompleter: AutoCompleter = AutoCompleter(),
|
350
|
+
print_func: Callable[[str], None] = Console().print) -> None:
|
366
351
|
"""
|
367
352
|
Public. The essence of the application itself.
|
368
353
|
Configures and manages all aspects of the behavior and presentation of the user interacting with the user
|
@@ -379,19 +364,17 @@ class App(BaseApp):
|
|
379
364
|
:param print_func: system messages text output function
|
380
365
|
:return: None
|
381
366
|
"""
|
382
|
-
super().__init__(
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
print_func=print_func,
|
394
|
-
)
|
367
|
+
super().__init__(prompt=prompt,
|
368
|
+
initial_message=initial_message,
|
369
|
+
farewell_message=farewell_message,
|
370
|
+
exit_command=exit_command,
|
371
|
+
system_router_title=system_router_title,
|
372
|
+
ignore_command_register=ignore_command_register,
|
373
|
+
dividing_line=dividing_line,
|
374
|
+
repeat_command_groups=repeat_command_groups,
|
375
|
+
override_system_messages=override_system_messages,
|
376
|
+
autocompleter=autocompleter,
|
377
|
+
print_func=print_func)
|
395
378
|
|
396
379
|
def run_polling(self) -> None:
|
397
380
|
"""
|
@@ -420,7 +403,7 @@ class App(BaseApp):
|
|
420
403
|
system_router.finds_appropriate_handler(input_command)
|
421
404
|
if self._ignore_command_register:
|
422
405
|
self._autocompleter.exit_setup(
|
423
|
-
self.
|
406
|
+
self._all_registered_triggers_in_lower_case
|
424
407
|
)
|
425
408
|
else:
|
426
409
|
self._autocompleter.exit_setup(
|
@@ -192,14 +192,12 @@ class Router:
|
|
192
192
|
pass
|
193
193
|
else:
|
194
194
|
file_path: str = getsourcefile(func)
|
195
|
-
source_line: int = getsourcelines(func)[1]
|
195
|
+
source_line: int = getsourcelines(func)[1]
|
196
196
|
fprint = Console().print
|
197
|
-
fprint(
|
198
|
-
f'\nFile "{file_path}", line {source_line}\n[b red]WARNING:[/b red] [i]The typehint '
|
197
|
+
fprint(f'\nFile "{file_path}", line {source_line}\n[b red]WARNING:[/b red] [i]The typehint '
|
199
198
|
f"of argument([green]{transferred_arg}[/green]) passed to the handler is [/i][bold blue]{Response}[/bold blue],"
|
200
|
-
f" [i]but[/i] [bold blue]{arg_annotation}[/bold blue] [i]is specified[/i]
|
201
|
-
highlight=False
|
202
|
-
)
|
199
|
+
f" [i]but[/i] [bold blue]{arg_annotation}[/bold blue] [i]is specified[/i]",
|
200
|
+
highlight=False)
|
203
201
|
|
204
202
|
def set_command_register_ignore(self, _: bool) -> None:
|
205
203
|
"""
|
@@ -33,13 +33,13 @@ class MyTestCase(unittest.TestCase):
|
|
33
33
|
def test_is_unknown_command1(self):
|
34
34
|
app = App()
|
35
35
|
app.set_unknown_command_handler(lambda command: None)
|
36
|
-
app.
|
36
|
+
app._all_registered_triggers_in_lower_case = ['fr', 'tr', 'de']
|
37
37
|
self.assertEqual(app._is_unknown_command(InputCommand('fr')), False)
|
38
38
|
|
39
39
|
def test_is_unknown_command2(self):
|
40
40
|
app = App()
|
41
41
|
app.set_unknown_command_handler(lambda command: None)
|
42
|
-
app.
|
42
|
+
app._all_registered_triggers_in_lower_case = ['fr', 'tr', 'de']
|
43
43
|
self.assertEqual(app._is_unknown_command(InputCommand('cr')), True)
|
44
44
|
|
45
45
|
def test_is_unknown_command3(self):
|
argenta-1.0.1/mock/local_test.py
DELETED
@@ -1,89 +0,0 @@
|
|
1
|
-
from argenta.app import App
|
2
|
-
from argenta.app.autocompleter import AutoCompleter
|
3
|
-
from argenta.router import Router
|
4
|
-
from argenta.command import Command
|
5
|
-
from argenta.orchestrator import Orchestrator
|
6
|
-
from argenta.app.dividing_line import DynamicDividingLine
|
7
|
-
from argenta.response import Response
|
8
|
-
import platform
|
9
|
-
import psutil
|
10
|
-
import os
|
11
|
-
import subprocess
|
12
|
-
import socket
|
13
|
-
|
14
|
-
# Маршрутизатор для работы с файлами
|
15
|
-
file_router = Router("Файловые операции")
|
16
|
-
|
17
|
-
|
18
|
-
@file_router.command(Command("list", "Список файлов"))
|
19
|
-
def list_files(response: Response):
|
20
|
-
files = os.listdir()
|
21
|
-
for file in files:
|
22
|
-
print(file)
|
23
|
-
|
24
|
-
|
25
|
-
@file_router.command(Command("size", "Размер файла"))
|
26
|
-
def file_size(response: Response):
|
27
|
-
file_name = input("Введите имя файла: ")
|
28
|
-
if os.path.exists(file_name):
|
29
|
-
size = os.path.getsize(file_name)
|
30
|
-
print(f"Размер файла {file_name}: {size} байт")
|
31
|
-
else:
|
32
|
-
print(f"Файл {file_name} не найден")
|
33
|
-
|
34
|
-
|
35
|
-
# Маршрутизатор для системных операций
|
36
|
-
system_router = Router("Системные операции")
|
37
|
-
|
38
|
-
|
39
|
-
@system_router.command(Command("info", "Информация о системе"))
|
40
|
-
def system_info(response: Response):
|
41
|
-
print(f"Система: {platform.system()}")
|
42
|
-
print(f"Версия: {platform.version()}")
|
43
|
-
print(f"Архитектура: {platform.architecture()}")
|
44
|
-
print(f"Процессор: {platform.processor()}")
|
45
|
-
|
46
|
-
|
47
|
-
@system_router.command(Command("memory", "Информация о памяти"))
|
48
|
-
def memory_info(response: Response):
|
49
|
-
memory = psutil.virtual_memory()
|
50
|
-
print(f"Всего памяти: {memory.total / (1024**3):.2f} ГБ")
|
51
|
-
print(f"Доступно: {memory.available / (1024**3):.2f} ГБ")
|
52
|
-
print(f"Использовано: {memory.used / (1024**3):.2f} ГБ ({memory.percent}%)")
|
53
|
-
|
54
|
-
|
55
|
-
# Маршрутизатор для сетевых операций
|
56
|
-
network_router = Router("Сетевые операции")
|
57
|
-
|
58
|
-
|
59
|
-
@network_router.command(Command("ping", "Проверка доступности хоста"))
|
60
|
-
def ping_host(response: Response):
|
61
|
-
host = input("Введите имя хоста: ")
|
62
|
-
print(f"Пингую {host}...")
|
63
|
-
subprocess.run(["ping", "-c", "4", host])
|
64
|
-
|
65
|
-
|
66
|
-
@network_router.command(Command("ip", "Показать IP-адреса"))
|
67
|
-
def show_ip(response: Response):
|
68
|
-
hostname = socket.gethostname()
|
69
|
-
print(f"Имя хоста: {hostname}")
|
70
|
-
print(f"IP-адрес: {socket.gethostbyname(hostname)}")
|
71
|
-
|
72
|
-
|
73
|
-
# Создание приложения и регистрация маршрутизаторов
|
74
|
-
app = App(
|
75
|
-
prompt="System> ",
|
76
|
-
initial_message="Pingator",
|
77
|
-
dividing_line=DynamicDividingLine("*"),
|
78
|
-
autocompleter=AutoCompleter(".hist", "e"),
|
79
|
-
)
|
80
|
-
|
81
|
-
# Добавляем все маршрутизаторы
|
82
|
-
app.include_routers(file_router, system_router, network_router)
|
83
|
-
|
84
|
-
# Добавляем сообщение при запуске
|
85
|
-
app.add_message_on_startup("Для просмотра доступных команд нажмите Enter")
|
86
|
-
|
87
|
-
# Запускаем приложение
|
88
|
-
orchestrator = Orchestrator()
|
89
|
-
orchestrator.start_polling(app)
|
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
|
File without changes
|
File without changes
|
File without changes
|
{argenta-1.0.1 → argenta-1.0.3}/mock/mock_app/handlers/handlers_implementation/help_command.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
|
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
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{argenta-1.0.1 → argenta-1.0.3}/tests/system_tests/test_system_handling_non_standard_behavior.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|