]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-134235: Import Autocomplete for Builtin Modules (GH-134277)
authorTom Wang <85062819+tommix626@users.noreply.github.com>
Mon, 19 May 2025 21:21:30 +0000 (17:21 -0400)
committerGitHub <noreply@github.com>
Mon, 19 May 2025 21:21:30 +0000 (14:21 -0700)
* added enhancement auto completing import with sys builtins

---------

Co-authored-by: Hunter <hyoung3@gmail.com>
Lib/_pyrepl/_module_completer.py
Lib/test/test_pyrepl/test_pyrepl.py
Misc/NEWS.d/next/Library/2025-05-19-15-05-24.gh-issue-134235.pz9PwV.rst [new file with mode: 0644]

index 347f05607c75c5128afb133f98f05582416e051b..0606797226d1e04268fe0fa0c743301c3f57d2f0 100644 (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
index a1cfbe4c3cadb7310c31cc79d00828d0dc965e67..59f5d1f893f9fd81be45caf9ebdd58b35c879536 100644 (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"),
diff --git a/Misc/NEWS.d/next/Library/2025-05-19-15-05-24.gh-issue-134235.pz9PwV.rst b/Misc/NEWS.d/next/Library/2025-05-19-15-05-24.gh-issue-134235.pz9PwV.rst
new file mode 100644 (file)
index 0000000..a65df88
--- /dev/null
@@ -0,0 +1,2 @@
+Updated tab completion on REPL to include builtin modules. Contributed by
+Tom Wang, Hunter Young