Skip to content

Commit 483c2c6

Browse files
committed
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.
1 parent cd40b95 commit 483c2c6

File tree

10 files changed

+77
-85
lines changed

10 files changed

+77
-85
lines changed

changelog.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ Internal
3939
* Move `--execute` logic to the new `main_modes` with `--batch`.
4040
* Move `--list-dsn` logic to the new `main_modes` with `--batch`.
4141
* Move `--list-ssh-config` logic to the new `main_modes` with `--batch`.
42-
* Move REPL logic to the new `main_modes`.
42+
* Move REPL logic to the new `main_modes`, and refactor the REPL.
4343
* Sort coverage report in tox suite.
4444
* Skip more tests when a database connection is not present.
4545
* Move SQL utilities to a new `sql_utils.py`.

mycli/clitoolbar.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def get_toolbar_tokens() -> list[tuple[str, str]]:
3838
result.append(("class:bottom-toolbar", "[F3] Multiline:"))
3939
result.append(("class:bottom-toolbar.off", "OFF"))
4040

41-
if mycli.prompt_app.editing_mode == EditingMode.VI:
41+
if mycli.prompt_session.editing_mode == EditingMode.VI:
4242
result.append(divider)
4343
result.append(("class:bottom-toolbar", "Vi:"))
4444
result.append(("class:bottom-toolbar.on", _get_vi_mode()))

mycli/main.py

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ def __init__(
153153
self.defaults_suffix = defaults_suffix
154154
self.login_path = login_path
155155
self.toolbar_error_message: str | None = None
156-
self.prompt_app: PromptSession | None = None
156+
self.prompt_session: PromptSession | None = None
157157
self._keepalive_counter = 0
158158
self.keepalive_ticks: int | None = 0
159159

@@ -291,7 +291,7 @@ def __init__(
291291
self.terminal_window_title_format = c['main']['terminal_window_title']
292292
self.multiplex_window_title_format = c['main']['multiplex_window_title']
293293
self.multiplex_pane_title_format = c['main']['multiplex_pane_title']
294-
self.prompt_app = None
294+
self.prompt_session = None
295295
self.destructive_keywords = [
296296
keyword for keyword in c["main"].get("destructive_keywords", "DROP SHUTDOWN DELETE TRUNCATE ALTER UPDATE").split(' ') if keyword
297297
]
@@ -904,8 +904,8 @@ def get_output_margin(self, status: str | None = None) -> int:
904904
"""Get the output margin (number of rows for the prompt, footer and
905905
timing message."""
906906
if not self.prompt_lines:
907-
if self.prompt_app and self.prompt_app.app:
908-
render_counter = self.prompt_app.app.render_counter
907+
if self.prompt_session and self.prompt_session.app:
908+
render_counter = self.prompt_session.app.render_counter
909909
else:
910910
render_counter = 0
911911
self.prompt_lines = self.get_prompt(self.prompt_format, render_counter).count('\n') + 1
@@ -933,8 +933,8 @@ def output(
933933
934934
"""
935935
if output:
936-
if self.prompt_app is not None:
937-
size = self.prompt_app.output.get_size()
936+
if self.prompt_session is not None:
937+
size = self.prompt_session.output.get_size()
938938
size_columns = size.columns
939939
size_rows = size.rows
940940
else:
@@ -1036,10 +1036,10 @@ def _on_completions_refreshed(self, new_completer: SQLCompleter) -> None:
10361036
with self._completer_lock:
10371037
self.completer = new_completer
10381038

1039-
if self.prompt_app:
1039+
if self.prompt_session:
10401040
# After refreshing, redraw the CLI to clear the statusbar
10411041
# "Refreshing completions..." indicator
1042-
self.prompt_app.app.invalidate()
1042+
self.prompt_session.app.invalidate()
10431043

10441044
def get_completions(self, text: str, cursor_position: int) -> Iterable[Completion]:
10451045
with self._completer_lock:
@@ -1054,22 +1054,22 @@ def set_all_external_titles(self) -> None:
10541054
def set_external_terminal_tab_title(self) -> None:
10551055
if not self.terminal_tab_title_format:
10561056
return
1057-
if not self.prompt_app:
1057+
if not self.prompt_session:
10581058
return
10591059
if not sys.stderr.isatty():
10601060
return
1061-
title = sanitize_terminal_title(self.get_prompt(self.terminal_tab_title_format, self.prompt_app.app.render_counter))
1061+
title = sanitize_terminal_title(self.get_prompt(self.terminal_tab_title_format, self.prompt_session.app.render_counter))
10621062
print(f'\x1b]1;{title}\a', file=sys.stderr, end='')
10631063
sys.stderr.flush()
10641064

10651065
def set_external_terminal_window_title(self) -> None:
10661066
if not self.terminal_window_title_format:
10671067
return
1068-
if not self.prompt_app:
1068+
if not self.prompt_session:
10691069
return
10701070
if not sys.stderr.isatty():
10711071
return
1072-
title = sanitize_terminal_title(self.get_prompt(self.terminal_window_title_format, self.prompt_app.app.render_counter))
1072+
title = sanitize_terminal_title(self.get_prompt(self.terminal_window_title_format, self.prompt_session.app.render_counter))
10731073
print(f'\x1b]2;{title}\a', file=sys.stderr, end='')
10741074
sys.stderr.flush()
10751075

@@ -1078,9 +1078,9 @@ def set_external_multiplex_window_title(self) -> None:
10781078
return
10791079
if not os.getenv('TMUX'):
10801080
return
1081-
if not self.prompt_app:
1081+
if not self.prompt_session:
10821082
return
1083-
title = sanitize_terminal_title(self.get_prompt(self.multiplex_window_title_format, self.prompt_app.app.render_counter))
1083+
title = sanitize_terminal_title(self.get_prompt(self.multiplex_window_title_format, self.prompt_session.app.render_counter))
10841084
try:
10851085
subprocess.run(
10861086
['tmux', 'rename-window', title],
@@ -1097,22 +1097,22 @@ def set_external_multiplex_pane_title(self) -> None:
10971097
return
10981098
if not os.getenv('TMUX'):
10991099
return
1100-
if not self.prompt_app:
1100+
if not self.prompt_session:
11011101
return
11021102
if not sys.stderr.isatty():
11031103
return
1104-
title = sanitize_terminal_title(self.get_prompt(self.multiplex_pane_title_format, self.prompt_app.app.render_counter))
1104+
title = sanitize_terminal_title(self.get_prompt(self.multiplex_pane_title_format, self.prompt_session.app.render_counter))
11051105
print(f'\x1b]2;{title}\x1b\\', file=sys.stderr, end='')
11061106
sys.stderr.flush()
11071107

11081108
def get_custom_toolbar(self, toolbar_format: str) -> ANSI:
1109-
if not self.prompt_app:
1109+
if not self.prompt_session:
11101110
return ANSI('')
1111-
if not self.prompt_app.app:
1111+
if not self.prompt_session.app:
11121112
return ANSI('')
1113-
if self.prompt_app.app.current_buffer.text:
1113+
if self.prompt_session.app.current_buffer.text:
11141114
return self.last_custom_toolbar_message
1115-
toolbar = self.get_prompt(toolbar_format, self.prompt_app.app.render_counter)
1115+
toolbar = self.get_prompt(toolbar_format, self.prompt_session.app.render_counter)
11161116
toolbar = toolbar.replace("\\x1b", "\x1b")
11171117
self.last_custom_toolbar_message = ANSI(toolbar)
11181118
return self.last_custom_toolbar_message

mycli/main_modes/repl.py

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,6 @@
7070
MIN_COMPLETION_TRIGGER = 1
7171

7272

73-
def _main_module():
74-
from mycli import main as main_module
75-
76-
return main_module
77-
78-
7973
@dataclass(slots=True)
8074
class ReplState:
8175
iterations: int = 0
@@ -213,8 +207,8 @@ def _output_results(
213207
break
214208

215209
if mycli.auto_vertical_output:
216-
if mycli.prompt_app is not None:
217-
max_width = mycli.prompt_app.output.get_size().columns
210+
if mycli.prompt_session is not None:
211+
max_width = mycli.prompt_session.output.get_size().columns
218212
else:
219213
max_width = DEFAULT_WIDTH
220214
else:
@@ -239,8 +233,8 @@ def _output_results(
239233
except KeyboardInterrupt:
240234
pass
241235
if mycli.beep_after_seconds > 0 and duration >= mycli.beep_after_seconds:
242-
assert mycli.prompt_app is not None
243-
mycli.prompt_app.output.bell()
236+
assert mycli.prompt_session is not None
237+
mycli.prompt_session.output.bell()
244238
if special.is_timing_enabled():
245239
mycli.output_timing(f'Time: {duration:0.03f}s')
246240
except KeyboardInterrupt:
@@ -320,7 +314,7 @@ def _build_prompt_session(
320314
else:
321315
editing_mode = EditingMode.EMACS
322316

323-
mycli.prompt_app = PromptSession(
317+
mycli.prompt_session = PromptSession(
324318
color_depth=ColorDepth.DEPTH_24_BIT if 'truecolor' in os.getenv('COLORTERM', '').lower() else None,
325319
lexer=PygmentsLexer(MyCliLexer),
326320
reserve_space_for_menu=mycli.get_reserved_space(),
@@ -351,9 +345,9 @@ def _build_prompt_session(
351345
)
352346

353347
if mycli.key_bindings == 'vi':
354-
mycli.prompt_app.app.ttimeoutlen = mycli.vi_ttimeoutlen
348+
mycli.prompt_session.app.ttimeoutlen = mycli.vi_ttimeoutlen
355349
else:
356-
mycli.prompt_app.app.ttimeoutlen = mycli.emacs_ttimeoutlen
350+
mycli.prompt_session.app.ttimeoutlen = mycli.emacs_ttimeoutlen
357351

358352

359353
def _one_iteration(
@@ -368,9 +362,9 @@ def _one_iteration(
368362

369363
if text is None:
370364
try:
371-
assert mycli.prompt_app is not None
372-
loaded_message_fn = partial(_get_prompt_message, mycli, mycli.prompt_app.app)
373-
text = mycli.prompt_app.prompt(
365+
assert mycli.prompt_session is not None
366+
loaded_message_fn = partial(_get_prompt_message, mycli, mycli.prompt_session.app)
367+
text = mycli.prompt_session.prompt(
374368
inputhook=inputhook,
375369
message=loaded_message_fn,
376370
)
@@ -420,8 +414,8 @@ def _one_iteration(
420414
click.echo('---')
421415
if special.is_timing_enabled():
422416
mycli.output_timing(f'Time: {duration:.2f} seconds')
423-
assert mycli.prompt_app is not None
424-
text = mycli.prompt_app.prompt(
417+
assert mycli.prompt_session is not None
418+
text = mycli.prompt_session.prompt(
425419
default=sql or '',
426420
inputhook=inputhook,
427421
message=loaded_message_fn,

mycli/packages/key_binding_utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ def handle_editor_command(
7575
raise RuntimeError(message)
7676
while True:
7777
try:
78-
assert isinstance(mycli.prompt_app, PromptSession)
79-
text = mycli.prompt_app.prompt(
78+
assert isinstance(mycli.prompt_session, PromptSession)
79+
text = mycli.prompt_session.prompt(
8080
default=sql,
8181
inputhook=inputhook,
8282
message=loaded_message_fn,

test/pytests/test_clitoolbar.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def make_mycli(
2121
return SimpleNamespace(
2222
completer=SimpleNamespace(smart_completion=smart_completion),
2323
multi_line=multi_line,
24-
prompt_app=SimpleNamespace(editing_mode=editing_mode),
24+
prompt_session=SimpleNamespace(editing_mode=editing_mode),
2525
toolbar_error_message=toolbar_error_message,
2626
completion_refresher=SimpleNamespace(is_refreshing=MagicMock(return_value=refreshing)),
2727
get_custom_toolbar=MagicMock(return_value="custom toolbar"),

test/pytests/test_key_binding_utils.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ class FakeMyCli:
3535
def __init__(
3636
self,
3737
*,
38-
prompt_app: FakePromptSession | None = None,
38+
prompt_session: FakePromptSession | None = None,
3939
last_query: str = 'last query',
4040
) -> None:
41-
self.prompt_app = prompt_app
41+
self.prompt_session = prompt_session
4242
self.last_query = last_query
4343
self.toolbar_error_message: str | None = None
4444

@@ -83,8 +83,8 @@ def test_handle_editor_command_returns_text_unchanged_when_not_editor_command(mo
8383

8484

8585
def test_handle_editor_command_opens_editor_reprompts_after_keyboard_interrupt_and_returns_text(monkeypatch: pytest.MonkeyPatch) -> None:
86-
prompt_app = FakePromptSession([KeyboardInterrupt(), 'edited sql'])
87-
mycli = FakeMyCli(prompt_app=prompt_app)
86+
prompt_session = FakePromptSession([KeyboardInterrupt(), 'edited sql'])
87+
mycli = FakeMyCli(prompt_session=prompt_session)
8888
open_calls: list[dict[str, str]] = []
8989

9090
def inputhook(*args: object, **kwargs: object) -> None:
@@ -111,14 +111,14 @@ def open_external_editor(*, filename: str | None, sql: str) -> tuple[str, str |
111111

112112
assert result == 'edited sql'
113113
assert open_calls == [{'filename': 'query.sql', 'sql': 'last query'}]
114-
assert prompt_app.prompt_calls == [
114+
assert prompt_session.prompt_calls == [
115115
{'default': 'SELECT 1', 'inputhook': inputhook, 'message': loaded_message_fn},
116116
{'default': '', 'inputhook': inputhook, 'message': loaded_message_fn},
117117
]
118118

119119

120120
def test_handle_editor_command_uses_explicit_editor_query_and_raises_on_editor_error(monkeypatch: pytest.MonkeyPatch) -> None:
121-
mycli = FakeMyCli(prompt_app=FakePromptSession([]))
121+
mycli = FakeMyCli(prompt_session=FakePromptSession([]))
122122

123123
monkeypatch.setattr(key_binding_utils.special, 'editor_command', lambda text: True)
124124
monkeypatch.setattr(key_binding_utils.special, 'get_filename', lambda text: 'query.sql')

test/pytests/test_main.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -719,11 +719,11 @@ class TestExecute:
719719
def server_type(self):
720720
return ["test"]
721721

722-
class PromptBuffer:
722+
class TestPromptSession:
723723
output = TestOutput()
724724
app = None
725725

726-
m.prompt_app = PromptBuffer()
726+
m.prompt_session = TestPromptSession()
727727
m.sqlexecute = TestExecute()
728728
m.explicit_pager = explicit_pager
729729

0 commit comments

Comments
 (0)