diff --git a/README.md b/README.md index bd66d49..3d7e947 100644 --- a/README.md +++ b/README.md @@ -44,11 +44,12 @@ from routers import router app: App = App() + def main() -> None: app.include_router(router) - app.start_polling() + app.run_polling() + - if __name__ == '__main__': main() ``` diff --git a/argenta/app/models.py b/argenta/app/models.py index 8830cf8..fc32c86 100644 --- a/argenta/app/models.py +++ b/argenta/app/models.py @@ -216,7 +216,7 @@ class AppSetups(AppValidators, AppPrinters): class App(AppSetters, AppNonStandardHandlers, AppSetups): - def start_polling(self) -> None: + def run_polling(self) -> None: self._pre_cycle_setup() while True: if self._repeat_command_groups_description: diff --git a/argenta/orchestrator/__init__.py b/argenta/orchestrator/__init__.py index e69de29..cc56f20 100644 --- a/argenta/orchestrator/__init__.py +++ b/argenta/orchestrator/__init__.py @@ -0,0 +1,4 @@ +__all__ = ["Orchestrator"] + + +from argenta.orchestrator.entity import Orchestrator diff --git a/argenta/orchestrator/argparse/__init__.py b/argenta/orchestrator/argparse/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/argenta/orchestrator/argparse/arguments/__init__.py b/argenta/orchestrator/argparse/arguments/__init__.py new file mode 100644 index 0000000..c5a9462 --- /dev/null +++ b/argenta/orchestrator/argparse/arguments/__init__.py @@ -0,0 +1,6 @@ +__all__ = ["BooleanArgument", "PositionalArgument", "OptionalArgument"] + + +from argenta.orchestrator.arguments.models import (BooleanArgument, + PositionalArgument, + OptionalArgument) diff --git a/argenta/orchestrator/argparse/arguments/models.py b/argenta/orchestrator/argparse/arguments/models.py new file mode 100644 index 0000000..40b72cc --- /dev/null +++ b/argenta/orchestrator/argparse/arguments/models.py @@ -0,0 +1,50 @@ +from abc import ABC, abstractmethod +from typing import Literal + + +class BaseArgument(ABC): + @abstractmethod + def get_string_entity(self): + """ + Returns the string representation of the argument + :return: + """ + pass + + +class PositionalArgument(BaseArgument): + def __init__(self, name: str): + """ + Required argument at startup + :param name: name of the argument, must not start with minus (-) + """ + self.name = name + + def get_string_entity(self): + return self.name + + +class OptionalArgument(BaseArgument): + def __init__(self, name: str, prefix: Literal['-', '--', '---']): + """ + Optional argument, must have the value + :param name: name of the argument + :param prefix: prefix of the argument + """ + self.name = name + self.prefix = prefix + + def get_string_entity(self): + return self.prefix + self.name + + +class BooleanArgument(BaseArgument): + def __init__(self, name: str): + """ + Boolean argument, does not require a value + :param name: name of the argument + """ + self.name = name + + def get_string_entity(self): + return self.name diff --git a/argenta/orchestrator/argparse/entity.py b/argenta/orchestrator/argparse/entity.py new file mode 100644 index 0000000..20d3808 --- /dev/null +++ b/argenta/orchestrator/argparse/entity.py @@ -0,0 +1,4 @@ +class ArgParse: + def __init__(self, name: str, description: str): + self.name = name + self.description = description diff --git a/argenta/orchestrator/entity.py b/argenta/orchestrator/entity.py index 6f84093..8ea6f17 100644 --- a/argenta/orchestrator/entity.py +++ b/argenta/orchestrator/entity.py @@ -1,2 +1,43 @@ +from argparse import ArgumentParser + +from argenta.app import App +from argenta.orchestrator.argparse.arguments import (PositionalArgument, + OptionalArgument, + BooleanArgument) + + class Orchestrator: - pass \ No newline at end of file + def __init__(self, *args: PositionalArgument | OptionalArgument | BooleanArgument): + """ + An orchestrator and configurator that defines the behavior of an integrated system, one level higher than the App + :param args: logged command line arguments at startup + """ + self.args = args + self.argparse: ArgumentParser = ArgumentParser() + self._register_args() + + @staticmethod + def start_polling(app: App) -> None: + """ + Starting the user input processing cycle + :param app: a running application + :return: + """ + app.run_polling() + + def get_args(self): + return self.argparse.parse_args() + + def _register_args(self): + """ + Registers initialized command line arguments + :return: + """ + for arg in self.args: + if type(arg) is PositionalArgument: + self.argparse.add_argument(arg.get_string_entity()) + elif type(arg) is OptionalArgument: + self.argparse.add_argument(arg.get_string_entity()) + elif type(arg) is BooleanArgument: + self.argparse.add_argument(arg.get_string_entity(), action='store_const') + \ No newline at end of file diff --git a/mock/default_mock_app/main.py b/mock/default_mock_app/main.py index 1af7849..2e9430b 100644 --- a/mock/default_mock_app/main.py +++ b/mock/default_mock_app/main.py @@ -6,4 +6,4 @@ app = App(repeat_command_groups=True) app.add_message_on_startup(PredeterminedMessages.USAGE + '\n\n') -app.start_polling() +app.run_polling() diff --git a/mock/mock_app/main.py b/mock/mock_app/main.py index d02b965..939504f 100644 --- a/mock/mock_app/main.py +++ b/mock/mock_app/main.py @@ -4,11 +4,15 @@ from argenta.app import App from argenta.app.defaults import PredeterminedMessages from argenta.app.dividing_line import DynamicDividingLine from argenta.app.autocompleter import AutoCompleter +from argenta.orchestrator import Orchestrator +from argenta.orchestrator.argparse.arguments import (PositionalArgument, + OptionalArgument, + BooleanArgument) -autocompleter = AutoCompleter('./mock/.hist') app: App = App(dividing_line=DynamicDividingLine(), - autocompleter=autocompleter) + autocompleter=AutoCompleter('./mock/.hist')) +orchestrator: Orchestrator = Orchestrator(PositionalArgument('name')) def main(): @@ -18,7 +22,8 @@ def main(): app.add_message_on_startup(PredeterminedMessages.AUTOCOMPLETE) app.add_message_on_startup(PredeterminedMessages.HELP) - app.start_polling() + print(orchestrator.get_args()) + #orchestrator.start_polling(app) if __name__ == "__main__": main() 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 4277aeb..ffebddb 100644 --- a/tests/system_tests/test_system_handling_non_standard_behavior.py +++ b/tests/system_tests/test_system_handling_non_standard_behavior.py @@ -26,7 +26,7 @@ class TestSystemHandlerNormalWork(unittest.TestCase): print_func=print) app.include_router(router) app.set_unknown_command_handler(lambda command: print(f'Unknown command: {command.get_trigger()}')) - app.start_polling() + app.run_polling() output = mock_stdout.getvalue() @@ -47,7 +47,7 @@ class TestSystemHandlerNormalWork(unittest.TestCase): print_func=print) app.include_router(router) app.set_unknown_command_handler(lambda command: print(f'Unknown command: {command.get_trigger()}')) - app.start_polling() + app.run_polling() output = mock_stdout.getvalue() @@ -66,7 +66,7 @@ class TestSystemHandlerNormalWork(unittest.TestCase): app = App(override_system_messages=True, print_func=print) app.include_router(router) - app.start_polling() + app.run_polling() output = mock_stdout.getvalue() @@ -85,7 +85,7 @@ class TestSystemHandlerNormalWork(unittest.TestCase): app = App(override_system_messages=True, print_func=print) app.include_router(router) - app.start_polling() + app.run_polling() output = mock_stdout.getvalue() @@ -105,7 +105,7 @@ class TestSystemHandlerNormalWork(unittest.TestCase): app = App(override_system_messages=True, print_func=print) app.include_router(router) - app.start_polling() + app.run_polling() output = mock_stdout.getvalue() @@ -125,7 +125,7 @@ class TestSystemHandlerNormalWork(unittest.TestCase): print_func=print) app.include_router(router) app.set_unknown_command_handler(lambda command: print(f'Unknown command: {command.get_trigger()}')) - app.start_polling() + app.run_polling() output = mock_stdout.getvalue() @@ -149,7 +149,7 @@ class TestSystemHandlerNormalWork(unittest.TestCase): print_func=print) app.include_router(router) app.set_unknown_command_handler(lambda command: print(f'Unknown command: {command.get_trigger()}')) - app.start_polling() + app.run_polling() output = mock_stdout.getvalue() @@ -169,7 +169,7 @@ class TestSystemHandlerNormalWork(unittest.TestCase): print_func=print) app.include_router(router) app.set_invalid_input_flags_handler(lambda command: print(f'Incorrect flag syntax: "{command}"')) - app.start_polling() + app.run_polling() output = mock_stdout.getvalue() @@ -189,7 +189,7 @@ class TestSystemHandlerNormalWork(unittest.TestCase): print_func=print) app.include_router(router) app.set_empty_command_handler(lambda: print('Empty input command')) - app.start_polling() + app.run_polling() output = mock_stdout.getvalue() @@ -209,7 +209,7 @@ class TestSystemHandlerNormalWork(unittest.TestCase): print_func=print) app.include_router(router) app.set_repeated_input_flags_handler(lambda command: print(f'Repeated input flags: "{command}"')) - app.start_polling() + app.run_polling() output = mock_stdout.getvalue() diff --git a/tests/system_tests/test_system_handling_normal_behavior.py b/tests/system_tests/test_system_handling_normal_behavior.py index 5aa4a46..9270bf0 100644 --- a/tests/system_tests/test_system_handling_normal_behavior.py +++ b/tests/system_tests/test_system_handling_normal_behavior.py @@ -25,7 +25,7 @@ class TestSystemHandlerNormalWork(unittest.TestCase): app = App(override_system_messages=True, print_func=print) app.include_router(router) - app.start_polling() + app.run_polling() output = mock_stdout.getvalue() @@ -45,7 +45,7 @@ class TestSystemHandlerNormalWork(unittest.TestCase): override_system_messages=True, print_func=print) app.include_router(router) - app.start_polling() + app.run_polling() output = mock_stdout.getvalue() @@ -65,7 +65,7 @@ class TestSystemHandlerNormalWork(unittest.TestCase): app = App(override_system_messages=True, print_func=print) app.include_router(router) - app.start_polling() + app.run_polling() output = mock_stdout.getvalue() @@ -84,7 +84,7 @@ class TestSystemHandlerNormalWork(unittest.TestCase): app = App(override_system_messages=True, print_func=print) app.include_router(router) - app.start_polling() + app.run_polling() output = mock_stdout.getvalue() @@ -104,7 +104,7 @@ class TestSystemHandlerNormalWork(unittest.TestCase): app = App(override_system_messages=True, print_func=print) app.include_router(router) - app.start_polling() + app.run_polling() output = mock_stdout.getvalue() @@ -125,7 +125,7 @@ class TestSystemHandlerNormalWork(unittest.TestCase): app = App(override_system_messages=True, print_func=print) app.include_router(router) - app.start_polling() + app.run_polling() output = mock_stdout.getvalue() @@ -145,7 +145,7 @@ class TestSystemHandlerNormalWork(unittest.TestCase): app = App(override_system_messages=True, print_func=print) app.include_router(router) - app.start_polling() + app.run_polling() output = mock_stdout.getvalue() @@ -165,7 +165,7 @@ class TestSystemHandlerNormalWork(unittest.TestCase): app = App(override_system_messages=True, print_func=print) app.include_router(router) - app.start_polling() + app.run_polling() output = mock_stdout.getvalue() @@ -188,7 +188,7 @@ class TestSystemHandlerNormalWork(unittest.TestCase): app = App(override_system_messages=True, print_func=print) app.include_router(router) - app.start_polling() + app.run_polling() output = mock_stdout.getvalue() @@ -215,7 +215,7 @@ class TestSystemHandlerNormalWork(unittest.TestCase): app = App(override_system_messages=True, print_func=print) app.include_router(router) - app.start_polling() + app.run_polling() output = mock_stdout.getvalue()