perf boooooooooooooost

This commit is contained in:
2026-03-13 16:50:38 +03:00
parent 1cd5c3759e
commit b9b83540e2
9 changed files with 297 additions and 296 deletions
+119 -159
View File
@@ -10,14 +10,11 @@ from prompt_toolkit.completion import CompleteEvent
from prompt_toolkit.document import Document
from prompt_toolkit.history import InMemoryHistory
from argenta.app.autocompleter.entity import (
AutoCompleter,
CommandLexer,
HistoryCompleter
)
from argenta.app.autocompleter._ext_features_impl import CommandLexer, HistoryCompleter
from argenta.app.autocompleter.entity import AutoCompleter
COMMANDS: set[str] = {"start", "stop", "status"}
_IMPL = "argenta.app.autocompleter._ext_features_impl"
def test_autocompleter_initializes_with_default_params() -> None:
@@ -33,7 +30,7 @@ def test_autocompleter_initializes_with_custom_params() -> None:
history_filename="test.txt",
autocomplete_button="c-space",
command_highlighting=False,
auto_suggestions=False
auto_suggestions=False,
)
assert completer.history_filename == "test.txt"
assert completer.autocomplete_button == "c-space"
@@ -79,13 +76,13 @@ def test_history_completer_returns_matching_commands() -> None:
history = InMemoryHistory()
history.append_string("start server")
history.append_string("stop server")
completer = HistoryCompleter(history, {"status"})
doc = Document("sta")
completions = list(completer.get_completions(doc, CompleteEvent()))
completion_texts = [c.text for c in completions]
assert "start server" in completion_texts
assert "status" in completion_texts
assert "stop server" not in completion_texts
@@ -95,13 +92,13 @@ def test_history_completer_returns_all_when_empty_input() -> None:
history = InMemoryHistory()
history.append_string("start")
history.append_string("stop")
completer = HistoryCompleter(history, {"status"})
doc = Document("")
completions = list(completer.get_completions(doc, CompleteEvent()))
completion_texts = [c.text for c in completions]
assert len(completion_texts) == 3
assert "start" in completion_texts
assert "stop" in completion_texts
@@ -111,10 +108,10 @@ def test_history_completer_returns_all_when_empty_input() -> None:
def test_history_completer_returns_empty_when_no_matches() -> None:
history = InMemoryHistory()
history.append_string("start")
completer = HistoryCompleter(history, {"stop"})
doc = Document("xyz")
completions = list(completer.get_completions(doc, CompleteEvent()))
assert len(completions) == 0
@@ -123,10 +120,10 @@ def test_history_completer_deduplicates_commands() -> None:
history = InMemoryHistory()
history.append_string("start")
history.append_string("start")
completer = HistoryCompleter(history, {"start"})
doc = Document("sta")
completions = list(completer.get_completions(doc, CompleteEvent()))
assert len(completions) == 1
@@ -136,13 +133,13 @@ def test_history_completer_sorts_results() -> None:
history.append_string("stop")
history.append_string("start")
history.append_string("status")
completer = HistoryCompleter(history, set())
doc = Document("st")
completions = list(completer.get_completions(doc, CompleteEvent()))
completion_texts = [c.text for c in completions]
assert completion_texts == ["start", "status", "stop"]
@@ -182,7 +179,7 @@ def test_history_completer_returns_early_when_no_matches() -> None:
history = InMemoryHistory()
completer = HistoryCompleter(history, {"start", "stop"})
doc = Document("xyz")
result = completer.get_completions(doc, CompleteEvent())
completions = list(result)
assert completions == []
@@ -190,28 +187,32 @@ def test_history_completer_returns_early_when_no_matches() -> None:
def test_autocompleter_initial_setup_with_commands() -> None:
completer = AutoCompleter()
with patch.object(sys.stdin, 'isatty', return_value=True), \
patch('argenta.app.autocompleter.entity.PromptSession') as mock_session:
with (
patch.object(sys.stdin, "isatty", return_value=True),
patch(f"{_IMPL}.PromptSession") as mock_session,
):
completer.initial_setup({"start", "stop", "status"})
assert completer._session is not None
assert completer._fallback_mode is False
mock_session.assert_called_once()
def test_autocompleter_initial_setup_with_history_file() -> None:
with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.txt') as f:
with tempfile.NamedTemporaryFile(mode="w", delete=False, suffix=".txt") as f:
history_file = f.name
try:
completer = AutoCompleter(history_filename=history_file)
with patch.object(sys.stdin, 'isatty', return_value=True), \
patch('argenta.app.autocompleter.entity.PromptSession'), \
patch('argenta.app.autocompleter.entity.ThreadedHistory') as mock_threaded_history:
with (
patch.object(sys.stdin, "isatty", return_value=True),
patch(f"{_IMPL}.PromptSession"),
patch(f"{_IMPL}.ThreadedHistory") as mock_threaded_history,
):
completer.initial_setup({"start", "stop"})
assert completer._session is not None
assert completer._fallback_mode is False
mock_threaded_history.assert_called_once()
@@ -222,12 +223,14 @@ def test_autocompleter_initial_setup_with_history_file() -> None:
def test_autocompleter_initial_setup_without_history_file() -> None:
completer = AutoCompleter(history_filename=None)
with patch.object(sys.stdin, 'isatty', return_value=True), \
patch('argenta.app.autocompleter.entity.PromptSession'), \
patch('argenta.app.autocompleter.entity.InMemoryHistory') as mock_in_memory:
with (
patch.object(sys.stdin, "isatty", return_value=True),
patch(f"{_IMPL}.PromptSession"),
patch(f"{_IMPL}.InMemoryHistory") as mock_in_memory,
):
completer.initial_setup({"start", "stop"})
assert completer._session is not None
assert completer._fallback_mode is False
mock_in_memory.assert_called_once()
@@ -235,96 +238,90 @@ def test_autocompleter_initial_setup_without_history_file() -> None:
def test_autocompleter_initial_setup_with_custom_autocomplete_button() -> None:
completer = AutoCompleter(autocomplete_button="c-space")
with patch.object(sys.stdin, 'isatty', return_value=True), \
patch('argenta.app.autocompleter.entity.PromptSession'):
with (
patch.object(sys.stdin, "isatty", return_value=True),
patch(f"{_IMPL}.PromptSession"),
):
completer.initial_setup({"start", "stop"})
assert completer._session is not None
assert completer.autocomplete_button == "c-space"
def test_autocompleter_initial_setup_without_auto_suggestions() -> None:
completer = AutoCompleter(auto_suggestions=False)
with patch.object(sys.stdin, 'isatty', return_value=True), \
patch('argenta.app.autocompleter.entity.PromptSession') as mock_session:
with (
patch.object(sys.stdin, "isatty", return_value=True),
patch(f"{_IMPL}.PromptSession") as mock_session,
):
completer.initial_setup({"start", "stop"})
assert completer._session is not None
call_kwargs = mock_session.call_args[1]
assert call_kwargs['auto_suggest'] is None
assert call_kwargs["auto_suggest"] is None
def test_autocompleter_initial_setup_without_command_highlighting() -> None:
completer = AutoCompleter(command_highlighting=False)
with patch.object(sys.stdin, 'isatty', return_value=True), \
patch('argenta.app.autocompleter.entity.PromptSession') as mock_session:
with (
patch.object(sys.stdin, "isatty", return_value=True),
patch(f"{_IMPL}.PromptSession") as mock_session,
):
completer.initial_setup({"start", "stop"})
assert completer._session is not None
call_kwargs = mock_session.call_args[1]
assert call_kwargs['style'] is None
assert call_kwargs['lexer'] is None
assert call_kwargs["style"] is None
assert call_kwargs["lexer"] is None
def test_autocompleter_key_binding_handler_with_complete_state() -> None:
completer = AutoCompleter()
def _setup_captured_handler(completer: AutoCompleter) -> Callable[[Any], None] | None:
"""Вспомогательная функция: поднимает initial_setup и захватывает kb-хендлер."""
captured_handler: Callable[[Any], None] | None = None
def capture_kb_add(key: str) -> Callable[[Callable[[Any], None]], Callable[[Any], None]]:
def decorator(func: Callable[[Any], None]) -> Callable[[Any], None]:
nonlocal captured_handler
captured_handler = func
return func
return decorator
with patch.object(sys.stdin, 'isatty', return_value=True), \
patch('argenta.app.autocompleter.entity.PromptSession'), \
patch('argenta.app.autocompleter.entity.KeyBindings') as mock_kb_class:
with (
patch.object(sys.stdin, "isatty", return_value=True),
patch(f"{_IMPL}.PromptSession"),
patch(f"{_IMPL}.KeyBindings") as mock_kb_class,
):
mock_kb = MagicMock()
mock_kb.add = capture_kb_add
mock_kb_class.return_value = mock_kb
completer.initial_setup({"start", "stop"})
return captured_handler
def test_autocompleter_key_binding_handler_with_complete_state() -> None:
completer = AutoCompleter()
captured_handler = _setup_captured_handler(completer)
assert captured_handler is not None
mock_event = MagicMock()
mock_buff = MagicMock()
mock_buff.complete_state = True
mock_event.app.current_buffer = mock_buff
captured_handler(mock_event)
mock_buff.complete_next.assert_called_once()
def test_autocompleter_key_binding_handler_no_completions() -> None:
completer = AutoCompleter()
captured_handler: Callable[[Any], None] | None = None
def capture_kb_add(key: str) -> Callable[[Callable[[Any], None]], Callable[[Any], None]]:
def decorator(func: Callable[[Any], None]) -> Callable[[Any], None]:
nonlocal captured_handler
captured_handler = func
return func
return decorator
with patch.object(sys.stdin, 'isatty', return_value=True), \
patch('argenta.app.autocompleter.entity.PromptSession'), \
patch('argenta.app.autocompleter.entity.KeyBindings') as mock_kb_class:
mock_kb = MagicMock()
mock_kb.add = capture_kb_add
mock_kb_class.return_value = mock_kb
completer.initial_setup({"start", "stop"})
captured_handler = _setup_captured_handler(completer)
assert captured_handler is not None
mock_event = MagicMock()
mock_buff = MagicMock()
mock_buff.complete_state = False
@@ -332,36 +329,18 @@ def test_autocompleter_key_binding_handler_no_completions() -> None:
mock_completer.get_completions.return_value = iter([])
mock_buff.completer = mock_completer
mock_event.app.current_buffer = mock_buff
assert captured_handler is not None
captured_handler(mock_event)
mock_buff.start_completion.assert_not_called()
mock_buff.apply_completion.assert_not_called()
def test_autocompleter_key_binding_handler_single_completion() -> None:
completer = AutoCompleter()
captured_handler: Callable[[Any], None] | None = None
def capture_kb_add(key: str) -> Callable[[Callable[[Any], None]], Callable[[Any], None]]:
def decorator(func: Callable[[Any], None]) -> Callable[[Any], None]:
nonlocal captured_handler
captured_handler = func
return func
return decorator
with patch.object(sys.stdin, 'isatty', return_value=True), \
patch('argenta.app.autocompleter.entity.PromptSession'), \
patch('argenta.app.autocompleter.entity.KeyBindings') as mock_kb_class:
mock_kb = MagicMock()
mock_kb.add = capture_kb_add
mock_kb_class.return_value = mock_kb
completer.initial_setup({"start", "stop"})
captured_handler = _setup_captured_handler(completer)
assert captured_handler is not None
mock_event = MagicMock()
mock_buff = MagicMock()
mock_buff.complete_state = False
@@ -370,36 +349,18 @@ def test_autocompleter_key_binding_handler_single_completion() -> None:
mock_completer.get_completions.return_value = iter([mock_completion])
mock_buff.completer = mock_completer
mock_event.app.current_buffer = mock_buff
assert captured_handler is not None
captured_handler(mock_event)
mock_buff.apply_completion.assert_called_once_with(mock_completion)
mock_buff.start_completion.assert_not_called()
def test_autocompleter_key_binding_handler_multiple_completions() -> None:
completer = AutoCompleter()
captured_handler: Callable[[Any], None] | None = None
def capture_kb_add(key: str) -> Callable[[Callable[[Any], None]], Callable[[Any], None]]:
def decorator(func: Callable[[Any], None]) -> Callable[[Any], None]:
nonlocal captured_handler
captured_handler = func
return func
return decorator
with patch.object(sys.stdin, 'isatty', return_value=True), \
patch('argenta.app.autocompleter.entity.PromptSession'), \
patch('argenta.app.autocompleter.entity.KeyBindings') as mock_kb_class:
mock_kb = MagicMock()
mock_kb.add = capture_kb_add
mock_kb_class.return_value = mock_kb
completer.initial_setup({"start", "stop"})
captured_handler = _setup_captured_handler(completer)
assert captured_handler is not None
mock_event = MagicMock()
mock_buff = MagicMock()
mock_buff.complete_state = False
@@ -409,54 +370,53 @@ def test_autocompleter_key_binding_handler_multiple_completions() -> None:
mock_completer.get_completions.return_value = iter([mock_completion1, mock_completion2])
mock_buff.completer = mock_completer
mock_event.app.current_buffer = mock_buff
assert captured_handler is not None
captured_handler(mock_event)
mock_buff.start_completion.assert_called_once_with(select_first=False)
mock_buff.apply_completion.assert_not_called()
def test_autocompleter_prompt_in_fallback_mode_with_string() -> None:
completer = AutoCompleter()
with patch.object(sys.stdin, 'isatty', return_value=False):
with patch.object(sys.stdin, "isatty", return_value=False):
completer.initial_setup({"start", "stop"})
assert completer._fallback_mode is True
with patch('builtins.input', return_value='test input'):
with patch("builtins.input", return_value="test input"):
result = completer.prompt(">>> ")
assert result == 'test input'
assert result == "test input"
def test_autocompleter_prompt_in_fallback_mode_with_html() -> None:
completer = AutoCompleter()
with patch.object(sys.stdin, 'isatty', return_value=False):
with patch.object(sys.stdin, "isatty", return_value=False):
completer.initial_setup({"start", "stop"})
assert completer._fallback_mode is True
with patch('builtins.input', return_value='test input'):
with patch("builtins.input", return_value="test input"):
result = completer.prompt(HTML("<b>>>> </b>"))
assert result == 'test input'
assert result == "test input"
def test_autocompleter_prompt_with_html_in_normal_mode() -> None:
completer = AutoCompleter()
mock_session = MagicMock()
mock_session.prompt.return_value = 'test result'
mock_session.prompt.return_value = "test result"
completer._session = mock_session
completer._fallback_mode = False
html_prompt = HTML("<b>>>> </b>")
result = completer.prompt(html_prompt)
assert result == 'test result'
assert result == "test result"
mock_session.prompt.assert_called_once()
call_args = mock_session.prompt.call_args
assert call_args[0][0] == html_prompt
@@ -464,15 +424,15 @@ def test_autocompleter_prompt_with_html_in_normal_mode() -> None:
def test_autocompleter_prompt_with_string_in_normal_mode() -> None:
completer = AutoCompleter()
mock_session = MagicMock()
mock_session.prompt.return_value = 'test result'
mock_session.prompt.return_value = "test result"
completer._session = mock_session
completer._fallback_mode = False
result = completer.prompt(">>> ")
assert result == 'test result'
assert result == "test result"
mock_session.prompt.assert_called_once()
call_args = mock_session.prompt.call_args
assert isinstance(call_args[0][0], HTML)