extend arguments

This commit is contained in:
2025-10-09 20:23:52 +03:00
parent 0bdc3f07c2
commit b3b5e2e8a8
6 changed files with 89 additions and 28 deletions
+6 -5
View File
@@ -3,26 +3,27 @@ from mock.mock_app.routers import work_router
from argenta import App, Orchestrator
from argenta.app import PredefinedMessages, DynamicDividingLine, AutoCompleter
from argenta.orchestrator import ArgParser
from argenta.orchestrator.argparser import BooleanArgument
from argenta.orchestrator.argparser import BooleanArgument, ValueArgument, RequiredArgument
arg_parser = ArgParser(processed_args=[BooleanArgument("repeat")])
arg_parser: ArgParser = ArgParser(processed_args=[BooleanArgument(name="repeat", is_deprecated=True),
ValueArgument(name="value", possible_values=["cat", "dog"]),
RequiredArgument(name="required", is_required=True)])
app: App = App(
dividing_line=DynamicDividingLine(),
autocompleter=AutoCompleter(),
)
orchestrator: Orchestrator = Orchestrator(arg_parser)
print(orchestrator.get_input_args())
def main():
app.include_router(work_router)
print(f"\n\n{orchestrator.get_input_args()}")
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)
# orchestrator.start_polling(app)
if __name__ == "__main__":
+4 -1
View File
@@ -20,7 +20,10 @@ exclude = [
"poetry.lock",
".__pycache__",
"tests"
]
]
[tool.pyright]
typeCheckingMode = "strict"
[build-system]
requires = ["hatchling"]
@@ -1,12 +1,12 @@
__all__ = [
"ArgParser",
"PositionalArgument",
"OptionalArgument",
"RequiredArgument",
"ValueArgument",
"BooleanArgument"
]
from argenta.orchestrator.argparser.entity import ArgParser
from argenta.orchestrator.argparser.arguments import (BooleanArgument,
PositionalArgument,
OptionalArgument)
RequiredArgument,
ValueArgument)
@@ -1,8 +1,8 @@
__all__ = ["BooleanArgument", "PositionalArgument", "OptionalArgument"]
__all__ = ["BooleanArgument", "RequiredArgument", "ValueArgument"]
from argenta.orchestrator.argparser.arguments.models import (
BooleanArgument,
PositionalArgument,
OptionalArgument,
RequiredArgument,
ValueArgument,
)
@@ -16,29 +16,65 @@ class BaseArgument(ABC):
raise NotImplementedError
class PositionalArgument(BaseArgument):
def __init__(self, name: str):
class RequiredArgument(BaseArgument):
def __init__(self, name: str, *,
prefix: Literal["-", "--", "---"] = "--",
help: str = "Help for required argument",
default: str | None = None,
possible_values: list[str] | None = None,
is_required: bool = True,
is_deprecated: bool = False):
"""
Public. Required argument at startup
:param name: name of the argument, must not start with minus (-)
:param prefix: prefix of the argument
:param help: help message for the argument
:param default: default value for the argument
:param possible_values: list of possible values for the argument
:param is_required: whether the argument is required
:param is_deprecated: whether the argument is deprecated
"""
self.name: str = name
self.prefix: Literal["-", "--", "---"] = prefix
self.help: str = help
self.default: str | None = default
self.possible_values: list[str] | None = possible_values
self.is_required: bool = is_required
self.is_deprecated: bool = is_deprecated
self.action: str = "store"
@property
@override
def string_entity(self) -> str:
return self.name
return self.prefix + self.name
class OptionalArgument(BaseArgument):
def __init__(self, name: str, prefix: Literal["-", "--", "---"] = "--"):
class ValueArgument(BaseArgument):
def __init__(self, name: str, *,
prefix: Literal["-", "--", "---"] = "--",
help: str = "Help message for the value argument",
possible_values: list[str] | None = None,
default: str | None = None,
is_required: bool = False,
is_deprecated: bool = False):
"""
Public. Optional argument, must have the value
Public. Value argument, must have the value
:param name: name of the argument
:param prefix: prefix of the argument
:param help: help message for the argument
:param possible_values: list of possible values for the argument
:param default: default value for the argument
:param is_required: whether the argument is required
:param is_deprecated: whether the argument is deprecated
"""
self.name: str = name
self.prefix: Literal["-", "--", "---"] = prefix
self.help: str = help
self.possible_values: list[str] | None = possible_values
self.default: str | None = default
self.is_required: bool = is_required
self.is_deprecated: bool = is_deprecated
self.action: str = "store"
@property
@override
@@ -47,14 +83,25 @@ class OptionalArgument(BaseArgument):
class BooleanArgument(BaseArgument):
def __init__(self, name: str, prefix: Literal["-", "--", "---"] = "--"):
def __init__(self, name: str, *,
prefix: Literal["-", "--", "---"] = "--",
help: str = "Help message for the boolean argument",
is_required: bool = False,
is_deprecated: bool = False):
"""
Public. Boolean argument, does not require a value
:param name: name of the argument
:param prefix: prefix of the argument
:param help: help message for the argument
:param is_required: whether the argument is required
:param is_deprecated: whether the argument is deprecated
"""
self.name: str = name
self.prefix: Literal["-", "--", "---"] = prefix
self.help: str = help
self.is_required: bool = is_required
self.is_deprecated: bool = is_deprecated
self.action: str = "store_true"
@property
@override
+17 -7
View File
@@ -2,15 +2,15 @@ from argparse import ArgumentParser, Namespace
from argenta.orchestrator.argparser.arguments.models import (
BooleanArgument,
OptionalArgument,
PositionalArgument,
ValueArgument,
RequiredArgument,
)
class ArgParser:
def __init__(
self,
processed_args: list[PositionalArgument | OptionalArgument | BooleanArgument], *,
processed_args: list[RequiredArgument | ValueArgument | BooleanArgument], *,
name: str = "Argenta",
description: str = "Argenta available arguments",
epilog: str = "github.com/koloideal/Argenta | made by kolo",
@@ -27,13 +27,23 @@ class ArgParser:
self._epilog: str = epilog
self._entity: ArgumentParser = ArgumentParser(prog=name, description=description, epilog=epilog)
self._processed_args: list[PositionalArgument | OptionalArgument | BooleanArgument] = processed_args
self._processed_args: list[RequiredArgument | ValueArgument | BooleanArgument] = processed_args
for arg in processed_args:
if isinstance(arg, PositionalArgument) or isinstance(arg, OptionalArgument):
_ = self._entity.add_argument(arg.string_entity)
if isinstance(arg, BooleanArgument):
_ = self._entity.add_argument(arg.string_entity,
action=arg.action,
help=arg.help,
required=arg.is_required,
deprecated=arg.is_deprecated)
else:
_ = self._entity.add_argument(arg.string_entity, action="store_true")
_ = self._entity.add_argument(arg.string_entity,
action=arg.action,
help=arg.help,
default=arg.default,
choices=arg.possible_values,
required=arg.is_required,
deprecated=arg.is_deprecated)
def parse_args(self) -> Namespace:
return self._entity.parse_args()