mirror of
https://github.com/koloideal/Argenta.git
synced 2026-06-10 18:15:28 +03:00
Update documentation and code snippets
This commit is contained in:
@@ -1,10 +1,40 @@
|
||||
__all__ = ["AutoCompleter"]
|
||||
|
||||
import sys
|
||||
|
||||
from prompt_toolkit import PromptSession, HTML
|
||||
from prompt_toolkit.auto_suggest import AutoSuggestFromHistory
|
||||
from prompt_toolkit.completion import Completer, Completion
|
||||
from prompt_toolkit.document import Document
|
||||
from prompt_toolkit.formatted_text import StyleAndTextTuples
|
||||
from prompt_toolkit.history import History, ThreadedHistory, FileHistory, InMemoryHistory
|
||||
from prompt_toolkit.key_binding import KeyBindings
|
||||
from prompt_toolkit.lexers import Lexer
|
||||
from prompt_toolkit.styles import Style
|
||||
|
||||
|
||||
class CommandLexer(Lexer):
|
||||
def __init__(self, valid_commands: set[str]) -> None:
|
||||
self.valid_commands: set[str] = valid_commands
|
||||
|
||||
def lex_document(self, document):
|
||||
def get_line_tokens(lineno: int) -> StyleAndTextTuples:
|
||||
if lineno >= len(document.lines):
|
||||
return []
|
||||
|
||||
line_text: str = document.lines[lineno]
|
||||
|
||||
if not line_text.strip():
|
||||
return [("", line_text)]
|
||||
|
||||
first_word: str = line_text.split()[0] if line_text.split() else ""
|
||||
|
||||
if first_word in self.valid_commands:
|
||||
return [("class:valid", line_text)]
|
||||
else:
|
||||
return [("class:invalid", line_text)]
|
||||
|
||||
return get_line_tokens
|
||||
|
||||
|
||||
class HistoryCompleter(Completer):
|
||||
@@ -45,13 +75,23 @@ class AutoCompleter:
|
||||
def __init__(
|
||||
self,
|
||||
history_filename: str | None = None,
|
||||
autocomplete_button: str = "tab"
|
||||
autocomplete_button: str = "tab",
|
||||
command_highlighting: bool = True,
|
||||
auto_suggestions: bool = True,
|
||||
) -> None:
|
||||
self.history_filename: str | None = history_filename
|
||||
self.autocomplete_button: str = autocomplete_button
|
||||
self.command_highlighting: bool = command_highlighting
|
||||
self.auto_suggestions: bool = auto_suggestions
|
||||
self._session: PromptSession | None = None
|
||||
self._fallback_mode: bool = False
|
||||
|
||||
def initial_setup(self, all_commands: set[str]) -> None:
|
||||
if not sys.stdin.isatty():
|
||||
self._session = None
|
||||
self._fallback_mode = True
|
||||
return
|
||||
|
||||
kb = KeyBindings()
|
||||
|
||||
def _(event):
|
||||
@@ -74,16 +114,23 @@ class AutoCompleter:
|
||||
else:
|
||||
history = InMemoryHistory()
|
||||
|
||||
style = Style.from_dict({'valid': '#00ff00', 'invalid': '#ff0000'})
|
||||
|
||||
self._session = PromptSession(
|
||||
history=history,
|
||||
completer=HistoryCompleter(history, all_commands),
|
||||
complete_while_typing=False,
|
||||
key_bindings=kb,
|
||||
auto_suggest=AutoSuggestFromHistory() if self.auto_suggestions else None,
|
||||
style=style if self.command_highlighting else style,
|
||||
lexer=CommandLexer(all_commands) if self.command_highlighting else None,
|
||||
)
|
||||
|
||||
def prompt(self, prompt_text: str | HTML = ">>> ") -> str:
|
||||
if self._fallback_mode:
|
||||
return input(prompt_text if isinstance(prompt_text, str) else ">>> ")
|
||||
if self._session is None:
|
||||
raise RuntimeError("Call initial_setup() before using prompt()")
|
||||
return self._session.prompt(
|
||||
HTML(f"<b><gray>{prompt_text}</gray></b>") if isinstance(prompt_text, str) else prompt_text
|
||||
HTML(prompt_text) if isinstance(prompt_text, str) else prompt_text
|
||||
)
|
||||
@@ -6,6 +6,7 @@ from contextlib import redirect_stdout
|
||||
from typing import Callable, Never, TypeAlias
|
||||
|
||||
from art import text2art
|
||||
from prompt_toolkit import HTML
|
||||
from rich.console import Console
|
||||
from rich.markup import escape
|
||||
|
||||
@@ -306,7 +307,7 @@ class BaseApp:
|
||||
Private. Sets up default app view
|
||||
:return: None
|
||||
"""
|
||||
self._prompt = f"[italic dim bold]{self._prompt}"
|
||||
self._prompt = f"<gray><b>{self._prompt}</b></gray>"
|
||||
self._initial_message = (
|
||||
"\n" + f"[bold red]{text2art(self._initial_message, font='tarty1')}" + "\n"
|
||||
)
|
||||
@@ -403,7 +404,7 @@ class App(BaseApp):
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
prompt: str = "What do you want to do?\n\n",
|
||||
prompt: str | HTML = ">>> ",
|
||||
initial_message: str = "Argenta\n",
|
||||
farewell_message: str = "\nSee you\n",
|
||||
exit_command: Command = DEFAULT_EXIT_COMMAND,
|
||||
@@ -454,7 +455,7 @@ class App(BaseApp):
|
||||
if self._repeat_command_groups_printing:
|
||||
self._print_command_group_description()
|
||||
|
||||
raw_command: str = Console().input(self._prompt)
|
||||
raw_command: str = self._autocompleter.prompt(self._prompt)
|
||||
|
||||
try:
|
||||
input_command: InputCommand = InputCommand.parse(raw_command=raw_command)
|
||||
@@ -467,7 +468,6 @@ class App(BaseApp):
|
||||
|
||||
if self._is_exit_command(input_command):
|
||||
self.system_router.finds_appropriate_handler(input_command)
|
||||
self._autocompleter.exit_setup(self.registered_routers.get_triggers())
|
||||
return
|
||||
|
||||
if self._is_unknown_command(input_command):
|
||||
|
||||
Reference in New Issue
Block a user