From 8b06e9cd39815df356fe36b4e9c0663de079d607 Mon Sep 17 00:00:00 2001 From: kolo Date: Mon, 12 May 2025 16:22:29 +0300 Subject: [PATCH] add metrics concept --- mock/default_mock_app/__init__.py | 0 mock/default_mock_app/main.py | 27 ------- mock/local_test.py | 79 +++---------------- mock/mock_app/handlers/__init__.py | 0 .../handlers_implementation/__init__.py | 0 .../handlers_implementation/help_command.py | 12 --- mock/mock_app/main.py | 2 +- mock/mock_app/{handlers => }/routers.py | 2 +- pyproject.toml | 2 +- src/argenta/app/defaults.py | 4 +- src/argenta/app/models.py | 9 +-- src/argenta/command/flag/__init__.py | 5 +- .../command/{ => flag}/flags/__init__.py | 2 +- .../command/{ => flag}/flags/models.py | 0 src/argenta/command/models.py | 2 +- src/argenta/metrics/__init__.py | 4 + src/argenta/metrics/main.py | 26 ++++++ src/argenta/response/entity.py | 2 +- src/argenta/router/entity.py | 2 +- 19 files changed, 57 insertions(+), 123 deletions(-) delete mode 100644 mock/default_mock_app/__init__.py delete mode 100644 mock/default_mock_app/main.py delete mode 100644 mock/mock_app/handlers/__init__.py delete mode 100644 mock/mock_app/handlers/handlers_implementation/__init__.py delete mode 100644 mock/mock_app/handlers/handlers_implementation/help_command.py rename mock/mock_app/{handlers => }/routers.py (95%) rename src/argenta/command/{ => flag}/flags/__init__.py (82%) rename src/argenta/command/{ => flag}/flags/models.py (100%) create mode 100644 src/argenta/metrics/__init__.py create mode 100644 src/argenta/metrics/main.py diff --git a/mock/default_mock_app/__init__.py b/mock/default_mock_app/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/mock/default_mock_app/main.py b/mock/default_mock_app/main.py deleted file mode 100644 index 29a57c0..0000000 --- a/mock/default_mock_app/main.py +++ /dev/null @@ -1,27 +0,0 @@ -from mock.mock_app.handlers.routers import work_router - -from argenta.app import App -from argenta.app.defaults import PredefinedMessages -from argenta.app.autocompleter import AutoCompleter -from argenta.orchestrator import Orchestrator -from argenta.orchestrator.argparser import ArgParser -from argenta.orchestrator.argparser.arguments import BooleanArgument - - -arg_parser = ArgParser(processed_args=[BooleanArgument("repeat")]) -app: App = App(autocompleter=AutoCompleter(".hist")) -orchestrator: Orchestrator = Orchestrator() - - -def main(): - app.include_router(work_router) - - app.add_message_on_startup(PredefinedMessages.USAGE) - app.add_message_on_startup(PredefinedMessages.AUTOCOMPLETE) - app.add_message_on_startup(PredefinedMessages.HELP) - - orchestrator.start_polling(app) - - -if __name__ == "__main__": - main() diff --git a/mock/local_test.py b/mock/local_test.py index ffd2074..c6606b9 100644 --- a/mock/local_test.py +++ b/mock/local_test.py @@ -1,85 +1,28 @@ from argenta.router import Router from argenta.command import Command from argenta.response import Response +from argenta.metrics import get_time_of_pre_cycle_setup from argenta.response.status import Status -from argenta.command.flag import Flag -from argenta.command.flags import Flags +from argenta.command.flag import Flag, Flags from argenta.app import App from argenta.orchestrator import Orchestrator -# Создание маршрутизатора -file_router = Router("Операции с файлами") -# Определение флагов для команды копирования -copy_flags = Flags( - Flag('source', '--'), - Flag('destination', '--'), - Flag('recursive', '--', False), # Булевый флаг без значения - Flag('force', '-', False) # Короткий булевый флаг -) -@file_router.command(Command('case', aliases=['cp', 'ch'])) -def handler(response: Response): - print('test') +router = Router() -# Регистрация команды копирования -@file_router.command(Command( - trigger="ch", - description="Копирование файлов", - flags=copy_flags, - aliases=["cp"] -)) -def copy_files(response: Response): - # Получаем значения корректных флагов - source = None - destination = None - recursive = False - force = False +for i in range(10000): + trigger = f"cmd{i}" - for flag in response.valid_flags: - if flag.get_name() == "source": - source = flag.get_value() - elif flag.get_name() == "destination": - destination = flag.get_value() - elif flag.get_name() == "recursive": - recursive = True - elif flag.get_name() == "force": - force = True - - # Проверка обязательных параметров - if not source or not destination: - print("Ошибка: необходимо указать источник и назначение") - return - - print(f"Копирование из {source} в {destination}") - if recursive: - print("Рекурсивное копирование включено") - if force: - print("Принудительное копирование включено") - - # Обработка неопределенных флагов - if response.undefined_flags: - print("\nПредупреждение: обнаружены незарегистрированные флаги:") - for flag in response.undefined_flags: - print(f" - {flag.get_name()}" + - (f" = {flag.get_value()}" if flag.get_value() else "")) - - # Обработка флагов с некорректными значениями - if response.invalid_value_flags: - print("\nПредупреждение: обнаружены флаги с некорректными значениями:") - for flag in response.invalid_value_flags: - print(f" - {flag.get_name()} = {flag.get_value()}") - - # Принятие решения на основе статуса - if response.status != Status.ALL_FLAGS_VALID: - print("\nВыполнение с предупреждениями из-за проблем с флагами.") + @router.command(Command(trigger, aliases=[f'dfs{i}', f'fds{i}'])) + def handler(response: Response): + print(response.status) -app = App() -app.include_router(file_router) -orchestrator = Orchestrator() +app = App(repeat_command_groups=False) +app.include_router(router) -orchestrator.start_polling(app) +print(get_time_of_pre_cycle_setup(app)) diff --git a/mock/mock_app/handlers/__init__.py b/mock/mock_app/handlers/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/mock/mock_app/handlers/handlers_implementation/__init__.py b/mock/mock_app/handlers/handlers_implementation/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/mock/mock_app/handlers/handlers_implementation/help_command.py b/mock/mock_app/handlers/handlers_implementation/help_command.py deleted file mode 100644 index b0a3cc5..0000000 --- a/mock/mock_app/handlers/handlers_implementation/help_command.py +++ /dev/null @@ -1,12 +0,0 @@ -from rich.console import Console - - -console = Console() - - -def help_command(): - console.print( - "[italic bold]The main functionality of the script is to convert an expression from a string " - "to a mathematical one and then calculate this expression. " - "Project GitHub: https://github.com/koloideal/WordMath[/italic bold]" - ) diff --git a/mock/mock_app/main.py b/mock/mock_app/main.py index 1ce1386..e51ca8c 100644 --- a/mock/mock_app/main.py +++ b/mock/mock_app/main.py @@ -1,4 +1,4 @@ -from mock.mock_app.handlers.routers import work_router +from mock.mock_app.routers import work_router from argenta.app import App from argenta.app.defaults import PredefinedMessages diff --git a/mock/mock_app/handlers/routers.py b/mock/mock_app/routers.py similarity index 95% rename from mock/mock_app/handlers/routers.py rename to mock/mock_app/routers.py index 7458ccd..754811b 100644 --- a/mock/mock_app/handlers/routers.py +++ b/mock/mock_app/routers.py @@ -2,7 +2,7 @@ from rich.console import Console from argenta.command import Command from argenta.command.flag.defaults import PredefinedFlags -from argenta.command.flags import Flags +from argenta.command.flag import Flags from argenta.response import Response from argenta.router import Router diff --git a/pyproject.toml b/pyproject.toml index 866b6aa..9940111 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "argenta" -version = "1.0.4" +version = "1.0.5" description = "Python library for building modular CLI applications" authors = [{ name = "kolo", email = "kolo.is.main@gmail.com" }] requires-python = ">=3.8" diff --git a/src/argenta/app/defaults.py b/src/argenta/app/defaults.py index 9660c2c..2908cef 100644 --- a/src/argenta/app/defaults.py +++ b/src/argenta/app/defaults.py @@ -1,7 +1,7 @@ -from enum import Enum +from enum import StrEnum -class PredefinedMessages(Enum): +class PredefinedMessages(StrEnum): """ Public. A dataclass with predetermined messages for quick use """ diff --git a/src/argenta/app/models.py b/src/argenta/app/models.py index ac18d4d..4f14e1b 100644 --- a/src/argenta/app/models.py +++ b/src/argenta/app/models.py @@ -201,9 +201,7 @@ class BaseApp: return False return True - def _error_handler( - self, error: BaseInputCommandException, raw_command: str - ) -> None: + def _error_handler(self, error: BaseInputCommandException, raw_command: str) -> None: """ Private. Handles parsing errors of the entered command :param error: error being handled @@ -296,7 +294,7 @@ class BaseApp: self._unknown_command_handler = unknown_command_handler - def _pre_cycle_setup(self) -> None: + def pre_cycle_setup(self) -> None: """ Private. Configures various aspects of the application before the start of the cycle :return: None @@ -330,7 +328,6 @@ class BaseApp: self._print_func(message) if self._messages_on_startup: print("\n") - if not self._repeat_command_groups_description: self._print_command_group_description() @@ -381,7 +378,7 @@ class App(BaseApp): Private. Starts the user input processing cycle :return: None """ - self._pre_cycle_setup() + self.pre_cycle_setup() while True: if self._repeat_command_groups_description: self._print_command_group_description() diff --git a/src/argenta/command/flag/__init__.py b/src/argenta/command/flag/__init__.py index 5f9f043..fc02a90 100644 --- a/src/argenta/command/flag/__init__.py +++ b/src/argenta/command/flag/__init__.py @@ -1,4 +1,7 @@ -__all__ = ["Flag", "InputFlag"] +__all__ = ["Flag", "InputFlag", "UndefinedInputFlags", "ValidInputFlags", "InvalidValueInputFlags", "Flags"] from argenta.command.flag.models import Flag, InputFlag +from argenta.command.flag.flags.models import (UndefinedInputFlags, + ValidInputFlags, Flags, + InvalidValueInputFlags) diff --git a/src/argenta/command/flags/__init__.py b/src/argenta/command/flag/flags/__init__.py similarity index 82% rename from src/argenta/command/flags/__init__.py rename to src/argenta/command/flag/flags/__init__.py index dc7be99..c0d94ed 100644 --- a/src/argenta/command/flags/__init__.py +++ b/src/argenta/command/flag/flags/__init__.py @@ -7,7 +7,7 @@ __all__ = [ ] -from argenta.command.flags.models import ( +from argenta.command.flag.flags.models import ( Flags, InputFlags, UndefinedInputFlags, diff --git a/src/argenta/command/flags/models.py b/src/argenta/command/flag/flags/models.py similarity index 100% rename from src/argenta/command/flags/models.py rename to src/argenta/command/flag/flags/models.py diff --git a/src/argenta/command/models.py b/src/argenta/command/models.py index 0ce15a4..eb8dd5f 100644 --- a/src/argenta/command/models.py +++ b/src/argenta/command/models.py @@ -1,5 +1,5 @@ from argenta.command.flag.models import Flag, InputFlag -from argenta.command.flags.models import InputFlags, Flags +from argenta.command.flag.flags.models import InputFlags, Flags from argenta.command.exceptions import ( UnprocessedInputFlagException, RepeatedInputFlagsException, diff --git a/src/argenta/metrics/__init__.py b/src/argenta/metrics/__init__.py new file mode 100644 index 0000000..5b98ef8 --- /dev/null +++ b/src/argenta/metrics/__init__.py @@ -0,0 +1,4 @@ +__all__ = ["get_time_of_pre_cycle_setup"] + + +from argenta.metrics.main import get_time_of_pre_cycle_setup diff --git a/src/argenta/metrics/main.py b/src/argenta/metrics/main.py new file mode 100644 index 0000000..18fc476 --- /dev/null +++ b/src/argenta/metrics/main.py @@ -0,0 +1,26 @@ +import io +from contextlib import redirect_stdout +from time import time + +from argenta.router import Router +from argenta.command import Command +from argenta.response import Response +from argenta.response.status import Status +from argenta.command.flag import Flag, Flags +from argenta.app import App + + +def get_time_of_pre_cycle_setup(app: App) -> float: + start = time() + with redirect_stdout(io.StringIO()): + app.pre_cycle_setup() + end = time() + return end - start + + + + + + + + diff --git a/src/argenta/response/entity.py b/src/argenta/response/entity.py index 901bdd8..e04511c 100644 --- a/src/argenta/response/entity.py +++ b/src/argenta/response/entity.py @@ -1,5 +1,5 @@ from argenta.response.status import Status -from argenta.command.flags import ( +from argenta.command.flag.flags import ( ValidInputFlags, UndefinedInputFlags, InvalidValueInputFlags, diff --git a/src/argenta/router/entity.py b/src/argenta/router/entity.py index aceee8b..7482ac7 100644 --- a/src/argenta/router/entity.py +++ b/src/argenta/router/entity.py @@ -6,7 +6,7 @@ from argenta.command import Command from argenta.command.models import InputCommand from argenta.response import Response, Status from argenta.router.command_handler.entity import CommandHandlers, CommandHandler -from argenta.command.flags.models import ( +from argenta.command.flag.flags import ( Flags, InputFlags, UndefinedInputFlags,