https://github.com/python/cpython/commit/e9922178100e17f0264dd943ac838b2f7e8cfdab
commit: e9922178100e17f0264dd943ac838b2f7e8cfdab
branch: 3.13
author: Miss Islington (bot) <[email protected]>
committer: lysnikolaou <[email protected]>
date: 2024-05-22T01:28:24Z
summary:

[3.13] gh-118877: Fix AssertionError crash in pyrepl (GH-118936) (#119363)

(cherry picked from commit c0d81b256604a1079349d82d136db43eefcb3df1)

Co-authored-by: Daniel Hollas <[email protected]>

files:
M Lib/_pyrepl/commands.py
M Lib/test/test_pyrepl.py

diff --git a/Lib/_pyrepl/commands.py b/Lib/_pyrepl/commands.py
index 456cba0769c952..51c7afebede5a8 100644
--- a/Lib/_pyrepl/commands.py
+++ b/Lib/_pyrepl/commands.py
@@ -34,9 +34,7 @@
 
 # types
 if False:
-    from .reader import Reader
     from .historical_reader import HistoricalReader
-    from .console import Event
 
 
 class Command:
@@ -245,7 +243,7 @@ def do(self) -> None:
             x, y = r.pos2xy()
             new_y = y - 1
 
-            if new_y < 0:
+            if r.bol() == 0:
                 if r.historyi > 0:
                     r.select_item(r.historyi - 1)
                     return
diff --git a/Lib/test/test_pyrepl.py b/Lib/test/test_pyrepl.py
index c8990b699b214c..ee6ba658f11e39 100644
--- a/Lib/test/test_pyrepl.py
+++ b/Lib/test/test_pyrepl.py
@@ -607,6 +607,30 @@ def test_global_namespace_completion(self):
         output = multiline_input(reader, namespace)
         self.assertEqual(output, "python")
 
+    def test_updown_arrow_with_completion_menu(self):
+        """Up arrow in the middle of unfinished tab completion when the menu 
is displayed
+        should work and trigger going back in history. Down arrow should 
subsequently
+        get us back to the incomplete command."""
+        code = "import os\nos.\t\t"
+        namespace = {"os": os}
+
+        events = itertools.chain(
+            code_to_events(code),
+            [
+                Event(evt='key', data='up', raw=bytearray(b'\x1bOA')),
+                Event(evt="key", data="down", raw=bytearray(b"\x1bOB")),
+            ],
+            code_to_events("\n")
+        )
+        reader = self.prepare_reader(events, namespace=namespace)
+        output = multiline_input(reader, namespace)
+        # This is the first line, nothing to see here
+        self.assertEqual(output, "import os")
+        # This is the second line. We pressed up and down arrows
+        # so we should end up where we were when we initiated tab completion.
+        output = multiline_input(reader, namespace)
+        self.assertEqual(output, "os.")
+
 
 @patch("_pyrepl.curses.tigetstr", lambda x: b"")
 class TestUnivEventQueue(TestCase):
@@ -1001,6 +1025,5 @@ def test_up_arrow_after_ctrl_r(self):
         reader, _ = handle_all_events(events)
         self.assert_screen_equals(reader, "")
 
-
 if __name__ == '__main__':
     unittest.main()

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]

Reply via email to