From a5fdcab862a319ac976926538600cb2ba49a3e1b Mon Sep 17 00:00:00 2001 From: kolo Date: Mon, 14 Apr 2025 01:03:24 +0300 Subject: [PATCH] work on --- argenta/orchestrator/argparse/__init__.py | 4 ++ .../argparse/arguments/__init__.py | 6 +-- .../orchestrator/argparse/arguments/models.py | 8 ++-- argenta/orchestrator/argparse/entity.py | 44 ++++++++++++++++++- argenta/orchestrator/entity.py | 28 +++--------- mock/local_test.py | 2 +- mock/mock_app/main.py | 4 +- 7 files changed, 66 insertions(+), 30 deletions(-) diff --git a/argenta/orchestrator/argparse/__init__.py b/argenta/orchestrator/argparse/__init__.py index e69de29..408d251 100644 --- a/argenta/orchestrator/argparse/__init__.py +++ b/argenta/orchestrator/argparse/__init__.py @@ -0,0 +1,4 @@ +__all__ = ["ArgParse"] + + +from argenta.orchestrator.argparse.entity import ArgParse \ No newline at end of file diff --git a/argenta/orchestrator/argparse/arguments/__init__.py b/argenta/orchestrator/argparse/arguments/__init__.py index c5a9462..c6b74a4 100644 --- a/argenta/orchestrator/argparse/arguments/__init__.py +++ b/argenta/orchestrator/argparse/arguments/__init__.py @@ -1,6 +1,6 @@ __all__ = ["BooleanArgument", "PositionalArgument", "OptionalArgument"] -from argenta.orchestrator.arguments.models import (BooleanArgument, - PositionalArgument, - OptionalArgument) +from argenta.orchestrator.argparse.arguments.models import (BooleanArgument, + PositionalArgument, + OptionalArgument) diff --git a/argenta/orchestrator/argparse/arguments/models.py b/argenta/orchestrator/argparse/arguments/models.py index 40b72cc..6cf6980 100644 --- a/argenta/orchestrator/argparse/arguments/models.py +++ b/argenta/orchestrator/argparse/arguments/models.py @@ -25,7 +25,7 @@ class PositionalArgument(BaseArgument): class OptionalArgument(BaseArgument): - def __init__(self, name: str, prefix: Literal['-', '--', '---']): + def __init__(self, name: str, prefix: Literal['-', '--', '---'] = '--'): """ Optional argument, must have the value :param name: name of the argument @@ -39,12 +39,14 @@ class OptionalArgument(BaseArgument): class BooleanArgument(BaseArgument): - def __init__(self, name: str): + def __init__(self, name: str, prefix: Literal['-', '--', '---'] = '--'): """ Boolean argument, does not require a 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.name + return self.prefix + self.name diff --git a/argenta/orchestrator/argparse/entity.py b/argenta/orchestrator/argparse/entity.py index 20d3808..d1f2ac9 100644 --- a/argenta/orchestrator/argparse/entity.py +++ b/argenta/orchestrator/argparse/entity.py @@ -1,4 +1,46 @@ +from argparse import ArgumentParser + +from argenta.orchestrator.argparse.arguments.models import (BooleanArgument, + OptionalArgument, + PositionalArgument) + + class ArgParse: - def __init__(self, name: str, description: str): + def __init__(self, name: str = 'Argenta', + description: str = 'Argenta available arguments', + epilog: str = 'github.com/koloideal/Argenta | made by kolo', + args: list[PositionalArgument | OptionalArgument | BooleanArgument] = None) -> None: + """ + Cmd argument parser and configurator at startup + :param name: the name of the ArgParse instance + :param description: the description of the ArgParse instance + :param epilog: the epilog of the ArgParse instance + :param args: registered and processed arguments + """ self.name = name self.description = description + self.epilog = epilog + + self.entity = ArgumentParser(prog=name, description=description, epilog=epilog) + self.args: list[PositionalArgument | OptionalArgument | BooleanArgument] | None = args + + def set_args(self, *args: PositionalArgument | OptionalArgument | BooleanArgument): + """ + Sets the arguments to be processed + :param args: processed arguments + :return: + """ + self.args.extend(args) + + def register_args(self): + """ + Registers initialized command line arguments + :return: + """ + for arg in self.args: + if type(arg) is PositionalArgument: + self.entity.add_argument(arg.get_string_entity()) + elif type(arg) is OptionalArgument: + self.entity.add_argument(arg.get_string_entity()) + elif type(arg) is BooleanArgument: + self.entity.add_argument(arg.get_string_entity(), action='store_true') diff --git a/argenta/orchestrator/entity.py b/argenta/orchestrator/entity.py index 8ea6f17..e5a8a55 100644 --- a/argenta/orchestrator/entity.py +++ b/argenta/orchestrator/entity.py @@ -1,20 +1,15 @@ -from argparse import ArgumentParser - from argenta.app import App -from argenta.orchestrator.argparse.arguments import (PositionalArgument, - OptionalArgument, - BooleanArgument) +from argenta.orchestrator.argparse import ArgParse class Orchestrator: - def __init__(self, *args: PositionalArgument | OptionalArgument | BooleanArgument): + def __init__(self, arg_parser: ArgParse): """ 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 + :param arg_parser: Cmd argument parser and configurator at startup """ - self.args = args - self.argparse: ArgumentParser = ArgumentParser() - self._register_args() + self.arg_parser: ArgParse = arg_parser + self.arg_parser.register_args() @staticmethod def start_polling(app: App) -> None: @@ -26,18 +21,9 @@ class Orchestrator: app.run_polling() def get_args(self): - return self.argparse.parse_args() - - def _register_args(self): """ - Registers initialized command line arguments + Returns the arguments parsed :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') + return self.arg_parser.entity.parse_args() \ No newline at end of file diff --git a/mock/local_test.py b/mock/local_test.py index 9efc551..4ab2ed7 100644 --- a/mock/local_test.py +++ b/mock/local_test.py @@ -7,7 +7,7 @@ parser = argparse.ArgumentParser(prog='ProgramName', parser.add_argument('filename') # positional argument parser.add_argument('-c', '--count') # option that takes a value -parser.add_argument('-v', '--verbose', +parser.add_argument('-v', action='store_const') args = parser.parse_args() diff --git a/mock/mock_app/main.py b/mock/mock_app/main.py index 939504f..a2e192a 100644 --- a/mock/mock_app/main.py +++ b/mock/mock_app/main.py @@ -5,14 +5,16 @@ 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 import ArgParse from argenta.orchestrator.argparse.arguments import (PositionalArgument, OptionalArgument, BooleanArgument) +arg_parser = ArgParse(args=[PositionalArgument('test'), OptionalArgument('some'), BooleanArgument('verbose')]) app: App = App(dividing_line=DynamicDividingLine(), autocompleter=AutoCompleter('./mock/.hist')) -orchestrator: Orchestrator = Orchestrator(PositionalArgument('name')) +orchestrator: Orchestrator = Orchestrator(arg_parser) def main():