Argenta
Описание
Argenta — Python library for creating custom shells
Установка
pip install argenta
or
poetry add argenta
Быстрый старт
Пример простейшей оболочки с командой без зарегистрированных флагов
# routers.py
from argenta.router import Router
from argenta.command import Command
router = Router()
@router.command(Command("hello"))
def handler():
print("Hello, world!")
# main.py
from argenta.app import App
from routers import router
app: App = App()
def main() -> None:
app.include_router(router)
app.start_polling()
if __name__ == '__main__':
main()
Пример оболочки с командой, у которой зарегистрированы флаги
# routers.py
import re
from argenta.router import Router
from argenta.command import Command
from argenta.command.flag.registered_flag import FlagsGroup, Flag
router = Router()
registered_flags = FlagsGroup(
Flag(flag_name='host',
flag_prefix='--',
possible_flag_values=re.compile(r'^192.168.\d{1,3}.\d{1,3}$')),
Flag('port', '--', re.compile(r'^[0-9]{1,4}$')))
@router.command(Command("hello"))
def handler():
print("Hello, world!")
@router.command(Command(trigger="ssh",
description='connect via ssh',
flags=registered_flags))
def handler_with_flags(flags: dict):
for flag in flags:
print(f'Flag name: {flag['name']}\n'
f'Flag value: {flag['value']}')
classes :
class : : App
Класс, определяющий поведение и состояние оболочки
Конструктор
App(prompt: str = 'Enter a command',
initial_greeting: str = '\nHello, I am Argenta\n',
farewell_message: str = '\nGoodBye\n',
exit_command: str = 'Q',
exit_command_description: str = 'Exit command',
system_points_title: str = 'System points:',
ignore_exit_command_register: bool = True,
ignore_command_register: bool = False,
line_separate: str = '',
command_group_description_separate: str = '',
repeat_command_groups: bool = True,
print_func: Callable[[str], None] = print)
Аргументы:
- name : mean
prompt(str): Сообщение перед вводом команды.initial_greeting(str): Приветственное сообщение при запуске.farewell_message(str): Сообщение при выходе.exit_command(str): Команда выхода (по умолчанию'Q').exit_command_description(str): Описание команды выхода.system_points_title(str): Заголовок перед списком системных команд.ignore_exit_command_register(bool): Игнорировать регистр команды выхода.ignore_command_register(bool): Игнорировать регистр всех команд.line_separate(str): Разделительная строка между командами.command_group_description_separate(str): Разделитель между группами команд.repeat_command_groups(bool): Повторять описание команд перед вводом.print_func(Callable[[str], None]): Функция вывода текста в терминал (по умолчаниюprint).
methods
.start_polling() -> None
method mean :: запускает цикл обработки ввода
.include_router(router: Router) -> None
param router: Router :: регистрируемый роутер
required :: True
method mean :: регистрирует роутер в оболочке
.set_initial_message(message: str) -> None
param message: str :: устанавливаемое приветственное сообщение
required :: True
example :: "Hello, I'm a example app"
method mean :: устанавливает сообщение, которое будет отображено при запуске программы
.set_farewell_message(message: str) -> None
param message: str :: устанавливаемое сообщение при выходе
required :: True
example :: "GoodBye !"
method mean :: устанавливает сообщение, которое будет отображено при выходе
.set_description_message_pattern(pattern: str) -> None
param pattern: str :: паттерн описания команды при её выводе в консоль
required :: True
example :: "[{command}] *=*=* {description}"
method mean :: устанавливает паттерн описания команд, который будет использован при выводе в консоль
.set_repeated_input_flags_handler(handler: Callable[[str], None]) -> None
param handler: Callable[[str], None] :: функция или лямбда функция, которой будет передано управление при
вводе юзером повторяющихся флагов
required :: True
example :: lambda raw_command: print_func(f'Repeated input flags: "{raw_command}"')
method mean :: устанавливает функцию, которой будет передано управление при вводе юзером повторяющихся флагов
.set_invalid_input_flags_handler(self, handler: Callable[[str], None]) -> None
param handler: Callable[[str], None] :: функция или лямбда функция, которой будет передано управление при
вводе юзером команды с некорректным синтаксисом флагов
required :: True
example :: lambda raw_command: print_func(f'Incorrect flag syntax: "{raw_command}"')
method mean :: устанавливает функцию, которой будет передано управление при вводе юзером команды с некорректным синтаксисом флагов
.set_unknown_command_handler(self, handler: Callable[[str], None]) -> None
param handler: Callable[[str], None] :: функция или лямбда функция, которой будет передано управление при
вводе юзером неизвестной команды
required :: True
example :: lambda command: print_func(f"Unknown command: {command.get_string_entity()}")
method mean :: устанавливает функцию, которой будет передано управление при вводе юзером неизвестной команды
.set_empty_command_handler(self, handler: Callable[[str], None]) -> None
param handler: Callable[[str], None] :: функция или лямбда функция, которой будет передано управление при
вводе юзером пустой команды
required :: True
example :: lambda: print_func(f'Empty input command')
method mean :: устанавливает функцию, которой будет передано управление при вводе юзером пустой команды
Примечания
-
В устанавливаемом паттерне сообщения описания команды необходимы быть два ключевых слова:
commandиdescription, каждое из которых должно быть заключено в фигурные скобки, после обработки паттерна на места этих ключевых слов будут подставлены соответствующие атрибуты команды, при отсутствии этих двух ключевых слов будет вызвано исключениеInvalidDescriptionMessagePatternException -
Команды оболочки не должны повторяться, при значении атрибута
ignore_command_registerравнымTrueдопускается создание обработчиков для разных регистров одинаковых символов в команде, для примераuиU, при значении атрибутаignore_command_registerклассаAppравнымFalseтот же пример вызывает исключениеRepeatedCommandInDifferentRoutersException. Исключение вызывается только при наличии пересекающихся команд у разных роутеров
Исключения
InvalidRouterInstanceException— Переданный объект в методApp().include_router()не является экземпляром классаRouter.InvalidDescriptionMessagePatternException— Неправильный формат паттерна описания команд.IncorrectNumberOfHandlerArgsException— У обработчика нестандартного поведения зарегистрировано неверное количество аргументов(в большинстве случаев у него должен быть один аргумент).NoRegisteredRoutersException— Отсутствуют зарегистрированные роутеры.NoRegisteredHandlersException— У роутера нет ни одного обработчика команд.RepeatedCommandInDifferentRoutersException— Одна и та же команда зарегистрирована в разных роутерах.
class :: Router
Класс, который определяет и конфигурирует обработчики команд
Конструктор
Router(title: str = 'Commands group title:',
name: str = 'Default')
Аргументы:
- name : mean
title(str): Заголовок группы команд.name(str): Персональное название роутера
methods
command(command: Command)
param command: Command :: экземпляр класса Command, который определяет строковый триггер команды,
допустимые флаги команды и другое
required :: True
example :: Command(command='ssh', description='connect via ssh')
method mean :: декоратор, который регистрирует функцию как обработчик команды
.get_name() -> str
method mean :: возвращает установленное название роутера
.get_title() -> str
method mean :: возвращает установленный заголовок группы команд данного роутера
.get_all_commands() -> list[str]
method mean :: возвращает все зарегистрированные команды для данного роутера
Исключения
RepeatedCommandException- Одна и та же команда зарегистрирована в одном роутереRepeatedFlagNameException- Повторяющиеся зарегистрированные флаги в командеTooManyTransferredArgsException- Слишком много зарегистрированных аргументов у обработчика командыRequiredArgumentNotPassedException- Не зарегистрирован обязательный аргумент у обработчика команды(аргумент, через который будут переданы флаги введённой команды)IncorrectNumberOfHandlerArgsException- У обработчика нестандартного поведения зарегистрировано неверное количество аргументов(в большинстве случаев у него должен быть один аргумент)TriggerCannotContainSpacesException- У регистрируемой команды в триггере содержатся пробелы
class :: Command
Класс, экземпляр которого определяет строковый триггер хэндлера и конфигурирует его атрибуты
Конструктор
Command(trigger: str,
description: str = None,
flags: Flag | FlagsGroup = None)
Аргументы:
- name : mean
trigger(str): Строковый триггерdescription(str): Описание команды, которое будет выведено в консоль при запуске оболочкиflags(Flag | FlagsGroup): Флаги, которые будут обработаны при их наличии во вводе юзера
.get_trigger() -> str
method mean :: возвращает строковый триггер экземпляра
.get_description() -> str
method mean :: возвращает описание команды
.get_registered_flags() -> FlagsGroup | None
method mean :: возвращает зарегистрированные флаги экземпляра
Исключения
UnprocessedInputFlagException- Некорректный синтаксис ввода командыRepeatedInputFlagsException- Повторяющиеся флаги во введённой командеEmptyInputCommandException- Введённая команда является пустой(не содержит символов)
Примечание
Все вышеуказанные исключения класса Command вызываются в рантайме запущенным экземпляром класса
App, а также по дефолту обрабатываются, при желании можно задать пользовательские
обработчики для этих исключений (подробнее см.)
class :: Flag
Класс, экземпляры которого в большинстве случаев передаются при создании
экземпляра класса Command для регистрации допустимого флага при вводе юзером команды
Конструктор
Flag(flag_name: str,
flag_prefix: typing.Literal['-', '--', '---'] = '-',
possible_flag_values: list[str] | typing.Pattern[str] | False = True)
Аргументы:
- name : mean
flag_name(str): Имя флагаflag_prefix(Literal['-', '--', '---']): Префикс команды, допустимым значением является от одного до трёх минусовpossible_flag_values(list[str] | Pattern[str] | bool): Множество допустимых значений флага, может быть задано списком с допустимыми значениями или регулярным выражением (рекомендуетсяre.compile(r'example exspression')), при значении аргументаFalseу введённого флага не может быть значения, иначе будет вызвано исключение и обработано соответствующим еррор-хэндлером
methods
.get_string_entity() -> str
method mean :: возвращает строковое представление флага(префикс + имя)
.get_flag_name() -> str
method mean :: возвращает имя флага
.get_flag_prefix() -> str
method mean :: возвращает префикс флага
class :: FlagsGroup
Класс, объединяющий список флагов в один объект, используется в качестве
передаваемого аргумента flags экземпляру класса Command, при регистрации
хэндлера
Конструктор
FlagsGroup(*flagы: Flag)
Аргументы:
- name : mean
*flags(Flag): Неограниченное количество передаваемых флагов
methods
.get_flags() -> list[Flag]
method mean :: возвращает зарегистрированные флаги
Тесты
Запуск тестов:
python -m unittest discover
or
python -m unittest discover -v