gh-134235: Import Autocomplete for Builtin Modules (GH-134277)

* added enhancement auto completing import with sys builtins

---------

Co-authored-by: Hunter <hyoung3@gmail.com>
This commit is contained in:
Tom Wang 2025-05-19 17:21:30 -04:00 committed by GitHub
parent 470941782f
commit 8421b03b16
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 25 additions and 2 deletions

View file

@ -81,8 +81,9 @@ class ModuleCompleter:
def _find_modules(self, path: str, prefix: str) -> list[str]:
if not path:
# Top-level import (e.g. `import foo<tab>`` or `from foo<tab>`)`
return [name for _, name, _ in self.global_cache
if name.startswith(prefix)]
builtin_modules = [name for name in sys.builtin_module_names if name.startswith(prefix)]
third_party_modules = [name for _, name, _ in self.global_cache if name.startswith(prefix)]
return sorted(builtin_modules + third_party_modules)
if path.startswith('.'):
# Convert relative path to absolute path

View file

@ -959,6 +959,26 @@ class TestPyReplModuleCompleter(TestCase):
output = reader.readline()
self.assertEqual(output, expected)
def test_builtin_completion_top_level(self):
import importlib
# Make iter_modules() search only the standard library.
# This makes the test more reliable in case there are
# other user packages/scripts on PYTHONPATH which can
# intefere with the completions.
lib_path = os.path.dirname(importlib.__path__[0])
sys.path = [lib_path]
cases = (
("import bui\t\n", "import builtins"),
("from bui\t\n", "from builtins"),
)
for code, expected in cases:
with self.subTest(code=code):
events = code_to_events(code)
reader = self.prepare_reader(events, namespace={})
output = reader.readline()
self.assertEqual(output, expected)
def test_relative_import_completions(self):
cases = (
("from .readl\t\n", "from .readline"),

View file

@ -0,0 +1,2 @@
Updated tab completion on REPL to include builtin modules. Contributed by
Tom Wang, Hunter Young