fix public api

This commit is contained in:
2025-10-13 14:23:47 +03:00
parent 4a895df52c
commit 36b4d16610
36 changed files with 164 additions and 158 deletions
+3 -6
View File
@@ -1,6 +1,3 @@
__all__ = ["App", "Orchestrator", "Router"]
from argenta.orchestrator.entity import Orchestrator
from argenta.app.models import App
from argenta.router.entity import Router
from argenta.orchestrator.entity import Orchestrator as Orchestrator
from argenta.app.models import App as App
from argenta.router.entity import Router as Router
+4 -12
View File
@@ -1,12 +1,4 @@
__all__ = [
"App",
"PredefinedMessages",
"DynamicDividingLine",
"StaticDividingLine",
"AutoCompleter"
]
from argenta.app.models import App
from argenta.app.defaults import PredefinedMessages
from argenta.app.dividing_line.models import DynamicDividingLine, StaticDividingLine
from argenta.app.autocompleter.entity import AutoCompleter
from argenta.app.models import App as App
from argenta.app.defaults import PredefinedMessages as PredefinedMessages
from argenta.app.dividing_line.models import DynamicDividingLine as DynamicDividingLine, StaticDividingLine as StaticDividingLine
from argenta.app.autocompleter.entity import AutoCompleter as AutoCompleter
+1 -4
View File
@@ -1,4 +1 @@
__all__ = ["AutoCompleter"]
from argenta.app.autocompleter.entity import AutoCompleter
from argenta.app.autocompleter.entity import AutoCompleter as AutoCompleter
+7 -5
View File
@@ -1,3 +1,5 @@
__all__ = ["AutoCompleter"]
import os
import readline
from typing import Never
@@ -38,7 +40,7 @@ class AutoCompleter:
i += 1
common_prefix = common_prefix[:i]
if state == 0:
readline.insert_text(common_prefix[len(text) :])
readline.insert_text(common_prefix[len(text) :])
readline.redisplay()
return None
elif len(matches) == 1:
@@ -54,10 +56,10 @@ class AutoCompleter:
"""
if self.history_filename:
if os.path.exists(self.history_filename):
readline.read_history_file(self.history_filename)
readline.read_history_file(self.history_filename)
else:
for line in all_commands:
readline.add_history(line)
readline.add_history(line)
readline.set_completer(self._complete)
readline.set_completer_delims(readline.get_completer_delims().replace(" ", ""))
@@ -69,7 +71,7 @@ class AutoCompleter:
:return: None
"""
if self.history_filename:
readline.write_history_file(self.history_filename)
readline.write_history_file(self.history_filename)
with open(self.history_filename, "r") as history_file:
raw_history = history_file.read()
pretty_history: list[str] = []
@@ -86,5 +88,5 @@ def _get_history_items() -> list[str] | list[Never]:
"""
return [
readline.get_history_item(i)
for i in range(1, readline.get_current_history_length() + 1)
for i in range(1, readline.get_current_history_length() + 1)
]
+2
View File
@@ -1,3 +1,5 @@
__all__ = ["PredefinedMessages"]
from enum import StrEnum
+1 -4
View File
@@ -1,4 +1 @@
__all__ = ["StaticDividingLine", "DynamicDividingLine"]
from argenta.app.dividing_line.models import StaticDividingLine, DynamicDividingLine
from argenta.app.dividing_line.models import StaticDividingLine as StaticDividingLine, DynamicDividingLine as DynamicDividingLine
+2
View File
@@ -1,3 +1,5 @@
__all__ = ["StaticDividingLine", "DynamicDividingLine"]
from abc import ABC
+2
View File
@@ -1,3 +1,5 @@
__all__ = ["App"]
import io
import re
from contextlib import redirect_stdout
+4 -2
View File
@@ -1,3 +1,5 @@
__all__ = ["NonStandardBehaviorHandler", "EmptyCommandHandler", "Printer", "DescriptionMessageGenerator"]
from typing import Protocol, TypeVar
T = TypeVar('T', contravariant=True) # noqa: WPS111
@@ -6,11 +8,11 @@ T = TypeVar('T', contravariant=True) # noqa: WPS111
class NonStandardBehaviorHandler(Protocol[T]):
def __call__(self, __param: T) -> None:
raise NotImplementedError
class EmptyCommandHandler(Protocol):
def __call__(self) -> None:
raise NotImplementedError
class Printer(Protocol):
def __call__(self, __text: str) -> None:
@@ -1,3 +1,5 @@
__all__ = ["RegisteredRouters"]
from typing import Iterator, Optional
from argenta.router import Router
+5 -12
View File
@@ -1,12 +1,5 @@
__all__ = [
"Command",
"PossibleValues",
"PredefinedFlags",
"InputCommand",
"Flags",
"Flag"
]
from argenta.command.models import Command, InputCommand
from argenta.command.flag import defaults as PredefinedFlags
from argenta.command.flag import (Flag, Flags, PossibleValues)
from argenta.command.models import Command as Command, InputCommand as InputCommand
from argenta.command.flag.defaults import PredefinedFlags as PredefinedFlags
from argenta.command.flag import (Flag as Flag,
Flags as Flags,
PossibleValues as PossibleValues)
+7
View File
@@ -1,3 +1,10 @@
__all__ = [
"InputCommandException",
"UnprocessedInputFlagException",
"RepeatedInputFlagsException",
"EmptyInputCommandException",
]
from argenta.command.flag.models import Flag, InputFlag
from abc import ABC, abstractmethod
from typing import override
+7 -11
View File
@@ -1,11 +1,7 @@
__all__ = [
"Flag",
"InputFlag",
"Flags",
"PossibleValues",
"ValidationStatus"
]
from argenta.command.flag.models import Flag, InputFlag, PossibleValues, ValidationStatus
from argenta.command.flag.flags.models import Flags
from argenta.command.flag.models import (
Flag as Flag,
InputFlag as InputFlag,
PossibleValues as PossibleValues,
ValidationStatus as ValidationStatus
)
from argenta.command.flag.flags.models import Flags as Flags
+21 -17
View File
@@ -1,27 +1,31 @@
__all__ = ["PredefinedFlags"]
from typing import Literal
from argenta.command.flag.models import Flag, PossibleValues
import re
import re
DEFAULT_PREFIX: Literal["-", "--", "---"] = "-"
HELP = Flag(name="help", possible_values=PossibleValues.NEITHER)
SHORT_HELP = Flag(name="H", prefix=DEFAULT_PREFIX, possible_values=PossibleValues.NEITHER)
INFO = Flag(name="info", possible_values=PossibleValues.NEITHER) # noqa: WPS110
SHORT_INFO = Flag(name="I", prefix=DEFAULT_PREFIX, possible_values=PossibleValues.NEITHER)
class PredefinedFlags:
HELP = Flag(name="help", possible_values=PossibleValues.NEITHER)
SHORT_HELP = Flag(name="H", prefix=DEFAULT_PREFIX, possible_values=PossibleValues.NEITHER)
ALL = Flag(name="all", possible_values=PossibleValues.NEITHER)
SHORT_ALL = Flag(name="A", prefix=DEFAULT_PREFIX, possible_values=PossibleValues.NEITHER)
INFO = Flag(name="info", possible_values=PossibleValues.NEITHER) # noqa: WPS110
SHORT_INFO = Flag(name="I", prefix=DEFAULT_PREFIX, possible_values=PossibleValues.NEITHER)
HOST = Flag(
name="host", possible_values=re.compile(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
)
SHORT_HOST = Flag(
name="H",
prefix=DEFAULT_PREFIX,
possible_values=re.compile(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$"),
)
ALL = Flag(name="all", possible_values=PossibleValues.NEITHER)
SHORT_ALL = Flag(name="A", prefix=DEFAULT_PREFIX, possible_values=PossibleValues.NEITHER)
PORT = Flag(name="port", possible_values=re.compile(r"^\d{1,5}$"))
SHORT_PORT = Flag(name="P", prefix=DEFAULT_PREFIX, possible_values=re.compile(r"^\d{1,5}$"))
HOST = Flag(
name="host", possible_values=re.compile(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
)
SHORT_HOST = Flag(
name="H",
prefix=DEFAULT_PREFIX,
possible_values=re.compile(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$"),
)
PORT = Flag(name="port", possible_values=re.compile(r"^\d{1,5}$"))
SHORT_PORT = Flag(name="P", prefix=DEFAULT_PREFIX, possible_values=re.compile(r"^\d{1,5}$"))
+2 -8
View File
@@ -1,10 +1,4 @@
__all__ = [
"Flags",
"InputFlags"
]
from argenta.command.flag.flags.models import (
Flags,
InputFlags
Flags as Flags,
InputFlags as InputFlags
)
+5 -4
View File
@@ -1,3 +1,5 @@
__all__ = ["Flags", "InputFlags"]
from argenta.command.flag.models import InputFlag, Flag
from typing import Generic, TypeVar, override
from collections.abc import Iterator
@@ -52,7 +54,7 @@ class Flags(BaseFlags[Flag]):
:return: entity of the flag or None
"""
return next((flag for flag in self.flags if flag.name == name), None)
@override
def __eq__(self, other: object) -> bool:
if not isinstance(other, Flags):
@@ -82,9 +84,9 @@ class InputFlags(BaseFlags[InputFlag]):
:return: entity of the flag or None
"""
return next((flag for flag in self.flags if flag.name == name), None)
@override
def __eq__(self, other: object) -> bool:
def __eq__(self, other: object) -> bool:
if not isinstance(other, InputFlags):
raise NotImplementedError
@@ -103,4 +105,3 @@ class InputFlags(BaseFlags[InputFlag]):
return False
else:
raise TypeError
+11 -9
View File
@@ -1,3 +1,5 @@
__all__ = ["PossibleValues", "ValidationStatus", "Flag", "InputFlag"]
from enum import Enum
from re import Pattern
from typing import Literal, override
@@ -16,7 +18,7 @@ class ValidationStatus(Enum):
class Flag:
def __init__(
self, name: str, *,
self, name: str, *,
prefix: Literal["-", "--", "---"] = "--",
possible_values: list[str] | Pattern[str] | PossibleValues = PossibleValues.ALL,
) -> None:
@@ -47,7 +49,7 @@ class Flag:
return input_flag_value in self.possible_values
return True
@property
def string_entity(self) -> str:
"""
@@ -56,17 +58,17 @@ class Flag:
"""
string_entity: str = self.prefix + self.name
return string_entity
@override
def __str__(self) -> str:
return self.string_entity
@override
def __repr__(self) -> str:
return f'Flag<name={self.name}, prefix={self.prefix}>'
@override
def __eq__(self, other: object) -> bool:
def __eq__(self, other: object) -> bool:
if isinstance(other, Flag):
return self.string_entity == other.string_entity
else:
@@ -91,7 +93,7 @@ class InputFlag:
self.prefix: Literal['-', '--', '---'] = prefix
self.input_value: str | None = input_value
self.status: ValidationStatus | None = status
@property
def string_entity(self) -> str:
"""
@@ -104,13 +106,13 @@ class InputFlag:
@override
def __str__(self) -> str:
return f'{self.string_entity} {self.input_value}'
@override
def __repr__(self) -> str:
return f'InputFlag<name={self.name}, prefix={self.prefix}, value={self.input_value}, status={self.status}>'
@override
def __eq__(self, other: object) -> bool:
def __eq__(self, other: object) -> bool:
if isinstance(other, InputFlag):
return (
self.name == other.name
+14 -9
View File
@@ -1,3 +1,8 @@
__all__ = [
"Command",
"InputCommand"
]
from argenta.command.flag.models import Flag, InputFlag, ValidationStatus
from argenta.command.flag.flags.models import InputFlags, Flags
from argenta.command.exceptions import (
@@ -20,7 +25,7 @@ DEFAULT_WITHOUT_INPUT_FLAGS: InputFlags = InputFlags()
class Command:
def __init__(
self,
trigger: str, *,
trigger: str, *,
description: str | None = None,
flags: Flag | Flags = DEFAULT_WITHOUT_FLAGS,
aliases: list[str] | None = None,
@@ -57,7 +62,7 @@ class Command:
class InputCommand:
def __init__(self, trigger: str, *,
def __init__(self, trigger: str, *,
input_flags: InputFlag | InputFlags = DEFAULT_WITHOUT_INPUT_FLAGS):
"""
Private. The model of the input command, after parsing
@@ -78,7 +83,7 @@ class InputCommand:
trigger, input_flags = CommandParser(raw_command).parse_raw_command()
return cls(trigger=trigger, input_flags=input_flags)
class CommandParser:
def __init__(self, raw_command: str) -> None:
@@ -113,24 +118,24 @@ class CommandParser:
input_value=crnt_flg_val,
status=None
)
if input_flag in self._parsed_input_flags:
raise RepeatedInputFlagsException(input_flag)
self._parsed_input_flags.add_flag(input_flag)
crnt_flg_name, crnt_flg_val = None, None
return (self._parsed_input_flags, crnt_flg_name, crnt_flg_val)
def _is_next_token_value(self, current_index: int,
_tokens: list[str] | list[Never]) -> bool:
next_index = current_index + 1
if next_index >= len(_tokens):
return False
return False
next_token = _tokens[next_index]
return not next_token.startswith(MIN_FLAG_PREFIX)
def _parse_single_token(
token: str,
crnt_flag_name: str | None,
+2 -2
View File
@@ -20,9 +20,10 @@ def inject(func: Callable[..., T]) -> Callable[..., T]:
)
def setup_dishka(app: App, *, auto_inject: bool = False) -> None:
def setup_dishka(app: App, container: Container, *, auto_inject: bool = False) -> None:
if auto_inject:
_auto_inject_handlers(app)
Response.patch_by_container(container)
def _get_container_from_response(
@@ -33,7 +34,6 @@ def _get_container_from_response(
if hasattr(arg, "_dishka_container"):
return arg._dishka_container # pyright: ignore[reportPrivateUsage]
break
raise RuntimeError("dishka container not found in Response")
+4
View File
@@ -1,3 +1,7 @@
__all__ = [
'SystemProvider',
]
from argenta.orchestrator.argparser import ArgParser
from dishka import Provider, provide, Scope
+1 -4
View File
@@ -1,4 +1 @@
__all__ = ["get_time_of_pre_cycle_setup"]
from argenta.metrics.main import get_time_of_pre_cycle_setup
from argenta.metrics.main import get_time_of_pre_cycle_setup as get_time_of_pre_cycle_setup
+4
View File
@@ -1,3 +1,7 @@
__all__ = [
'get_time_of_pre_cycle_setup',
]
import io
from contextlib import redirect_stdout
from time import time
+2 -4
View File
@@ -1,4 +1,2 @@
__all__ = ["ArgParser", "Orchestrator"]
from argenta.orchestrator.argparser.entity import ArgParser
from argenta.orchestrator.entity import Orchestrator
from argenta.orchestrator.argparser.entity import ArgParser as ArgParser
from argenta.orchestrator.entity import Orchestrator as Orchestrator
@@ -1,9 +1,2 @@
__all__ = [
"ArgParser",
"BooleanArgument",
"ValueArgument"
]
from argenta.orchestrator.argparser.entity import ArgParser
from argenta.orchestrator.argparser.arguments import BooleanArgument, ValueArgument
from argenta.orchestrator.argparser.entity import ArgParser as ArgParser
from argenta.orchestrator.argparser.arguments import BooleanArgument as BooleanArgument, ValueArgument as ValueArgument
@@ -1,8 +1,5 @@
__all__ = ["BooleanArgument", "ValueArgument", "InputArgument"]
from argenta.orchestrator.argparser.arguments.models import (
BooleanArgument,
ValueArgument,
InputArgument
BooleanArgument as BooleanArgument,
ValueArgument as ValueArgument,
InputArgument as InputArgument
)
@@ -1,3 +1,9 @@
__all__ = [
'BooleanArgument',
'ValueArgument',
'InputArgument'
]
from typing import Literal
@@ -20,7 +26,7 @@ class BaseArgument:
self.help: str = help
self.is_deprecated: bool = is_deprecated
self.prefix: Literal["-", "--", "---"] = prefix
@property
def string_entity(self) -> str:
return self.prefix + self.name
@@ -29,7 +35,7 @@ class BaseArgument:
class ValueArgument(BaseArgument):
def __init__(self, name: str, *,
prefix: Literal["-", "--", "---"] = "--",
help: str = "Help message for the value argument",
help: str = "Help message for the value argument",
possible_values: list[str] | None = None,
default: str | None = None,
is_required: bool = False,
@@ -74,9 +80,9 @@ class InputArgument:
self.name: str = name
self.value: str | None = value
self.founder_class: type[BaseArgument] = founder_class
def __str__(self) -> str:
return f"InputArgument({self.name}={self.value})"
def __repr__(self) -> str:
return f"InputArgument<name={self.name}, value={self.value}, founder_class={self.founder_class.__name__}>"
+18 -14
View File
@@ -1,3 +1,8 @@
__all__ = [
"ArgSpace",
"ArgParser",
]
from argparse import ArgumentParser, Namespace
from typing import Never, Self
@@ -8,32 +13,32 @@ from argenta.orchestrator.argparser.arguments.models import (
ValueArgument
)
class ArgSpace:
def __init__(self, all_arguments: list[InputArgument]) -> None:
self.all_arguments = all_arguments
@classmethod
def from_namespace(cls, namespace: Namespace,
def from_namespace(cls, namespace: Namespace,
processed_args: list[ValueArgument | BooleanArgument]) -> Self:
name_type_paired_args: dict[str, type[BaseArgument]] = {
arg.name: type(arg)
for arg in processed_args
for arg in processed_args
}
return cls([InputArgument(name=name,
value=value,
founder_class=name_type_paired_args[name])
return cls([InputArgument(name=name,
value=value,
founder_class=name_type_paired_args[name])
for name, value in vars(namespace).items()])
def get_by_name(self, name: str) -> InputArgument | None:
for arg in self.all_arguments:
if arg.name == name:
return arg
return None
def get_by_type(self, arg_type: type[BaseArgument]) -> list[InputArgument] | list[Never]:
return [arg for arg in self.all_arguments if arg.founder_class is arg_type]
class ArgParser:
def __init__(
@@ -56,15 +61,15 @@ class ArgParser:
self.processed_args: list[ValueArgument | BooleanArgument] = processed_args
self._core: ArgumentParser = ArgumentParser(prog=name, description=description, epilog=epilog)
for arg in processed_args:
if isinstance(arg, BooleanArgument):
_ = self._core.add_argument(arg.string_entity,
_ = self._core.add_argument(arg.string_entity,
action=arg.action,
help=arg.help,
deprecated=arg.is_deprecated)
else:
_ = self._core.add_argument(arg.string_entity,
_ = self._core.add_argument(arg.string_entity,
action=arg.action,
help=arg.help,
default=arg.default,
@@ -75,4 +80,3 @@ class ArgParser:
def parse_args(self) -> ArgSpace:
return ArgSpace.from_namespace(namespace=self._core.parse_args(),
processed_args=self.processed_args)
+3 -3
View File
@@ -1,5 +1,6 @@
__all__ = ["Orchestrator"]
from argenta.app import App
from argenta.response import Response
from argenta.orchestrator.argparser import ArgParser
from argenta.di.integration import setup_dishka
@@ -31,7 +32,6 @@ class Orchestrator:
:return: None
"""
container = make_container(SystemProvider(self._arg_parser), *self._custom_providers)
Response.patch_by_container(container)
setup_dishka(app, auto_inject=self._auto_inject_handlers)
setup_dishka(app, container, auto_inject=self._auto_inject_handlers)
app.run_polling()
+2 -5
View File
@@ -1,5 +1,2 @@
__all__ = ["Response", "ResponseStatus"]
from argenta.response.entity import Response
from argenta.response.status import ResponseStatus
from argenta.response.entity import Response as Response
from argenta.response.status import ResponseStatus as ResponseStatus
+2
View File
@@ -1,3 +1,5 @@
__all__ = ["Response"]
from dishka import Container
from argenta.command.flag.flags.models import InputFlags
+2
View File
@@ -1,3 +1,5 @@
__all__ = ["ResponseStatus"]
from enum import Enum
+1 -4
View File
@@ -1,4 +1 @@
from argenta.router.entity import Router
__all__ = ["Router"]
from argenta.router.entity import Router as Router
@@ -1,3 +1,5 @@
__all__ = ["CommandHandler", "CommandHandlers"]
from collections.abc import Iterator
from typing import Callable
+2
View File
@@ -1,3 +1,5 @@
__all__ = ["system_router"]
from argenta.router import Router
+2
View File
@@ -1,3 +1,5 @@
__all__ = ["Router"]
from typing import Callable, TypeAlias
from inspect import getfullargspec, get_annotations, getsourcefile, getsourcelines
from rich.console import Console
+2
View File
@@ -1,3 +1,5 @@
__all__ = ["RepeatedFlagNameException", "RequiredArgumentNotPassedException", "TriggerContainSpacesException"]
from typing import override