[3.13] gh-119553: Clear reader on Ctrl-C command (GH-119801) (#120062)

(cherry picked from commit 010ea93b2b)

Co-authored-by: Lysandros Nikolaou <lisandrosnik@gmail.com>
Co-authored-by: Łukasz Langa <lukasz@langa.pl>
This commit is contained in:
Miss Islington (bot) 2024-06-04 20:45:22 +02:00 committed by GitHub
parent fd5428d2d1
commit 93b95e91fa
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 19 additions and 0 deletions

View file

@ -221,6 +221,7 @@ class interrupt(FinishCommand):
class ctrl_c(Command): class ctrl_c(Command):
def do(self) -> None: def do(self) -> None:
self.reader.finish()
raise KeyboardInterrupt raise KeyboardInterrupt

View file

@ -75,6 +75,8 @@ def handle_all_events(
reader.handle1() reader.handle1()
except StopIteration: except StopIteration:
pass pass
except KeyboardInterrupt:
pass
return reader, console return reader, console

View file

@ -179,6 +179,22 @@ class TestReader(TestCase):
self.assert_screen_equals(reader, expected) self.assert_screen_equals(reader, expected)
self.assertTrue(reader.finished) self.assertTrue(reader.finished)
def test_keyboard_interrupt_clears_screen(self):
namespace = {"itertools": itertools}
code = "import itertools\nitertools."
events = itertools.chain(code_to_events(code), [
Event(evt='key', data='\t', raw=bytearray(b'\t')), # Two tabs for completion
Event(evt='key', data='\t', raw=bytearray(b'\t')),
Event(evt='key', data='\x03', raw=bytearray(b'\x03')), # Ctrl-C
])
completing_reader = functools.partial(
prepare_reader,
readline_completer=rlcompleter.Completer(namespace).complete
)
reader, _ = handle_all_events(events, prepare_reader=completing_reader)
self.assertEqual(reader.calc_screen(), code.split("\n"))
def test_prompt_length(self): def test_prompt_length(self):
# Handles simple ASCII prompt # Handles simple ASCII prompt
ps1 = ">>> " ps1 = ">>> "