diff --git a/argenta/app/entity.py b/argenta/app/entity.py index 6efcf0c..d3e2dac 100644 --- a/argenta/app/entity.py +++ b/argenta/app/entity.py @@ -1,17 +1,18 @@ from typing import Callable from inspect import getfullargspec +import re from ..command.entity import Command from ..router.entity import Router from ..command.exceptions import (UnprocessedInputFlagException, - IncorrectNumberOfHandlerArgsException, RepeatedInputFlagsException, EmptyInputCommandException) from .exceptions import (InvalidRouterInstanceException, InvalidDescriptionMessagePatternException, NoRegisteredRoutersException, NoRegisteredHandlersException, - RepeatedCommandInDifferentRoutersException) + RepeatedCommandInDifferentRoutersException, + IncorrectNumberOfHandlerArgsException) class App: @@ -129,9 +130,11 @@ class App: def set_description_message_pattern(self, pattern: str) -> None: - try: - pattern.format(command='command', description='description') - except KeyError: + first_check = re.match(r'.*{commmand}.*', pattern) + second_check = re.match(r'.*{description}.*', pattern) + print(first_check) + print(second_check) + if bool(first_check) and bool(second_check): raise InvalidDescriptionMessagePatternException(pattern) else: self._description_message_pattern: str = pattern diff --git a/argenta/app/exceptions.py b/argenta/app/exceptions.py index 5b9dba1..4ecc562 100644 --- a/argenta/app/exceptions.py +++ b/argenta/app/exceptions.py @@ -28,3 +28,8 @@ class NoRegisteredHandlersException(Exception): class RepeatedCommandInDifferentRoutersException(Exception): def __str__(self): return "Commands in different handlers cannot be repeated" + + +class IncorrectNumberOfHandlerArgsException(Exception): + def __str__(self): + return "Incorrect Input Flags Handler has incorrect number of arguments" diff --git a/argenta/command/__init__.py b/argenta/command/__init__.py index e69de29..5b4073f 100644 --- a/argenta/command/__init__.py +++ b/argenta/command/__init__.py @@ -0,0 +1 @@ +from .entity import Command \ No newline at end of file diff --git a/argenta/command/entity.py b/argenta/command/entity.py index c0abbc6..3217c22 100644 --- a/argenta/command/entity.py +++ b/argenta/command/entity.py @@ -19,7 +19,7 @@ class Command(Generic[T]): flags: Flag | FlagsGroup | None = None): self._command = command self._description = description - self._flags: FlagsGroup | None = flags if isinstance(flags, FlagsGroup) else FlagsGroup([flags]) if isinstance(flags, Flag) else flags + self._registered_flags: FlagsGroup | None = flags if isinstance(flags, FlagsGroup) else FlagsGroup([flags]) if isinstance(flags, Flag) else flags self._input_flags: FlagsGroup | None = None @@ -37,7 +37,7 @@ class Command(Generic[T]): def get_registered_flags(self): - return self._flags + return self._registered_flags def validate_commands_params(self): @@ -45,7 +45,7 @@ class Command(Generic[T]): raise InvalidCommandInstanceException(self._command) if not isinstance(self._description, str): raise InvalidDescriptionInstanceException() - if not any([(isinstance(self._flags, FlagsGroup)), not self._flags]): + if not any([(isinstance(self._registered_flags, FlagsGroup)), not self._registered_flags]): raise InvalidFlagsInstanceException diff --git a/argenta/command/exceptions.py b/argenta/command/exceptions.py index 2586982..1186b30 100644 --- a/argenta/command/exceptions.py +++ b/argenta/command/exceptions.py @@ -29,11 +29,6 @@ class RepeatedInputFlagsException(Exception): f"Duplicate flag was detected in the input: '{self.flag.get_string_entity()}'") -class IncorrectNumberOfHandlerArgsException(Exception): - def __str__(self): - return "Incorrect Input Flags Handler has incorrect number of arguments" - - class EmptyInputCommandException(Exception): def __str__(self): return "Input Command is empty" \ No newline at end of file diff --git a/argenta/command/params/flag/__init__.py b/argenta/command/params/flag/__init__.py index e69de29..d437340 100644 --- a/argenta/command/params/flag/__init__.py +++ b/argenta/command/params/flag/__init__.py @@ -0,0 +1,2 @@ +from .entity import Flag +from .flags_group.entity import FlagsGroup \ No newline at end of file diff --git a/argenta/router/entity.py b/argenta/router/entity.py index eea21d4..29489f5 100644 --- a/argenta/router/entity.py +++ b/argenta/router/entity.py @@ -1,11 +1,12 @@ from typing import Callable, Any from inspect import getfullargspec + from ..command.entity import Command +from ..command.params.flag.entity import Flag from ..command.params.flag.flags_group.entity import FlagsGroup from ..router.exceptions import (RepeatedCommandException, RepeatedFlagNameException, TooManyTransferredArgsException, RequiredArgumentNotPassedException, - NotValidInputFlagHandlerHasBeenAlreadyCreatedException, IncorrectNumberOfHandlerArgsException) @@ -20,7 +21,7 @@ class Router: self._command_entities: list[dict[str, Callable[[], None] | Command]] = [] self._ignore_command_register: bool = False - self._not_valid_flag_handler: Callable[[Command], None] | None = None + self._not_valid_flag_handler: Callable[[Flag], None] = lambda flag: print(f"Undefined or incorrect input flag: '{flag.get_string_entity()} {flag.get_value()}'") def command(self, command: Command) -> Callable[[Any], Any]: @@ -37,19 +38,12 @@ class Router: return command_decorator - def not_valid_input_flag(self, func): - if self._not_valid_flag_handler: - raise NotValidInputFlagHandlerHasBeenAlreadyCreatedException() + def set_invalid_input_flag_handler(self, func): + processed_args = getfullargspec(func).args + if len(processed_args) != 1: + raise IncorrectNumberOfHandlerArgsException() else: - processed_args = getfullargspec(func).args - if len(processed_args) != 1: - raise IncorrectNumberOfHandlerArgsException() - else: - self._not_valid_flag_handler = func - def wrapper(*args, **kwargs): - return func(*args, **kwargs) - - return wrapper + self._not_valid_flag_handler = func def input_command_handler(self, input_command: Command): @@ -62,20 +56,14 @@ class Router: for flag in input_command_flags: is_valid = command_entity['command'].validate_input_flag(flag) if not is_valid: - if self._not_valid_flag_handler: - self._not_valid_flag_handler(input_command) - else: - print(f"Undefined or incorrect input flag: '{flag.get_string_entity()} {flag.get_value()}'") + self._not_valid_flag_handler(flag) return return command_entity['handler_func'](input_command_flags) else: return command_entity['handler_func'](FlagsGroup(None)) else: if input_command_flags: - if self._not_valid_flag_handler: - self._not_valid_flag_handler(input_command) - else: - print(f"Undefined or incorrect input flag: '{input_command_flags[0].get_string_entity()} {input_command_flags[0].get_value()}'") + self._not_valid_flag_handler(input_command_flags[0]) return else: return command_entity['handler_func']() @@ -125,28 +113,9 @@ class Router: return self.title - def get_router_info(self) -> dict: - return { - 'title': self.title, - 'name': self.name, - 'ignore_command_register': self._ignore_command_register, - 'attributes': { - 'command_entities': self._command_entities, - } - - } - - def get_all_commands(self) -> list[str]: all_commands: list[str] = [] for command_entity in self._command_entities: all_commands.append(command_entity['command'].get_string_entity()) return all_commands - - def get_all_flags(self) -> list[FlagsGroup]: - all_flags: list[FlagsGroup] = [] - for command_entity in self._command_entities: - all_flags.append(command_entity['command'].get_registered_flags()) - - return all_flags diff --git a/tests/mock_app/__init__.py b/mock/__init__.py similarity index 100% rename from tests/mock_app/__init__.py rename to mock/__init__.py diff --git a/tests/mock_app/business_logic/__init__.py b/mock/mock_app/__init__.py similarity index 100% rename from tests/mock_app/business_logic/__init__.py rename to mock/mock_app/__init__.py diff --git a/tests/mock_app/handlers/__init__.py b/mock/mock_app/business_logic/__init__.py similarity index 100% rename from tests/mock_app/handlers/__init__.py rename to mock/mock_app/business_logic/__init__.py diff --git a/tests/mock_app/business_logic/script_updater.py b/mock/mock_app/business_logic/script_updater.py similarity index 100% rename from tests/mock_app/business_logic/script_updater.py rename to mock/mock_app/business_logic/script_updater.py diff --git a/tests/mock_app/business_logic/word2num_math.py b/mock/mock_app/business_logic/word2num_math.py similarity index 100% rename from tests/mock_app/business_logic/word2num_math.py rename to mock/mock_app/business_logic/word2num_math.py diff --git a/tests/mock_app/handlers/handlers_implementation/__init__.py b/mock/mock_app/handlers/__init__.py similarity index 100% rename from tests/mock_app/handlers/handlers_implementation/__init__.py rename to mock/mock_app/handlers/__init__.py diff --git a/tests/mock_app/local_data_func/__init__.py b/mock/mock_app/handlers/handlers_implementation/__init__.py similarity index 100% rename from tests/mock_app/local_data_func/__init__.py rename to mock/mock_app/handlers/handlers_implementation/__init__.py diff --git a/tests/mock_app/handlers/handlers_implementation/help_command.py b/mock/mock_app/handlers/handlers_implementation/help_command.py similarity index 100% rename from tests/mock_app/handlers/handlers_implementation/help_command.py rename to mock/mock_app/handlers/handlers_implementation/help_command.py diff --git a/tests/mock_app/handlers/handlers_implementation/solving_command.py b/mock/mock_app/handlers/handlers_implementation/solving_command.py similarity index 100% rename from tests/mock_app/handlers/handlers_implementation/solving_command.py rename to mock/mock_app/handlers/handlers_implementation/solving_command.py diff --git a/tests/mock_app/handlers/handlers_implementation/upgrade_command.py b/mock/mock_app/handlers/handlers_implementation/upgrade_command.py similarity index 100% rename from tests/mock_app/handlers/handlers_implementation/upgrade_command.py rename to mock/mock_app/handlers/handlers_implementation/upgrade_command.py diff --git a/tests/mock_app/handlers/routers.py b/mock/mock_app/handlers/routers.py similarity index 83% rename from tests/mock_app/handlers/routers.py rename to mock/mock_app/handlers/routers.py index 180e034..788528a 100644 --- a/tests/mock_app/handlers/routers.py +++ b/mock/mock_app/handlers/routers.py @@ -8,7 +8,7 @@ from argenta.command.params.flag.flags_group.entity import FlagsGroup from argenta.router import Router -work_router: Router = Router(title='Work points:') +work_router: Router = Router(title='Work nts:') settings_router: Router = Router(title='Settings points:') console = Console() @@ -46,9 +46,11 @@ def command_update(): # upgrade_command() -@work_router.not_valid_input_flag -def invalid_input_flag(command: Command): - print(f'Invalid inpuuuuuuuuuuuuuuuuuuuuuuuut flag: "{command.get_input_flags()[0].get_value()}"') +def invalid_input_flag(flag: Flag): + print(f'Invalid inpuuuuuuuuuuuuuuuuuuuuuuuut flag: "{flag.get_string_entity()} {flag.get_value()}"') + + +work_router.set_invalid_input_flag_handler(invalid_input_flag) diff --git a/tests/mock_app/local_data/operator_synonyms.json b/mock/mock_app/local_data/operator_synonyms.json similarity index 100% rename from tests/mock_app/local_data/operator_synonyms.json rename to mock/mock_app/local_data/operator_synonyms.json diff --git a/tests/mock_app/local_data/script_release_tag.json b/mock/mock_app/local_data/script_release_tag.json similarity index 100% rename from tests/mock_app/local_data/script_release_tag.json rename to mock/mock_app/local_data/script_release_tag.json diff --git a/tests/mock_default_app/__init__.py b/mock/mock_app/local_data_func/__init__.py similarity index 100% rename from tests/mock_default_app/__init__.py rename to mock/mock_app/local_data_func/__init__.py diff --git a/tests/mock_app/local_data_func/get_operator_synonyms.py b/mock/mock_app/local_data_func/get_operator_synonyms.py similarity index 100% rename from tests/mock_app/local_data_func/get_operator_synonyms.py rename to mock/mock_app/local_data_func/get_operator_synonyms.py diff --git a/tests/mock_app/local_data_func/get_script_release_tag.py b/mock/mock_app/local_data_func/get_script_release_tag.py similarity index 100% rename from tests/mock_app/local_data_func/get_script_release_tag.py rename to mock/mock_app/local_data_func/get_script_release_tag.py diff --git a/tests/mock_app/main.py b/mock/mock_app/main.py similarity index 90% rename from tests/mock_app/main.py rename to mock/mock_app/main.py index db9f5c6..78eb4f9 100644 --- a/tests/mock_app/main.py +++ b/mock/mock_app/main.py @@ -1,8 +1,12 @@ from tests.mock_app.handlers.routers import work_router, settings_router -from argenta.app.entity import App from art import text2art from rich.console import Console +from argenta.app import App +from argenta.router import Router +from argenta.command import Command +from argenta.command.params.flag import Flag, FlagsGroup + app: App = App(prompt='[italic white bold]What do you want to do(enter number of action)?', line_separate=f'\n{"[bold green]-[/bold green][bold red]-[/bold red]"*25}\n', diff --git a/tests/mock_default_app/handlers/__init__.py b/mock/mock_default_app/__init__.py similarity index 100% rename from tests/mock_default_app/handlers/__init__.py rename to mock/mock_default_app/__init__.py diff --git a/mock/mock_default_app/handlers/__init__.py b/mock/mock_default_app/handlers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/mock_default_app/handlers/routers.py b/mock/mock_default_app/handlers/routers.py similarity index 100% rename from tests/mock_default_app/handlers/routers.py rename to mock/mock_default_app/handlers/routers.py diff --git a/tests/mock_default_app/main.py b/mock/mock_default_app/main.py similarity index 100% rename from tests/mock_default_app/main.py rename to mock/mock_default_app/main.py diff --git a/mock/test.py b/mock/test.py new file mode 100644 index 0000000..47c04fe --- /dev/null +++ b/mock/test.py @@ -0,0 +1,11 @@ +import re + + +def set_description_message_pattern(pattern: str) -> None: + first_check = re.fullmatch(r'.*{commmand}.*', pattern) + second_check = re.fullmatch(r'.*{description}.*', pattern) + print(bool(first_check)) + print(second_check) + + +set_description_message_pattern('Invalid des{command}cription pattern') \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 5839ac3..0040681 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ name = "argenta" version = "0.3.4" description = "python library for creating custom shells" authors = [ - {name = "kolo",email = "kolo.is.main@gmail.com"} + {name = "kolo", email = "kolo.is.main@gmail.com"} ] license = {text = "MIT"} readme = "README.md" diff --git a/tests/test.py b/tests/test.py deleted file mode 100644 index e9feaf5..0000000 --- a/tests/test.py +++ /dev/null @@ -1,9 +0,0 @@ -class Entity: - pass - -class Person(Entity): - pass - -a: Entity = Entity() -print(a) -a = Person() \ No newline at end of file diff --git a/tests/test_app.py b/tests/test_app.py new file mode 100644 index 0000000..29c52fb --- /dev/null +++ b/tests/test_app.py @@ -0,0 +1,16 @@ +from argenta.app import App +from argenta.app.exceptions import (InvalidDescriptionMessagePatternException, + NoRegisteredRoutersException) + +import unittest + + +class TestApp(unittest.TestCase): + def test_set_invalid_description_message_pattern(self): + with self.assertRaises(InvalidDescriptionMessagePatternException): + App().set_description_message_pattern('Invalid des{}cription pattern') + + def test_no_registered_router(self): + with self.assertRaises(NoRegisteredRoutersException): + App()._validate_number_of_routers() + diff --git a/tests/test_command.py b/tests/test_command.py new file mode 100644 index 0000000..1c76a23 --- /dev/null +++ b/tests/test_command.py @@ -0,0 +1,32 @@ +from argenta.command import Command +from argenta.command.params.flag import Flag, FlagsGroup +from argenta.command.exceptions import (UnprocessedInputFlagException, + RepeatedInputFlagsException, + EmptyInputCommandException) + +import unittest + + +class TestCommand(unittest.TestCase): + def test_parse_correct_raw_command(self): + self.assertEqual(Command.parse_input_command('ssh --host 192.168.0.3').get_string_entity(), 'ssh') + + def test_parse_raw_command_with_flag_name_without_value(self): + with self.assertRaises(UnprocessedInputFlagException): + Command.parse_input_command('ssh --host') + + def test_parse_raw_command_without_flag_name_with_value(self): + with self.assertRaises(UnprocessedInputFlagException): + Command.parse_input_command('ssh 192.168.0.3') + + def test_parse_raw_command_with_repeated_flag_name(self): + with self.assertRaises(RepeatedInputFlagsException): + Command.parse_input_command('ssh --host 192.168.0.3 --host 172.198.0.43') + + def test_parse_empty_raw_command(self): + with self.assertRaises(EmptyInputCommandException): + Command.parse_input_command('') + + def test_get_command_description(self): + self.assertEqual(Command(command='test', description='test description').get_description(), 'test description') +