From 8c01a5520d55a136bf655683203c3c9bca56f467 Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev Date: Sat, 24 Aug 2024 07:01:55 +0300 Subject: [PATCH 1/7] gh-123228: fix return type for _ReadlineWrapper.get_line_buffer() --- Lib/_pyrepl/readline.py | 7 +++---- Lib/test/test_pyrepl/test_pyrepl.py | 4 +++- .../Library/2024-08-24-06-05-41.gh-issue-123228.jR_5O5.rst | 3 +++ 3 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2024-08-24-06-05-41.gh-issue-123228.jR_5O5.rst diff --git a/Lib/_pyrepl/readline.py b/Lib/_pyrepl/readline.py index 143770a885a2c2..483eb1039fa062 100644 --- a/Lib/_pyrepl/readline.py +++ b/Lib/_pyrepl/readline.py @@ -479,15 +479,14 @@ def add_history(self, line: str) -> None: def set_startup_hook(self, function: Callback | None = None) -> None: self.startup_hook = function - def get_line_buffer(self) -> bytes: - buf_str = self.get_reader().get_unicode() - return buf_str.encode(ENCODING) + def get_line_buffer(self) -> str: + return self.get_reader().get_unicode() def _get_idxs(self) -> tuple[int, int]: start = cursor = self.get_reader().pos buf = self.get_line_buffer() for i in range(cursor - 1, -1, -1): - if str(buf[i]) in self.get_completer_delims(): + if buf[i] in self.get_completer_delims(): break start = i return start, cursor diff --git a/Lib/test/test_pyrepl/test_pyrepl.py b/Lib/test/test_pyrepl/test_pyrepl.py index b03cf136ec5c78..03b4c205d5f36a 100644 --- a/Lib/test/test_pyrepl/test_pyrepl.py +++ b/Lib/test/test_pyrepl/test_pyrepl.py @@ -26,7 +26,8 @@ make_clean_env, ) from _pyrepl.console import Event -from _pyrepl.readline import ReadlineAlikeReader, ReadlineConfig +from _pyrepl.readline import (ReadlineAlikeReader, ReadlineConfig, + get_line_buffer) from _pyrepl.readline import multiline_input as readline_multiline_input try: @@ -515,6 +516,7 @@ def test_basic(self): output = multiline_input(reader) self.assertEqual(output, "1+1") self.assertEqual(clean_screen(reader.screen), "1+1") + self.assertIs(type(get_line_buffer()), str) def test_multiline_edit(self): events = itertools.chain( diff --git a/Misc/NEWS.d/next/Library/2024-08-24-06-05-41.gh-issue-123228.jR_5O5.rst b/Misc/NEWS.d/next/Library/2024-08-24-06-05-41.gh-issue-123228.jR_5O5.rst new file mode 100644 index 00000000000000..99b3c0ca5eef28 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-08-24-06-05-41.gh-issue-123228.jR_5O5.rst @@ -0,0 +1,3 @@ +Fix return type for +:func:`!_pyrepl.readline._ReadlineWrapper.get_line_buffer` to be +:func:`str`. Patch by Sergey B Kirpichev. From e66522932cffae867f31a6ccfe080d8d4f33063e Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev Date: Sat, 24 Aug 2024 11:07:01 +0300 Subject: [PATCH 2/7] +1 --- Lib/test/test_pyrepl/test_pyrepl.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Lib/test/test_pyrepl/test_pyrepl.py b/Lib/test/test_pyrepl/test_pyrepl.py index 03b4c205d5f36a..abfcee802e9730 100644 --- a/Lib/test/test_pyrepl/test_pyrepl.py +++ b/Lib/test/test_pyrepl/test_pyrepl.py @@ -516,6 +516,9 @@ def test_basic(self): output = multiline_input(reader) self.assertEqual(output, "1+1") self.assertEqual(clean_screen(reader.screen), "1+1") + + # skip, if readline module is not available + import_module('readline') self.assertIs(type(get_line_buffer()), str) def test_multiline_edit(self): From 119362b65fc19ee6d00026a6e53266b1f40ac04d Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev Date: Sat, 24 Aug 2024 11:22:59 +0300 Subject: [PATCH 3/7] + revert tests --- Lib/test/test_pyrepl/test_pyrepl.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Lib/test/test_pyrepl/test_pyrepl.py b/Lib/test/test_pyrepl/test_pyrepl.py index abfcee802e9730..b03cf136ec5c78 100644 --- a/Lib/test/test_pyrepl/test_pyrepl.py +++ b/Lib/test/test_pyrepl/test_pyrepl.py @@ -26,8 +26,7 @@ make_clean_env, ) from _pyrepl.console import Event -from _pyrepl.readline import (ReadlineAlikeReader, ReadlineConfig, - get_line_buffer) +from _pyrepl.readline import ReadlineAlikeReader, ReadlineConfig from _pyrepl.readline import multiline_input as readline_multiline_input try: @@ -517,10 +516,6 @@ def test_basic(self): self.assertEqual(output, "1+1") self.assertEqual(clean_screen(reader.screen), "1+1") - # skip, if readline module is not available - import_module('readline') - self.assertIs(type(get_line_buffer()), str) - def test_multiline_edit(self): events = itertools.chain( code_to_events("def f():\n...\n\n"), From 989c8f307118e6ec7d707b93c67ffbd3d26f25db Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev Date: Sat, 24 Aug 2024 15:38:35 +0300 Subject: [PATCH 4/7] Revert "+ revert tests" This reverts commit 119362b65fc19ee6d00026a6e53266b1f40ac04d. --- Lib/test/test_pyrepl/test_pyrepl.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_pyrepl/test_pyrepl.py b/Lib/test/test_pyrepl/test_pyrepl.py index b03cf136ec5c78..abfcee802e9730 100644 --- a/Lib/test/test_pyrepl/test_pyrepl.py +++ b/Lib/test/test_pyrepl/test_pyrepl.py @@ -26,7 +26,8 @@ make_clean_env, ) from _pyrepl.console import Event -from _pyrepl.readline import ReadlineAlikeReader, ReadlineConfig +from _pyrepl.readline import (ReadlineAlikeReader, ReadlineConfig, + get_line_buffer) from _pyrepl.readline import multiline_input as readline_multiline_input try: @@ -516,6 +517,10 @@ def test_basic(self): self.assertEqual(output, "1+1") self.assertEqual(clean_screen(reader.screen), "1+1") + # skip, if readline module is not available + import_module('readline') + self.assertIs(type(get_line_buffer()), str) + def test_multiline_edit(self): events = itertools.chain( code_to_events("def f():\n...\n\n"), From 510594f7bc5385dc2b64c31adeceb0b0b0114fd9 Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev Date: Sat, 24 Aug 2024 15:46:39 +0300 Subject: [PATCH 5/7] + restore tests --- Lib/test/test_pyrepl/test_pyrepl.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_pyrepl/test_pyrepl.py b/Lib/test/test_pyrepl/test_pyrepl.py index abfcee802e9730..7c7e5468f31f4f 100644 --- a/Lib/test/test_pyrepl/test_pyrepl.py +++ b/Lib/test/test_pyrepl/test_pyrepl.py @@ -1,3 +1,4 @@ +import curses import io import itertools import os @@ -517,9 +518,10 @@ def test_basic(self): self.assertEqual(output, "1+1") self.assertEqual(clean_screen(reader.screen), "1+1") - # skip, if readline module is not available - import_module('readline') - self.assertIs(type(get_line_buffer()), str) + try: + self.assertIs(type(get_line_buffer()), str) + except curses.error: + pass def test_multiline_edit(self): events = itertools.chain( From 9cab99d5d97dd7d5db4f21611a24ec5fdb943a9f Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev Date: Sat, 24 Aug 2024 16:29:40 +0300 Subject: [PATCH 6/7] + drop import --- Lib/test/test_pyrepl/test_pyrepl.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Lib/test/test_pyrepl/test_pyrepl.py b/Lib/test/test_pyrepl/test_pyrepl.py index 7c7e5468f31f4f..4e8c5b183d4f09 100644 --- a/Lib/test/test_pyrepl/test_pyrepl.py +++ b/Lib/test/test_pyrepl/test_pyrepl.py @@ -1,4 +1,3 @@ -import curses import io import itertools import os From 604e7721b843f9d9f083c35b6cd5180b61ab8517 Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev Date: Sat, 24 Aug 2024 17:07:51 +0300 Subject: [PATCH 7/7] adjust test Co-authored-by: Carl Friedrich Bolz-Tereick --- Lib/test/test_pyrepl/test_pyrepl.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_pyrepl/test_pyrepl.py b/Lib/test/test_pyrepl/test_pyrepl.py index 4e8c5b183d4f09..58078d6ff11b39 100644 --- a/Lib/test/test_pyrepl/test_pyrepl.py +++ b/Lib/test/test_pyrepl/test_pyrepl.py @@ -27,7 +27,7 @@ ) from _pyrepl.console import Event from _pyrepl.readline import (ReadlineAlikeReader, ReadlineConfig, - get_line_buffer) + _ReadlineWrapper) from _pyrepl.readline import multiline_input as readline_multiline_input try: @@ -517,10 +517,10 @@ def test_basic(self): self.assertEqual(output, "1+1") self.assertEqual(clean_screen(reader.screen), "1+1") - try: - self.assertIs(type(get_line_buffer()), str) - except curses.error: - pass + def test_get_line_buffer_returns_str(self): + reader = self.prepare_reader(code_to_events("\n")) + wrapper = _ReadlineWrapper(reader=reader) + self.assertIs(type(wrapper.get_line_buffer()), str) def test_multiline_edit(self): events = itertools.chain(