diff --git a/mock/local_test.py b/mock/local_test.py index c6606b9..d4bf4f7 100644 --- a/mock/local_test.py +++ b/mock/local_test.py @@ -13,7 +13,7 @@ router = Router() for i in range(10000): trigger = f"cmd{i}" - @router.command(Command(trigger, aliases=[f'dfs{i}', f'fds{i}'])) + @router.command(Command(trigger, aliases=[f'dfs{i}'])) def handler(response: Response): print(response.status) @@ -30,3 +30,5 @@ print(get_time_of_pre_cycle_setup(app)) + + diff --git a/mock/mock_app/routers.py b/mock/mock_app/routers.py index 754811b..4dc0d28 100644 --- a/mock/mock_app/routers.py +++ b/mock/mock_app/routers.py @@ -7,7 +7,7 @@ from argenta.response import Response from argenta.router import Router -work_router: Router = Router(title="Work points:") +work_router: Router = Router(title="Work points:", disable_redirect_stdout=True) console = Console() @@ -21,6 +21,8 @@ console = Console() ) ) def command_help(response: Response): + case = input('test') + print(case) print(response.status) print(response.undefined_flags.get_flags()) print(response.valid_flags.get_flags()) diff --git a/pyproject.toml b/pyproject.toml index 9940111..5ff4dda 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,3 +26,8 @@ exclude = [ requires = ["hatchling"] build-backend = "hatchling.build" +[dependency-groups] +dev = [ + "pandas>=2.0.3", +] + diff --git a/src/argenta/app/models.py b/src/argenta/app/models.py index 4f14e1b..e0cac01 100644 --- a/src/argenta/app/models.py +++ b/src/argenta/app/models.py @@ -302,22 +302,30 @@ class BaseApp: self._setup_system_router() for router_entity in self._registered_routers: - self._all_registered_triggers_in_default_case.extend(router_entity.get_triggers()) - self._all_registered_triggers_in_default_case.extend(router_entity.get_aliases()) + router_triggers = router_entity.get_triggers() + router_aliases = router_entity.get_aliases() + combined = router_triggers + router_aliases - self._all_registered_triggers_in_lower_case.extend([x.lower() for x in router_entity.get_triggers()]) - self._all_registered_triggers_in_lower_case.extend([x.lower() for x in router_entity.get_aliases()]) + self._all_registered_triggers_in_default_case.extend(combined) + + self._all_registered_triggers_in_lower_case.extend(x.lower() for x in combined) self._autocompleter.initial_setup(self._all_registered_triggers_in_lower_case) if self._ignore_command_register: - for cmd in set(self._all_registered_triggers_in_lower_case): - if self._all_registered_triggers_in_lower_case.count(cmd) != 1: - Console().print(f"\n[b red]WARNING:[/b red] Overlapping trigger or alias: [b blue]{cmd}[/b blue]") + seen = {} + for item in self._all_registered_triggers_in_lower_case: + if item in seen: + Console().print(f"\n[b red]WARNING:[/b red] Overlapping trigger or alias: [b blue]{item}[/b blue]") + else: + seen[item] = True else: - for cmd in set(self._all_registered_triggers_in_default_case): - if self._all_registered_triggers_in_default_case.count(cmd) != 1: - Console().print(f"\n[b red]WARNING:[/b red] Overlapping trigger or alias: [b blue]{cmd}[/b blue]") + seen = {} + for item in self._all_registered_triggers_in_default_case: + if item in seen: + Console().print(f"\n[b red]WARNING:[/b red] Overlapping trigger or alias: [b blue]{item}[/b blue]") + else: + seen[item] = True if not self._override_system_messages: self._setup_default_view() @@ -415,11 +423,14 @@ class App(BaseApp): self._print_framed_text(res) continue - with redirect_stdout(io.StringIO()) as f: - for registered_router in self._registered_routers: + for registered_router in self._registered_routers: + if registered_router.disable_redirect_stdout: registered_router.finds_appropriate_handler(input_command) - res: str = f.getvalue() - self._print_framed_text(res) + else: + with redirect_stdout(io.StringIO()) as f: + registered_router.finds_appropriate_handler(input_command) + res: str = f.getvalue() + self._print_framed_text(res) def include_router(self, router: Router) -> None: """ diff --git a/src/argenta/metrics/main.py b/src/argenta/metrics/main.py index 18fc476..182354b 100644 --- a/src/argenta/metrics/main.py +++ b/src/argenta/metrics/main.py @@ -2,15 +2,15 @@ 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: + """ + Public. Return time of pre cycle setup + :param app: app instance for testing time of pre cycle setup + :return: time of pre cycle setup as float + """ start = time() with redirect_stdout(io.StringIO()): app.pre_cycle_setup() diff --git a/src/argenta/router/entity.py b/src/argenta/router/entity.py index 7482ac7..b0b4ae9 100644 --- a/src/argenta/router/entity.py +++ b/src/argenta/router/entity.py @@ -22,13 +22,19 @@ from argenta.router.exceptions import ( class Router: - def __init__(self, title: str | None = "Awesome title"): + def __init__(self, title: str | None = "Awesome title", disable_redirect_stdout: bool = False): """ Public. Directly configures and manages handlers :param title: the title of the router, displayed when displaying the available commands + :param disable_redirect_stdout: Disables stdout forwarding, if the argument value is True, + the StaticDividingLine will be forced to be used as a line separator for this router, + disabled forwarding is needed when there is text output in conjunction with a text input request (for example, input()), + if the argument value is True, the output of the input() prompt is intercepted and not displayed, + which is ambiguous behavior and can lead to unexpected work :return: None """ self.title = title + self.disable_redirect_stdout = disable_redirect_stdout self._command_handlers: CommandHandlers = CommandHandlers() self._ignore_command_register: bool = False diff --git a/tests/system_tests/test_system_handling_non_standard_behavior.py b/tests/system_tests/test_system_handling_non_standard_behavior.py index 3314774..4ea5682 100644 --- a/tests/system_tests/test_system_handling_non_standard_behavior.py +++ b/tests/system_tests/test_system_handling_non_standard_behavior.py @@ -7,7 +7,7 @@ import re from argenta.app import App from argenta.command import Command from argenta.router import Router -from argenta.command.flags.models import Flags +from argenta.command.flag.flags.models import Flags from argenta.command.flag.defaults import PredefinedFlags from argenta.orchestrator import Orchestrator from argenta.response import Response diff --git a/tests/system_tests/test_system_handling_normal_behavior.py b/tests/system_tests/test_system_handling_normal_behavior.py index 64dafd5..88d2565 100644 --- a/tests/system_tests/test_system_handling_normal_behavior.py +++ b/tests/system_tests/test_system_handling_normal_behavior.py @@ -10,7 +10,7 @@ from argenta.response import Response from argenta.router import Router from argenta.orchestrator import Orchestrator from argenta.command.flag import Flag -from argenta.command.flags import Flags +from argenta.command.flag.flags import Flags from argenta.command.flag.defaults import PredefinedFlags diff --git a/tests/unit_tests/test_command.py b/tests/unit_tests/test_command.py index ae43d1c..fa6badd 100644 --- a/tests/unit_tests/test_command.py +++ b/tests/unit_tests/test_command.py @@ -1,5 +1,5 @@ from argenta.command.flag import Flag, InputFlag -from argenta.command.flags import Flags +from argenta.command.flag.flags import Flags from argenta.command.models import InputCommand, Command from argenta.command.exceptions import (UnprocessedInputFlagException, RepeatedInputFlagsException, diff --git a/tests/unit_tests/test_flag.py b/tests/unit_tests/test_flag.py index fe2c738..17625e6 100644 --- a/tests/unit_tests/test_flag.py +++ b/tests/unit_tests/test_flag.py @@ -1,5 +1,5 @@ from argenta.command.flag import Flag, InputFlag -from argenta.command.flags import InputFlags, Flags +from argenta.command.flag.flags import InputFlags, Flags import unittest import re diff --git a/tests/unit_tests/test_router.py b/tests/unit_tests/test_router.py index 0284111..56d879f 100644 --- a/tests/unit_tests/test_router.py +++ b/tests/unit_tests/test_router.py @@ -1,5 +1,5 @@ from argenta.command.flag import InputFlag, Flag -from argenta.command.flags import Flags, InputFlags, UndefinedInputFlags, InvalidValueInputFlags, ValidInputFlags +from argenta.command.flag.flags import Flags, InputFlags, UndefinedInputFlags, InvalidValueInputFlags, ValidInputFlags from argenta.router import Router from argenta.command import Command from argenta.router.exceptions import (TriggerContainSpacesException,