From 3d674cf113377a95ba937ab64007ca18018cc49d Mon Sep 17 00:00:00 2001 From: Sergey Miryanov Date: Mon, 3 Mar 2025 23:57:04 +0500 Subject: [PATCH 1/5] Fix support of typing unicode chars in pyrepl --- Lib/_pyrepl/base_eventqueue.py | 9 +++++++-- Lib/test/test_pyrepl/test_eventqueue.py | 7 +++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Lib/_pyrepl/base_eventqueue.py b/Lib/_pyrepl/base_eventqueue.py index 9cae1db112a838..e4aa75692a104e 100644 --- a/Lib/_pyrepl/base_eventqueue.py +++ b/Lib/_pyrepl/base_eventqueue.py @@ -74,8 +74,13 @@ def push(self, char: int | bytes) -> 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: + char = bytes(char.encode(self.encoding)) + 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 diff --git a/Lib/test/test_pyrepl/test_eventqueue.py b/Lib/test/test_pyrepl/test_eventqueue.py index a1bac38fbd43f5..b25bdb956b0d14 100644 --- a/Lib/test/test_pyrepl/test_eventqueue.py +++ b/Lib/test/test_pyrepl/test_eventqueue.py @@ -123,6 +123,13 @@ def test_push_unrecognized_escape_sequence(self): 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): From c1f3aa828e067a7666b2e3665979aa0c0dd9c605 Mon Sep 17 00:00:00 2001 From: Sergey Miryanov Date: Tue, 4 Mar 2025 00:45:49 +0500 Subject: [PATCH 2/5] Make mypy happy --- Lib/_pyrepl/base_eventqueue.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/_pyrepl/base_eventqueue.py b/Lib/_pyrepl/base_eventqueue.py index e4aa75692a104e..cfeb489b5d556e 100644 --- a/Lib/_pyrepl/base_eventqueue.py +++ b/Lib/_pyrepl/base_eventqueue.py @@ -69,7 +69,7 @@ def insert(self, event: Event) -> None: 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. """ From ef0d0ee2a98822a1b6bc34158242b8e1dbff0421 Mon Sep 17 00:00:00 2001 From: Sergey Miryanov Date: Tue, 4 Mar 2025 00:51:53 +0500 Subject: [PATCH 3/5] Add assert to check if passed char is str --- Lib/_pyrepl/base_eventqueue.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/_pyrepl/base_eventqueue.py b/Lib/_pyrepl/base_eventqueue.py index cfeb489b5d556e..dd0adb3d0ccdc5 100644 --- a/Lib/_pyrepl/base_eventqueue.py +++ b/Lib/_pyrepl/base_eventqueue.py @@ -75,6 +75,7 @@ def push(self, char: int | bytes | str) -> None: """ ord_char = char if isinstance(char, int) else ord(char) if ord_char > 255: + assert isinstance(char, str) char = bytes(char.encode(self.encoding)) self.buf.extend(char) else: From bfa2e4e7095dd4c3eba3819f7b2f28798ebef136 Mon Sep 17 00:00:00 2001 From: Sergey Miryanov Date: Tue, 11 Mar 2025 01:06:57 +0500 Subject: [PATCH 4/5] Update Lib/_pyrepl/base_eventqueue.py Co-authored-by: Petr Viktorin --- Lib/_pyrepl/base_eventqueue.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/_pyrepl/base_eventqueue.py b/Lib/_pyrepl/base_eventqueue.py index dd0adb3d0ccdc5..e018c4fc18308e 100644 --- a/Lib/_pyrepl/base_eventqueue.py +++ b/Lib/_pyrepl/base_eventqueue.py @@ -76,7 +76,7 @@ def push(self, char: int | bytes | str) -> None: ord_char = char if isinstance(char, int) else ord(char) if ord_char > 255: assert isinstance(char, str) - char = bytes(char.encode(self.encoding)) + char = bytes(char.encode(self.encoding, "replace")) self.buf.extend(char) else: char = bytes(bytearray((ord_char,))) From 7cc16ea0dcf8f7db13412c4cbc2ad95ee70d06b7 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Mon, 10 Mar 2025 21:46:43 +0000 Subject: [PATCH 5/5] Add NEWS entry --- .../2025-03-10-21-46-37.gh-issue-130804.0PpcTx.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-03-10-21-46-37.gh-issue-130804.0PpcTx.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-03-10-21-46-37.gh-issue-130804.0PpcTx.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-03-10-21-46-37.gh-issue-130804.0PpcTx.rst new file mode 100644 index 00000000000000..37a9b83c858331 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-03-10-21-46-37.gh-issue-130804.0PpcTx.rst @@ -0,0 +1 @@ +Fix support of unicode characters on Windows in the new REPL.