Skip to content

Commit 93b95e9

Browse files
miss-islingtonlysnikolaouambv
authored
[3.13] gh-119553: Clear reader on Ctrl-C command (GH-119801) (#120062)
(cherry picked from commit 010ea93) Co-authored-by: Lysandros Nikolaou <[email protected]> Co-authored-by: Łukasz Langa <[email protected]>
1 parent fd5428d commit 93b95e9

File tree

3 files changed

+19
-0
lines changed

3 files changed

+19
-0
lines changed

Lib/_pyrepl/commands.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ def do(self) -> None:
221221

222222
class ctrl_c(Command):
223223
def do(self) -> None:
224+
self.reader.finish()
224225
raise KeyboardInterrupt
225226

226227

Lib/test/test_pyrepl/support.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ def handle_all_events(
7575
reader.handle1()
7676
except StopIteration:
7777
pass
78+
except KeyboardInterrupt:
79+
pass
7880
return reader, console
7981

8082

Lib/test/test_pyrepl/test_reader.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,22 @@ def test_newline_within_block_trailing_whitespace(self):
179179
self.assert_screen_equals(reader, expected)
180180
self.assertTrue(reader.finished)
181181

182+
def test_keyboard_interrupt_clears_screen(self):
183+
namespace = {"itertools": itertools}
184+
code = "import itertools\nitertools."
185+
events = itertools.chain(code_to_events(code), [
186+
Event(evt='key', data='\t', raw=bytearray(b'\t')), # Two tabs for completion
187+
Event(evt='key', data='\t', raw=bytearray(b'\t')),
188+
Event(evt='key', data='\x03', raw=bytearray(b'\x03')), # Ctrl-C
189+
])
190+
191+
completing_reader = functools.partial(
192+
prepare_reader,
193+
readline_completer=rlcompleter.Completer(namespace).complete
194+
)
195+
reader, _ = handle_all_events(events, prepare_reader=completing_reader)
196+
self.assertEqual(reader.calc_screen(), code.split("\n"))
197+
182198
def test_prompt_length(self):
183199
# Handles simple ASCII prompt
184200
ps1 = ">>> "

0 commit comments

Comments
 (0)