mirror of
https://github.com/koloideal/Argenta.git
synced 2026-06-10 10:05:28 +03:00
docs
This commit is contained in:
@@ -3,48 +3,48 @@
|
||||
AutoCompleter
|
||||
=====================
|
||||
|
||||
Объект ``AutoCompleter`` является компонентом ``Argenta``, отвечающим за интерактивное автодополнение команд. Его основная задача — улучшить опыт взаимодействия пользователя с командной строкой, предоставляя подсказки и автоматически завершая ввод на основе ранее введенных команд. Это значительно ускоряет работу и снижает вероятность опечаток.
|
||||
``AutoCompleter`` — это компонент, отвечающий за интерактивное автодополнение команд. Он улучшает пользовательский опыт, предлагая подсказки и завершая ввод на основе истории команд, что ускоряет работу и снижает вероятность опечаток.
|
||||
|
||||
``AutoCompleter`` использует ``pyreadline3`` для имплементации ``readline GNU`` на ``Windows`` для управления историей команд и реализации логики автодополнения.
|
||||
``AutoCompleter`` использует ``pyreadline3`` для реализации функциональности `GNU readline` в `Windows`, что позволяет управлять историей команд и автодополнением.
|
||||
|
||||
-----
|
||||
|
||||
Инициализация
|
||||
-------------
|
||||
|
||||
.. code:: python
|
||||
.. code-block:: python
|
||||
|
||||
__init__(self, history_filename: str | None = None,
|
||||
autocomplete_button: str = "tab") -> None
|
||||
|
||||
Создает и настраивает экземпляр ``AutoCompleter``.
|
||||
Создаёт и настраивает экземпляр ``AutoCompleter``.
|
||||
|
||||
* ``history_filename``: Имя файла для сохранения и загрузки истории команд. Если указано, история будет персистентной между сессиями приложения. Если **None**, история будет храниться только в памяти текущей сессии.
|
||||
* ``autocomplete_button``: Название клавиши, которая активирует автодополнение. По умолчанию используется клавиша **"tab"**.
|
||||
* ``history_filename``: Имя файла для сохранения истории команд. Если указано, история будет сохраняться между сессиями. При значении `None` история хранится только в памяти.
|
||||
* ``autocomplete_button``: Клавиша, активирующая автодополнение. По умолчанию — **Tab**.
|
||||
|
||||
-----
|
||||
|
||||
Назначение и возможности
|
||||
-------------------------
|
||||
|
||||
``AutoCompleter`` обладает следующими возможностями:
|
||||
Основные возможности ``AutoCompleter``:
|
||||
|
||||
* **Автодополнение по истории**: Основная логика автодополнения основана на истории команд, которые пользователь вводил ранее. Когда пользователь начинает вводить команду и нажимает клавишу автодополнения (по умолчанию **Tab**), система ищет в истории все команды, начинающиеся с введенного текста.
|
||||
* **Автодополнение по истории**: При нажатии клавиши автодополнения (по умолчанию **Tab**) система ищет в истории команды, начинающиеся с уже введённого текста.
|
||||
|
||||
* **Завершение по общему префиксу**: Если найдено несколько команд с общим префиксом, автодокомплитер подставит только общую часть. Например, если в истории есть команды ``show_users`` и ``show_profile``, при вводе ``sho`` и нажатии **Tab** будет подставлено ``show_``.
|
||||
* **Общий префикс**: Если найдено несколько команд с общим префиксом, будет подставлена только общая часть. Например, для команд ``show_users`` и ``show_profile`` при вводе ``sho`` и нажатии **Tab** ввод дополнится до ``show_``.
|
||||
|
||||
* **Персистентная история**: При указании параметра ``history_filename`` в конструкторе, вся история команд сохраняется в файл при выходе из приложения и загружается при следующем запуске. Это делает автодополнение со временем все более "умным" и персонализированным.
|
||||
* **Постоянная история**: Если указан ``history_filename``, история команд сохраняется в файл при выходе и загружается при следующем запуске. Это делает автодополнение со временем «умнее».
|
||||
|
||||
* **Очистка истории**: При сохранении истории ``AutoCompleter`` автоматически удаляет дубликаты и команды, которые больше не зарегистрированы в приложении, поддерживая актуальность и чистоту файла истории.
|
||||
* **Очистка истории**: При сохранении ``AutoCompleter`` удаляет дубликаты и более не существующие команды, поддерживая историю в актуальном состоянии.
|
||||
|
||||
* **Настройка клавиши активации**: Вы можете изменить клавишу, отвечающую за автодополнение, через параметр ``autocomplete_button``.
|
||||
* **Настройка клавиши**: Клавишу автодополнения можно изменить с помощью параметра ``autocomplete_button``.
|
||||
|
||||
-----
|
||||
|
||||
Пример использования
|
||||
--------------------
|
||||
|
||||
``AutoCompleter`` передается как аргумент при инициализации `App`.
|
||||
``AutoCompleter`` передаётся как аргумент при инициализации `App`.
|
||||
|
||||
.. literalinclude:: ../../../code_snippets/autocompleter/snippet.py
|
||||
:language: python
|
||||
|
||||
@@ -3,15 +3,14 @@
|
||||
Dividing Lines
|
||||
==============
|
||||
|
||||
Разделительные линии в ``Argenta`` играют важную роль в визуальном оформлении консольного интерфейса. Они используются для структурирования вывода, отделения блоков информации друг от друга (например, вывода команды от следующего приглашения к вводу).
|
||||
Библиотека предлагает два подхода к управлению разделительными линиями: статический и динамический, каждый из которых имеет свои преимущества и сценарии использования.
|
||||
Разделительные линии в ``Argenta`` используются для визуального структурирования вывода и отделения блоков информации друг от друга. Библиотека предлагает два типа линий: статическую и динамическую.
|
||||
|
||||
----
|
||||
|
||||
Класс ``StaticDividingLine``
|
||||
-----------------------------
|
||||
|
||||
``StaticDividingLine`` — это класс, который создает разделительную линию **фиксированной** длины. Длина и символ-заполнитель задаются при инициализации объекта. Этот тип линии полезен, когда вам нужен предсказуемый и унифицированный внешний вид интерфейса, независимо от содержимого вывода.
|
||||
``StaticDividingLine`` создаёт разделительную линию **фиксированной** длины. Этот тип линии полезен для создания предсказуемого и унифицированного интерфейса.
|
||||
|
||||
.. code-block:: python
|
||||
:linenos:
|
||||
@@ -19,28 +18,28 @@ Dividing Lines
|
||||
def __init__(self, unit_part: str = "-", *,
|
||||
length: int = 25) -> None
|
||||
|
||||
Создает экземпляр статической разделительной линии.
|
||||
Создаёт экземпляр статической разделительной линии.
|
||||
|
||||
* ``unit_part``: Символ, который будет использоваться для построения линии. Учитывается только первый символ строки. По умолчанию: ``-``.
|
||||
* ``length``: Целое число, определяющее фиксированную длину линии в символах. Является keyword-only аргументом. По умолчанию: ``25``.
|
||||
* ``unit_part``: Символ для построения линии (учитывается только первый символ). По умолчанию: ``-``.
|
||||
* ``length``: Фиксированная длина линии (keyword-only аргумент). По умолчанию: ``25``.
|
||||
|
||||
-----
|
||||
|
||||
Класс ``DynamicDividingLine``
|
||||
------------------------------
|
||||
|
||||
``DynamicDividingLine`` представляет собой более "умный" подход. Этот класс создает линию, длина которой **динамически** подстраивается под самую длинную строку, выведенную в консоль, в рамках выполнения одной команды. Это достигается за счет механизма перехвата `stdout`. В результате разделительные линии всегда идеально обрамляют выводимый контент, что выглядит очень аккуратно.
|
||||
``DynamicDividingLine`` создаёт линию, длина которой **динамически** подстраивается под самую длинную строку в выводе команды. Это требует перехвата `stdout`, в результате чего разделители идеально обрамляют выводимый контент.
|
||||
|
||||
.. code-block:: python
|
||||
:linenos:
|
||||
|
||||
__init__(self, unit_part: str = "-") -> None
|
||||
|
||||
Создает экземпляр динамической разделительной линии.
|
||||
Создаёт экземпляр динамической разделительной линии.
|
||||
|
||||
* ``unit_part``: Символ, который будет использоваться для построения линии. По умолчанию: ``-``.
|
||||
* ``unit_part``: Символ для построения линии. По умолчанию: ``-``.
|
||||
|
||||
Длина для этой линии не задается при инициализации, так как она вычисляется автоматически во время выполнения.
|
||||
Длина вычисляется автоматически и не задаётся при инициализации.
|
||||
|
||||
.. warning::
|
||||
Обязательно почитайте про нюансы использования динамических линий и перехвата ``stdout`` в :ref:`этом разделе<root_redirect_stdout>`.
|
||||
@@ -50,20 +49,20 @@ Dividing Lines
|
||||
Назначение и использование
|
||||
--------------------------
|
||||
|
||||
Выбор между статической и динамической линией зависит от ваших потребностей в конкретном приложении или даже для конкретного ``Router``-а.
|
||||
Выбор между статической и динамической линией зависит от ваших задач.
|
||||
|
||||
* **StaticDividingLine** идеально подходит, если:
|
||||
|
||||
* Вам нужен строгий, консистентный дизайн.
|
||||
* Вы используете роутеры с отключенным перехватом ``stdout`` (``disable_redirect_stdout=True``), так как в этом случае динамическое вычисление длины невозможно.
|
||||
* Вам нужен строгий и консистентный дизайн.
|
||||
* Вы используете роутеры с отключённым перехватом ``stdout`` (``disable_redirect_stdout=True``), где динамическое вычисление длины невозможно.
|
||||
|
||||
* **DynamicDividingLine** (используется по умолчанию) является предпочтительным выбором, если:
|
||||
* **DynamicDividingLine** (поведение по умолчанию) — предпочтительный выбор, если:
|
||||
|
||||
* Вы хотите, чтобы интерфейс выглядел аккуратно и адаптивно.
|
||||
* Вывод ваших команд имеет разную длину, и вы хотите, чтобы рамки всегда соответствовали контенту.
|
||||
* В ваших хэндлерах нет ожидающих ``io`` операций.
|
||||
* Вы хотите, чтобы интерфейс был адаптивным.
|
||||
* Вывод ваших команд имеет разную длину.
|
||||
* В ваших обработчиках нет интерактивных операций ввода (например, ``input()``).
|
||||
|
||||
Тип разделительной линии для всего приложения задается при инициализации ``App`` через параметр ``dividing_line``.
|
||||
Тип разделителя для всего приложения задаётся при инициализации ``App`` через параметр ``dividing_line``.
|
||||
|
||||
-----
|
||||
|
||||
|
||||
+38
-50
@@ -3,14 +3,14 @@
|
||||
App
|
||||
===
|
||||
|
||||
Объект ``App`` является центральной сущностью библиотеки ``Argenta``. Он выступает в роли ядра вашего консольного приложения, отвечая за его конфигурацию, управление жизненным циклом, обработку команд и взаимодействие с пользователем. ``App`` координирует работу всех остальных компонентов, таких как роутеры, обработчики команд и системные сообщения.
|
||||
Объект ``App`` — это ядро вашего консольного приложения. Он отвечает за конфигурацию, управление жизненным циклом, обработку команд и взаимодействие с пользователем, координируя работу всех компонентов: роутеров, обработчиков и системных сообщений.
|
||||
|
||||
------
|
||||
|
||||
Инициализация
|
||||
-------------
|
||||
|
||||
.. code-block:: rust
|
||||
.. code-block:: python
|
||||
:linenos:
|
||||
|
||||
AVAILABLE_DIVIDING_LINES: TypeAlias = StaticDividingLine | DynamicDividingLine
|
||||
@@ -35,19 +35,19 @@ App
|
||||
autocompleter: AutoCompleter = DEFAULT_AUTOCOMPLETER,
|
||||
print_func: Printer = DEFAULT_PRINT_FUNC) -> None
|
||||
|
||||
Создает и настраивает экземпляр приложения ``Argenta``.
|
||||
Создаёт и настраивает экземпляр приложения.
|
||||
|
||||
* ``prompt``: Строка-приглашение, которая отображается перед вводом каждой команды. По умолчанию: **"What do you want to do?\\n\\n"**.
|
||||
* ``initial_message``: Приветственное сообщение, которое выводится при запуске приложения.
|
||||
* ``farewell_message``: Прощальное сообщение при завершении работы приложения.
|
||||
* ``exit_command``: Сущность команды, которая будет маркирована как команда для выхода из приложения.
|
||||
* ``system_router_title``: Заголовок для системного роутера, который содержит команду выхода и другие системные команды.
|
||||
* ``ignore_command_register``: Если **True** (по умолчанию), регистр введенных команд будет игнорироваться при поиске обработчика.
|
||||
* ``dividing_line``: Объект, управляющий стилем разделительной линии. Может быть **StaticDividingLine** или **DynamicDividingLine**.
|
||||
* ``repeat_command_groups``: Если **True** (по умолчанию), описание доступных команд будет выводиться перед каждым вводом.
|
||||
* ``override_system_messages``: Если **True** (по умолчанию), стандартное форматирование системных сообщений (цвета, ASCII-арт) будет отключено.
|
||||
* ``autocompleter``: Объект, отвечающий за логику автодополнения команд.
|
||||
* ``print_func``: Функция, используемая для вывода всех системных сообщений. По умолчанию используется ``rich.console.Console().print``.
|
||||
* ``prompt``: Приглашение к вводу, отображаемое перед каждой командой.
|
||||
* ``initial_message``: Сообщение, выводимое при запуске приложения.
|
||||
* ``farewell_message``: Сообщение, выводимое при выходе из приложения.
|
||||
* ``exit_command``: Команда, используемая для выхода из приложения.
|
||||
* ``system_router_title``: Заголовок для системного роутера (содержит команду выхода).
|
||||
* ``ignore_command_register``: Если ``True``, регистр команд игнорируется при поиске обработчика.
|
||||
* ``dividing_line``: Стиль разделительной линии (``StaticDividingLine`` или ``DynamicDividingLine``).
|
||||
* ``repeat_command_groups``: Если ``True``, список доступных команд выводится перед каждым вводом.
|
||||
* ``override_system_messages``: Если ``True``, стандартное форматирование (цвета, ASCII-арт) отключается.
|
||||
* ``autocompleter``: Объект, отвечающий за автодополнение команд.
|
||||
* ``print_func``: Функция для вывода всех системных сообщений (по умолчанию ``rich.print``).
|
||||
|
||||
-----
|
||||
|
||||
@@ -56,19 +56,19 @@ App
|
||||
|
||||
- .. py:method:: include_router(self, router: Router) -> None
|
||||
|
||||
Регистрирует один ``Router`` в приложении. Все команды, определенные в этом роутере, становятся доступными для вызова.
|
||||
Регистрирует роутер в приложении. Все команды из этого роутера становятся доступными для вызова.
|
||||
|
||||
:param router: Объект роутера, который нужно зарегистрировать.
|
||||
:param router: Экземпляр ``Router`` для регистрации.
|
||||
|
||||
- .. py:method:: include_routers(self, *routers: Router) -> None
|
||||
|
||||
Регистрирует несколько роутеров одновременно. Является удобной оберткой над ``include_router``.
|
||||
Регистрирует несколько роутеров одновременно.
|
||||
|
||||
:param routers: Последовательность объектов ``Router`` для регистрации.
|
||||
:param routers: Последовательность экземпляров ``Router`` для регистрации.
|
||||
|
||||
- .. py:method:: add_message_on_startup(self, message: str) -> None
|
||||
|
||||
Добавляет дополнительное текстовое сообщение, которое будет выведено на экран при запуске приложения, сразу после `initial_message`.
|
||||
Добавляет текстовое сообщение, которое выводится при запуске приложения после `initial_message`.
|
||||
|
||||
:param message: Строка с сообщением.
|
||||
|
||||
@@ -77,70 +77,58 @@ App
|
||||
Методы установки обработчиков
|
||||
-------------------------------
|
||||
|
||||
``App`` позволяет гибко настраивать реакцию на различные события, такие как ошибки ввода или ввод неизвестной команды.
|
||||
``App`` позволяет настраивать реакцию на различные события, такие как ошибки ввода или неизвестные команды.
|
||||
|
||||
.. hint::
|
||||
Подробнее о исключениях и их обработке в соответствующем :ref:`разделе документации <root_error_handling>`.
|
||||
|
||||
-----
|
||||
|
||||
.. py:method:: set_description_message_pattern(self, handler: DescriptionMessageGenerator) -> None
|
||||
.. py:method:: set_description_message_pattern(self, handler: Callable[[str, str], str]) -> None
|
||||
|
||||
Устанавливает пользовательский шаблон для форматирования строки, описывающей доступную команду (триггер + описание).
|
||||
Устанавливает шаблон для форматирования строки описания команды.
|
||||
|
||||
``DescriptionMessageGenerator`` -> ``Callable[[str, str], str]``
|
||||
|
||||
Где первый аргумент - это триггер команды, а второй - ее описание, возвращает строку, которая является форматированной строкой.
|
||||
Обработчик принимает триггер команды (``str``) и её описание (``str``), а возвращает отформатированную строку.
|
||||
|
||||
------
|
||||
|
||||
.. py:method:: set_incorrect_input_syntax_handler(self, handler: NonStandardBehaviorHandler[str]) -> None
|
||||
.. py:method:: set_incorrect_input_syntax_handler(self, handler: Callable[[str], None]) -> None
|
||||
|
||||
Устанавливает обработчик, который вызывается при некорректном синтаксисе флагов в введенной команде.
|
||||
Устанавливает обработчик для некорректного синтаксиса флагов.
|
||||
|
||||
``NonStandardBehaviorHandler[str]`` -> ``Callable[[str], None]``
|
||||
|
||||
Где первый и единственный аргумент - это необработанная строка пользовательского ввода.
|
||||
Обработчик принимает строку, введённую пользователем.
|
||||
|
||||
------
|
||||
|
||||
.. py:method:: set_repeated_input_flags_handler(self, handler: NonStandardBehaviorHandler[str]) -> None
|
||||
.. py:method:: set_repeated_input_flags_handler(self, handler: Callable[[str], None]) -> None
|
||||
|
||||
Устанавливает обработчик для ситуации, когда пользователь вводит один и тот же флаг несколько раз.
|
||||
Устанавливает обработчик для повторяющихся флагов в команде.
|
||||
|
||||
``NonStandardBehaviorHandler[str]`` -> ``Callable[[str], None]``
|
||||
|
||||
Где первый и единственный аргумент - это необработанная строка пользовательского ввода.
|
||||
Обработчик принимает строку, введённую пользователем.
|
||||
|
||||
------
|
||||
|
||||
.. py:method:: set_unknown_command_handler(self, handler: NonStandardBehaviorHandler[InputCommand]) -> None
|
||||
.. py:method:: set_unknown_command_handler(self, handler: Callable[[InputCommand], None]) -> None
|
||||
|
||||
Устанавливает обработчик, который срабатывает, если введенная команда не была найдена ни в одном из зарегистрированных роутеров.
|
||||
Устанавливает обработчик для неизвестной команды.
|
||||
|
||||
``NonStandardBehaviorHandler[InputCommand]`` -> ``Callable[[InputCommand], None]``
|
||||
|
||||
Где первый и единственный аргумент - это распаршенный в объект InputCommand ввод пользователя.
|
||||
Обработчик принимает объект ``InputCommand``.
|
||||
|
||||
-----
|
||||
|
||||
.. py:method:: set_empty_command_handler(self, handler: EmptyCommandHandler) -> None
|
||||
.. py:method:: set_empty_command_handler(self, handler: Callable[[], None]) -> None
|
||||
|
||||
Устанавливает обработчик для случая, когда пользователь отправляет пустую строку вместо команды.
|
||||
Устанавливает обработчик для пустого ввода.
|
||||
|
||||
``EmptyCommandHandler`` -> ``Callable[[], None]``
|
||||
|
||||
Не принимает и не возвращает ничего.
|
||||
Обработчик не принимает аргументов.
|
||||
|
||||
-----
|
||||
|
||||
.. py:method:: set_exit_command_handler(self, handler: NonStandardBehaviorHandler[Response]) -> None
|
||||
.. py:method:: set_exit_command_handler(self, handler: Callable[[Response], None]) -> None
|
||||
|
||||
Позволяет переопределить стандартное поведение при вызове команды выхода. По умолчанию просто выводится ``farewell_message``.
|
||||
Переопределяет стандартное поведение при вызове команды выхода.
|
||||
|
||||
``NonStandardBehaviorHandler[Response]`` -> ``Callable[[Response], None]``
|
||||
|
||||
Где первый и единственный аргумент - это объект ответа, ``Response``.
|
||||
Обработчик принимает объект ``Response``.
|
||||
|
||||
.. toctree::
|
||||
:hidden:
|
||||
|
||||
Reference in New Issue
Block a user