Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-119205: Fix autocompletion bug in new repl #119229

Merged
merged 15 commits into from
May 21, 2024
Merged
4 changes: 3 additions & 1 deletion Lib/_pyrepl/readline.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

from __future__ import annotations

import warnings
from dataclasses import dataclass, field

import os
Expand Down Expand Up @@ -301,7 +302,8 @@ def multiline_input(self, more_lines: MoreLinesCallable, ps1: str, ps2: str) ->
reader.more_lines = more_lines
reader.ps1 = reader.ps2 = ps1
reader.ps3 = reader.ps4 = ps2
return reader.readline(), reader.was_paste_mode_activated
with warnings.catch_warnings(action="ignore"):
return reader.readline(), reader.was_paste_mode_activated
finally:
reader.more_lines = saved
reader.paste_mode = False
Expand Down
30 changes: 24 additions & 6 deletions Lib/test/test_pyrepl/test_pyrepl.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
import itertools
import io
import os
import rlcompleter
import unittest
from unittest import TestCase
from unittest.mock import patch

from .support import FakeConsole, handle_all_events, handle_events_narrow_console, multiline_input, code_to_events
from .support import FakeConsole, handle_all_events, handle_events_narrow_console
from .support import more_lines, multiline_input, code_to_events
from _pyrepl.console import Event
from _pyrepl.readline import ReadlineAlikeReader, ReadlineConfig
from _pyrepl.readline import multiline_input as readline_multiline_input


class TestCursorPosition(TestCase):
Expand Down Expand Up @@ -475,6 +478,25 @@ def test_updown_arrow_with_completion_menu(self):
output = multiline_input(reader, namespace)
self.assertEqual(output, "os.")

@patch("_pyrepl.readline._ReadlineWrapper.get_reader")
@patch("sys.stderr", new_callable=io.StringIO)
def test_completion_with_warnings(self, mock_stderr, mock_get_reader):
class Dummy:
@property
def test_func(self):
import warnings
warnings.warn("warnings\n")
return None

dummy = Dummy()
events = code_to_events("dummy.test_func.\t\n\n")
namespace = {"dummy": dummy}
reader = self.prepare_reader(events, namespace)
mock_get_reader.return_value = reader
output = readline_multiline_input(more_lines, ">>>", "...")
self.assertEqual(output[0], "dummy.test_func.__")
self.assertEqual(mock_stderr.getvalue(), "")


class TestPasteEvent(TestCase):
def prepare_reader(self, events):
Expand Down Expand Up @@ -633,7 +655,3 @@ def test_bracketed_paste_single_line(self):
reader = self.prepare_reader(events)
output = multiline_input(reader)
self.assertEqual(output, input_code)


if __name__ == "__main__":
unittest.main()
2 changes: 1 addition & 1 deletion Lib/test/test_pyrepl/test_unix_eventqueue.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@


@patch("_pyrepl.curses.tigetstr", lambda x: b"")
class TestUnivEventQueue(unittest.TestCase):
class TestUnixEventQueue(unittest.TestCase):
def setUp(self):
self.file = tempfile.TemporaryFile()

Expand Down
Loading