summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/_pyrepl/reader.py10
-rw-r--r--Lib/test/test_pyrepl.py9
2 files changed, 16 insertions, 3 deletions
diff --git a/Lib/_pyrepl/reader.py b/Lib/_pyrepl/reader.py
index e36f65c..d84c164 100644
--- a/Lib/_pyrepl/reader.py
+++ b/Lib/_pyrepl/reader.py
@@ -568,12 +568,16 @@ class Reader:
"""`cmd` is a tuple of "event_name" and "event", which in the current
implementation is always just the "buffer" which happens to be a list
of single-character strings."""
- assert isinstance(cmd[0], str)
trace("received command {cmd}", cmd=cmd)
- command_type = self.commands.get(cmd[0], commands.invalid_command)
- command = command_type(self, *cmd) # type: ignore[arg-type]
+ if isinstance(cmd[0], str):
+ command_type = self.commands.get(cmd[0], commands.invalid_command)
+ elif isinstance(cmd[0], type):
+ command_type = cmd[0]
+ else:
+ return # nothing to do
+ command = command_type(self, *cmd) # type: ignore[arg-type]
command.do()
self.after_command(command)
diff --git a/Lib/test/test_pyrepl.py b/Lib/test/test_pyrepl.py
index b7ae91b..bb9e36b 100644
--- a/Lib/test/test_pyrepl.py
+++ b/Lib/test/test_pyrepl.py
@@ -976,6 +976,15 @@ class TestReader(TestCase):
reader.setpos_from_xy(0, 1)
self.assertEqual(reader.pos, 9)
+ def test_up_arrow_after_ctrl_r(self):
+ events = iter([
+ Event(evt='key', data='\x12', raw=bytearray(b'\x12')),
+ Event(evt='key', data='up', raw=bytearray(b'\x1bOA')),
+ ])
+
+ reader, _ = handle_all_events(events)
+ self.assert_screen_equals(reader, "")
+
if __name__ == "__main__":
unittest.main()