mirror of
https://github.com/koloideal/Argenta.git
synced 2026-06-10 10:05:28 +03:00
docs
This commit is contained in:
+6
-6
@@ -9,16 +9,16 @@ Argenta
|
|||||||
**Библиотека для построения модульных CLI-приложений с простым и приятным API.**
|
**Библиотека для построения модульных CLI-приложений с простым и приятным API.**
|
||||||
|
|
||||||
У вас есть некая функциональность и вы хотите распространять её в виде CLI? Argenta поможет вам.
|
У вас есть некая функциональность и вы хотите распространять её в виде CLI? Argenta поможет вам.
|
||||||
Основная цель библиотеки дать возможность разработчикам сфокусироваться на реализации своих идей, предоставляя для этого удобные абстракциию.
|
Основная цель библиотеки — дать возможность разработчикам сфокусироваться на реализации своих идей, предоставляя для этого удобные абстракции.
|
||||||
|
|
||||||
.. image:: https://github.com/koloideal/Argenta/blob/main/imgs/mock_app_preview4.png?raw=True
|
.. image:: https://github.com/koloideal/Argenta/blob/main/imgs/mock_app_preview4.png?raw=True
|
||||||
:alt: Пример приложения
|
:alt: Пример приложения
|
||||||
|
|
||||||
Argenta нужна для создания приложений, которым необходим свой скоуп, то есть: при запуске приложения юзер входит в абстрагированный скоуп,
|
Argenta нужна для создания приложений, которым необходим свой скоуп, то есть: при запуске приложения пользователь входит в абстрагированный скоуп,
|
||||||
в котором у него есть доступ к созданной функциональности.
|
в котором у него есть доступ к созданной функциональности.
|
||||||
|
|
||||||
Один из основных принципов библиотеки это цикличность, это значит, что после ввода юзером команды он не выходит из скоупа, в этом основное
|
Один из основных принципов библиотеки — это цикличность, это значит, что после ввода пользователем команды он не выходит из скоупа, в этом основное
|
||||||
отличие от таких библиотек, как ``argparse``, ``click`` и ``typer``. Выход из скоупа контролируется самим юзером.
|
отличие от таких библиотек, как ``argparse``, ``click`` и ``typer``. Выход из скоупа контролируется самим пользователем.
|
||||||
|
|
||||||
**Ключевые особенности:**
|
**Ключевые особенности:**
|
||||||
|
|
||||||
@@ -26,12 +26,12 @@ Argenta нужна для создания приложений, которым
|
|||||||
* **Маршрутизаторы**. Объекты маршрутизации, которые регистрируют обработчиков, позволяя создавать кастомные настройки для групп обработчиков, а также семантически их разделять.
|
* **Маршрутизаторы**. Объекты маршрутизации, которые регистрируют обработчиков, позволяя создавать кастомные настройки для групп обработчиков, а также семантически их разделять.
|
||||||
* **Приложение**. Объект управления жизненным циклом приложения, подключения созданных маршрутизаторов, конфигурирования различных вторичных утилит, таких как автокомплит, логирование и т.д.
|
* **Приложение**. Объект управления жизненным циклом приложения, подключения созданных маршрутизаторов, конфигурирования различных вторичных утилит, таких как автокомплит, логирование и т.д.
|
||||||
* **Оркестратор**. Объект *оркестрации*, который конфигурирует, запускает и управляет всеми остальными компонентами программы.
|
* **Оркестратор**. Объект *оркестрации*, который конфигурирует, запускает и управляет всеми остальными компонентами программы.
|
||||||
* **Внедрение зависимостей**. ``Argenta`` нативно поддерживает ``dishka`` и предоставляет возможность инжектирования зависимостей в хэндлерах, резолвя тайпхинты, подробнее_.
|
* **Внедрение зависимостей**. ``Argenta`` нативно поддерживает ``dishka`` и предоставляет возможность инжектирования зависимостей в хэндлерах, разрешая типы, подробнее_.
|
||||||
|
|
||||||
.. _подробнее: https://dishka.readthedocs.io/en/stable/di_intro.html
|
.. _подробнее: https://dishka.readthedocs.io/en/stable/di_intro.html
|
||||||
|
|
||||||
* **Поддержка флагов**. Библиотека поддерживает определение флагов, введённых вместе с командой, ``Argenta`` сама парсит и валидирует их, отдавая понятные сущности.
|
* **Поддержка флагов**. Библиотека поддерживает определение флагов, введённых вместе с командой, ``Argenta`` сама парсит и валидирует их, отдавая понятные сущности.
|
||||||
* **Поддержка аргументов**. Осуществленна поддержка аргументов командной строки, позволяя пользователю передавать различные параметры при запуске приложения.
|
* **Поддержка аргументов**. Осуществлена поддержка аргументов командной строки, позволяющая пользователю передавать различные параметры при запуске приложения.
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:hidden:
|
:hidden:
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ Router
|
|||||||
__init__(self, title: str | None = None,
|
__init__(self, title: str | None = None,
|
||||||
disable_redirect_stdout: bool = False) -> None
|
disable_redirect_stdout: bool = False) -> None
|
||||||
|
|
||||||
Создает новый экземпляр маршрутизатора.
|
Создаёт новый экземпляр маршрутизатора.
|
||||||
|
|
||||||
* ``title`` : Необязательный заголовок для группы команд, которые регистрируются в этом роутере. Этот заголовок будет отображаться в списке доступных команд, помогая пользователю ориентироваться.
|
* ``title`` : Необязательный заголовок для группы команд, которые регистрируются в этом роутере. Этот заголовок будет отображаться в списке доступных команд, помогая пользователю ориентироваться.
|
||||||
* ``disable_redirect_stdout`` : Если установлено в ``True``, отключает механизм перехвата стандартного вывода (``stdout``) для всех команд этого роутера. Это необходимо для команд, которые требуют интерактивного ввода от пользователя (например, с помощью ``input()``). При отключении перехвата вывода автоматически используется статическая разделительная линия. Подробнее в :ref:`соответствующем разделе <root_redirect_stdout>`
|
* ``disable_redirect_stdout`` : Если установлено в ``True``, отключает механизм перехвата стандартного вывода (``stdout``) для всех команд этого роутера. Это необходимо для команд, которые требуют интерактивного ввода от пользователя (например, с помощью ``input()``). При отключении перехвата вывода автоматически используется статическая разделительная линия. Подробнее в :ref:`соответствующем разделе <root_redirect_stdout>`
|
||||||
@@ -53,7 +53,7 @@ Router
|
|||||||
|
|
||||||
Предопределенный экземпляр ``Router``, который содержит базовые системные команды. По умолчанию в него включена команда выхода из приложения (обычно **exit**). Он имеет заголовок **"System points:"**, который можно переопределить в инстансе приложения -> ``App``.
|
Предопределенный экземпляр ``Router``, который содержит базовые системные команды. По умолчанию в него включена команда выхода из приложения (обычно **exit**). Он имеет заголовок **"System points:"**, который можно переопределить в инстансе приложения -> ``App``.
|
||||||
|
|
||||||
Вы можете добавлять свои команды в этот роутер, для этого импортируйте ``argenta.router.defaults.system_router`` и декорируйте его методом необходимые хэндлеры.
|
Вы можете добавлять свои команды в этот роутер, для этого импортируйте ``argenta.router.defaults.system_router`` и декорируйте необходимые хэндлеры его методом.
|
||||||
|
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
:language: python
|
:language: python
|
||||||
:linenos:
|
:linenos:
|
||||||
|
|
||||||
``Argenta`` -> ``dishka`` зарезолвит тайпхинты и внедрит зависимость с возвращаемым типом ``Connection``, прежде чем использовать зависимость её нужно создать, для этого нужно создать соответствующий провайдер.
|
``Argenta`` через ``dishka`` разрешит типы и внедрит зависимость с возвращаемым типом ``Connection``. Прежде чем использовать зависимость, её нужно создать, для этого нужно создать соответствующий провайдер.
|
||||||
|
|
||||||
.. literalinclude:: ../code_snippets/dependency_injection/snippet2.py
|
.. literalinclude:: ../code_snippets/dependency_injection/snippet2.py
|
||||||
:language: python
|
:language: python
|
||||||
:linenos:
|
:linenos:
|
||||||
|
|
||||||
После создания провайдера, его нужно зарегистрировать в оркестраторе.
|
После создания провайдера его нужно зарегистрировать в оркестраторе.
|
||||||
|
|
||||||
.. literalinclude:: ../code_snippets/dependency_injection/snippet3.py
|
.. literalinclude:: ../code_snippets/dependency_injection/snippet3.py
|
||||||
:language: python
|
:language: python
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
Как это работает?
|
Как это работает?
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
В основе DI в Argente лежат **провайдеры** и **контейнер**.
|
В основе DI в Argenta лежат **провайдеры** и **контейнер**.
|
||||||
|
|
||||||
* **Провайдер (Provider)** — это "рецепт", который объясняет, как создавать и настраивать ту или иную зависимость (например, подключение к БД, API-клиент или любой другой сервис).
|
* **Провайдер (Provider)** — это "рецепт", который объясняет, как создавать и настраивать ту или иную зависимость (например, подключение к БД, API-клиент или любой другой сервис).
|
||||||
* **Контейнер (IoC Container)** — это "фабрика", которая хранит все рецепты (провайдеры) и по запросу создаёт и выдаёт готовые зависимости.
|
* **Контейнер (IoC Container)** — это "фабрика", которая хранит все рецепты (провайдеры) и по запросу создаёт и выдаёт готовые зависимости.
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
|
|
||||||
``Argenta`` поставляется с предопределённым провайдером, который даёт доступ к важным системным зависимостям без какой-либо настройки. К примеру вы можете получить объект ``ArgSpace``, который представляет из себя распаршенные аргументы командной строки при запуске приложения.
|
``Argenta`` поставляется с предопределённым провайдером, который даёт доступ к важным системным зависимостям без какой-либо настройки. К примеру вы можете получить объект ``ArgSpace``, который представляет из себя распаршенные аргументы командной строки при запуске приложения.
|
||||||
|
|
||||||
Краткий сэмпл кода, который получает объект ``ArgSpace`` и выводит в консоль аргумент с именем "type":
|
Краткий пример кода, который получает объект ``ArgSpace`` и выводит в консоль аргумент с именем "type":
|
||||||
|
|
||||||
.. literalinclude:: ../code_snippets/dependency_injection/snippet4.py
|
.. literalinclude:: ../code_snippets/dependency_injection/snippet4.py
|
||||||
:language: python
|
:language: python
|
||||||
|
|||||||
@@ -14,8 +14,7 @@
|
|||||||
.. note::
|
.. note::
|
||||||
Все исключения никогда не остаются необработанными, так как у них есть стандартные хэндлеры. Поэтому переопределение опционально.
|
Все исключения никогда не остаются необработанными, так как у них есть стандартные хэндлеры. Поэтому переопределение опционально.
|
||||||
|
|
||||||
Краткий сэмпл кода, переопределяющего хэндлер ввода
|
Краткий пример кода, переопределяющего хэндлер ввода пустой команды:
|
||||||
пустой команды
|
|
||||||
|
|
||||||
.. literalinclude:: ../code_snippets/error_handling/snippet.py
|
.. literalinclude:: ../code_snippets/error_handling/snippet.py
|
||||||
:language: python
|
:language: python
|
||||||
@@ -30,11 +29,11 @@
|
|||||||
``UnprocessedInputFlagException``: Необрабатываемый ввод от пользователя
|
``UnprocessedInputFlagException``: Необрабатываемый ввод от пользователя
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Исключение вызывается, когда пользователь вводит команду с некорректным синтаксисом и как следствие парсер не может
|
Исключение вызывается, когда пользователь вводит команду с некорректным синтаксисом и, как следствие, парсер не может
|
||||||
*распарсить* её. В большинстве случаев это означат, что проблема в синтаксисе введённых флагов команды, подробнее о
|
*распарсить* её. В большинстве случаев это означает, что проблема в синтаксисе введённых флагов команды, подробнее о
|
||||||
флагах и их синтаксисе в :ref:`Flags <root_flags>`.
|
флагах и их синтаксисе в :ref:`Flags <root_flags>`.
|
||||||
|
|
||||||
Дефолтный хэндлер выводит в консоль
|
Стандартный хэндлер выводит в консоль
|
||||||
|
|
||||||
.. code-block:: shell
|
.. code-block:: shell
|
||||||
|
|
||||||
@@ -44,7 +43,7 @@
|
|||||||
протокол ``NonStandardBehaviorHandler[str]`` соответствует ``Callable[[str], None]``, то есть хэндлер должен быть вызываемым объектом,
|
протокол ``NonStandardBehaviorHandler[str]`` соответствует ``Callable[[str], None]``, то есть хэндлер должен быть вызываемым объектом,
|
||||||
к примеру функция или лямбда, которая принимает единственный аргумент - строку, которая представляет собой необработанную введённую команду, и ничего не возвращает.
|
к примеру функция или лямбда, которая принимает единственный аргумент - строку, которая представляет собой необработанную введённую команду, и ничего не возвращает.
|
||||||
|
|
||||||
Сэмпл кода, переопределяющего хэндлер ввода команды с некорректным синтаксисом:
|
Пример кода, переопределяющего хэндлер ввода команды с некорректным синтаксисом:
|
||||||
|
|
||||||
.. literalinclude:: ../code_snippets/error_handling/snippet2.py
|
.. literalinclude:: ../code_snippets/error_handling/snippet2.py
|
||||||
:language: python
|
:language: python
|
||||||
@@ -61,7 +60,7 @@
|
|||||||
.. note::
|
.. note::
|
||||||
Сравнение на равенство у регистрируемых флагов(Flag) происходит иначе, подробнее в :ref:`Flag <root_flags>`.
|
Сравнение на равенство у регистрируемых флагов(Flag) происходит иначе, подробнее в :ref:`Flag <root_flags>`.
|
||||||
|
|
||||||
Дефолтный хэндлер выводит в консоль
|
Стандартный хэндлер выводит в консоль
|
||||||
|
|
||||||
.. code-block:: shell
|
.. code-block:: shell
|
||||||
|
|
||||||
@@ -71,7 +70,7 @@
|
|||||||
протокол ``NonStandardBehaviorHandler[str]`` соответствует ``Callable[[str], None]``, то есть хэндлер должен быть вызываемым объектом,
|
протокол ``NonStandardBehaviorHandler[str]`` соответствует ``Callable[[str], None]``, то есть хэндлер должен быть вызываемым объектом,
|
||||||
к примеру функция или лямбда, которая принимает единственный аргумент - строку, которая представляет собой необработанную введённую команду, и ничего не возвращает.
|
к примеру функция или лямбда, которая принимает единственный аргумент - строку, которая представляет собой необработанную введённую команду, и ничего не возвращает.
|
||||||
|
|
||||||
Сэмпл кода, переопределяющего хэндлер ввода команды с повторяющимися флагами:
|
Пример кода, переопределяющего хэндлер ввода команды с повторяющимися флагами:
|
||||||
|
|
||||||
.. literalinclude:: ../code_snippets/error_handling/snippet3.py
|
.. literalinclude:: ../code_snippets/error_handling/snippet3.py
|
||||||
:language: python
|
:language: python
|
||||||
@@ -84,7 +83,7 @@
|
|||||||
|
|
||||||
Исключение вызывается, когда пользователь вводит команду в виде строки из пробельных символов - ``\n``, ``\t``, пробел и т.д.
|
Исключение вызывается, когда пользователь вводит команду в виде строки из пробельных символов - ``\n``, ``\t``, пробел и т.д.
|
||||||
|
|
||||||
Дефолтный хэндлер выводит в консоль
|
Стандартный хэндлер выводит в консоль
|
||||||
|
|
||||||
.. code-block:: shell
|
.. code-block:: shell
|
||||||
|
|
||||||
@@ -94,7 +93,7 @@
|
|||||||
протокол ``EmptyCommandHandler`` соответствует ``Callable[[], None]``, то есть хэндлер должен быть вызываемым объектом,
|
протокол ``EmptyCommandHandler`` соответствует ``Callable[[], None]``, то есть хэндлер должен быть вызываемым объектом,
|
||||||
к примеру функция или лямбда, которая не принимает аргументов и ничего не возвращает.
|
к примеру функция или лямбда, которая не принимает аргументов и ничего не возвращает.
|
||||||
|
|
||||||
Сэмпл кода, переопределяющего хэндлер ввода пустой команды:
|
Пример кода, переопределяющего хэндлер ввода пустой команды:
|
||||||
|
|
||||||
.. literalinclude:: ../code_snippets/error_handling/snippet4.py
|
.. literalinclude:: ../code_snippets/error_handling/snippet4.py
|
||||||
:language: python
|
:language: python
|
||||||
@@ -108,7 +107,7 @@
|
|||||||
Поведение триггерится, когда пользователь вводит команду, которая не зарегистрирована ни в одном роутере и не является алиасом ни для
|
Поведение триггерится, когда пользователь вводит команду, которая не зарегистрирована ни в одном роутере и не является алиасом ни для
|
||||||
одной зарегистрированной команды.
|
одной зарегистрированной команды.
|
||||||
|
|
||||||
Дефолтный хэндлер выводит в консоль
|
Стандартный хэндлер выводит в консоль
|
||||||
|
|
||||||
.. code-block:: shell
|
.. code-block:: shell
|
||||||
|
|
||||||
@@ -118,7 +117,7 @@
|
|||||||
протокол ``NonStandardBehaviorHandler[InputCommand]`` соответствует ``Callable[[InputCommand], None]``, то есть хэндлер должен быть вызываемым объектом,
|
протокол ``NonStandardBehaviorHandler[InputCommand]`` соответствует ``Callable[[InputCommand], None]``, то есть хэндлер должен быть вызываемым объектом,
|
||||||
к примеру функция или лямбда, которая принимает обязательный аргумент типа :ref:`InputCommand <root_api_command_input_command>` и ничего не возвращает.
|
к примеру функция или лямбда, которая принимает обязательный аргумент типа :ref:`InputCommand <root_api_command_input_command>` и ничего не возвращает.
|
||||||
|
|
||||||
Сэмпл кода, переопределяющего хэндлер ввода неизвестной команды:
|
Пример кода, переопределяющего хэндлер ввода неизвестной команды:
|
||||||
|
|
||||||
.. literalinclude:: ../code_snippets/error_handling/snippet5.py
|
.. literalinclude:: ../code_snippets/error_handling/snippet5.py
|
||||||
:language: python
|
:language: python
|
||||||
@@ -131,7 +130,7 @@
|
|||||||
|
|
||||||
Поведение триггерится, когда пользователь вводит команду, которая маркирована как команда завершения работы.
|
Поведение триггерится, когда пользователь вводит команду, которая маркирована как команда завершения работы.
|
||||||
|
|
||||||
Дефолтный хэндлер выводит в консоль текст и завершает работу приложения.
|
Стандартный хэндлер выводит в консоль текст и завершает работу приложения.
|
||||||
|
|
||||||
.. code-block:: shell
|
.. code-block:: shell
|
||||||
|
|
||||||
@@ -141,7 +140,7 @@
|
|||||||
протокол ``NonStandardBehaviorHandler[Response]`` соответствует ``Callable[[Response], None]``, то есть хэндлер должен быть вызываемым объектом,
|
протокол ``NonStandardBehaviorHandler[Response]`` соответствует ``Callable[[Response], None]``, то есть хэндлер должен быть вызываемым объектом,
|
||||||
к примеру функция или лямбда, которая принимает обязательный аргумент типа :ref:`Response <root_api_response>` и ничего не возвращает.
|
к примеру функция или лямбда, которая принимает обязательный аргумент типа :ref:`Response <root_api_response>` и ничего не возвращает.
|
||||||
|
|
||||||
Сэмпл кода, переопределяющего хэндлер ввода команды выхода:
|
Пример кода, переопределяющего хэндлер ввода команды выхода:
|
||||||
|
|
||||||
.. literalinclude:: ../code_snippets/error_handling/snippet6.py
|
.. literalinclude:: ../code_snippets/error_handling/snippet6.py
|
||||||
:language: python
|
:language: python
|
||||||
|
|||||||
+3
-3
@@ -16,15 +16,15 @@
|
|||||||
|
|
||||||
<command_name> <flag_prefix: Literal['-', '--', '---']><flag_name> <flag_value: Optional>
|
<command_name> <flag_prefix: Literal['-', '--', '---']><flag_name> <flag_value: Optional>
|
||||||
|
|
||||||
То есть, у флага обязательно должен быть префикс, который может быть одним, двум или трем минусам. После префикса следует имя флага, без
|
То есть у флага обязательно должен быть префикс, который может быть одним, двумя или тремя минусами. После префикса следует имя флага, без
|
||||||
пробела, после, через пробел, идёт значение флага, если оно есть.
|
пробела, после чего, через пробел, идёт значение флага, если оно есть.
|
||||||
|
|
||||||
-----
|
-----
|
||||||
|
|
||||||
Два типа флагов
|
Два типа флагов
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
Флаги бывают двух основных видов: без значений (переключатели) и со значениями. ``Argenta`` позволяет регистрировать и вводить флаги обоих типов в любой последовательности для одной команды.
|
Флаги бывают двух основных видов: без значений (переключатели) и со значениями. ``Argenta`` позволяет регистрировать и вводить флаги обоих типов в любой последовательности для одной команды.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
Ошибки валидации значений являются пассивными, их не нужно обрабатывать явно. У каждого инстанса :ref:`InputFlag <root_api_command_input_flag>` есть поле ``status``, по которому можно определить результат валидации флага. **Конкретная реализация и описание API вы можете найти в разделе** :ref:`Flag <root_api_command_flag>`.
|
Ошибки валидации значений являются пассивными, их не нужно обрабатывать явно. У каждого инстанса :ref:`InputFlag <root_api_command_input_flag>` есть поле ``status``, по которому можно определить результат валидации флага. **Конкретная реализация и описание API вы можете найти в разделе** :ref:`Flag <root_api_command_flag>`.
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
:language: python
|
:language: python
|
||||||
:linenos:
|
:linenos:
|
||||||
|
|
||||||
3. **Определение приложения и оркестратора**. Для запуска приложения необходимо вызвать ``.include_router()`` у созданного приложения и передать ему раннее созданный роутер, после этого необходимо вызвать ``.start_polling()`` у созданного оркестратора и передать ему созданное приложение.
|
3. **Определение приложения и оркестратора**. Для запуска приложения необходимо вызвать ``.include_router()`` у созданного приложения и передать ему ранее созданный роутер, после этого необходимо вызвать ``.start_polling()`` у созданного оркестратора и передать ему созданное приложение.
|
||||||
|
|
||||||
.. literalinclude:: ../code_snippets/quickstart/main.py
|
.. literalinclude:: ../code_snippets/quickstart/main.py
|
||||||
:language: python
|
:language: python
|
||||||
|
|||||||
Reference in New Issue
Block a user