This commit is contained in:
2026-01-29 14:09:15 +03:00
parent 107530a4b1
commit d03ce5061b
7 changed files with 89 additions and 41 deletions
+1 -1
View File
@@ -3,7 +3,7 @@ from argenta.command import Flag
verbose_flag = Flag(name="verbose", prefix="--") verbose_flag = Flag(name="verbose", prefix="--")
short_flag = Flag(name="v", prefix="-") short_flag = Flag(name="v", prefix="-")
# Debug view # Debug presentation
print(repr(verbose_flag)) # Flag<prefix=--, name=verbose> print(repr(verbose_flag)) # Flag<prefix=--, name=verbose>
print(repr(short_flag)) # Flag<prefix=-, name=v> print(repr(short_flag)) # Flag<prefix=-, name=v>
@@ -579,7 +579,7 @@ msgstr ""
msgid "" msgid ""
"Откройте `127.0.0.1:8000` в браузере, чтобы просмотреть сгенерированную " "Откройте `127.0.0.1:8000` в браузере, чтобы просмотреть сгенерированную "
"документацию." "документацию."
msgstr "Open `127.0.0.1:8000` in your browser to view the generated documentation." msgstr "Open `127.0.0.1:8000` in your browser to presentation the generated documentation."
#: ../../root/contributing.rst:233 #: ../../root/contributing.rst:233
msgid "" msgid ""
+14
View File
@@ -0,0 +1,14 @@
from rich.console import Console
from argenta.app.presentation.renderers import RichRenderer, Renderer, PlainRenderer, RendererMixin
def main(rend: Renderer):
pass
def mm(tr) -> str | None:
pass
main(RichRenderer(print, mm))
main(PlainRenderer(print, mm))
main()
+4 -3
View File
@@ -8,7 +8,7 @@ from typing import Callable, Never, TypeAlias
from rich.console import Console from rich.console import Console
from argenta.app.autocompleter import AutoCompleter from argenta.app.autocompleter import AutoCompleter
from argenta.app.view_renderer.entity import PlainRenderer, RichRenderer, ViewRenderer from argenta.app.presentation.renderers import PlainRenderer, RichRenderer, Renderer
from argenta.app.dividing_line.models import DynamicDividingLine, StaticDividingLine from argenta.app.dividing_line.models import DynamicDividingLine, StaticDividingLine
from argenta.app.protocols import ( from argenta.app.protocols import (
DescriptionMessageGenerator, DescriptionMessageGenerator,
@@ -27,6 +27,7 @@ from argenta.command.models import Command, InputCommand
from argenta.response import Response from argenta.response import Response
from argenta.router import Router from argenta.router import Router
Matches: TypeAlias = list[str] | list[Never] Matches: TypeAlias = list[str] | list[Never]
_ANSI_ESCAPE_RE: re.Pattern[str] = re.compile(r"\u001b\[[0-9;]*m") _ANSI_ESCAPE_RE: re.Pattern[str] = re.compile(r"\u001b\[[0-9;]*m")
@@ -60,12 +61,12 @@ class BaseApp:
self._messages_on_startup: list[str] = [] self._messages_on_startup: list[str] = []
if self._override_system_messages: if self._override_system_messages:
self.view: ViewRenderer = PlainRenderer( self.view: Renderer = PlainRenderer(
print_func=self._print_func, print_func=self._print_func,
most_similar_command_getter=self._most_similar_command most_similar_command_getter=self._most_similar_command
) )
else: else:
self.view: ViewRenderer = RichRenderer( self.view: Renderer = RichRenderer(
print_func=self._print_func, print_func=self._print_func,
most_similar_command_getter=self._most_similar_command most_similar_command_getter=self._most_similar_command
) )
@@ -1,8 +1,10 @@
from abc import ABC, abstractmethod
from typing import Protocol, Iterable from typing import Protocol, Iterable
from art import text2art from art import text2art
from rich.markup import escape from rich.markup import escape
from argenta.app.registered_routers.entity import RegisteredRouters
from argenta.response.entity import Response from argenta.response.entity import Response
from argenta.command.models import InputCommand from argenta.command.models import InputCommand
from argenta.app.protocols import ( from argenta.app.protocols import (
@@ -10,23 +12,62 @@ from argenta.app.protocols import (
EmptyCommandHandler, EmptyCommandHandler,
MostSimilarCommandGetter, MostSimilarCommandGetter,
NonStandardBehaviorHandler, NonStandardBehaviorHandler,
Printer, Printer
) )
class ConcatenateRenderer: class RendererMixin(ABC):
def render_concatenated_messages_on_startup(self, messages: Iterable[str]) -> str: def __init__(self, print_func: Printer, most_similar_command_getter: MostSimilarCommandGetter) -> None:
self._print_func = print_func
self._most_similar_command_getter = most_similar_command_getter
self._cached_command_groups_description: str | None = None
@staticmethod
@abstractmethod
def generate_formatted_description_message_gen() -> DescriptionMessageGenerator:
raise NotImplementedError
@staticmethod
def render_messages_on_startup(messages: Iterable[str]) -> str:
return "\n".join(messages) return "\n".join(messages)
def render_command_groups_description(self, registered_routers: RegisteredRouters) -> str:
if self._cached_command_groups_description:
return self._cached_command_groups_description
command_groups_description = ""
for registered_router in registered_routers:
command_groups_description += "\n" + registered_router.title
for command_handler in registered_router.command_handlers:
handled_command = command_handler.handled_command
command_groups_description += self.generate_formatted_description_message_gen()(
handled_command.trigger,
handled_command.description,
)
self._cached_command_groups_description = command_groups_description
return command_groups_description
class ViewRenderer(Protocol): def generate_formatted_exit_command_handler(self, farewell_message: str) -> NonStandardBehaviorHandler[Response]:
def render_prompt(self, text: str) -> str: ... return lambda _: self._print_func(farewell_message)
def render_initial_message(self, text: str) -> str: ...
def render_farewell_message(self, text: str) -> str: ... class Renderer(Protocol):
@staticmethod
def render_prompt(text: str) -> str: ...
def generate_formatted_description_message_gen(self) -> DescriptionMessageGenerator: ... @staticmethod
def render_initial_message(text: str) -> str: ...
@staticmethod
def render_farewell_message(text: str) -> str: ...
@staticmethod
def render_messages_on_startup(messages: Iterable[str]) -> str: ...
@staticmethod
def generate_formatted_description_message_gen() -> DescriptionMessageGenerator: ...
def render_command_groups_description(self, registered_routers: RegisteredRouters) -> str: ...
def generate_formatted_incorrect_input_syntax_handler(self) -> NonStandardBehaviorHandler[str]: ... def generate_formatted_incorrect_input_syntax_handler(self) -> NonStandardBehaviorHandler[str]: ...
@@ -39,18 +80,17 @@ class ViewRenderer(Protocol):
def generate_formatted_exit_command_handler(self, farewell_message: str) -> NonStandardBehaviorHandler[Response]: ... def generate_formatted_exit_command_handler(self, farewell_message: str) -> NonStandardBehaviorHandler[Response]: ...
class RichRenderer(ViewRenderer): class RichRenderer(RendererMixin):
def __init__(self, print_func: Printer, most_similar_command_getter: MostSimilarCommandGetter) -> None: @staticmethod
self._print_func = print_func def render_prompt(text: str) -> str:
self._most_similar_command_getter = most_similar_command_getter
def render_prompt(self, text: str) -> str:
return f"<gray><b>{text}</b></gray>" return f"<gray><b>{text}</b></gray>"
def render_initial_message(self, text: str) -> str: @staticmethod
def render_initial_message(text: str) -> str:
return f"[bold red]{text2art(text, font='tarty1')}[/bold red]" return f"[bold red]{text2art(text, font='tarty1')}[/bold red]"
def render_farewell_message(self, text: str) -> str: @staticmethod
def render_farewell_message(text: str) -> str:
return ( return (
"[bold red]" "[bold red]"
+ str(text2art(text, font="chanky")) + str(text2art(text, font="chanky"))
@@ -58,7 +98,8 @@ class RichRenderer(ViewRenderer):
+ "[red i]https://github.com/koloideal/Argenta[/red i] | [red bold i]made by kolo[/red bold i]" + "[red i]https://github.com/koloideal/Argenta[/red i] | [red bold i]made by kolo[/red bold i]"
) )
def generate_formatted_description_message_gen(self) -> DescriptionMessageGenerator: @staticmethod
def generate_formatted_description_message_gen() -> DescriptionMessageGenerator:
return lambda command, description: ( return lambda command, description: (
f"[bold red]{escape('[' + command + ']')}[/bold red] " f"[bold red]{escape('[' + command + ']')}[/bold red] "
f"[blue dim]*=*=*[/blue dim] " f"[blue dim]*=*=*[/blue dim] "
@@ -79,33 +120,28 @@ class RichRenderer(ViewRenderer):
cmd_trg: str = command.trigger cmd_trg: str = command.trigger
mst_sim_cmd: str | None = self._most_similar_command_getter(cmd_trg) mst_sim_cmd: str | None = self._most_similar_command_getter(cmd_trg)
self._print_func( self._print_func(
f"[red]Unknown command:[/red][blue]{escape(cmd_trg)}[/blue][red]" + f"[red]Unknown command:[/red][blue]{escape(cmd_trg)}[/blue][red]"
(f", most similar:[/red][blue]{mst_sim_cmd}[/blue]" + (f", most similar:[/red][blue]{mst_sim_cmd}[/blue]" if mst_sim_cmd else "")
if mst_sim_cmd
else "")
) )
return unknown_command_handler return unknown_command_handler
def generate_formatted_exit_command_handler(self, farewell_message: str) -> NonStandardBehaviorHandler[Response]:
return lambda _: self._print_func(farewell_message)
class PlainRenderer(RendererMixin):
class PlainRenderer(ViewRenderer): @staticmethod
def __init__(self, print_func: Printer, most_similar_command_getter: MostSimilarCommandGetter) -> None: def render_prompt(text: str) -> str:
self._print_func = print_func
self._most_similar_command_getter = most_similar_command_getter
def render_prompt(self, text: str) -> str:
return text return text
def render_initial_message(self, text: str) -> str: @staticmethod
def render_initial_message(text: str) -> str:
return text return text
def render_farewell_message(self, text: str) -> str: @staticmethod
def render_farewell_message(text: str) -> str:
return f"{text} | https://github.com/koloideal/Argenta | made by kolo" return f"{text} | https://github.com/koloideal/Argenta | made by kolo"
def generate_formatted_description_message_gen(self) -> DescriptionMessageGenerator: @staticmethod
def generate_formatted_description_message_gen() -> DescriptionMessageGenerator:
return lambda command, description: f"{command} *=*=* {description}" return lambda command, description: f"{command} *=*=* {description}"
def generate_formatted_incorrect_input_syntax_handler(self) -> NonStandardBehaviorHandler[str]: def generate_formatted_incorrect_input_syntax_handler(self) -> NonStandardBehaviorHandler[str]:
@@ -127,6 +163,3 @@ class PlainRenderer(ViewRenderer):
) )
return unknown_command_handler return unknown_command_handler
def generate_formatted_exit_command_handler(self, farewell_message: str) -> NonStandardBehaviorHandler[Response]:
return lambda _: self._print_func(farewell_message)