Skip to content

Commit f194db6

Browse files
committed
Revert "Fix NoConsoleScreenBufferError on Windows CI by robustly initializing PromptSession and ensuring consistent input/output usage"
This reverts commit c263b38.
1 parent d0bf798 commit f194db6

File tree

2 files changed

+18
-62
lines changed

2 files changed

+18
-62
lines changed

cmd2/cmd2.py

Lines changed: 10 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
cast,
6464
)
6565

66+
import prompt_toolkit as pt
6667
import rich.box
6768
from rich.console import Group, RenderableType
6869
from rich.highlighter import ReprHighlighter
@@ -143,26 +144,9 @@
143144
from prompt_toolkit.completion import Completer, DummyCompleter
144145
from prompt_toolkit.formatted_text import ANSI
145146
from prompt_toolkit.history import InMemoryHistory
146-
from prompt_toolkit.input import DummyInput
147-
from prompt_toolkit.output import DummyOutput
148147
from prompt_toolkit.patch_stdout import patch_stdout
149148
from prompt_toolkit.shortcuts import PromptSession, set_title
150149

151-
try:
152-
if sys.platform == "win32":
153-
from prompt_toolkit.output.win32 import NoConsoleScreenBufferError # type: ignore[attr-defined]
154-
else:
155-
156-
class NoConsoleScreenBufferError(Exception): # type: ignore[no-redef]
157-
"""Dummy exception to use when prompt_toolkit.output.win32.NoConsoleScreenBufferError is not available."""
158-
159-
160-
except ImportError:
161-
162-
class NoConsoleScreenBufferError(Exception): # type: ignore[no-redef]
163-
"""Dummy exception to use when prompt_toolkit.output.win32.NoConsoleScreenBufferError is not available."""
164-
165-
166150
from .pt_utils import (
167151
Cmd2Completer,
168152
Cmd2History,
@@ -437,22 +421,10 @@ def __init__(
437421
# Initialize prompt-toolkit PromptSession
438422
self.history_adapter = Cmd2History(self)
439423
self.completer = Cmd2Completer(self)
440-
441-
try:
442-
self.session: PromptSession[str] = PromptSession(
443-
history=self.history_adapter,
444-
completer=self.completer,
445-
)
446-
except (NoConsoleScreenBufferError, AttributeError, ValueError):
447-
# Fallback to dummy input/output if PromptSession initialization fails.
448-
# This can happen in some CI environments (like GitHub Actions on Windows)
449-
# where isatty() is True but there is no real console.
450-
self.session = PromptSession(
451-
history=self.history_adapter,
452-
completer=self.completer,
453-
input=DummyInput(),
454-
output=DummyOutput(),
455-
)
424+
self.session: PromptSession[str] = PromptSession(
425+
history=self.history_adapter,
426+
completer=self.completer,
427+
)
456428

457429
# Commands to exclude from the history command
458430
self.exclude_from_history = ['eof', 'history']
@@ -3254,16 +3226,12 @@ def get_prompt() -> Any:
32543226
history_to_use = InMemoryHistory()
32553227
for item in history:
32563228
history_to_use.append_string(item)
3229+
from prompt_toolkit import prompt as pt_prompt
32573230

3258-
temp_session1: PromptSession[str] = PromptSession(
3259-
history=history_to_use,
3260-
input=self.session.input,
3261-
output=self.session.output,
3262-
)
3263-
3264-
return temp_session1.prompt(
3231+
return pt_prompt(
32653232
prompt_to_use,
32663233
completer=completer_to_use,
3234+
history=history_to_use,
32673235
bottom_toolbar=self._bottom_toolbar,
32683236
)
32693237

@@ -3276,26 +3244,13 @@ def get_prompt() -> Any:
32763244
# Otherwise read from self.stdin
32773245
elif self.stdin.isatty():
32783246
# on a tty, print the prompt first, then read the line
3279-
temp_session2: PromptSession[str] = PromptSession(
3280-
input=self.session.input,
3281-
output=self.session.output,
3282-
)
3283-
line = temp_session2.prompt(
3284-
prompt,
3285-
bottom_toolbar=self._bottom_toolbar,
3286-
)
3247+
line = pt.prompt(prompt, bottom_toolbar=self._bottom_toolbar)
32873248
if len(line) == 0:
32883249
raise EOFError
32893250
return line.rstrip('\n')
32903251
else:
32913252
# not a tty, just read the line
3292-
temp_session3: PromptSession[str] = PromptSession(
3293-
input=self.session.input,
3294-
output=self.session.output,
3295-
)
3296-
line = temp_session3.prompt(
3297-
bottom_toolbar=self._bottom_toolbar,
3298-
)
3253+
line = pt.prompt(bottom_toolbar=self._bottom_toolbar)
32993254
if len(line) == 0:
33003255
raise EOFError
33013256
line = line.rstrip('\n')

tests/test_cmd2.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1918,10 +1918,11 @@ def test_read_input_rawinput_true(capsys, monkeypatch) -> None:
19181918
app = cmd2.Cmd()
19191919
app.use_rawinput = True
19201920

1921-
# Mock PromptSession.prompt (used when isatty=False)
1921+
# Mock prompt_toolkit.prompt (used when isatty=False)
19221922
# and app.session.prompt (used when use_rawinput=True and isatty=True)
19231923
with (
1924-
mock.patch('cmd2.cmd2.PromptSession.prompt', return_value=input_str),
1924+
mock.patch('prompt_toolkit.prompt', return_value=input_str),
1925+
mock.patch.object(app.session, 'prompt', return_value=input_str),
19251926
):
19261927
# isatty is True
19271928
with mock.patch('sys.stdin.isatty', mock.MagicMock(name='isatty', return_value=True)):
@@ -1999,22 +2000,22 @@ def mock_pt_prompt(message='', **kwargs):
19992000

20002001
# isatty True
20012002
app = make_app(isatty=True)
2002-
with mock.patch('cmd2.cmd2.PromptSession.prompt', side_effect=mock_pt_prompt):
2003+
with mock.patch('prompt_toolkit.prompt', side_effect=mock_pt_prompt):
20032004
line = app.read_input(prompt_str)
20042005
out, _err = capsys.readouterr()
20052006
assert line == input_str
20062007
assert out == prompt_str
20072008

20082009
# isatty True, empty input
20092010
app = make_app(isatty=True, empty_input=True)
2010-
with mock.patch('cmd2.cmd2.PromptSession.prompt', return_value=''), pytest.raises(EOFError):
2011+
with mock.patch('prompt_toolkit.prompt', return_value=''), pytest.raises(EOFError):
20112012
app.read_input(prompt_str)
20122013
out, _err = capsys.readouterr()
20132014

20142015
# isatty is False, echo is True
20152016
app = make_app(isatty=False)
20162017
app.echo = True
2017-
with mock.patch('cmd2.cmd2.PromptSession.prompt', return_value=input_str):
2018+
with mock.patch('prompt_toolkit.prompt', return_value=input_str):
20182019
line = app.read_input(prompt_str)
20192020
out, _err = capsys.readouterr()
20202021
assert line == input_str
@@ -2023,15 +2024,15 @@ def mock_pt_prompt(message='', **kwargs):
20232024
# isatty is False, echo is False
20242025
app = make_app(isatty=False)
20252026
app.echo = False
2026-
with mock.patch('cmd2.cmd2.PromptSession.prompt', return_value=input_str):
2027+
with mock.patch('prompt_toolkit.prompt', return_value=input_str):
20272028
line = app.read_input(prompt_str)
20282029
out, _err = capsys.readouterr()
20292030
assert line == input_str
20302031
assert not out
20312032

20322033
# isatty is False, empty input
20332034
app = make_app(isatty=False, empty_input=True)
2034-
with mock.patch('cmd2.cmd2.PromptSession.prompt', return_value=''), pytest.raises(EOFError):
2035+
with mock.patch('prompt_toolkit.prompt', return_value=''), pytest.raises(EOFError):
20352036
app.read_input(prompt_str)
20362037
out, _err = capsys.readouterr()
20372038

0 commit comments

Comments
 (0)