diff --git a/docs/justfile b/docs/justfile index 811f633..afe81be 100644 --- a/docs/justfile +++ b/docs/justfile @@ -14,7 +14,7 @@ default: # Build all language versions build-all: {{sphinxbuild}} -b html -D language=ru {{sourcedir}} {{builddir}}/html/ru - {{sphinxbuild}} -b html -D language=en {{sourcedir}} {{builddir}}/html/en + {{sphinxbuild}} -b html -D language =en {{sourcedir}} {{builddir}}/html/en # Live preview for Russian version live-ru: diff --git a/docs/root/api/response.rst b/docs/root/api/response.rst index 9053db2..4759928 100644 --- a/docs/root/api/response.rst +++ b/docs/root/api/response.rst @@ -3,7 +3,7 @@ Response ======== -`Response` — это объект, который передаётся в обработчик команды. Он создаётся автоматически при обработке пользовательского ввода и содержит статус валидации, введённые флаги, а также предоставляет механизм для обмена данными между обработчиками. +`Response` — это объект, который передаётся в обработчик команды. Он создаётся автоматически при обработке пользовательского ввода и содержит статус валидации, введённые флаги. .. seealso:: diff --git a/docs/root/redirect_stdout.rst b/docs/root/redirect_stdout.rst index f4a191d..e9d4e40 100644 --- a/docs/root/redirect_stdout.rst +++ b/docs/root/redirect_stdout.rst @@ -12,6 +12,18 @@ По умолчанию ``Argenta`` перехватывает весь текст, выводимый в ``stdout`` внутри обработчика команды. Это необходимо для реализации **динамических разделителей**: система анализирует вывод, находит самую длинную строку и использует её для отрисовки верхней и нижней границ. Такой подход создаёт аккуратный интерфейс, где вывод команды «обёрнут» в рамку, подогнанную под его содержимое. +Пример приложения с динамической разделительной линией: + +.. image:: https://i.ibb.co/ZptzLJ1n/2025-11-03-121308.png + :alt: Пример приложения с динамической разделительной линией + +Как вы можете заметить разделительная линия ровно той же длины, что и самая длинная строка в выводе. + +То же приложение с статической линией: + +.. image:: https://i.ibb.co/YFGRY2c0/2025-11-03-121650.png + :alt: Пример приложения с статической разделительной линией + ----- Побочные эффекты перехвата ``stdout`` diff --git a/mock/mock_app/main.py b/mock/mock_app/main.py index f2c9b5d..b3c52c4 100644 --- a/mock/mock_app/main.py +++ b/mock/mock_app/main.py @@ -1,23 +1,12 @@ from argenta import App, Orchestrator -from argenta.app import AutoCompleter, DynamicDividingLine, PredefinedMessages -from argenta.orchestrator import ArgParser -from argenta.orchestrator.argparser import BooleanArgument, ValueArgument +from argenta.app import PredefinedMessages, StaticDividingLine from mock.mock_app.routers import work_router -arg_parser: ArgParser = ArgParser( - processed_args=[ - BooleanArgument(name="repeat", is_deprecated=True), - ValueArgument(name="required", is_required=True), - ] -) -print(arg_parser.parsed_argspace.all_arguments) app: App = App( - dividing_line=DynamicDividingLine(), - autocompleter=AutoCompleter(history_filename="history.txt") + dividing_line=StaticDividingLine(), ) -orchestrator: Orchestrator = Orchestrator(arg_parser) -print(arg_parser.parsed_argspace.all_arguments) +orchestrator: Orchestrator = Orchestrator() def main(): diff --git a/mock/mock_app/routers.py b/mock/mock_app/routers.py index b4491cc..db29a7c 100644 --- a/mock/mock_app/routers.py +++ b/mock/mock_app/routers.py @@ -1,21 +1,8 @@ -from dishka import FromDishka +from argenta import Router, Response, Command -from argenta import Router -from argenta.command import Flag, PossibleValues -from argenta.orchestrator.argparser import ArgSpace -from argenta.response import Response -from argenta.router.defaults import system_router - -work_router: Router = Router(title="Work points:") - -flag = Flag("csdv", possible_values=PossibleValues.NEITHER) +work_router: Router = Router(title="Base points:") -@work_router.command("get") -def command_help(response: Response, argspace: FromDishka[ArgSpace]): - print(argspace.all_arguments) - - -@system_router.command("run") -def command_start_solving(response: Response): - print(response.get_data()) +@work_router.command(Command('hello', description="Hello, world!")) +def command_help(response: Response): + print('Hello, world!') diff --git a/pyproject.toml b/pyproject.toml index a679420..90c4553 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,6 +23,7 @@ typecheckers = [ "mypy>=1.14.1", ] docs = [ + "esbonio>=1.0.0", "shibuya>=2025.9.25", "sphinx>=8.2.3", "sphinx-autobuild>=2025.8.25", diff --git a/uv.lock b/uv.lock index 10f765b..2a49b09 100644 --- a/uv.lock +++ b/uv.lock @@ -2,6 +2,18 @@ version = 1 revision = 3 requires-python = ">=3.11" +[[package]] +name = "aiosqlite" +version = "0.21.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/13/7d/8bca2bf9a247c2c5dfeec1d7a5f40db6518f88d314b8bca9da29670d2671/aiosqlite-0.21.0.tar.gz", hash = "sha256:131bb8056daa3bc875608c631c678cda73922a2d4ba8aec373b19f18c17e7aa3", size = 13454, upload-time = "2025-02-03T07:30:16.235Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/10/6c25ed6de94c49f88a91fa5018cb4c0f3625f31d5be9f771ebe5cc7cd506/aiosqlite-0.21.0-py3-none-any.whl", hash = "sha256:2549cf4057f95f53dcba16f2b64e8e2791d7e1adedb13197dd8ed77bb226d7d0", size = 15792, upload-time = "2025-02-03T07:30:13.6Z" }, +] + [[package]] name = "alabaster" version = "1.0.0" @@ -38,6 +50,7 @@ dependencies = [ [package.dev-dependencies] docs = [ + { name = "esbonio" }, { name = "shibuya" }, { name = "sphinx" }, { name = "sphinx-autobuild" }, @@ -68,6 +81,7 @@ requires-dist = [ [package.metadata.requires-dev] docs = [ + { name = "esbonio", specifier = ">=1.0.0" }, { name = "shibuya", specifier = ">=2025.9.25" }, { name = "sphinx", specifier = ">=8.2.3" }, { name = "sphinx-autobuild", specifier = ">=2025.8.25" }, @@ -113,6 +127,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, ] +[[package]] +name = "cattrs" +version = "25.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e3/42/988b3a667967e9d2d32346e7ed7edee540ef1cee829b53ef80aa8d4a0222/cattrs-25.2.0.tar.gz", hash = "sha256:f46c918e955db0177be6aa559068390f71988e877c603ae2e56c71827165cc06", size = 506531, upload-time = "2025-08-31T20:41:59.301Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/a5/b3771ac30b590026b9d721187110194ade05bfbea3d98b423a9cafd80959/cattrs-25.2.0-py3-none-any.whl", hash = "sha256:539d7eedee7d2f0706e4e109182ad096d608ba84633c32c75ef3458f1d11e8f1", size = 70040, upload-time = "2025-08-31T20:41:57.543Z" }, +] + [[package]] name = "certifi" version = "2025.10.5" @@ -326,6 +353,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload-time = "2024-04-23T18:57:14.835Z" }, ] +[[package]] +name = "esbonio" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiosqlite" }, + { name = "docutils" }, + { name = "platformdirs" }, + { name = "pygls" }, + { name = "websockets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b5/85/03b0944176b7eca5174959dc6f6606ddd87e054a91e8174a593eb8723e06/esbonio-1.0.0.tar.gz", hash = "sha256:9d1c3d3e074b3f7fe285147cd713fbda0290472864756772020aebf19f5935c0", size = 123653, upload-time = "2025-10-28T20:03:15.425Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/a6/e1368fc807e7abe7ca7ef224e9c13f96be7c943be364e6ff869e96d7e633/esbonio-1.0.0-py3-none-any.whl", hash = "sha256:049aa76d5d637f0f79c86d690de4b74bc2be302c68425c4fe6c83b241ac0634c", size = 118424, upload-time = "2025-10-28T20:03:13.855Z" }, +] + [[package]] name = "flake8" version = "7.3.0" @@ -397,6 +440,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] +[[package]] +name = "lsprotocol" +version = "2025.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "cattrs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/26/67b84e6ec1402f0e6764ef3d2a0aaf9a79522cc1d37738f4e5bb0b21521a/lsprotocol-2025.0.0.tar.gz", hash = "sha256:e879da2b9301e82cfc3e60d805630487ac2f7ab17492f4f5ba5aaba94fe56c29", size = 74896, upload-time = "2025-06-17T21:30:18.156Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/f0/92f2d609d6642b5f30cb50a885d2bf1483301c69d5786286500d15651ef2/lsprotocol-2025.0.0-py3-none-any.whl", hash = "sha256:f9d78f25221f2a60eaa4a96d3b4ffae011b107537facee61d3da3313880995c7", size = 76250, upload-time = "2025-06-17T21:30:19.455Z" }, +] + [[package]] name = "markdown-it-py" version = "3.0.0" @@ -566,6 +622,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, ] +[[package]] +name = "platformdirs" +version = "4.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/61/33/9611380c2bdb1225fdef633e2a9610622310fed35ab11dac9620972ee088/platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312", size = 21632, upload-time = "2025-10-08T17:44:48.791Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3", size = 18651, upload-time = "2025-10-08T17:44:47.223Z" }, +] + [[package]] name = "pluggy" version = "1.6.0" @@ -602,6 +667,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl", hash = "sha256:f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f", size = 63551, upload-time = "2025-06-20T18:45:26.937Z" }, ] +[[package]] +name = "pygls" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "cattrs" }, + { name = "lsprotocol" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/50/2bfc32f3acbc8941042919b59c9f592291127b55d7331b72e67ce7b62f08/pygls-2.0.0.tar.gz", hash = "sha256:99accd03de1ca76fe1e7e317f0968ebccf7b9955afed6e2e3e188606a20b4f07", size = 55796, upload-time = "2025-10-17T19:22:47.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/09/14feafc13bebb9c85b29b374889c1549d3700cb572f2d43a1bb940d70315/pygls-2.0.0-py3-none-any.whl", hash = "sha256:b4e54bba806f76781017ded8fd07463b98670f959042c44170cd362088b200cc", size = 69533, upload-time = "2025-10-17T19:22:46.63Z" }, +] + [[package]] name = "pygments" version = "2.19.1"