From 3656f344cf630a8fd1a4f51cd9b2558759c755cf Mon Sep 17 00:00:00 2001 From: Roland Walker Date: Sat, 4 Apr 2026 18:25:08 -0400 Subject: [PATCH] rename MyCli.prompt_app property to prompt_session Since this property contains a PromptSession instance, calling it a prompt_app was confusing, especially since "prompt_app" had itself a property named "app". No functional change. Incidentally removes _main_module() from main_modes/repl.py, since it is no longer used. --- changelog.md | 2 +- mycli/clitoolbar.py | 2 +- mycli/main.py | 40 +++++++++++++------------- mycli/main_modes/repl.py | 30 ++++++++----------- mycli/packages/key_binding_utils.py | 4 +-- test/pytests/test_clitoolbar.py | 2 +- test/pytests/test_key_binding_utils.py | 12 ++++---- test/pytests/test_main.py | 4 +-- test/pytests/test_main_modes_repl.py | 36 +++++++++++------------ test/pytests/test_main_regression.py | 30 +++++++++---------- 10 files changed, 77 insertions(+), 85 deletions(-) diff --git a/changelog.md b/changelog.md index 1d9be1a2..444623c3 100644 --- a/changelog.md +++ b/changelog.md @@ -39,7 +39,7 @@ Internal * Move `--execute` logic to the new `main_modes` with `--batch`. * Move `--list-dsn` logic to the new `main_modes` with `--batch`. * Move `--list-ssh-config` logic to the new `main_modes` with `--batch`. -* Move REPL logic to the new `main_modes`. +* Move REPL logic to the new `main_modes`, and refactor the REPL. * Sort coverage report in tox suite. * Skip more tests when a database connection is not present. * Move SQL utilities to a new `sql_utils.py`. diff --git a/mycli/clitoolbar.py b/mycli/clitoolbar.py index 1112d30a..cdd22dc0 100644 --- a/mycli/clitoolbar.py +++ b/mycli/clitoolbar.py @@ -38,7 +38,7 @@ def get_toolbar_tokens() -> list[tuple[str, str]]: result.append(("class:bottom-toolbar", "[F3] Multiline:")) result.append(("class:bottom-toolbar.off", "OFF")) - if mycli.prompt_app.editing_mode == EditingMode.VI: + if mycli.prompt_session.editing_mode == EditingMode.VI: result.append(divider) result.append(("class:bottom-toolbar", "Vi:")) result.append(("class:bottom-toolbar.on", _get_vi_mode())) diff --git a/mycli/main.py b/mycli/main.py index 74aaff91..9fe869c9 100755 --- a/mycli/main.py +++ b/mycli/main.py @@ -153,7 +153,7 @@ def __init__( self.defaults_suffix = defaults_suffix self.login_path = login_path self.toolbar_error_message: str | None = None - self.prompt_app: PromptSession | None = None + self.prompt_session: PromptSession | None = None self._keepalive_counter = 0 self.keepalive_ticks: int | None = 0 @@ -291,7 +291,7 @@ def __init__( self.terminal_window_title_format = c['main']['terminal_window_title'] self.multiplex_window_title_format = c['main']['multiplex_window_title'] self.multiplex_pane_title_format = c['main']['multiplex_pane_title'] - self.prompt_app = None + self.prompt_session = None self.destructive_keywords = [ keyword for keyword in c["main"].get("destructive_keywords", "DROP SHUTDOWN DELETE TRUNCATE ALTER UPDATE").split(' ') if keyword ] @@ -904,8 +904,8 @@ def get_output_margin(self, status: str | None = None) -> int: """Get the output margin (number of rows for the prompt, footer and timing message.""" if not self.prompt_lines: - if self.prompt_app and self.prompt_app.app: - render_counter = self.prompt_app.app.render_counter + if self.prompt_session and self.prompt_session.app: + render_counter = self.prompt_session.app.render_counter else: render_counter = 0 self.prompt_lines = self.get_prompt(self.prompt_format, render_counter).count('\n') + 1 @@ -933,8 +933,8 @@ def output( """ if output: - if self.prompt_app is not None: - size = self.prompt_app.output.get_size() + if self.prompt_session is not None: + size = self.prompt_session.output.get_size() size_columns = size.columns size_rows = size.rows else: @@ -1036,10 +1036,10 @@ def _on_completions_refreshed(self, new_completer: SQLCompleter) -> None: with self._completer_lock: self.completer = new_completer - if self.prompt_app: + if self.prompt_session: # After refreshing, redraw the CLI to clear the statusbar # "Refreshing completions..." indicator - self.prompt_app.app.invalidate() + self.prompt_session.app.invalidate() def get_completions(self, text: str, cursor_position: int) -> Iterable[Completion]: with self._completer_lock: @@ -1054,22 +1054,22 @@ def set_all_external_titles(self) -> None: def set_external_terminal_tab_title(self) -> None: if not self.terminal_tab_title_format: return - if not self.prompt_app: + if not self.prompt_session: return if not sys.stderr.isatty(): return - title = sanitize_terminal_title(self.get_prompt(self.terminal_tab_title_format, self.prompt_app.app.render_counter)) + title = sanitize_terminal_title(self.get_prompt(self.terminal_tab_title_format, self.prompt_session.app.render_counter)) print(f'\x1b]1;{title}\a', file=sys.stderr, end='') sys.stderr.flush() def set_external_terminal_window_title(self) -> None: if not self.terminal_window_title_format: return - if not self.prompt_app: + if not self.prompt_session: return if not sys.stderr.isatty(): return - title = sanitize_terminal_title(self.get_prompt(self.terminal_window_title_format, self.prompt_app.app.render_counter)) + title = sanitize_terminal_title(self.get_prompt(self.terminal_window_title_format, self.prompt_session.app.render_counter)) print(f'\x1b]2;{title}\a', file=sys.stderr, end='') sys.stderr.flush() @@ -1078,9 +1078,9 @@ def set_external_multiplex_window_title(self) -> None: return if not os.getenv('TMUX'): return - if not self.prompt_app: + if not self.prompt_session: return - title = sanitize_terminal_title(self.get_prompt(self.multiplex_window_title_format, self.prompt_app.app.render_counter)) + title = sanitize_terminal_title(self.get_prompt(self.multiplex_window_title_format, self.prompt_session.app.render_counter)) try: subprocess.run( ['tmux', 'rename-window', title], @@ -1097,22 +1097,22 @@ def set_external_multiplex_pane_title(self) -> None: return if not os.getenv('TMUX'): return - if not self.prompt_app: + if not self.prompt_session: return if not sys.stderr.isatty(): return - title = sanitize_terminal_title(self.get_prompt(self.multiplex_pane_title_format, self.prompt_app.app.render_counter)) + title = sanitize_terminal_title(self.get_prompt(self.multiplex_pane_title_format, self.prompt_session.app.render_counter)) print(f'\x1b]2;{title}\x1b\\', file=sys.stderr, end='') sys.stderr.flush() def get_custom_toolbar(self, toolbar_format: str) -> ANSI: - if not self.prompt_app: + if not self.prompt_session: return ANSI('') - if not self.prompt_app.app: + if not self.prompt_session.app: return ANSI('') - if self.prompt_app.app.current_buffer.text: + if self.prompt_session.app.current_buffer.text: return self.last_custom_toolbar_message - toolbar = self.get_prompt(toolbar_format, self.prompt_app.app.render_counter) + toolbar = self.get_prompt(toolbar_format, self.prompt_session.app.render_counter) toolbar = toolbar.replace("\\x1b", "\x1b") self.last_custom_toolbar_message = ANSI(toolbar) return self.last_custom_toolbar_message diff --git a/mycli/main_modes/repl.py b/mycli/main_modes/repl.py index 2292af9d..66eca056 100644 --- a/mycli/main_modes/repl.py +++ b/mycli/main_modes/repl.py @@ -70,12 +70,6 @@ MIN_COMPLETION_TRIGGER = 1 -def _main_module(): - from mycli import main as main_module - - return main_module - - @dataclass(slots=True) class ReplState: iterations: int = 0 @@ -213,8 +207,8 @@ def _output_results( break if mycli.auto_vertical_output: - if mycli.prompt_app is not None: - max_width = mycli.prompt_app.output.get_size().columns + if mycli.prompt_session is not None: + max_width = mycli.prompt_session.output.get_size().columns else: max_width = DEFAULT_WIDTH else: @@ -239,8 +233,8 @@ def _output_results( except KeyboardInterrupt: pass if mycli.beep_after_seconds > 0 and duration >= mycli.beep_after_seconds: - assert mycli.prompt_app is not None - mycli.prompt_app.output.bell() + assert mycli.prompt_session is not None + mycli.prompt_session.output.bell() if special.is_timing_enabled(): mycli.output_timing(f'Time: {duration:0.03f}s') except KeyboardInterrupt: @@ -320,7 +314,7 @@ def _build_prompt_session( else: editing_mode = EditingMode.EMACS - mycli.prompt_app = PromptSession( + mycli.prompt_session = PromptSession( color_depth=ColorDepth.DEPTH_24_BIT if 'truecolor' in os.getenv('COLORTERM', '').lower() else None, lexer=PygmentsLexer(MyCliLexer), reserve_space_for_menu=mycli.get_reserved_space(), @@ -351,9 +345,9 @@ def _build_prompt_session( ) if mycli.key_bindings == 'vi': - mycli.prompt_app.app.ttimeoutlen = mycli.vi_ttimeoutlen + mycli.prompt_session.app.ttimeoutlen = mycli.vi_ttimeoutlen else: - mycli.prompt_app.app.ttimeoutlen = mycli.emacs_ttimeoutlen + mycli.prompt_session.app.ttimeoutlen = mycli.emacs_ttimeoutlen def _one_iteration( @@ -368,9 +362,9 @@ def _one_iteration( if text is None: try: - assert mycli.prompt_app is not None - loaded_message_fn = partial(_get_prompt_message, mycli, mycli.prompt_app.app) - text = mycli.prompt_app.prompt( + assert mycli.prompt_session is not None + loaded_message_fn = partial(_get_prompt_message, mycli, mycli.prompt_session.app) + text = mycli.prompt_session.prompt( inputhook=inputhook, message=loaded_message_fn, ) @@ -420,8 +414,8 @@ def _one_iteration( click.echo('---') if special.is_timing_enabled(): mycli.output_timing(f'Time: {duration:.2f} seconds') - assert mycli.prompt_app is not None - text = mycli.prompt_app.prompt( + assert mycli.prompt_session is not None + text = mycli.prompt_session.prompt( default=sql or '', inputhook=inputhook, message=loaded_message_fn, diff --git a/mycli/packages/key_binding_utils.py b/mycli/packages/key_binding_utils.py index 887b1fa7..cdf8af6a 100644 --- a/mycli/packages/key_binding_utils.py +++ b/mycli/packages/key_binding_utils.py @@ -75,8 +75,8 @@ def handle_editor_command( raise RuntimeError(message) while True: try: - assert isinstance(mycli.prompt_app, PromptSession) - text = mycli.prompt_app.prompt( + assert isinstance(mycli.prompt_session, PromptSession) + text = mycli.prompt_session.prompt( default=sql, inputhook=inputhook, message=loaded_message_fn, diff --git a/test/pytests/test_clitoolbar.py b/test/pytests/test_clitoolbar.py index 71c64d66..cffb5fd9 100644 --- a/test/pytests/test_clitoolbar.py +++ b/test/pytests/test_clitoolbar.py @@ -21,7 +21,7 @@ def make_mycli( return SimpleNamespace( completer=SimpleNamespace(smart_completion=smart_completion), multi_line=multi_line, - prompt_app=SimpleNamespace(editing_mode=editing_mode), + prompt_session=SimpleNamespace(editing_mode=editing_mode), toolbar_error_message=toolbar_error_message, completion_refresher=SimpleNamespace(is_refreshing=MagicMock(return_value=refreshing)), get_custom_toolbar=MagicMock(return_value="custom toolbar"), diff --git a/test/pytests/test_key_binding_utils.py b/test/pytests/test_key_binding_utils.py index 248d3616..bbb3d619 100644 --- a/test/pytests/test_key_binding_utils.py +++ b/test/pytests/test_key_binding_utils.py @@ -35,10 +35,10 @@ class FakeMyCli: def __init__( self, *, - prompt_app: FakePromptSession | None = None, + prompt_session: FakePromptSession | None = None, last_query: str = 'last query', ) -> None: - self.prompt_app = prompt_app + self.prompt_session = prompt_session self.last_query = last_query self.toolbar_error_message: str | None = None @@ -83,8 +83,8 @@ def test_handle_editor_command_returns_text_unchanged_when_not_editor_command(mo def test_handle_editor_command_opens_editor_reprompts_after_keyboard_interrupt_and_returns_text(monkeypatch: pytest.MonkeyPatch) -> None: - prompt_app = FakePromptSession([KeyboardInterrupt(), 'edited sql']) - mycli = FakeMyCli(prompt_app=prompt_app) + prompt_session = FakePromptSession([KeyboardInterrupt(), 'edited sql']) + mycli = FakeMyCli(prompt_session=prompt_session) open_calls: list[dict[str, str]] = [] def inputhook(*args: object, **kwargs: object) -> None: @@ -111,14 +111,14 @@ def open_external_editor(*, filename: str | None, sql: str) -> tuple[str, str | assert result == 'edited sql' assert open_calls == [{'filename': 'query.sql', 'sql': 'last query'}] - assert prompt_app.prompt_calls == [ + assert prompt_session.prompt_calls == [ {'default': 'SELECT 1', 'inputhook': inputhook, 'message': loaded_message_fn}, {'default': '', 'inputhook': inputhook, 'message': loaded_message_fn}, ] def test_handle_editor_command_uses_explicit_editor_query_and_raises_on_editor_error(monkeypatch: pytest.MonkeyPatch) -> None: - mycli = FakeMyCli(prompt_app=FakePromptSession([])) + mycli = FakeMyCli(prompt_session=FakePromptSession([])) monkeypatch.setattr(key_binding_utils.special, 'editor_command', lambda text: True) monkeypatch.setattr(key_binding_utils.special, 'get_filename', lambda text: 'query.sql') diff --git a/test/pytests/test_main.py b/test/pytests/test_main.py index bcfccaac..1c4562b7 100644 --- a/test/pytests/test_main.py +++ b/test/pytests/test_main.py @@ -719,11 +719,11 @@ class TestExecute: def server_type(self): return ["test"] - class PromptBuffer: + class TestPromptSession: output = TestOutput() app = None - m.prompt_app = PromptBuffer() + m.prompt_session = TestPromptSession() m.sqlexecute = TestExecute() m.explicit_pager = explicit_pager diff --git a/test/pytests/test_main_modes_repl.py b/test/pytests/test_main_modes_repl.py index 771566a1..496fa2c9 100644 --- a/test/pytests/test_main_modes_repl.py +++ b/test/pytests/test_main_modes_repl.py @@ -12,7 +12,6 @@ import pymysql import pytest -import mycli.main as main_module import mycli.main_modes.repl as repl_mode from mycli.packages.sqlresult import SQLResult @@ -151,7 +150,7 @@ def make_repl_cli(sqlexecute: Any | None = None) -> Any: cli.null_string = '' cli.numeric_alignment = 'right' cli.binary_display = None - cli.prompt_app = None + cli.prompt_session = None cli.post_redirect_command = None cli.logfile = None cli.smart_completion = False @@ -274,12 +273,11 @@ def test_complete_while_typing_filter_covers_threshold_and_word_rules(monkeypatc assert repl_mode.complete_while_typing_filter() is True -def test_repl_main_module_and_create_history(monkeypatch: pytest.MonkeyPatch) -> None: +def test_repl_create_history(monkeypatch: pytest.MonkeyPatch) -> None: cli = make_repl_cli() monkeypatch.setenv('MYCLI_HISTFILE', '~/override-history') monkeypatch.setattr(repl_mode, 'dir_path_exists', lambda path: True) monkeypatch.setattr(repl_mode, 'FileHistoryWithTimestamp', lambda path: f'history:{path}') - assert repl_mode._main_module() is main_module history = cast(Any, repl_mode._create_history(cli)) assert history == f'history:{os.path.expanduser("~/override-history")}' @@ -352,7 +350,7 @@ def run(self, text: str) -> list[SQLResult]: cli = make_repl_cli(FakeSQLExecute()) cli.auto_vertical_output = True - cli.prompt_app = FakePromptSession(columns=91) + cli.prompt_session = FakePromptSession(columns=91) cli.beep_after_seconds = 0.1 cli.show_warnings = True state = repl_mode.ReplState() @@ -381,7 +379,7 @@ def format_sqlresult(result: SQLResult, **kwargs: Any) -> Iterator[str]: assert state.mutating is True assert format_widths[:2] == [91, 91] - assert cli.prompt_app.output.bell_count == 2 + assert cli.prompt_session.output.bell_count == 2 assert '' in cli.echo_calls assert any(is_warnings_style is True for _, _, is_warnings_style in cli.output_calls) assert any(is_warnings_style is False for _, is_warnings_style in cli.timing_calls) @@ -496,7 +494,7 @@ def fake_toolbar_tokens(mycli: Any, show_help: Any, fmt: str) -> str: assert first_kwargs['bottom_toolbar'] is None assert first_kwargs['complete_style'] == repl_mode.CompleteStyle.MULTI_COLUMN assert first_kwargs['editing_mode'] == repl_mode.EditingMode.VI - assert cli.prompt_app.app.ttimeoutlen == cli.vi_ttimeoutlen + assert cli.prompt_session.app.ttimeoutlen == cli.vi_ttimeoutlen cli.toolbar_format = 'default' cli.key_bindings = 'emacs' @@ -508,7 +506,7 @@ def fake_toolbar_tokens(mycli: Any, show_help: Any, fmt: str) -> str: assert latest_kwargs['complete_style'] == repl_mode.CompleteStyle.COLUMN assert latest_kwargs['editing_mode'] == repl_mode.EditingMode.EMACS assert toolbar_help == [True] - assert cli.prompt_app.app.ttimeoutlen == cli.emacs_ttimeoutlen + assert cli.prompt_session.app.ttimeoutlen == cli.emacs_ttimeoutlen assert latest_kwargs['prompt_continuation'](4, 0, 0) == [('class:continuation', ' > ')] @@ -516,14 +514,14 @@ def test_one_iteration_handles_prompt_interrupt_empty_editor_clip_and_clip_true( patch_repl_runtime_defaults(monkeypatch) cli = make_repl_cli(SimpleNamespace(run=lambda text: iter([SQLResult(status='ok')]), conn=FakeConnection())) cli.keepalive_ticks = 1 - cli.prompt_app = FakePromptSession([KeyboardInterrupt(), ' ', 'edit-error', 'clip-error', 'clip-stop']) + cli.prompt_session = FakePromptSession([KeyboardInterrupt(), ' ', 'edit-error', 'clip-error', 'clip-stop']) repl_mode._one_iteration(cli, repl_mode.ReplState()) assert cli.query_history == [] repl_mode._one_iteration(cli, repl_mode.ReplState()) assert cli.query_history == [] - inputhook = cli.prompt_app.prompt_calls[-1]['inputhook'] + inputhook = cli.prompt_session.prompt_calls[-1]['inputhook'] assert inputhook is not None inputhook(None) @@ -562,7 +560,7 @@ def run(self, text: str) -> Iterator[SQLResult]: lambda text, cur, dbname, field_truncate, section_truncate: ('context', 'select 1', 1.25), ) cli = make_repl_cli(FakeSQLExecute()) - cli.prompt_app = FakePromptSession(['\\llm ask', 'select 1']) + cli.prompt_session = FakePromptSession(['\\llm ask', 'select 1']) repl_mode._one_iteration( cli, repl_mode.ReplState(), @@ -571,7 +569,7 @@ def run(self, text: str) -> Iterator[SQLResult]: assert cli.output_calls[0][0] == ['None', 'ran:select 1'] cli_finish = make_repl_cli(FakeSQLExecute()) - cli_finish.prompt_app = FakePromptSession(['\\llm finish']) + cli_finish.prompt_session = FakePromptSession(['\\llm finish']) cli_finish.format_sqlresult = lambda result, **kwargs: iter([result.status_plain or 'row']) monkeypatch.setattr( repl_mode.special, @@ -582,7 +580,7 @@ def run(self, text: str) -> Iterator[SQLResult]: assert cli_finish.output_calls[0][0] == ['done'] cli_empty = make_repl_cli(FakeSQLExecute()) - cli_empty.prompt_app = FakePromptSession(['\\llm empty']) + cli_empty.prompt_session = FakePromptSession(['\\llm empty']) monkeypatch.setattr( repl_mode.special, 'handle_llm', @@ -592,7 +590,7 @@ def run(self, text: str) -> Iterator[SQLResult]: assert cli_empty.output_calls == [] cli_err = make_repl_cli(FakeSQLExecute()) - cli_err.prompt_app = FakePromptSession(['\\llm err']) + cli_err.prompt_session = FakePromptSession(['\\llm err']) monkeypatch.setattr( repl_mode.special, 'handle_llm', @@ -602,7 +600,7 @@ def run(self, text: str) -> Iterator[SQLResult]: assert 'llm boom' in cli_err.echo_calls[-1] cli_interrupt = make_repl_cli(FakeSQLExecute()) - cli_interrupt.prompt_app = FakePromptSession(['\\llm stop']) + cli_interrupt.prompt_session = FakePromptSession(['\\llm stop']) monkeypatch.setattr( repl_mode.special, 'handle_llm', @@ -612,7 +610,7 @@ def run(self, text: str) -> Iterator[SQLResult]: assert cli_interrupt.output_calls == [] cli_quiet = make_repl_cli(FakeSQLExecute()) - cli_quiet.prompt_app = FakePromptSession(['\\llm quiet', 'select 2']) + cli_quiet.prompt_session = FakePromptSession(['\\llm quiet', 'select 2']) monkeypatch.setattr(repl_mode.special, 'is_timing_enabled', lambda: False) monkeypatch.setattr( repl_mode.special, @@ -845,7 +843,7 @@ def test_main_repl_covers_setup_loop_and_goodbye(monkeypatch: pytest.MonkeyPatch monkeypatch.setattr( repl_mode, '_build_prompt_session', - lambda mycli, state, history, key_bindings: setattr(mycli, 'prompt_app', FakePromptSession()), + lambda mycli, state, history, key_bindings: setattr(mycli, 'prompt_session', FakePromptSession()), ) def fake_one_iteration(mycli: Any, state: repl_mode.ReplState) -> None: @@ -877,7 +875,7 @@ def test_main_repl_covers_no_refresh_and_quiet_exit(monkeypatch: pytest.MonkeyPa monkeypatch.setattr( repl_mode, '_build_prompt_session', - lambda mycli, state, history, key_bindings: setattr(mycli, 'prompt_app', FakePromptSession()), + lambda mycli, state, history, key_bindings: setattr(mycli, 'prompt_session', FakePromptSession()), ) monkeypatch.setattr(repl_mode, '_one_iteration', lambda mycli, state: (_ for _ in ()).throw(EOFError())) monkeypatch.setattr(repl_mode.special, 'close_tee', lambda: None) @@ -897,7 +895,7 @@ def run(self, text: str) -> list[SQLResult]: cli = make_repl_cli(WarninglessSQLExecute()) cli.show_warnings = True cli.auto_vertical_output = False - cli.prompt_app = FakePromptSession(columns=77) + cli.prompt_session = FakePromptSession(columns=77) monkeypatch.setattr(repl_mode, 'Cursor', FakeCursorBase) monkeypatch.setattr(repl_mode, 'is_mutating', lambda status: False) monkeypatch.setattr(repl_mode, 'confirm', lambda text: True) diff --git a/test/pytests/test_main_regression.py b/test/pytests/test_main_regression.py index 596ad639..4452574b 100644 --- a/test/pytests/test_main_regression.py +++ b/test/pytests/test_main_regression.py @@ -219,7 +219,7 @@ def make_bare_mycli() -> Any: cli.show_warnings = False cli.query_history = [] cli.toolbar_error_message = None - cli.prompt_app = None + cli.prompt_session = None cli.last_prompt_message = main.ANSI('') cli.last_custom_toolbar_message = main.ANSI('') cli.prompt_lines = 0 @@ -1024,7 +1024,7 @@ def __int__(self) -> int: def test_handle_editor_clip_and_output_timing(monkeypatch: pytest.MonkeyPatch) -> None: cli = make_bare_mycli() monkeypatch.setattr(key_binding_utils, 'PromptSession', FakePromptSession) - cli.prompt_app = cast(Any, FakePromptSession(responses=[KeyboardInterrupt(), 'edited sql'])) + cli.prompt_session = cast(Any, FakePromptSession(responses=[KeyboardInterrupt(), 'edited sql'])) cli.get_last_query = lambda: 'last query' # type: ignore[assignment] monkeypatch.setattr(main.special, 'editor_command', lambda text: text.endswith(r'\e')) monkeypatch.setattr(main.special, 'get_filename', lambda text: 'query.sql') @@ -1144,7 +1144,7 @@ def failing_connect() -> None: cli.prompt_lines = 0 prompt_session = FakePromptSession() prompt_session.app.render_counter = 3 - cli.prompt_app = cast(Any, prompt_session) + cli.prompt_session = cast(Any, prompt_session) cli.get_prompt = lambda string, render_counter: 'line1\nline2' # type: ignore[assignment] monkeypatch.setattr(main.special, 'is_timing_enabled', lambda: True) assert main.MyCli.get_output_margin(cli, 'status\nline') == 13 @@ -1162,13 +1162,13 @@ def failing_connect() -> None: assert echoed_lines == [] assert printed_status - cli.prompt_app = None + cli.prompt_session = None assert main.to_plain_text(main.MyCli.get_custom_toolbar(cli, 'fmt')) == '' - cli.prompt_app = cast(Any, SimpleNamespace(app=None)) + cli.prompt_session = cast(Any, SimpleNamespace(app=None)) assert main.to_plain_text(main.MyCli.get_custom_toolbar(cli, 'fmt')) == '' monkeypatch.setattr(main.sys.stderr, 'isatty', lambda: False) - cli.prompt_app = cast(Any, FakePromptSession()) + cli.prompt_session = cast(Any, FakePromptSession()) cli.terminal_tab_title_format = 'tab' cli.terminal_window_title_format = 'window' cli.multiplex_window_title_format = 'mux-window' @@ -1285,7 +1285,7 @@ def format_output(self, rows: Any, header: Any, format_name: str | None = None, assert list(main.MyCli.format_sqlresult(cli, result, max_width=10)) == ['short', 'second'] assert list(main.MyCli.format_sqlresult(cli, result, max_width=2)) == ['vertical-a', 'vertical-b'] - cli.prompt_app = None + cli.prompt_session = None cli.terminal_tab_title_format = 'tab' cli.terminal_window_title_format = 'window' cli.multiplex_window_title_format = 'mux-window' @@ -1302,7 +1302,7 @@ def test_output_uses_stdout_and_pager_paths(monkeypatch: pytest.MonkeyPatch) -> cli = make_bare_mycli() cli.explicit_pager = False cli.prompt_lines = 1 - cli.prompt_app = None + cli.prompt_session = None cli.log_output = lambda text: None # type: ignore[assignment] monkeypatch.setattr(main.special, 'write_tee', lambda text: None) monkeypatch.setattr(main.special, 'write_once', lambda text: None) @@ -1334,7 +1334,7 @@ def test_format_sqlresult_output_and_prompt_helpers_cover_extra_branches(monkeyp cli.get_reserved_space = lambda: 1 # type: ignore[assignment] cli.get_prompt = lambda string, render_counter: 'a\nb' # type: ignore[assignment] cli.prompt_lines = 0 - cli.prompt_app = None + cli.prompt_session = None monkeypatch.setattr(main, 'Cursor', FakeCursorBase) monkeypatch.setattr(main.special, 'is_timing_enabled', lambda: False) rows = FakeCursorBase(rows=[], rowcount=0, description=[('id', 3, None, None, None, None, None)]) @@ -1425,7 +1425,7 @@ def test_completion_helpers_title_helpers_thanks_tips(monkeypatch: pytest.Monkey cli._completer_lock = cast(Any, ReusableLock(lambda: entered_lock.__setitem__('count', entered_lock['count'] + 1))) prompt_session = FakePromptSession() prompt_session.app.current_buffer.text = '' - cli.prompt_app = cast(Any, prompt_session) + cli.prompt_session = cast(Any, prompt_session) cli.get_prompt = lambda string, render_counter: f'title:{string}' # type: ignore[assignment] monkeypatch.setattr(main, 'sanitize_terminal_title', lambda title: title.upper()) monkeypatch.setattr(main.sys.stderr, 'isatty', lambda: True) @@ -1444,9 +1444,9 @@ def test_completion_helpers_title_helpers_thanks_tips(monkeypatch: pytest.Monkey monkeypatch.setattr(main.sys.stderr, 'isatty', lambda: False) main.MyCli.set_external_multiplex_pane_title(cli) - cli.prompt_app.app.current_buffer.text = 'in progress' + cli.prompt_session.app.current_buffer.text = 'in progress' assert main.MyCli.get_custom_toolbar(cli, 'x') == cli.last_custom_toolbar_message - cli.prompt_app.app.current_buffer.text = '' + cli.prompt_session.app.current_buffer.text = '' assert 'title:x' in str(main.MyCli.get_custom_toolbar(cli, 'x')) new_completer = cast(Any, SimpleNamespace(get_completions=lambda document, event: ['done'])) @@ -2636,7 +2636,7 @@ def run(self, text: str) -> Iterator[SQLResult]: assert any('Encountered error while cancelling query' in line for line in echoes) -def test_run_cli_auto_vertical_uses_default_width_when_prompt_app_is_cleared(monkeypatch: pytest.MonkeyPatch) -> None: +def test_run_cli_auto_vertical_uses_default_width_when_prompt_session_is_cleared(monkeypatch: pytest.MonkeyPatch) -> None: cli = make_bare_mycli() cli.config = {'history_file': '~/.mycli-history-testing'} cli.auto_vertical_output = True @@ -2653,7 +2653,7 @@ def fake_format_default_width(result: Any, **kwargs: Any) -> Iterator[str]: cli.format_sqlresult = fake_format_default_width # type: ignore[assignment] prompt_session = FakePromptSession(responses=['select 1', EOFError()]) - cli.output = lambda formatted, result, is_warnings_style=False: setattr(cli, 'prompt_app', prompt_session) # type: ignore[assignment] + cli.output = lambda formatted, result, is_warnings_style=False: setattr(cli, 'prompt_session', prompt_session) # type: ignore[assignment] class FakeRunSQLExecute: def __init__(self) -> None: @@ -2665,7 +2665,7 @@ def __init__(self) -> None: self.user = 'root' def run(self, text: str) -> Iterator[SQLResult]: - cli.prompt_app = None + cli.prompt_session = None return iter([SQLResult(status='ok')]) monkeypatch.setattr(main, 'SQLExecute', FakeRunSQLExecute)