This commit is contained in:
2025-11-02 01:04:31 +03:00
parent 64c984a704
commit 9c58c10152
70 changed files with 341 additions and 391 deletions
+2 -2
View File
@@ -1,10 +1,10 @@
from argenta import App, Orchestrator from argenta import App, Orchestrator
from argenta.orchestrator.argparser import ArgParser, BooleanArgument from argenta.orchestrator.argparser import ArgParser, BooleanArgument
arg_parser = ArgParser(processed_args=[BooleanArgument('config')]) arg_parser = ArgParser(processed_args=[BooleanArgument("config")])
orchestrator = Orchestrator( orchestrator = Orchestrator(
arg_parser=arg_parser, arg_parser=arg_parser,
) )
if __name__ == "__main__": if __name__ == "__main__":
orchestrator.start_polling(App()) orchestrator.start_polling(App())
+8 -18
View File
@@ -3,23 +3,13 @@ from argenta.orchestrator.argparser import ArgParser, ValueArgument
# Определение аргументов приложения # Определение аргументов приложения
arguments = [ arguments = [
ValueArgument( ValueArgument("host", help="Server host", default="localhost"),
"host", ValueArgument("port", help="Server port", default="8080"),
help="Server host",
default="localhost"
),
ValueArgument(
"port",
help="Server port",
default="8080"
),
] ]
# Создание и запуск парсера # Создание и запуск парсера
argparser = ArgParser( argparser = ArgParser(
processed_args=arguments, processed_args=arguments, name="WebServer", description="Simple web server"
name="WebServer",
description="Simple web server"
) )
app = App() app = App()
@@ -29,17 +19,17 @@ orchestrator = Orchestrator(argparser)
def main(): def main():
# Получение аргументов только после инициализации Orchestrator # Получение аргументов только после инициализации Orchestrator
argspace = argparser.parsed_argspace argspace = argparser.parsed_argspace
# Получение конкретных аргументов # Получение конкретных аргументов
host = argspace.get_by_name("host") host = argspace.get_by_name("host")
port = argspace.get_by_name("port") port = argspace.get_by_name("port")
print("Server configuration:") print("Server configuration:")
print(f" Host: {host.value}") print(f" Host: {host.value}")
print(f" Port: {port.value}") print(f" Port: {port.value}")
orchestrator.start_polling(app) orchestrator.start_polling(app)
if __name__ == "__main__": if __name__ == "__main__":
main() main()
+2 -2
View File
@@ -4,7 +4,7 @@ from argenta.orchestrator.argparser import ArgSpace
router = Router() router = Router()
@router.command('get_args')
@router.command("get_args")
async def get_args(response: Response, argspace: FromDishka[ArgSpace]): async def get_args(response: Response, argspace: FromDishka[ArgSpace]):
print(argspace.all_arguments) print(argspace.all_arguments)
+6 -6
View File
@@ -1,21 +1,21 @@
from argenta import Response, Router from argenta import Response, Router
from argenta.di import FromDishka from argenta.di import FromDishka
from argenta.orchestrator.argparser import (ArgSpace, BooleanArgument, from argenta.orchestrator.argparser import ArgSpace, BooleanArgument, ValueArgument
ValueArgument)
router = Router() router = Router()
@router.command('get_args')
@router.command("get_args")
def get_args(response: Response, argspace: FromDishka[ArgSpace]): def get_args(response: Response, argspace: FromDishka[ArgSpace]):
# Получение всех булевых флагов # Получение всех булевых флагов
boolean_flags = argspace.get_by_type(BooleanArgument) boolean_flags = argspace.get_by_type(BooleanArgument)
print(f"Active flags: {[arg.name for arg in boolean_flags if arg.value]}") print(f"Active flags: {[arg.name for arg in boolean_flags if arg.value]}")
# Получение всех аргументов со значениями # Получение всех аргументов со значениями
value_args = argspace.get_by_type(ValueArgument) value_args = argspace.get_by_type(ValueArgument)
for arg in value_args: for arg in value_args:
print(f"{arg.name} = {arg.value}") print(f"{arg.name} = {arg.value}")
# Подсчет количества аргументов каждого типа # Подсчет количества аргументов каждого типа
print(f"Boolean arguments: {len(argspace.get_by_type(BooleanArgument))}") print(f"Boolean arguments: {len(argspace.get_by_type(BooleanArgument))}")
print(f"Value arguments: {len(argspace.get_by_type(ValueArgument))}") print(f"Value arguments: {len(argspace.get_by_type(ValueArgument))}")
+1 -1
View File
@@ -7,4 +7,4 @@ my_autocompleter = AutoCompleter(history_filename="argenta_history.txt")
# Передача настроенного автокомплитера в приложение # Передача настроенного автокомплитера в приложение
app = App(autocompleter=my_autocompleter) app = App(autocompleter=my_autocompleter)
# ... остальная логика приложения # ... остальная логика приложения
+11 -16
View File
@@ -2,25 +2,20 @@ from argenta import Command
from argenta.command import Flag, Flags from argenta.command import Flag, Flags
# Простая команда без флагов # Простая команда без флагов
hello_cmd = Command( hello_cmd = Command("hello", description="Greet the user")
"hello",
description="Greet the user"
)
# Команда с описанием и псевдонимами # Команда с описанием и псевдонимами
quit_cmd = Command( quit_cmd = Command("quit", description="Exit the application", aliases=["exit", "q"])
"quit",
description="Exit the application",
aliases=["exit", "q"]
)
# Команда с флагами # Команда с флагами
deploy_cmd = Command( deploy_cmd = Command(
"deploy", "deploy",
description="Deploy application to server", description="Deploy application to server",
flags=Flags([ flags=Flags(
Flag("env", help="Environment name", possible_values=["dev", "prod"]), [
Flag("force", help="Force deployment") Flag("env", help="Environment name", possible_values=["dev", "prod"]),
]), Flag("force", help="Force deployment"),
aliases=["dep"] ]
) ),
aliases=["dep"],
)
+11 -10
View File
@@ -2,17 +2,18 @@ from argenta import Command, Response, Router
router = Router(title="User Management") router = Router(title="User Management")
@router.command(Command(
"create-user", @router.command(Command("create-user", description="Create a new user account"))
description="Create a new user account"
))
def handle_create_user(response): def handle_create_user(response):
print("Creating new user...") print("Creating new user...")
@router.command(Command(
"delete-user", @router.command(
description="Delete existing user account", Command(
aliases=["remove-user", "rm-user"] "delete-user",
)) description="Delete existing user account",
aliases=["remove-user", "rm-user"],
)
)
def handle_delete_user(response: Response): def handle_delete_user(response: Response):
print("Deleting user...") print("Deleting user...")
+18 -13
View File
@@ -3,26 +3,31 @@ from argenta.command import Flag, Flags
router = Router(title="Server Management") router = Router(title="Server Management")
@router.command(Command(
"start", @router.command(
description="Start the server", Command(
flags=Flags([ "start",
Flag("port", help="Server port", default="8080"), description="Start the server",
Flag("host", help="Server host", default="localhost"), flags=Flags(
Flag("debug", help="Enable debug mode") [
]), Flag("port", help="Server port", default="8080"),
aliases=["run"] Flag("host", help="Server host", default="localhost"),
)) Flag("debug", help="Enable debug mode"),
]
),
aliases=["run"],
)
)
def handle_start(response: Response): def handle_start(response: Response):
input_flags = response.input_flags input_flags = response.input_flags
port_flag = input_flags.get_flag_by_name("port") port_flag = input_flags.get_flag_by_name("port")
host_flag = input_flags.get_flag_by_name("host") host_flag = input_flags.get_flag_by_name("host")
debug_flag = input_flags.get_flag_by_name("debug") debug_flag = input_flags.get_flag_by_name("debug")
host = host_flag.input_value if host_flag else "localhost" host = host_flag.input_value if host_flag else "localhost"
port = port_flag.input_value if port_flag else "8080" port = port_flag.input_value if port_flag else "8080"
debug = debug_flag and debug_flag.input_value debug = debug_flag and debug_flag.input_value
print(f"Starting server on {host}:{port}") print(f"Starting server on {host}:{port}")
if debug: if debug:
print("Debug mode: ON") print("Debug mode: ON")
+1 -1
View File
@@ -8,4 +8,4 @@ print(len(cmd1.input_flags)) # 0
# Парсинг команды с флагами # Парсинг команды с флагами
cmd2 = InputCommand.parse("deploy --env prod --force") cmd2 = InputCommand.parse("deploy --env prod --force")
print(cmd2.trigger) # "deploy" print(cmd2.trigger) # "deploy"
print(len(cmd2.input_flags)) # 2 print(len(cmd2.input_flags)) # 2
@@ -5,7 +5,7 @@ from argenta.di import FromDishka
router = Router() router = Router()
@router.command('connect')
@router.command("connect")
def connect_handler(response: Response, connection: FromDishka[Connection]): def connect_handler(response: Response, connection: FromDishka[Connection]):
connection.execute('...') connection.execute("...")
@@ -10,4 +10,4 @@ class ConnectionProvider(Provider):
def new_connection(self) -> Iterable[Connection]: def new_connection(self) -> Iterable[Connection]:
conn = sqlite3.connect(":memory:") conn = sqlite3.connect(":memory:")
yield conn yield conn
conn.close() conn.close()
@@ -4,7 +4,7 @@ from argenta.orchestrator.argparser import ArgSpace
router = Router() router = Router()
@router.command('info')
@router.command("info")
def connect_handler(response: Response, argspace: FromDishka[ArgSpace]): def connect_handler(response: Response, argspace: FromDishka[ArgSpace]):
print(argspace.get_by_name('type')) print(argspace.get_by_name("type"))
+1 -1
View File
@@ -11,4 +11,4 @@ dynamic_line = DynamicDividingLine(unit_part="*")
app_with_static_line = App(dividing_line=static_line) app_with_static_line = App(dividing_line=static_line)
# Приложение с динамической линией (поведение по умолчанию, но с кастомным символом) # Приложение с динамической линией (поведение по умолчанию, но с кастомным символом)
app_with_dynamic_line = App(dividing_line=dynamic_line) app_with_dynamic_line = App(dividing_line=dynamic_line)
@@ -4,5 +4,6 @@ from argenta import App
def empty_command_handler(): def empty_command_handler():
print("Empty command handler called") print("Empty command handler called")
app: App = App() app: App = App()
app.set_empty_command_handler(empty_command_handler) app.set_empty_command_handler(empty_command_handler)
@@ -4,5 +4,6 @@ from argenta import App
def incorrect_input_syntax_handler(raw_command: str): def incorrect_input_syntax_handler(raw_command: str):
print(f"Incorrect input syntax for command: {raw_command}") print(f"Incorrect input syntax for command: {raw_command}")
app: App = App() app: App = App()
app.set_incorrect_input_syntax_handler(incorrect_input_syntax_handler) app.set_incorrect_input_syntax_handler(incorrect_input_syntax_handler)
@@ -4,5 +4,6 @@ from argenta import App
def repeated_input_flags_handler(raw_command: str): def repeated_input_flags_handler(raw_command: str):
print(f"Repeated input flags: {raw_command}") print(f"Repeated input flags: {raw_command}")
app: App = App() app: App = App()
app.set_repeated_input_flags_handler(repeated_input_flags_handler) app.set_repeated_input_flags_handler(repeated_input_flags_handler)
@@ -4,5 +4,6 @@ from argenta import App
def empty_command_handler(): def empty_command_handler():
print("Empty input command") print("Empty input command")
app: App = App() app: App = App()
app.set_empty_command_handler(empty_command_handler) app.set_empty_command_handler(empty_command_handler)
@@ -5,5 +5,6 @@ from argenta.command import InputCommand
def unknown_command_handler(command: InputCommand): def unknown_command_handler(command: InputCommand):
print(f"Unknown input command with trigger: {command.trigger}") print(f"Unknown input command with trigger: {command.trigger}")
app: App = App() app: App = App()
app.set_unknown_command_handler(unknown_command_handler) app.set_unknown_command_handler(unknown_command_handler)
@@ -4,5 +4,6 @@ from argenta import App, Response
def exit_command_handler(response: Response): def exit_command_handler(response: Response):
print("Exit command handler") print("Exit command handler")
app: App = App() app: App = App()
app.set_exit_command_handler(exit_command_handler) app.set_exit_command_handler(exit_command_handler)
+23 -19
View File
@@ -2,32 +2,36 @@ from argenta.command import Flags
from argenta.command.flag.defaults import PredefinedFlags from argenta.command.flag.defaults import PredefinedFlags
# Использование предопределенных флагов при создании команды # Использование предопределенных флагов при создании команды
command_flags = Flags([ command_flags = Flags(
PredefinedFlags.HELP, [
PredefinedFlags.SHORT_HELP, PredefinedFlags.HELP,
PredefinedFlags.INFO, PredefinedFlags.SHORT_HELP,
]) PredefinedFlags.INFO,
]
)
# Использование сетевых флагов # Использование сетевых флагов
network_flags = Flags([ network_flags = Flags(
PredefinedFlags.HOST, [
PredefinedFlags.PORT, PredefinedFlags.HOST,
]) PredefinedFlags.PORT,
]
)
# Валидация значений предопределенных флагов # Валидация значений предопределенных флагов
print(PredefinedFlags.HOST.validate_input_flag_value("192.168.1.1")) # True print(PredefinedFlags.HOST.validate_input_flag_value("192.168.1.1")) # True
print(PredefinedFlags.HOST.validate_input_flag_value("invalid")) # False print(PredefinedFlags.HOST.validate_input_flag_value("invalid")) # False
print(PredefinedFlags.PORT.validate_input_flag_value("8080")) # True print(PredefinedFlags.PORT.validate_input_flag_value("8080")) # True
print(PredefinedFlags.PORT.validate_input_flag_value("99999")) # True print(PredefinedFlags.PORT.validate_input_flag_value("99999")) # True
print(PredefinedFlags.PORT.validate_input_flag_value("abc")) # False print(PredefinedFlags.PORT.validate_input_flag_value("abc")) # False
# Флаги без значений # Флаги без значений
print(PredefinedFlags.HELP.validate_input_flag_value(None)) # True print(PredefinedFlags.HELP.validate_input_flag_value(None)) # True
print(PredefinedFlags.HELP.validate_input_flag_value("something")) # False print(PredefinedFlags.HELP.validate_input_flag_value("something")) # False
# Проверка строковых представлений # Проверка строковых представлений
print(PredefinedFlags.HELP.string_entity) # --help print(PredefinedFlags.HELP.string_entity) # --help
print(PredefinedFlags.SHORT_HELP.string_entity) # -H print(PredefinedFlags.SHORT_HELP.string_entity) # -H
print(PredefinedFlags.HOST.string_entity) # --host print(PredefinedFlags.HOST.string_entity) # --host
print(PredefinedFlags.SHORT_PORT.string_entity) # -P print(PredefinedFlags.SHORT_PORT.string_entity) # -P
+2 -5
View File
@@ -12,13 +12,10 @@ short_flag = Flag(name="v", prefix="-")
help_flag = Flag(name="help", possible_values=PossibleValues.NEITHER) help_flag = Flag(name="help", possible_values=PossibleValues.NEITHER)
# Флаг со списком допустимых значений # Флаг со списком допустимых значений
format_flag = Flag( format_flag = Flag(name="format", possible_values=["json", "xml", "csv"])
name="format",
possible_values=["json", "xml", "csv"]
)
# Флаг с регулярным выражением для валидации # Флаг с регулярным выражением для валидации
email_flag = Flag( email_flag = Flag(
name="email", name="email",
possible_values=re.compile(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$") possible_values=re.compile(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"),
) )
+5 -5
View File
@@ -7,14 +7,14 @@ format_flag = Flag(name="format", possible_values=["json", "xml", "csv"])
# Валидация значений # Валидация значений
print(format_flag.validate_input_flag_value("json")) # True print(format_flag.validate_input_flag_value("json")) # True
print(format_flag.validate_input_flag_value("pdf")) # False print(format_flag.validate_input_flag_value("pdf")) # False
# Флаг без значения # Флаг без значения
help_flag = Flag(name="help", possible_values=PossibleValues.NEITHER) 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(None)) # True
print(help_flag.validate_input_flag_value("value")) # False print(help_flag.validate_input_flag_value("value")) # False
# Флаг с регулярным выражением # Флаг с регулярным выражением
port_flag = Flag(name="port", possible_values=re.compile(r"^\d{1,5}$")) 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("8080")) # True
print(port_flag.validate_input_flag_value("abc")) # False print(port_flag.validate_input_flag_value("abc")) # False
+2 -2
View File
@@ -7,5 +7,5 @@ triple_flag = Flag(name="debug", prefix="---")
# Получение строкового представления # Получение строкового представления
print(verbose_flag.string_entity) # --verbose print(verbose_flag.string_entity) # --verbose
print(short_flag.string_entity) # -v print(short_flag.string_entity) # -v
print(triple_flag.string_entity) # ---debug print(triple_flag.string_entity) # ---debug
+2 -2
View File
@@ -4,8 +4,8 @@ help_flag = Flag(name="help")
version_flag = Flag(name="V", prefix="-") version_flag = Flag(name="V", prefix="-")
# Использование str() или print() # Использование str() или print()
print(str(help_flag)) # --help print(str(help_flag)) # --help
print(version_flag) # -V print(version_flag) # -V
# Форматирование строк # Форматирование строк
message = f"Use {help_flag} to see help" message = f"Use {help_flag} to see help"
+1 -1
View File
@@ -5,7 +5,7 @@ short_flag = Flag(name="v", prefix="-")
# Отладочное представление # Отладочное представление
print(repr(verbose_flag)) # Flag<prefix=--, name=verbose> print(repr(verbose_flag)) # Flag<prefix=--, name=verbose>
print(repr(short_flag)) # Flag<prefix=-, name=v> print(repr(short_flag)) # Flag<prefix=-, name=v>
# В интерактивной консоли или отладчике # В интерактивной консоли или отладчике
# >>> verbose_flag # >>> verbose_flag
+9 -9
View File
@@ -4,14 +4,14 @@ from argenta import Command
from argenta.command import Flag, Flags from argenta.command import Flag, Flags
# Создание коллекции с флагами # Создание коллекции с флагами
flags = Flags([ flags = Flags(
Flag("host", possible_values=re.compile(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")), [
Flag("port", possible_values=re.compile(r"^\d{1,5}$")) Flag(
]) "host", possible_values=re.compile(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
),
Flag("port", possible_values=re.compile(r"^\d{1,5}$")),
]
)
# Использование в команде # Использование в команде
cmd = Command( cmd = Command("start", description="Start the server", flags=flags)
"start",
description="Start the server",
flags=flags
)
+1 -1
View File
@@ -8,4 +8,4 @@ flags.add_flag(Flag("config"))
flags.add_flag(Flag("debug")) flags.add_flag(Flag("debug"))
flags.add_flag(Flag("log-level", possible_values=["INFO", "DEBUG", "ERROR"])) flags.add_flag(Flag("log-level", possible_values=["INFO", "DEBUG", "ERROR"]))
print(len(flags.flags)) # 3 print(len(flags.flags)) # 3
+3 -5
View File
@@ -2,19 +2,17 @@ from argenta.command import Flag, Flags
from argenta.command.flag.defaults import PredefinedFlags from argenta.command.flag.defaults import PredefinedFlags
# Начальная коллекция # Начальная коллекция
flags = Flags([ flags = Flags([PredefinedFlags.HOST])
PredefinedFlags.HOST
])
# Дополнительные флаги # Дополнительные флаги
additional_flags = [ additional_flags = [
PredefinedFlags.PORT, PredefinedFlags.PORT,
Flag("database"), Flag("database"),
Flag("ssl"), Flag("ssl"),
Flag("verbose") Flag("verbose"),
] ]
# Добавление списка флагов # Добавление списка флагов
flags.add_flags(additional_flags) flags.add_flags(additional_flags)
print(len(flags.flags)) # 5 print(len(flags.flags)) # 5
+2 -6
View File
@@ -1,11 +1,7 @@
from argenta.command import Flag, Flags from argenta.command import Flag, Flags
from argenta.command.flag.defaults import PredefinedFlags from argenta.command.flag.defaults import PredefinedFlags
flags = Flags([ flags = Flags([PredefinedFlags.HOST, PredefinedFlags.PORT, Flag("verbose")])
PredefinedFlags.HOST,
PredefinedFlags.PORT,
Flag("verbose")
])
# Получение флага по имени # Получение флага по имени
host_flag = flags.get_flag_by_name("host") host_flag = flags.get_flag_by_name("host")
@@ -15,4 +11,4 @@ if host_flag:
# Поиск несуществующего флага # Поиск несуществующего флага
unknown_flag = flags.get_flag_by_name("nonexistent") unknown_flag = flags.get_flag_by_name("nonexistent")
if unknown_flag is None: if unknown_flag is None:
print("Flag not found") print("Flag not found")
+2 -6
View File
@@ -1,11 +1,7 @@
from argenta.command import Flag, Flags from argenta.command import Flag, Flags
from argenta.command.flag.defaults import PredefinedFlags from argenta.command.flag.defaults import PredefinedFlags
flags = Flags([ flags = Flags([PredefinedFlags.HOST, PredefinedFlags.PORT, Flag("verbose")])
PredefinedFlags.HOST,
PredefinedFlags.PORT,
Flag("verbose")
])
# Итерация по всем флагам # Итерация по всем флагам
for flag in flags: for flag in flags:
@@ -13,4 +9,4 @@ for flag in flags:
# Использование в list comprehension # Использование в list comprehension
flag_names = [flag.name for flag in flags] flag_names = [flag.name for flag in flags]
print(f"All flags: {flag_names}") print(f"All flags: {flag_names}")
+2 -6
View File
@@ -1,10 +1,6 @@
from argenta.command import Flag, Flags from argenta.command import Flag, Flags
flags = Flags([ flags = Flags([Flag("first"), Flag("second"), Flag("third")])
Flag("first"),
Flag("second"),
Flag("third")
])
print(flags[0].name) print(flags[0].name)
# first # first
@@ -13,4 +9,4 @@ print(flags[1].name)
# second # second
print(flags[2].name) print(flags[2].name)
# third # third
+2 -8
View File
@@ -2,16 +2,10 @@ from argenta.command.flag import InputFlag, ValidationStatus
# Создание InputFlag с полным набором параметров # Создание InputFlag с полным набором параметров
output_flag = InputFlag( output_flag = InputFlag(
name="output", name="output", prefix="--", input_value="result.txt", status=ValidationStatus.VALID
prefix="--",
input_value="result.txt",
status=ValidationStatus.VALID
) )
# Флаг без значения # Флаг без значения
help_flag = InputFlag( help_flag = InputFlag(
name="help", name="help", prefix="-", input_value=None, status=ValidationStatus.VALID
prefix="-",
input_value=None,
status=ValidationStatus.VALID
) )
+1 -4
View File
@@ -1,10 +1,7 @@
from argenta.command.flag import InputFlag, ValidationStatus from argenta.command.flag import InputFlag, ValidationStatus
flag = InputFlag( flag = InputFlag(
name="verbose", name="verbose", prefix="-", input_value=None, status=ValidationStatus.VALID
prefix="-",
input_value=None,
status=ValidationStatus.VALID
) )
# Получение строкового представления флага # Получение строкового представления флага
+2 -8
View File
@@ -1,17 +1,11 @@
from argenta.command.flag import InputFlag, ValidationStatus from argenta.command.flag import InputFlag, ValidationStatus
flag_with_value = InputFlag( flag_with_value = InputFlag(
name="output", name="output", prefix="--", input_value="result.txt", status=ValidationStatus.VALID
prefix="--",
input_value="result.txt",
status=ValidationStatus.VALID
) )
flag_without_value = InputFlag( flag_without_value = InputFlag(
name="help", name="help", prefix="-", input_value=None, status=ValidationStatus.VALID
prefix="-",
input_value=None,
status=ValidationStatus.VALID
) )
# Строковое представление включает значение # Строковое представление включает значение
+1 -1
View File
@@ -4,7 +4,7 @@ flag = InputFlag(
name="config", name="config",
prefix="--", prefix="--",
input_value="settings.json", input_value="settings.json",
status=ValidationStatus.VALID status=ValidationStatus.VALID,
) )
# Отладочное представление объекта # Отладочное представление объекта
+2 -8
View File
@@ -1,17 +1,11 @@
from argenta.command.flag import InputFlag, ValidationStatus from argenta.command.flag import InputFlag, ValidationStatus
flag1 = InputFlag( flag1 = InputFlag(
name="debug", name="debug", prefix="--", input_value=None, status=ValidationStatus.VALID
prefix="--",
input_value=None,
status=ValidationStatus.VALID
) )
flag2 = InputFlag( flag2 = InputFlag(
name="debug", name="debug", prefix="-", input_value="true", status=ValidationStatus.INVALID
prefix="-",
input_value="true",
status=ValidationStatus.INVALID
) )
# Сравнение по имени (префикс и значение не учитываются) # Сравнение по имени (префикс и значение не учитываются)
+9 -10
View File
@@ -3,21 +3,20 @@ from argenta.command import Flag, Flags
router = Router(title="Example") router = Router(title="Example")
@router.command(Command(
"example", @router.command(
description="Example command with flags", Command(
flags=Flags([ "example",
Flag("name"), description="Example command with flags",
Flag("age") flags=Flags([Flag("name"), Flag("age")]),
]) )
)) )
def example_handler(response: Response): def example_handler(response: Response):
# response.input_flags содержит коллекцию InputFlags # response.input_flags содержит коллекцию InputFlags
input_flags = response.input_flags input_flags = response.input_flags
# Проверяем наличие флагов # Проверяем наличие флагов
if input_flags: if input_flags:
print(f"Received {len(input_flags.flags)} flag(s)") print(f"Received {len(input_flags.flags)} flag(s)")
else: else:
print("No flags provided") print("No flags provided")
+19 -15
View File
@@ -4,25 +4,30 @@ from argenta.command.flag import ValidationStatus
router = Router(title="Comprehensive Example") router = Router(title="Comprehensive Example")
@router.command(Command(
"validate", @router.command(
description="Validate all flags", Command(
flags=Flags([ "validate",
Flag("format", possible_values=["json", "xml"]), description="Validate all flags",
Flag("output"), flags=Flags(
Flag("force") [
]) Flag("format", possible_values=["json", "xml"]),
)) Flag("output"),
Flag("force"),
]
),
)
)
def validate_handler(response: Response): def validate_handler(response: Response):
input_flags = response.input_flags input_flags = response.input_flags
# Итерируемся по всем флагам и проверяем их статусы # Итерируемся по всем флагам и проверяем их статусы
print("Flag validation results:") print("Flag validation results:")
valid_flags = [] valid_flags = []
invalid_flags = [] invalid_flags = []
undefined_flags = [] undefined_flags = []
for flag in input_flags: for flag in input_flags:
if flag.status == ValidationStatus.VALID: if flag.status == ValidationStatus.VALID:
valid_flags.append(flag) valid_flags.append(flag)
@@ -33,16 +38,15 @@ def validate_handler(response: Response):
elif flag.status == ValidationStatus.UNDEFINED: elif flag.status == ValidationStatus.UNDEFINED:
undefined_flags.append(flag) undefined_flags.append(flag)
print(f" ? {flag.string_entity}: {flag.input_value} (UNDEFINED)") print(f" ? {flag.string_entity}: {flag.input_value} (UNDEFINED)")
# Выводим сводку # Выводим сводку
print("\nSummary:") print("\nSummary:")
print(f" Valid flags: {len(valid_flags)}") print(f" Valid flags: {len(valid_flags)}")
print(f" Invalid flags: {len(invalid_flags)}") print(f" Invalid flags: {len(invalid_flags)}")
print(f" Undefined flags: {len(undefined_flags)}") print(f" Undefined flags: {len(undefined_flags)}")
# Обрабатываем только валидные флаги # Обрабатываем только валидные флаги
if valid_flags: if valid_flags:
print("\nProcessing valid flags:") print("\nProcessing valid flags:")
for flag in valid_flags: for flag in valid_flags:
print(f" Processing {flag.name} = {flag.input_value}") print(f" Processing {flag.name} = {flag.input_value}")
+13 -15
View File
@@ -3,34 +3,32 @@ from argenta.command import Flag, Flags
router = Router(title="Get Flag Example") router = Router(title="Get Flag Example")
@router.command(Command(
"config", @router.command(
description="Configure settings", Command(
flags=Flags([ "config",
Flag("host"), description="Configure settings",
Flag("port"), flags=Flags([Flag("host"), Flag("port"), Flag("debug")]),
Flag("debug") )
]) )
))
def config_handler(response: Response): def config_handler(response: Response):
input_flags = response.input_flags input_flags = response.input_flags
# Получаем флаг по имени # Получаем флаг по имени
host_flag = input_flags.get_flag_by_name("host") host_flag = input_flags.get_flag_by_name("host")
port_flag = input_flags.get_flag_by_name("port") port_flag = input_flags.get_flag_by_name("port")
debug_flag = input_flags.get_flag_by_name("debug") debug_flag = input_flags.get_flag_by_name("debug")
if host_flag: if host_flag:
print(f"Host: {host_flag.input_value}") print(f"Host: {host_flag.input_value}")
if port_flag: if port_flag:
print(f"Port: {port_flag.input_value}") print(f"Port: {port_flag.input_value}")
if debug_flag: if debug_flag:
print("Debug mode enabled") print("Debug mode enabled")
# Если флаг не найден, get_flag_by_name вернёт None # Если флаг не найден, get_flag_by_name вернёт None
missing_flag = input_flags.get_flag_by_name("nonexistent") missing_flag = input_flags.get_flag_by_name("nonexistent")
if missing_flag is None: if missing_flag is None:
print("Flag 'nonexistent' not found") print("Flag 'nonexistent' not found")
+4 -7
View File
@@ -3,20 +3,17 @@ from argenta.command.flag import InputFlag, InputFlags, ValidationStatus
router = Router(title="Add Flag Example") router = Router(title="Add Flag Example")
@router.command(Command("test", description="Test command")) @router.command(Command("test", description="Test command"))
def test_handler(response: Response): def test_handler(response: Response):
# Создаём новую коллекцию InputFlags # Создаём новую коллекцию InputFlags
new_flags = InputFlags() new_flags = InputFlags()
# Добавляем один флаг # Добавляем один флаг
test_flag = InputFlag( test_flag = InputFlag(
name="test", name="test", prefix="--", input_value="value", status=ValidationStatus.VALID
prefix="--",
input_value="value",
status=ValidationStatus.VALID
) )
new_flags.add_flag(test_flag) new_flags.add_flag(test_flag)
print(f"Flags count: {len(new_flags.flags)}") print(f"Flags count: {len(new_flags.flags)}")
print(f"First flag: {new_flags.flags[0].name}") print(f"First flag: {new_flags.flags[0].name}")
+3 -13
View File
@@ -5,24 +5,15 @@ flags = InputFlags()
# Создаём несколько флагов # Создаём несколько флагов
flag1 = InputFlag( flag1 = InputFlag(
name="option1", name="option1", prefix="--", input_value="value1", status=ValidationStatus.VALID
prefix="--",
input_value="value1",
status=ValidationStatus.VALID
) )
flag2 = InputFlag( flag2 = InputFlag(
name="option2", name="option2", prefix="--", input_value="value2", status=ValidationStatus.VALID
prefix="--",
input_value="value2",
status=ValidationStatus.VALID
) )
flag3 = InputFlag( flag3 = InputFlag(
name="option3", name="option3", prefix="---", input_value="value3", status=ValidationStatus.VALID
prefix="---",
input_value="value3",
status=ValidationStatus.VALID
) )
# Добавляем все флаги одним вызовом # Добавляем все флаги одним вызовом
@@ -31,4 +22,3 @@ flags.add_flags([flag1, flag2, flag3])
print(f"Total flags: {len(flags.flags)}") print(f"Total flags: {len(flags.flags)}")
for flag in flags: for flag in flags:
print(f" - {flag.string_entity}: {flag.input_value}") print(f" - {flag.string_entity}: {flag.input_value}")
+10 -12
View File
@@ -3,26 +3,24 @@ from argenta.command import Flag, Flags
router = Router(title="Iterate Example") router = Router(title="Iterate Example")
@router.command(Command(
"process", @router.command(
description="Process with multiple flags", Command(
flags=Flags([ "process",
Flag("file"), description="Process with multiple flags",
Flag("format"), flags=Flags([Flag("file"), Flag("format"), Flag("output")]),
Flag("output") )
]) )
))
def process_handler(response: Response): def process_handler(response: Response):
input_flags = response.input_flags input_flags = response.input_flags
# Итерируемся по всем введённым флагам # Итерируемся по всем введённым флагам
print("All flags:") print("All flags:")
for flag in input_flags: for flag in input_flags:
status_str = flag.status.name if flag.status else "None" status_str = flag.status.name if flag.status else "None"
print(f" {flag.string_entity}: {flag.input_value} (status: {status_str})") print(f" {flag.string_entity}: {flag.input_value} (status: {status_str})")
# Также можно использовать enumerate для получения индексов # Также можно использовать enumerate для получения индексов
print("\nFlags with indices:") print("\nFlags with indices:")
for index, flag in enumerate(input_flags): for index, flag in enumerate(input_flags):
print(f" [{index}] {flag.name}: {flag.input_value}") print(f" [{index}] {flag.name}: {flag.input_value}")
+11 -13
View File
@@ -3,29 +3,27 @@ from argenta.command import Flag, Flags
router = Router(title="Index Access Example") router = Router(title="Index Access Example")
@router.command(Command(
"example", @router.command(
description="Example with indexed access", Command(
flags=Flags([ "example",
Flag("first"), description="Example with indexed access",
Flag("second"), flags=Flags([Flag("first"), Flag("second"), Flag("third")]),
Flag("third") )
]) )
))
def example_handler(response: Response): def example_handler(response: Response):
input_flags = response.input_flags input_flags = response.input_flags
# Получаем флаги по индексу # Получаем флаги по индексу
if len(input_flags.flags) > 0: if len(input_flags.flags) > 0:
first_flag = input_flags[0] first_flag = input_flags[0]
print(f"First flag: {first_flag.name} = {first_flag.input_value}") print(f"First flag: {first_flag.name} = {first_flag.input_value}")
if len(input_flags.flags) > 1: if len(input_flags.flags) > 1:
second_flag = input_flags[1] second_flag = input_flags[1]
print(f"Second flag: {second_flag.name} = {second_flag.input_value}") print(f"Second flag: {second_flag.name} = {second_flag.input_value}")
# Можно использовать срез для получения нескольких флагов # Можно использовать срез для получения нескольких флагов
if len(input_flags.flags) >= 2: if len(input_flags.flags) >= 2:
first_two = input_flags.flags[:2] first_two = input_flags.flags[:2]
print(f"First two flags: {[f.name for f in first_two]}") print(f"First two flags: {[f.name for f in first_two]}")
+10 -11
View File
@@ -3,17 +3,17 @@ from argenta.command import Flag, Flags
router = Router(title="Bool Check Example") router = Router(title="Bool Check Example")
@router.command(Command(
"action", @router.command(
description="Action with optional flags", Command(
flags=Flags([ "action",
Flag("option1"), description="Action with optional flags",
Flag("option2") flags=Flags([Flag("option1"), Flag("option2")]),
]) )
)) )
def action_handler(response: Response): def action_handler(response: Response):
input_flags = response.input_flags input_flags = response.input_flags
# Проверяем наличие флагов # Проверяем наличие флагов
if input_flags: if input_flags:
print("Flags were provided:") print("Flags were provided:")
@@ -21,8 +21,7 @@ def action_handler(response: Response):
print(f" - {flag.name}: {flag.input_value}") print(f" - {flag.name}: {flag.input_value}")
else: else:
print("No flags provided, using defaults") print("No flags provided, using defaults")
# Альтернативный способ проверки # Альтернативный способ проверки
has_flags = bool(input_flags) has_flags = bool(input_flags)
print(f"\nHas flags: {has_flags}") print(f"\nHas flags: {has_flags}")
+24 -17
View File
@@ -2,29 +2,36 @@ from argenta.command.flag import InputFlag, ValidationStatus
from argenta.command.flag.flags.models import InputFlags from argenta.command.flag.flags.models import InputFlags
# Создаём первую коллекцию # Создаём первую коллекцию
flags1 = InputFlags([ flags1 = InputFlags(
InputFlag(name="flag1", input_value="value1", status=ValidationStatus.VALID), [
InputFlag(name="flag2", input_value="value2", status=ValidationStatus.VALID) InputFlag(name="flag1", input_value="value1", status=ValidationStatus.VALID),
]) InputFlag(name="flag2", input_value="value2", status=ValidationStatus.VALID),
]
)
# Создаём вторую коллекцию с теми же флагами # Создаём вторую коллекцию с теми же флагами
flags2 = InputFlags([ flags2 = InputFlags(
InputFlag(name="flag1", input_value="value1", status=ValidationStatus.VALID), [
InputFlag(name="flag2", input_value="value2", status=ValidationStatus.VALID) InputFlag(name="flag1", input_value="value1", status=ValidationStatus.VALID),
]) InputFlag(name="flag2", input_value="value2", status=ValidationStatus.VALID),
]
)
# Создаём третью коллекцию с другими флагами # Создаём третью коллекцию с другими флагами
flags3 = InputFlags([ flags3 = InputFlags(
InputFlag(name="flag1", input_value="different", status=ValidationStatus.VALID), [
InputFlag(name="flag2", input_value="value2", status=ValidationStatus.VALID) InputFlag(name="flag1", input_value="different", status=ValidationStatus.VALID),
]) InputFlag(name="flag2", input_value="value2", status=ValidationStatus.VALID),
]
)
print(f"flags1 == flags2: {flags1 == flags2}") # True (одинаковые имена) print(f"flags1 == flags2: {flags1 == flags2}") # True (одинаковые имена)
print(f"flags1 == flags3: {flags1 == flags3}") # True (имена одинаковые, значения не учитываются) print(
f"flags1 == flags3: {flags1 == flags3}"
) # True (имена одинаковые, значения не учитываются)
# Разные коллекции # Разные коллекции
flags4 = InputFlags([ flags4 = InputFlags(
InputFlag(name="flag3", input_value="value3", status=ValidationStatus.VALID) [InputFlag(name="flag3", input_value="value3", status=ValidationStatus.VALID)]
]) )
print(f"flags1 == flags4: {flags1 == flags4}") # False (разные флаги) print(f"flags1 == flags4: {flags1 == flags4}") # False (разные флаги)
+14 -21
View File
@@ -4,37 +4,30 @@ from argenta.command.flag import InputFlag
router = Router(title="Contains Example") router = Router(title="Contains Example")
@router.command(Command(
"check", @router.command(
description="Check flags", Command(
flags=Flags([ "check",
Flag("verbose"), description="Check flags",
Flag("debug"), flags=Flags([Flag("verbose"), Flag("debug"), Flag("quiet")]),
Flag("quiet") )
]) )
))
def check_handler(response: Response): def check_handler(response: Response):
input_flags = response.input_flags input_flags = response.input_flags
# Проверяем наличие конкретного флага # Проверяем наличие конкретного флага
verbose_flag = input_flags.get_flag_by_name("verbose") verbose_flag = input_flags.get_flag_by_name("verbose")
debug_flag = input_flags.get_flag_by_name("debug") debug_flag = input_flags.get_flag_by_name("debug")
# Используем оператор in для проверки # Используем оператор in для проверки
if verbose_flag and verbose_flag in input_flags: if verbose_flag and verbose_flag in input_flags:
print("Verbose flag is present") print("Verbose flag is present")
if debug_flag and debug_flag in input_flags: if debug_flag and debug_flag in input_flags:
print("Debug flag is present") print("Debug flag is present")
# Можно создать флаг для проверки (сравнение идёт по имени) # Можно создать флаг для проверки (сравнение идёт по имени)
test_flag = InputFlag( test_flag = InputFlag(name="verbose", prefix="--", input_value="any", status=None)
name="verbose",
prefix="--",
input_value="any",
status=None
)
if test_flag in input_flags: if test_flag in input_flags:
print("Verbose flag found using 'in' operator") print("Verbose flag found using 'in' operator")
+2 -1
View File
@@ -14,6 +14,7 @@ class ConnectionProvider(Provider):
yield conn yield conn
conn.close() conn.close()
# 2. Создаем и настраиваем App # 2. Создаем и настраиваем App
app = App() app = App()
# ... здесь можно добавить роутеры ... # ... здесь можно добавить роутеры ...
@@ -23,4 +24,4 @@ orchestrator = Orchestrator(custom_providers=[ConnectionProvider()])
# 4. Запускаем приложение # 4. Запускаем приложение
if __name__ == "__main__": if __name__ == "__main__":
orchestrator.start_polling(app) orchestrator.start_polling(app)
@@ -5,6 +5,7 @@ def custom_print_function(text: str) -> None:
"""Простая пользовательская функция вывода с префиксом.""" """Простая пользовательская функция вывода с префиксом."""
print(f"Префикс: {text}") print(f"Префикс: {text}")
app = App( app = App(
initial_message="My App", initial_message="My App",
override_system_messages=True, override_system_messages=True,
+1 -1
View File
@@ -6,7 +6,7 @@ message_flag = Flag(name="message", possible_values=PossibleValues.ALL)
name_flag = Flag(name="name", possible_values=PossibleValues.ALL) name_flag = Flag(name="name", possible_values=PossibleValues.ALL)
# Можно передать любую строку или ничего # Можно передать любую строку или ничего
# Примеры: # Примеры:
# --output result.json # --output result.json
# --message "Any text here" # --message "Any text here"
# --name "User Name" # --name "User Name"
+4 -16
View File
@@ -3,25 +3,13 @@ import re
from argenta.command import Flag, PossibleValues from argenta.command import Flag, PossibleValues
# Флаг без значения # Флаг без значения
verbose_flag = Flag( verbose_flag = Flag(name="verbose", possible_values=PossibleValues.NEITHER)
name="verbose",
possible_values=PossibleValues.NEITHER
)
# Флаг с любым значением # Флаг с любым значением
output_flag = Flag( output_flag = Flag(name="output", possible_values=PossibleValues.ALL)
name="output",
possible_values=PossibleValues.ALL
)
# Флаг со списком допустимых значений # Флаг со списком допустимых значений
format_flag = Flag( format_flag = Flag(name="format", possible_values=["json", "xml", "csv", "yaml"])
name="format",
possible_values=["json", "xml", "csv", "yaml"]
)
# Флаг с регулярным выражением # Флаг с регулярным выражением
email_flag = Flag( email_flag = Flag(name="email", possible_values=re.compile(r"^[\w\.-]+@[\w\.-]+\.\w+$"))
name="email",
possible_values=re.compile(r"^[\w\.-]+@[\w\.-]+\.\w+$")
)
@@ -1,9 +1,9 @@
from argenta.command.flag.defaults import PredefinedFlags from argenta.command.flag.defaults import PredefinedFlags
# Проверка типа possible_values в предопределенных флагах # Проверка типа possible_values в предопределенных флагах
print(PredefinedFlags.HELP.possible_values) # PossibleValues.NEITHER print(PredefinedFlags.HELP.possible_values) # PossibleValues.NEITHER
print(PredefinedFlags.INFO.possible_values) # PossibleValues.NEITHER print(PredefinedFlags.INFO.possible_values) # PossibleValues.NEITHER
print(PredefinedFlags.ALL.possible_values) # PossibleValues.NEITHER print(PredefinedFlags.ALL.possible_values) # PossibleValues.NEITHER
# Сетевые флаги используют регулярные выражения, а не PossibleValues # Сетевые флаги используют регулярные выражения, а не PossibleValues
# PredefinedFlags.HOST использует Pattern для валидации IP # PredefinedFlags.HOST использует Pattern для валидации IP
+3 -2
View File
@@ -6,10 +6,11 @@ from argenta import App, Orchestrator
app: App = App() app: App = App()
orchestrator: Orchestrator = Orchestrator() orchestrator: Orchestrator = Orchestrator()
def main() -> None: def main() -> None:
app.include_router(router) app.include_router(router)
orchestrator.start_polling(app) orchestrator.start_polling(app)
if __name__ == '__main__':
if __name__ == "__main__":
main() main()
+1 -1
View File
@@ -3,7 +3,7 @@ from argenta import Command, Response, Router
router = Router(title="Quickstart Example") router = Router(title="Quickstart Example")
@router.command(Command("hello", description="Say hello")) @router.command(Command("hello", description="Say hello"))
def handler(response: Response): def handler(response: Response):
print("Hello, world!") print("Hello, world!")
@@ -9,14 +9,17 @@ from .repository import Priority, Task, TaskRepository
router = Router(title="Task Manager") router = Router(title="Task Manager")
@router.command( @router.command(
Command( Command(
"add-task", "add-task",
description="Add a new task", description="Add a new task",
flags=Flags([ flags=Flags(
Flag("description"), [
Flag("priority", possible_values=["low", "medium", "high"]), Flag("description"),
]) Flag("priority", possible_values=["low", "medium", "high"]),
]
),
) )
) )
def add_task(response: Response, repo: FromDishka[TaskRepository]): def add_task(response: Response, repo: FromDishka[TaskRepository]):
@@ -40,6 +43,7 @@ def add_task(response: Response, repo: FromDishka[TaskRepository]):
repo.add_task(task) repo.add_task(task)
print(f"Added task: '{task.description}' with priority '{task.priority}'") print(f"Added task: '{task.description}' with priority '{task.priority}'")
@router.command(Command("list-tasks", description="List all tasks")) @router.command(Command("list-tasks", description="List all tasks"))
def list_tasks(response: Response, repo: FromDishka[TaskRepository]): def list_tasks(response: Response, repo: FromDishka[TaskRepository]):
tasks = repo.get_all_tasks() tasks = repo.get_all_tasks()
@@ -3,11 +3,13 @@ from typing import Literal
Priority = Literal["low", "medium", "high"] Priority = Literal["low", "medium", "high"]
@dataclass @dataclass
class Task: class Task:
description: str description: str
priority: Priority = "medium" priority: Priority = "medium"
class TaskRepository: class TaskRepository:
def __init__(self): def __init__(self):
self._tasks: list[Task] = [] self._tasks: list[Task] = []
+2 -1
View File
@@ -3,7 +3,8 @@ from argenta.router import Router
# Для этого роутера перехват stdout будет отключен # Для этого роутера перехват stdout будет отключен
interactive_router = Router(disable_redirect_stdout=True) interactive_router = Router(disable_redirect_stdout=True)
@interactive_router.command("ask") @interactive_router.command("ask")
def ask_name(response): def ask_name(response):
name = input("Как вас зовут? ") name = input("Как вас зовут? ")
print(f"Приятно познакомиться, {name}!") print(f"Приятно познакомиться, {name}!")
@@ -3,4 +3,4 @@ from argenta.app.dividing_line import StaticDividingLine
# Все роутеры по умолчанию будут использовать статическую линию длиной 50 символов # Все роутеры по умолчанию будут использовать статическую линию длиной 50 символов
# (если для них не отключен перехват stdout) # (если для них не отключен перехват stdout)
app = App(dividing_line=StaticDividingLine(length=50)) app = App(dividing_line=StaticDividingLine(length=50))
+2 -2
View File
@@ -3,14 +3,14 @@ from argenta.response import ResponseStatus
router = Router(title="Example") router = Router(title="Example")
@router.command(Command("greet", description="Greet the user")) @router.command(Command("greet", description="Greet the user"))
def greet_handler(response: Response): def greet_handler(response: Response):
# response автоматически передаётся в обработчик # response автоматически передаётся в обработчик
# response.status содержит статус валидации флагов # response.status содержит статус валидации флагов
# response.input_flags содержит все введённые флаги # response.input_flags содержит все введённые флаги
if response.status == ResponseStatus.ALL_FLAGS_VALID: if response.status == ResponseStatus.ALL_FLAGS_VALID:
print("Hello! All flags are valid.") print("Hello! All flags are valid.")
else: else:
print("Warning: Some flags have issues.") print("Warning: Some flags have issues.")
+9 -6
View File
@@ -2,16 +2,20 @@ from argenta import Command, Response, Router
router = Router(title="Data Example") router = Router(title="Data Example")
@router.command(Command("set", description="Set data")) @router.command(Command("set", description="Set data"))
def set_handler(response: Response): def set_handler(response: Response):
# Обновляем глобальное хранилище данных # Обновляем глобальное хранилище данных
response.update_data({ response.update_data(
"user_name": "John", {
"timestamp": "2024-01-01", "user_name": "John",
"settings": {"theme": "dark", "language": "ru"} "timestamp": "2024-01-01",
}) "settings": {"theme": "dark", "language": "ru"},
}
)
print("Data updated successfully") print("Data updated successfully")
@router.command(Command("show", description="Show data")) @router.command(Command("show", description="Show data"))
def show_handler(response: Response): def show_handler(response: Response):
# Получаем данные из глобального хранилища # Получаем данные из глобального хранилища
@@ -19,4 +23,3 @@ def show_handler(response: Response):
if "user_name" in data: if "user_name" in data:
print(f"User: {data['user_name']}") print(f"User: {data['user_name']}")
print(f"Settings: {data.get('settings', {})}") print(f"Settings: {data.get('settings', {})}")
+2 -2
View File
@@ -2,15 +2,15 @@ from argenta import Command, Response, Router
router = Router(title="Get Data Example") router = Router(title="Get Data Example")
@router.command(Command("info", description="Show all stored data")) @router.command(Command("info", description="Show all stored data"))
def info_handler(response: Response): def info_handler(response: Response):
# Получаем все данные из глобального хранилища # Получаем все данные из глобального хранилища
all_data = response.get_data() all_data = response.get_data()
if all_data: if all_data:
print("Stored data:") print("Stored data:")
for key, value in all_data.items(): for key, value in all_data.items():
print(f" {key}: {value}") print(f" {key}: {value}")
else: else:
print("No data stored") print("No data stored")
+2 -1
View File
@@ -2,12 +2,14 @@ from argenta import Command, Response, Router
router = Router(title="Clear Data Example") router = Router(title="Clear Data Example")
@router.command(Command("clear", description="Clear all stored data")) @router.command(Command("clear", description="Clear all stored data"))
def clear_handler(response: Response): def clear_handler(response: Response):
# Очищаем всё хранилище данных # Очищаем всё хранилище данных
response.clear_data() response.clear_data()
print("All data cleared") print("All data cleared")
@router.command(Command("check", description="Check if data exists")) @router.command(Command("check", description="Check if data exists"))
def check_handler(response: Response): def check_handler(response: Response):
data = response.get_data() data = response.get_data()
@@ -15,4 +17,3 @@ def check_handler(response: Response):
print(f"Storage contains {len(data)} item(s)") print(f"Storage contains {len(data)} item(s)")
else: else:
print("Storage is empty") print("Storage is empty")
+10 -7
View File
@@ -2,25 +2,28 @@ from argenta import Command, Response, Router
router = Router(title="Delete Data Example") router = Router(title="Delete Data Example")
@router.command(Command("store", description="Store data")) @router.command(Command("store", description="Store data"))
def store_handler(response: Response): def store_handler(response: Response):
response.update_data({ response.update_data(
"temp_key": "temporary value", {
"important_key": "important value", "temp_key": "temporary value",
"another_key": "another value" "important_key": "important value",
}) "another_key": "another value",
}
)
print("Data stored") print("Data stored")
@router.command(Command("remove", description="Remove specific key")) @router.command(Command("remove", description="Remove specific key"))
def remove_handler(response: Response): def remove_handler(response: Response):
# Удаляем конкретный ключ из хранилища # Удаляем конкретный ключ из хранилища
try: try:
response.delete_from_data("temp_key") response.delete_from_data("temp_key")
print("Key 'temp_key' deleted") print("Key 'temp_key' deleted")
# Проверяем, что осталось # Проверяем, что осталось
remaining = response.get_data() remaining = response.get_data()
print(f"Remaining keys: {list(remaining.keys())}") print(f"Remaining keys: {list(remaining.keys())}")
except KeyError: except KeyError:
print("Key not found") print("Key not found")
+12 -13
View File
@@ -4,29 +4,29 @@ from argenta.response import ResponseStatus
router = Router(title="Flags Example") router = Router(title="Flags Example")
@router.command(Command(
"process", @router.command(
description="Process with flags", Command(
flags=Flags([ "process",
Flag("format", possible_values=["json", "xml"]), description="Process with flags",
Flag("verbose") flags=Flags([Flag("format", possible_values=["json", "xml"]), Flag("verbose")]),
]) )
)) )
def process_handler(response: Response): def process_handler(response: Response):
# Проверяем статус валидации флагов # Проверяем статус валидации флагов
print(f"Status: {response.status.value}") print(f"Status: {response.status.value}")
# Работаем с флагами # Работаем с флагами
format_flag = response.input_flags.get_flag_by_name("format") format_flag = response.input_flags.get_flag_by_name("format")
verbose_flag = response.input_flags.get_flag_by_name("verbose") verbose_flag = response.input_flags.get_flag_by_name("verbose")
if format_flag: if format_flag:
format_value = format_flag.input_value format_value = format_flag.input_value
print(f"Format: {format_value}") print(f"Format: {format_value}")
if verbose_flag: if verbose_flag:
print("Verbose mode enabled") print("Verbose mode enabled")
# Проверяем валидность флагов # Проверяем валидность флагов
if response.status == ResponseStatus.ALL_FLAGS_VALID: if response.status == ResponseStatus.ALL_FLAGS_VALID:
print("All flags are valid, proceeding...") print("All flags are valid, proceeding...")
@@ -35,4 +35,3 @@ def process_handler(response: Response):
for flag in response.input_flags: for flag in response.input_flags:
if flag.status and flag.status.name == "INVALID": if flag.status and flag.status.name == "INVALID":
print(f" Invalid flag: {flag.string_entity} = {flag.input_value}") print(f" Invalid flag: {flag.string_entity} = {flag.input_value}")
+2 -1
View File
@@ -3,7 +3,8 @@ from argenta.router import Router
user_router = Router(title="User Management") user_router = Router(title="User Management")
@user_router.command(Command("add-user", description="Adds a new user")) @user_router.command(Command("add-user", description="Adds a new user"))
def add_user_handler(response): def add_user_handler(response):
# Логика добавления пользователя # Логика добавления пользователя
print("User added successfully!") print("User added successfully!")
@@ -1,13 +1,12 @@
import re import re
from argenta.command.flag import (Flag, InputFlag, PossibleValues, from argenta.command.flag import Flag, InputFlag, PossibleValues, ValidationStatus
ValidationStatus)
# Создаём различные типы флагов # Создаём различные типы флагов
verbose_flag = Flag("verbose", possible_values=PossibleValues.NEITHER) verbose_flag = Flag("verbose", possible_values=PossibleValues.NEITHER)
output_flag = Flag("output", possible_values=PossibleValues.ALL) output_flag = Flag("output", possible_values=PossibleValues.ALL)
level_flag = Flag("level", possible_values=["1", "2", "3"]) level_flag = Flag("level", possible_values=["1", "2", "3"])
pattern_flag = Flag("pattern", possible_values=re.compile(r'^[a-zA-Z]+$')) pattern_flag = Flag("pattern", possible_values=re.compile(r"^[a-zA-Z]+$"))
# Создаём входные флаги с различными статусами # Создаём входные флаги с различными статусами
input_flags = [ input_flags = [
@@ -16,12 +15,10 @@ input_flags = [
InputFlag("output", input_value="result.txt", status=ValidationStatus.VALID), InputFlag("output", input_value="result.txt", status=ValidationStatus.VALID),
InputFlag("level", input_value="2", status=ValidationStatus.VALID), InputFlag("level", input_value="2", status=ValidationStatus.VALID),
InputFlag("pattern", input_value="onlyletters", status=ValidationStatus.VALID), InputFlag("pattern", input_value="onlyletters", status=ValidationStatus.VALID),
# Невалидные флаги # Невалидные флаги
InputFlag("verbose", input_value="true", status=ValidationStatus.INVALID), InputFlag("verbose", input_value="true", status=ValidationStatus.INVALID),
InputFlag("level", input_value="4", status=ValidationStatus.INVALID), InputFlag("level", input_value="4", status=ValidationStatus.INVALID),
InputFlag("pattern", input_value="123", status=ValidationStatus.INVALID), InputFlag("pattern", input_value="123", status=ValidationStatus.INVALID),
# Неопределённые флаги # Неопределённые флаги
InputFlag("unknown", input_value="value", status=ValidationStatus.UNDEFINED), InputFlag("unknown", input_value="value", status=ValidationStatus.UNDEFINED),
] ]
@@ -2,21 +2,15 @@ from argenta import InputFlag, ValidationStatus
# Создание входных флагов с различными статусами # Создание входных флагов с различными статусами
valid_flag = InputFlag( valid_flag = InputFlag(
"output", "output", input_value="/path/to/file.txt", status=ValidationStatus.VALID
input_value="/path/to/file.txt",
status=ValidationStatus.VALID
) )
invalid_flag = InputFlag( invalid_flag = InputFlag(
"count", "count", input_value="not-a-number", status=ValidationStatus.INVALID
input_value="not-a-number",
status=ValidationStatus.INVALID
) )
undefined_flag = InputFlag( undefined_flag = InputFlag(
"experimental", "experimental", input_value="test", status=ValidationStatus.UNDEFINED
input_value="test",
status=ValidationStatus.UNDEFINED
) )
flags = [valid_flag, invalid_flag, undefined_flag] flags = [valid_flag, invalid_flag, undefined_flag]
@@ -1,5 +1,4 @@
from argenta.command.flag import (Flag, InputFlag, PossibleValues, from argenta.command.flag import Flag, InputFlag, PossibleValues, ValidationStatus
ValidationStatus)
# Создание флага без значения # Создание флага без значения
help_flag = Flag("help", possible_values=PossibleValues.NEITHER) help_flag = Flag("help", possible_values=PossibleValues.NEITHER)
@@ -3,30 +3,33 @@ from argenta import InputFlag, ValidationStatus
def process_input_flag(input_flag: InputFlag) -> None: def process_input_flag(input_flag: InputFlag) -> None:
"""Обрабатывает входной флаг в зависимости от его статуса валидации""" """Обрабатывает входной флаг в зависимости от его статуса валидации"""
if input_flag.status == ValidationStatus.VALID: if input_flag.status == ValidationStatus.VALID:
print(f"✓ Обрабатываем валидный флаг: {input_flag.string_entity}") print(f"✓ Обрабатываем валидный флаг: {input_flag.string_entity}")
# Выполняем основную логику # Выполняем основную логику
execute_flag_logic(input_flag) execute_flag_logic(input_flag)
elif input_flag.status == ValidationStatus.INVALID: elif input_flag.status == ValidationStatus.INVALID:
print(f"✗ Ошибка валидации флага: {input_flag.string_entity}") print(f"✗ Ошибка валидации флага: {input_flag.string_entity}")
# Записываем ошибку и прекращаем выполнение # Записываем ошибку и прекращаем выполнение
log_validation_error(input_flag) log_validation_error(input_flag)
elif input_flag.status == ValidationStatus.UNDEFINED: elif input_flag.status == ValidationStatus.UNDEFINED:
print(f"? Неопределённый статус флага: {input_flag.string_entity}") print(f"? Неопределённый статус флага: {input_flag.string_entity}")
# Пытаемся провести валидацию или пропускаем # Пытаемся провести валидацию или пропускаем
attempt_revalidation(input_flag) attempt_revalidation(input_flag)
def execute_flag_logic(flag: InputFlag) -> None: def execute_flag_logic(flag: InputFlag) -> None:
"""Выполняет логику для валидного флага""" """Выполняет логику для валидного флага"""
pass pass
def log_validation_error(flag: InputFlag) -> None: def log_validation_error(flag: InputFlag) -> None:
"""Записывает ошибку валидации в лог""" """Записывает ошибку валидации в лог"""
pass pass
def attempt_revalidation(flag: InputFlag) -> None: def attempt_revalidation(flag: InputFlag) -> None:
"""Пытается повторно провести валидацию""" """Пытается повторно провести валидацию"""
pass pass
@@ -1,11 +1,15 @@
from argenta import InputFlag, ValidationStatus from argenta import InputFlag, ValidationStatus
# Создание входного флага без определения статуса # Создание входного флага без определения статуса
undefined_input = InputFlag("unknown-flag", input_value="some-value", status=ValidationStatus.UNDEFINED) undefined_input = InputFlag(
"unknown-flag", input_value="some-value", status=ValidationStatus.UNDEFINED
)
print(f"Флаг: {undefined_input.string_entity}") print(f"Флаг: {undefined_input.string_entity}")
print(f"Значение: {undefined_input.input_value}") print(f"Значение: {undefined_input.input_value}")
print(f"Статус: {undefined_input.status.value}") # Выведет: UNDEFINED print(f"Статус: {undefined_input.status.value}") # Выведет: UNDEFINED
# Или флаг, для которого валидация ещё не проводилась # Или флаг, для которого валидация ещё не проводилась
pending_input = InputFlag("pending", input_value=None, status=ValidationStatus.UNDEFINED) pending_input = InputFlag(
"pending", input_value=None, status=ValidationStatus.UNDEFINED
)
@@ -1,7 +1,9 @@
from argenta.command.flag import Flag, InputFlag, ValidationStatus from argenta.command.flag import Flag, InputFlag, ValidationStatus
# Создание флага, который принимает только определённые значения # Создание флага, который принимает только определённые значения
log_level_flag = Flag("log-level", possible_values=["debug", "info", "warning", "error"]) log_level_flag = Flag(
"log-level", possible_values=["debug", "info", "warning", "error"]
)
# Создание корректного входного флага # Создание корректного входного флага
valid_input = InputFlag("log-level", input_value="debug", status=ValidationStatus.VALID) valid_input = InputFlag("log-level", input_value="debug", status=ValidationStatus.VALID)