From f7c649d18638165ed065a54334220590bcfd0338 Mon Sep 17 00:00:00 2001 From: Roland Walker Date: Sat, 3 Oct 2026 12:50:41 -0400 Subject: [PATCH] recast cli_is_multiline() as repl_is_multiline() the distinction should be that CLI is, when possible, in reference to when the application is invoked --- changelog.md | 1 + mycli/main_modes/repl.py | 4 +-- mycli/packages/prompt_toolkit/multiline.py | 2 +- mycli_test/pytests/test_clibuffer.py | 42 +++++++++++----------- mycli_test/pytests/test_main_modes_repl.py | 2 +- 5 files changed, 26 insertions(+), 25 deletions(-) diff --git a/changelog.md b/changelog.md index 2ac9c3d6..bcbb786b 100644 --- a/changelog.md +++ b/changelog.md @@ -20,6 +20,7 @@ Internal * Add `.txt` to text files without file extensions. * Move `test` directory to `mycli_test`. * Ignore recent refactoring move commits in `git-blame`. +* Recast `cli_is_multiline()` as `repl_is_multiline()`. v2.28.0 (2026/10/02) diff --git a/mycli/main_modes/repl.py b/mycli/main_modes/repl.py index 327ba24b..e8a702d5 100644 --- a/mycli/main_modes/repl.py +++ b/mycli/main_modes/repl.py @@ -69,7 +69,7 @@ from mycli.packages.execution.sql_execute import SQLExecute from mycli.packages.prompt_toolkit.history import FRECENCY_HISTORY_ENTRIES, FRECENCY_REFRESH_INTERVAL, FileHistoryWithTimestamp from mycli.packages.prompt_toolkit.key_bindings import mycli_bindings -from mycli.packages.prompt_toolkit.multiline import cli_is_multiline +from mycli.packages.prompt_toolkit.multiline import repl_is_multiline from mycli.packages.prompt_toolkit.style import style_factory_ptoolkit from mycli.packages.prompt_toolkit.toolbar import create_toolbar_tokens_func, get_vi_mode from mycli.packages.pygments.mycli_lexer import MyCliLexer @@ -781,7 +781,7 @@ def _build_prompt_session( history=history, auto_suggest=ThreadedAutoSuggest(AutoSuggestFromHistory()), complete_while_typing=complete_while_typing_filter, - multiline=cli_is_multiline(mycli), + multiline=repl_is_multiline(mycli), style=style_factory_ptoolkit(mycli.syntax_style, mycli.cli_style), include_default_pygments_style=False, key_bindings=key_bindings, diff --git a/mycli/packages/prompt_toolkit/multiline.py b/mycli/packages/prompt_toolkit/multiline.py index dfcf23b1..4ee9ad63 100644 --- a/mycli/packages/prompt_toolkit/multiline.py +++ b/mycli/packages/prompt_toolkit/multiline.py @@ -9,7 +9,7 @@ ) -def cli_is_multiline(mycli) -> Filter: +def repl_is_multiline(mycli) -> Filter: @Condition def cond(): if not mycli.multi_line: diff --git a/mycli_test/pytests/test_clibuffer.py b/mycli_test/pytests/test_clibuffer.py index 07d67441..2321d6ed 100644 --- a/mycli_test/pytests/test_clibuffer.py +++ b/mycli_test/pytests/test_clibuffer.py @@ -3,7 +3,7 @@ import pytest -from mycli.packages.prompt_toolkit import multiline as clibuffer +from mycli.packages.prompt_toolkit import multiline @dataclass @@ -38,8 +38,8 @@ def make_app_for_text(text: str) -> tuple[SimpleNamespace, DummyLayout]: def test_multiline_exception_handles_favorite_queries_only_after_blank_line(command: str) -> None: text = f'{command} demo select 1; select 2' - assert clibuffer._multiline_exception(text) is False - assert clibuffer._multiline_exception(f'{text}\n') is True + assert multiline._multiline_exception(text) is False + assert multiline._multiline_exception(f'{text}\n') is True @pytest.mark.parametrize( @@ -63,22 +63,22 @@ def test_multiline_exception_detects_commands_terminators_and_plain_sql( text: str, expected: bool, ) -> None: - monkeypatch.setattr(clibuffer.iocommands, 'get_current_delimiter', lambda: '//') - monkeypatch.setattr(clibuffer, 'CASE_SENSITIVE_COMMANDS', {'Camel'}) - monkeypatch.setattr(clibuffer, 'CASE_INSENSITIVE_COMMANDS', {'help', 'exit'}) + monkeypatch.setattr(multiline.iocommands, 'get_current_delimiter', lambda: '//') + monkeypatch.setattr(multiline, 'CASE_SENSITIVE_COMMANDS', {'Camel'}) + monkeypatch.setattr(multiline, 'CASE_INSENSITIVE_COMMANDS', {'help', 'exit'}) - assert clibuffer._multiline_exception(text) is expected + assert multiline._multiline_exception(text) is expected -def test_cli_is_multiline_returns_false_when_multiline_mode_is_disabled(monkeypatch) -> None: +def test_repl_is_multiline_returns_false_when_multiline_mode_is_disabled(monkeypatch) -> None: mycli = SimpleNamespace(multi_line=False) def fail_get_app() -> None: raise AssertionError('get_app() should not be called when multiline mode is disabled') - monkeypatch.setattr(clibuffer, 'get_app', fail_get_app) + monkeypatch.setattr(multiline, 'get_app', fail_get_app) - multiline_filter = clibuffer.cli_is_multiline(mycli) + multiline_filter = multiline.repl_is_multiline(mycli) assert multiline_filter() is False @@ -88,11 +88,11 @@ def test_multiline_exception_recognizes_non_backslashed_special_commands_with_ge monkeypatch, text: str, ) -> None: - monkeypatch.setattr(clibuffer.iocommands, 'get_current_delimiter', lambda: ';') - monkeypatch.setattr(clibuffer, 'CASE_SENSITIVE_COMMANDS', {'Camel'}) - monkeypatch.setattr(clibuffer, 'CASE_INSENSITIVE_COMMANDS', {'help', 'exit'}) + monkeypatch.setattr(multiline.iocommands, 'get_current_delimiter', lambda: ';') + monkeypatch.setattr(multiline, 'CASE_SENSITIVE_COMMANDS', {'Camel'}) + monkeypatch.setattr(multiline, 'CASE_INSENSITIVE_COMMANDS', {'help', 'exit'}) - assert clibuffer._multiline_exception(text) is True + assert multiline._multiline_exception(text) is True @pytest.mark.parametrize( @@ -102,7 +102,7 @@ def test_multiline_exception_recognizes_non_backslashed_special_commands_with_ge ('help select', False), ), ) -def test_cli_is_multiline_uses_buffer_text_when_multiline_mode_is_enabled( +def test_repl_is_multiline_uses_buffer_text_when_multiline_mode_is_enabled( monkeypatch, text: str, expected: bool, @@ -110,12 +110,12 @@ def test_cli_is_multiline_uses_buffer_text_when_multiline_mode_is_enabled( app, layout = make_app_for_text(text) mycli = SimpleNamespace(multi_line=True) - monkeypatch.setattr(clibuffer, 'get_app', lambda: app) - monkeypatch.setattr(clibuffer.iocommands, 'get_current_delimiter', lambda: ';') - monkeypatch.setattr(clibuffer, 'CASE_SENSITIVE_COMMANDS', {'Camel'}) - monkeypatch.setattr(clibuffer, 'CASE_INSENSITIVE_COMMANDS', {'help'}) + monkeypatch.setattr(multiline, 'get_app', lambda: app) + monkeypatch.setattr(multiline.iocommands, 'get_current_delimiter', lambda: ';') + monkeypatch.setattr(multiline, 'CASE_SENSITIVE_COMMANDS', {'Camel'}) + monkeypatch.setattr(multiline, 'CASE_INSENSITIVE_COMMANDS', {'help'}) - multiline_filter = clibuffer.cli_is_multiline(mycli) + multiline_filter = multiline.repl_is_multiline(mycli) assert multiline_filter() is expected - assert layout.requested_names == [clibuffer.DEFAULT_BUFFER] + assert layout.requested_names == [multiline.DEFAULT_BUFFER] diff --git a/mycli_test/pytests/test_main_modes_repl.py b/mycli_test/pytests/test_main_modes_repl.py index f7c88bfa..bb3f2751 100644 --- a/mycli_test/pytests/test_main_modes_repl.py +++ b/mycli_test/pytests/test_main_modes_repl.py @@ -1514,7 +1514,7 @@ def fake_prompt_session(**kwargs: Any) -> FakePromptSession: monkeypatch.setattr(repl_mode, 'PromptSession', fake_prompt_session) monkeypatch.setattr(repl_mode, 'style_factory_ptoolkit', lambda *args, **kwargs: 'style') - monkeypatch.setattr(repl_mode, 'cli_is_multiline', lambda mycli: False) + monkeypatch.setattr(repl_mode, 'repl_is_multiline', lambda mycli: False) def fake_toolbar_tokens(mycli: Any, show_help: Any, fmt: str, custom_toolbar: Any) -> str: toolbar_help.append(show_help())