Skip to content

Commit

Permalink
[3.13] gh-118908: Fix completions after namespace change in REPL (GH-…
Browse files Browse the repository at this point in the history
…120370) (#120392)

(cherry picked from commit 02e74c3)

Co-authored-by: Lysandros Nikolaou <[email protected]>
  • Loading branch information
miss-islington and lysnikolaou authored Jun 12, 2024
1 parent 8f5ce42 commit 10821cc
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 5 deletions.
13 changes: 10 additions & 3 deletions Lib/_pyrepl/readline.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@
from collections.abc import Callable, Collection
from .types import Callback, Completer, KeySpec, CommandName

TYPE_CHECKING = False

if TYPE_CHECKING:
from typing import Any


MoreLinesCallable = Callable[[str], bool]

Expand Down Expand Up @@ -92,7 +97,7 @@

@dataclass
class ReadlineConfig:
readline_completer: Completer | None = RLCompleter().complete
readline_completer: Completer | None = None
completer_delims: frozenset[str] = frozenset(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?")


Expand Down Expand Up @@ -554,7 +559,7 @@ def stub(*args: object, **kwds: object) -> None:
# ____________________________________________________________


def _setup() -> None:
def _setup(namespace: dict[str, Any]) -> None:
global raw_input
if raw_input is not None:
return # don't run _setup twice
Expand All @@ -570,9 +575,11 @@ def _setup() -> None:
_wrapper.f_in = f_in
_wrapper.f_out = f_out

# set up namespace in rlcompleter
_wrapper.config.readline_completer = RLCompleter(namespace).complete

# this is not really what readline.c does. Better than nothing I guess
import builtins

raw_input = builtins.input
builtins.input = _wrapper.input

Expand Down
4 changes: 2 additions & 2 deletions Lib/_pyrepl/simple_interact.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,9 +96,9 @@ def run_multiline_interactive_console(
console: code.InteractiveConsole | None = None,
) -> None:
from .readline import _setup
_setup()

namespace = mainmodule.__dict__ if mainmodule else DEFAULT_NAMESPACE
_setup(namespace)

if console is None:
console = InteractiveColoredConsole(
namespace, filename="<stdin>"
Expand Down

0 comments on commit 10821cc

Please sign in to comment.