This commit is contained in:
2025-03-03 18:52:49 +03:00
parent 8fbf651223
commit 404758bd91
6 changed files with 48 additions and 19 deletions
+27 -9
View File
@@ -3,7 +3,7 @@
--- ---
## Описание ## Описание
**Argenta** — это библиотека для создания CLI-приложений на Python. Она предоставляет удобные инструменты для маршрутизации команд и обработки пользовательского ввода. **Argenta** — Python library for creating custom shells
--- ---
@@ -19,20 +19,38 @@ poetry add argenta
--- ---
# Быстрый старт # Быстрый старт
Пример базового CLI-приложения с Argenta:
```python ```python
#routers.py # routers.py
import re
from argenta.router import Router from argenta.router import Router
from argenta.command import Command
from argenta.command.params.flag import FlagsGroup, Flag
router = Router() router = Router()
@router.command("hello")
def hello():
print("Hello, world!")
@router.unknown_command list_of_flags = [
def unlnown_command(command): Flag(flag_name='host',
print(f'Command "{command}" undefined') flag_prefix='--',
possible_flag_values=re.compile(r'^192.168.\d{1,3}.\d{1,3}$')),
Flag(flag_name='port',
flag_prefix='---',
possible_flag_values=re.compile(r'^[0-9]{1,4}$'))
]
@router.command(Command("hello"))
def handler():
print("Hello, world!")
@router.command(Command(command="ssh",
description='connect via ssh',
flags=FlagsGroup(list_of_flags)))
def handler_with_flags(args: FlagsGroup):
print(f'Command "{command}" undefined')
``` ```
```python ```python
#main.py #main.py
+3 -3
View File
@@ -11,7 +11,7 @@ class Flag:
self.possible_flag_values = possible_flag_values self.possible_flag_values = possible_flag_values
self.ignore_flag_value_register = ignore_flag_value_register self.ignore_flag_value_register = ignore_flag_value_register
self._value = None self._flag_value = None
def get_string_entity(self): def get_string_entity(self):
string_entity: str = self._flag_prefix + self._flag_name string_entity: str = self._flag_prefix + self._flag_name
@@ -24,10 +24,10 @@ class Flag:
return self._flag_prefix return self._flag_prefix
def get_value(self): def get_value(self):
return self._value return self._flag_value
def set_value(self, value): def set_value(self, value):
self._value = value self._flag_value = value
def validate_input_flag_value(self, input_flag_value: str): def validate_input_flag_value(self, input_flag_value: str):
if isinstance(self.possible_flag_values, Pattern): if isinstance(self.possible_flag_values, Pattern):
@@ -14,6 +14,17 @@ class FlagsGroup:
def add_flags(self, flags: list[Flag]): def add_flags(self, flags: list[Flag]):
self._flags.extend(flags) self._flags.extend(flags)
def unparse_to_dict(self):
result_dict: dict[str, dict] = {}
for flag in self._flags:
result_dict[flag.get_flag_name()] = {
'name': flag.get_flag_name(),
'string_entity': flag.get_string_entity(),
'prefix': flag.get_flag_prefix(),
'value': flag.get_value()
}
return result_dict
def __iter__(self): def __iter__(self):
return iter(self._flags) return iter(self._flags)
+3 -2
View File
@@ -49,6 +49,7 @@ class Router:
def input_command_handler(self, input_command: Command): def input_command_handler(self, input_command: Command):
input_command_name: str = input_command.get_string_entity() input_command_name: str = input_command.get_string_entity()
input_command_flags: FlagsGroup = input_command.get_input_flags() input_command_flags: FlagsGroup = input_command.get_input_flags()
input_command_flags_dict: dict = input_command_flags.unparse_to_dict()
for command_entity in self._command_entities: for command_entity in self._command_entities:
if input_command_name.lower() == command_entity['command'].get_string_entity().lower(): if input_command_name.lower() == command_entity['command'].get_string_entity().lower():
if command_entity['command'].get_registered_flags(): if command_entity['command'].get_registered_flags():
@@ -58,9 +59,9 @@ class Router:
if not is_valid: if not is_valid:
self._not_valid_flag_handler(flag) self._not_valid_flag_handler(flag)
return return
return command_entity['handler_func'](input_command_flags) return command_entity['handler_func'](input_command_flags_dict)
else: else:
return command_entity['handler_func'](FlagsGroup(None)) return command_entity['handler_func']({})
else: else:
if input_command_flags: if input_command_flags:
self._not_valid_flag_handler(input_command_flags[0]) self._not_valid_flag_handler(input_command_flags[0])
+3 -4
View File
@@ -1,4 +1,5 @@
import re import re
from pprint import pprint
from rich.console import Console from rich.console import Console
@@ -32,11 +33,9 @@ def command_help():
@work_router.command(Command(command='P', description='Start Solving', flags=flagi)) @work_router.command(Command(command='P', description='Start Solving', flags=flagi))
def command_start_solving(argrrtrts: FlagsGroup | None): def command_start_solving(argrrtrts: dict):
print('Solving...') print('Solving...')
flags = argrrtrts.get_flags() pprint(argrrtrts)
for flag in flags:
print(f'name: "{flag.get_string_entity()}", value: "{flag.get_value()}"')
#start_solving_command() #start_solving_command()
+1 -1
View File
@@ -1,4 +1,4 @@
from tests.mock_app.handlers.routers import work_router, settings_router from mock.mock_app.handlers.routers import work_router, settings_router
from art import text2art from art import text2art
from rich.console import Console from rich.console import Console