gh-69605: Add module autocomplete to PyREPL (#129329)

This commit is contained in:
Tomas R. 2025-04-25 03:24:26 +02:00 committed by GitHub
parent 22c9886c8e
commit c3a7118065
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 588 additions and 1 deletions

View file

@ -39,6 +39,7 @@ from rlcompleter import Completer as RLCompleter
from . import commands, historical_reader
from .completing_reader import CompletingReader
from .console import Console as ConsoleType
from ._module_completer import ModuleCompleter, make_default_module_completer
Console: type[ConsoleType]
_error: tuple[type[Exception], ...] | type[Exception]
@ -99,7 +100,7 @@ __all__ = [
class ReadlineConfig:
readline_completer: Completer | None = None
completer_delims: frozenset[str] = frozenset(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?")
module_completer: ModuleCompleter = field(default_factory=make_default_module_completer)
@dataclass(kw_only=True)
class ReadlineAlikeReader(historical_reader.HistoricalReader, CompletingReader):
@ -132,6 +133,8 @@ class ReadlineAlikeReader(historical_reader.HistoricalReader, CompletingReader):
return "".join(b[p + 1 : self.pos])
def get_completions(self, stem: str) -> list[str]:
if module_completions := self.get_module_completions():
return module_completions
if len(stem) == 0 and self.more_lines is not None:
b = self.buffer
p = self.pos
@ -161,6 +164,10 @@ class ReadlineAlikeReader(historical_reader.HistoricalReader, CompletingReader):
result.sort()
return result
def get_module_completions(self) -> list[str]:
line = self.get_line()
return self.config.module_completer.get_completions(line)
def get_trimmed_history(self, maxlength: int) -> list[str]:
if maxlength >= 0:
cut = len(self.history) - maxlength