mirror of
https://github.com/koloideal/Argenta.git
synced 2026-06-10 10:05:28 +03:00
Update documentation and code snippets
This commit is contained in:
@@ -7,15 +7,15 @@ router = Router()
|
||||
|
||||
@router.command("get_args")
|
||||
def get_args(response: Response, argspace: FromDishka[ArgSpace]):
|
||||
# Получение всех булевых флагов
|
||||
# Get all boolean flags
|
||||
boolean_flags = argspace.get_by_type(BooleanArgument)
|
||||
print(f"Active flags: {[arg.name for arg in boolean_flags if arg.value]}")
|
||||
|
||||
# Получение всех аргументов со значениями
|
||||
# Get all value arguments
|
||||
value_args = argspace.get_by_type(ValueArgument)
|
||||
for arg in value_args:
|
||||
print(f"{arg.name} = {arg.value}")
|
||||
|
||||
# Подсчет количества аргументов каждого типа
|
||||
# Count arguments of each type
|
||||
print(f"Boolean arguments: {len(argspace.get_by_type(BooleanArgument))}")
|
||||
print(f"Value arguments: {len(argspace.get_by_type(ValueArgument))}")
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
from argenta.orchestrator.argparser import ArgParser, ValueArgument
|
||||
|
||||
# Создание аргументов
|
||||
# Create arguments
|
||||
config_arg = ValueArgument(
|
||||
"config",
|
||||
help="Path to configuration file",
|
||||
@@ -20,7 +20,7 @@ host_arg = ValueArgument(
|
||||
is_required=True
|
||||
)
|
||||
|
||||
# Регистрация в ArgParser
|
||||
# Register in ArgParser
|
||||
parser = ArgParser(
|
||||
processed_args=[config_arg, log_level_arg, host_arg],
|
||||
name="MyApp",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
from argenta.orchestrator.argparser import ArgParser, BooleanArgument
|
||||
|
||||
# Создание булевых аргументов
|
||||
# Create boolean arguments
|
||||
verbose_arg = BooleanArgument(
|
||||
"verbose",
|
||||
help="Enable verbose output"
|
||||
@@ -16,7 +16,7 @@ no_cache_arg = BooleanArgument(
|
||||
help="Disable caching"
|
||||
)
|
||||
|
||||
# Регистрация в ArgParser
|
||||
# Register in ArgParser
|
||||
parser = ArgParser(
|
||||
processed_args=[verbose_arg, debug_arg, no_cache_arg],
|
||||
name="MyApp"
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
from argenta.command import InputCommand
|
||||
|
||||
# Парсинг команды без флагов
|
||||
# Parse command without flags
|
||||
cmd1 = InputCommand.parse("hello")
|
||||
print(cmd1.trigger) # "hello"
|
||||
print(len(cmd1.input_flags)) # 0
|
||||
|
||||
# Парсинг команды с флагами
|
||||
# Parse command with flags
|
||||
cmd2 = InputCommand.parse("deploy --env prod --force")
|
||||
print(cmd2.trigger) # "deploy"
|
||||
print(len(cmd2.input_flags)) # 2
|
||||
|
||||
@@ -2,19 +2,19 @@ import re
|
||||
|
||||
from argenta.command.flag.models import Flag, PossibleValues
|
||||
|
||||
# Флаг со списком допустимых значений
|
||||
# Flag with list of allowed values
|
||||
format_flag = Flag(name="format", possible_values=["json", "xml", "csv"])
|
||||
|
||||
# Валидация значений
|
||||
# Value validation
|
||||
print(format_flag.validate_input_flag_value("json")) # True
|
||||
print(format_flag.validate_input_flag_value("pdf")) # False
|
||||
|
||||
# Флаг без значения
|
||||
# Flag without value
|
||||
help_flag = Flag(name="help", possible_values=PossibleValues.NEITHER)
|
||||
print(help_flag.validate_input_flag_value(None)) # True
|
||||
print(help_flag.validate_input_flag_value("value")) # False
|
||||
|
||||
# Флаг с регулярным выражением
|
||||
# Flag with regular expression
|
||||
port_flag = Flag(name="port", possible_values=re.compile(r"^\d{1,5}$"))
|
||||
print(port_flag.validate_input_flag_value("8080")) # True
|
||||
print(port_flag.validate_input_flag_value("abc")) # False
|
||||
|
||||
@@ -6,10 +6,10 @@ router = Router(title="Add Flag Example")
|
||||
|
||||
@router.command(Command("test", description="Test command"))
|
||||
def test_handler(response: Response):
|
||||
# Создаём новую коллекцию InputFlags
|
||||
# Create new InputFlags collection
|
||||
new_flags = InputFlags()
|
||||
|
||||
# Добавляем один флаг
|
||||
# Add one flag
|
||||
test_flag = InputFlag(
|
||||
name="test", prefix="--", input_value="value", status=ValidationStatus.VALID
|
||||
)
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
from argenta.command.flag import InputFlag, InputFlags, ValidationStatus
|
||||
|
||||
# Создаём коллекцию InputFlags
|
||||
# Create InputFlags collection
|
||||
flags = InputFlags()
|
||||
|
||||
# Создаём несколько флагов
|
||||
# Create several flags
|
||||
flag1 = InputFlag(
|
||||
name="option1", prefix="--", input_value="value1", status=ValidationStatus.VALID
|
||||
)
|
||||
@@ -16,7 +16,7 @@ flag3 = InputFlag(
|
||||
name="option3", prefix="---", input_value="value3", status=ValidationStatus.VALID
|
||||
)
|
||||
|
||||
# Добавляем все флаги одним вызовом
|
||||
# Add all flags in one call
|
||||
flags.add_flags([flag1, flag2, flag3])
|
||||
|
||||
print(f"Total flags: {len(flags.flags)}")
|
||||
|
||||
@@ -14,7 +14,7 @@ router = Router(title="Bool Check Example")
|
||||
def action_handler(response: Response):
|
||||
input_flags = response.input_flags
|
||||
|
||||
# Проверяем наличие флагов
|
||||
# Check for flags presence
|
||||
if input_flags:
|
||||
print("Flags were provided:")
|
||||
for flag in input_flags:
|
||||
@@ -22,6 +22,6 @@ def action_handler(response: Response):
|
||||
else:
|
||||
print("No flags provided, using defaults")
|
||||
|
||||
# Альтернативный способ проверки
|
||||
# Alternative way to check
|
||||
has_flags = bool(input_flags)
|
||||
print(f"\nHas flags: {has_flags}")
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
from argenta.command.flag import InputFlag, ValidationStatus
|
||||
from argenta.command.flag.flags.models import InputFlags
|
||||
|
||||
# Создаём первую коллекцию
|
||||
# Create first collection
|
||||
flags1 = InputFlags(
|
||||
[
|
||||
InputFlag(name="flag1", input_value="value1", status=ValidationStatus.VALID),
|
||||
@@ -9,7 +9,7 @@ flags1 = InputFlags(
|
||||
]
|
||||
)
|
||||
|
||||
# Создаём вторую коллекцию с теми же флагами
|
||||
# Create second collection with same flags
|
||||
flags2 = InputFlags(
|
||||
[
|
||||
InputFlag(name="flag1", input_value="value1", status=ValidationStatus.VALID),
|
||||
@@ -17,7 +17,7 @@ flags2 = InputFlags(
|
||||
]
|
||||
)
|
||||
|
||||
# Создаём третью коллекцию с другими флагами
|
||||
# Create third collection with different values
|
||||
flags3 = InputFlags(
|
||||
[
|
||||
InputFlag(name="flag1", input_value="different", status=ValidationStatus.VALID),
|
||||
@@ -25,13 +25,13 @@ flags3 = InputFlags(
|
||||
]
|
||||
)
|
||||
|
||||
print(f"flags1 == flags2: {flags1 == flags2}") # True (одинаковые имена)
|
||||
print(f"flags1 == flags2: {flags1 == flags2}") # True (same names)
|
||||
print(
|
||||
f"flags1 == flags3: {flags1 == flags3}"
|
||||
) # True (имена одинаковые, значения не учитываются)
|
||||
) # True (same names, values are not considered)
|
||||
|
||||
# Разные коллекции
|
||||
# Different collections
|
||||
flags4 = InputFlags(
|
||||
[InputFlag(name="flag3", input_value="value3", status=ValidationStatus.VALID)]
|
||||
)
|
||||
print(f"flags1 == flags4: {flags1 == flags4}") # False (разные флаги)
|
||||
print(f"flags1 == flags4: {flags1 == flags4}") # False (different flags)
|
||||
|
||||
@@ -15,18 +15,18 @@ router = Router(title="Contains Example")
|
||||
def check_handler(response: Response):
|
||||
input_flags = response.input_flags
|
||||
|
||||
# Проверяем наличие конкретного флага
|
||||
# Check for specific flag presence
|
||||
verbose_flag = input_flags.get_flag_by_name("verbose")
|
||||
debug_flag = input_flags.get_flag_by_name("debug")
|
||||
|
||||
# Используем оператор in для проверки
|
||||
# Use 'in' operator for checking
|
||||
if verbose_flag and verbose_flag in input_flags:
|
||||
print("Verbose flag is present")
|
||||
|
||||
if debug_flag and debug_flag in input_flags:
|
||||
print("Debug flag is present")
|
||||
|
||||
# Можно создать флаг для проверки (сравнение идёт по имени)
|
||||
# You can create a flag for checking (comparison is by name)
|
||||
test_flag = InputFlag(name="verbose", prefix="--", input_value="any", status=None)
|
||||
|
||||
if test_flag in input_flags:
|
||||
|
||||
@@ -15,13 +15,13 @@ class ConnectionProvider(Provider):
|
||||
conn.close()
|
||||
|
||||
|
||||
# 2. Создаем и настраиваем App
|
||||
# 2. Create and configure App
|
||||
app = App()
|
||||
# ... здесь можно добавить роутеры ...
|
||||
# ... you can add routers here ...
|
||||
|
||||
# 3. Создаем Orchestrator, передавая наш провайдер
|
||||
# 3. Create Orchestrator, passing our provider
|
||||
orchestrator = Orchestrator(custom_providers=[ConnectionProvider()])
|
||||
|
||||
# 4. Запускаем приложение
|
||||
# 4. Start the application
|
||||
if __name__ == "__main__":
|
||||
orchestrator.start_polling(app)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
from argenta import App, Command, Orchestrator, Router, Response
|
||||
from argenta.command import Flag
|
||||
|
||||
# 1. Создание экземпляра приложения и оркестратора
|
||||
# 1. Create app and orchestrator instances
|
||||
app = App(
|
||||
prompt=">> ",
|
||||
initial_message="Simple App",
|
||||
@@ -9,28 +9,28 @@ app = App(
|
||||
)
|
||||
orchestrator = Orchestrator()
|
||||
|
||||
# 2. Создание роутера для группировки команд
|
||||
main_router = Router(title="Основные команды")
|
||||
# 2. Create router for grouping commands
|
||||
main_router = Router(title="Main commands")
|
||||
|
||||
|
||||
# 3. Определение команды и её обработчика
|
||||
# 3. Define command and its handler
|
||||
@main_router.command(
|
||||
Command(
|
||||
"hello", description="Печатает приветственное сообщение", flags=Flag("name")
|
||||
"hello", description="Prints greeting message", flags=Flag("name")
|
||||
)
|
||||
)
|
||||
def hello_handler(response: Response):
|
||||
"""Этот обработчик будет вызван для команды 'hello'."""
|
||||
"""This handler will be called for 'hello' command."""
|
||||
name = response.input_flags.get_flag_by_name("name")
|
||||
if name:
|
||||
print(f"Привет, {name.input_value}!")
|
||||
print(f"Hello, {name.input_value}!")
|
||||
else:
|
||||
print("Привет, мир!")
|
||||
print("Hello, world!")
|
||||
|
||||
|
||||
# 4. Подключение роутера к приложению
|
||||
# 4. Include router to application
|
||||
app.include_router(main_router)
|
||||
|
||||
# 5. Запуск приложения
|
||||
# 5. Start application
|
||||
if __name__ == "__main__":
|
||||
orchestrator.start_polling(app)
|
||||
|
||||
@@ -3,16 +3,16 @@ from argenta import App, Orchestrator
|
||||
from .handlers import router
|
||||
from .provider import TaskProvider
|
||||
|
||||
# 1. Создаем экземпляр приложения и оркестратора
|
||||
# 1. Create app and orchestrator instances
|
||||
app = App(
|
||||
initial_message="Task Manager",
|
||||
prompt="Enter a command: ",
|
||||
)
|
||||
orchestrator = Orchestrator(custom_providers=[TaskProvider()])
|
||||
|
||||
# 2. Подключаем роутер с нашими командами
|
||||
# 2. Include router with our commands
|
||||
app.include_router(router)
|
||||
|
||||
# 3. Запускаем поллинг через оркестратор
|
||||
# 3. Start polling via orchestrator
|
||||
if __name__ == "__main__":
|
||||
orchestrator.start_polling(app)
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
from argenta import Response, Router
|
||||
|
||||
# Для этого роутера перехват stdout будет отключен
|
||||
# For this router stdout redirect will be disabled
|
||||
interactive_router = Router(disable_redirect_stdout=True)
|
||||
|
||||
|
||||
@interactive_router.command("ask")
|
||||
def ask_name(response: Response):
|
||||
name = input("Как вас зовут? ")
|
||||
print(f"Приятно познакомиться, {name}!")
|
||||
name = input("What is your name? ")
|
||||
print(f"Nice to meet you, {name}!")
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
from argenta import App
|
||||
from argenta.app import StaticDividingLine
|
||||
|
||||
# Все роутеры по умолчанию будут использовать статическую линию длиной 50 символов
|
||||
# All routers will use static line with length 50 by default
|
||||
app = App(dividing_line=StaticDividingLine(length=50))
|
||||
|
||||
@@ -5,7 +5,7 @@ router = Router(title="Data Example")
|
||||
|
||||
@router.command(Command("set", description="Set data"))
|
||||
def set_handler(response: Response):
|
||||
# Обновляем глобальное хранилище данных
|
||||
# Update global data storage
|
||||
response.update_data(
|
||||
{
|
||||
"user_name": "John",
|
||||
@@ -18,7 +18,7 @@ def set_handler(response: Response):
|
||||
|
||||
@router.command(Command("show", description="Show data"))
|
||||
def show_handler(response: Response):
|
||||
# Получаем данные из глобального хранилища
|
||||
# Get data from global storage
|
||||
data = response.get_data()
|
||||
if "user_name" in data:
|
||||
print(f"User: {data['user_name']}")
|
||||
|
||||
@@ -5,7 +5,7 @@ router = Router(title="Get Data Example")
|
||||
|
||||
@router.command(Command("info", description="Show all stored data"))
|
||||
def info_handler(response: Response):
|
||||
# Получаем все данные из глобального хранилища
|
||||
# Get all data from global storage
|
||||
all_data = response.get_data()
|
||||
|
||||
if all_data:
|
||||
|
||||
@@ -5,7 +5,7 @@ router = Router(title="Clear Data Example")
|
||||
|
||||
@router.command(Command("clear", description="Clear all stored data"))
|
||||
def clear_handler(response: Response):
|
||||
# Очищаем всё хранилище данных
|
||||
# Clear all data storage
|
||||
response.clear_data()
|
||||
print("All data cleared")
|
||||
|
||||
|
||||
@@ -17,12 +17,12 @@ def store_handler(response: Response):
|
||||
|
||||
@router.command(Command("remove", description="Remove specific key"))
|
||||
def remove_handler(response: Response):
|
||||
# Удаляем конкретный ключ из хранилища
|
||||
# Delete specific key from storage
|
||||
try:
|
||||
response.delete_from_data("temp_key")
|
||||
print("Key 'temp_key' deleted")
|
||||
|
||||
# Проверяем, что осталось
|
||||
# Check what remains
|
||||
remaining = response.get_data()
|
||||
print(f"Remaining keys: {list(remaining.keys())}")
|
||||
except KeyError:
|
||||
|
||||
@@ -68,6 +68,7 @@ Router
|
||||
Выбрасывается, если триггер команды в ``Command`` содержит пробелы. Триггеры должны быть одним словом.
|
||||
|
||||
**Неправильно:** ``Command("add user")``
|
||||
|
||||
**Правильно:** ``Command("add-user")``
|
||||
|
||||
.. py:exception:: RepeatedFlagNameException
|
||||
@@ -81,7 +82,7 @@ Router
|
||||
|
||||
Command("send", flags=[
|
||||
Flag("recipient"),
|
||||
Flag("recipient")
|
||||
Flag("recipient") # Duplicate!
|
||||
])
|
||||
|
||||
.. py:exception:: RequiredArgumentNotPassedException
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
В основе DI в Argenta лежат **провайдеры** и **контейнер**.
|
||||
|
||||
* **Провайдер (Provider)** — это "рецепт", который объясняет, как создавать и настраивать ту или иную зависимость (например, подключение к БД, API-клиент или любой другой сервис).
|
||||
* **Провайдер (``Provider``)** — это "рецепт", который объясняет, как создавать и настраивать ту или иную зависимость (например, подключение к БД, API-клиент или любой другой сервис).
|
||||
* **Контейнер (IoC Container)** — это "фабрика", которая хранит все рецепты (провайдеры) и по запросу создаёт и выдаёт готовые зависимости.
|
||||
|
||||
-----
|
||||
|
||||
@@ -51,7 +51,7 @@ Argenta выбрасывает исключения в пограничных с
|
||||
Исключение выбрасывается, если пользователь ввёл команду с повторяющимися флагами. Два флага (:ref:`InputFlag <root_api_command_input_flag>`) считаются одинаковыми, если у них совпадают имена. Подробнее о флагах и их синтаксисе — в разделе :ref:`Flags <root_flags>`.
|
||||
|
||||
.. note::
|
||||
Сравнение на равенство у регистрируемых флагов(Flag) происходит иначе, подробнее в :ref:`Flag <root_flags>`.
|
||||
Сравнение на равенство у регистрируемых флагов (``Flag``) происходит иначе, подробнее в :ref:`Flag <root_flags>`.
|
||||
|
||||
Стандартный хэндлер выводит в консоль
|
||||
|
||||
|
||||
@@ -67,11 +67,11 @@
|
||||
|
||||
``Argenta`` поддерживает два типа разделителей, которые настраиваются при инициализации ``App``:
|
||||
|
||||
1. **DynamicDividingLine()**
|
||||
1. **``DynamicDividingLine()``**
|
||||
* Поведение по умолчанию. Длина линии динамически подстраивается под самый длинный текст в выводе.
|
||||
* Требует включённого перехвата ``stdout`` (``disable_redirect_stdout=False`` в роутере).
|
||||
|
||||
2. **StaticDividingLine(length: int = 25)**
|
||||
2. **``StaticDividingLine(length: int = 25)``**
|
||||
* Линия имеет фиксированную длину (по умолчанию 25 символов), которую можно задать через аргумент ``length``.
|
||||
* Используется принудительно для роутеров с ``disable_redirect_stdout=True``, так как без перехвата вывода невозможно определить динамическую длину.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user