[3.13] gh-130804: Fix support of typing unicode chars in pyrepl (GH-130805) (GH-133462)

(cherry picked from commit 7c98b0674d)

Co-authored-by: Sergey Miryanov <sergey.miryanov@gmail.com>
This commit is contained in:
Łukasz Langa 2025-05-05 21:39:21 +02:00 committed by GitHub
parent e4d68488bc
commit 76f52c434c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 17 additions and 3 deletions

View file

@ -69,13 +69,19 @@ class BaseEventQueue:
trace('added event {event}', event=event)
self.events.append(event)
def push(self, char: int | bytes) -> None:
def push(self, char: int | bytes | str) -> None:
"""
Processes a character by updating the buffer and handling special key mappings.
"""
ord_char = char if isinstance(char, int) else ord(char)
char = bytes(bytearray((ord_char,)))
self.buf.append(ord_char)
if ord_char > 255:
assert isinstance(char, str)
char = bytes(char.encode(self.encoding, "replace"))
self.buf.extend(char)
else:
char = bytes(bytearray((ord_char,)))
self.buf.append(ord_char)
if char in self.keymap:
if self.keymap is self.compiled_keymap:
# sanity check, buffer is empty when a special key comes

View file

@ -123,6 +123,13 @@ class EventQueueTestBase:
self.assertEqual(eq.events[2].evt, "key")
self.assertEqual(eq.events[2].data, "Z")
def test_push_unicode_character(self):
eq = self.make_eventqueue()
eq.keymap = {}
eq.push("ч")
self.assertEqual(eq.events[0].evt, "key")
self.assertEqual(eq.events[0].data, "ч")
@unittest.skipIf(support.MS_WINDOWS, "No Unix event queue on Windows")
class TestUnixEventQueue(EventQueueTestBase, unittest.TestCase):

View file

@ -0,0 +1 @@
Fix support of unicode characters on Windows in the new REPL.