https://github.com/python/cpython/commit/7cbc3ea8fb1b0f1ac082466e4fc99b740357e675
commit: 7cbc3ea8fb1b0f1ac082466e4fc99b740357e675
branch: 3.14
author: Miss Islington (bot) <31488909+miss-isling...@users.noreply.github.com>
committer: gpshead <g...@krypto.org>
date: 2025-05-19T21:46:50Z
summary:

[3.14] gh-134235: Import Autocomplete for Builtin Modules (GH-134277) (#134285)

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

* added enhancement auto completing import with sys builtins

---------
(cherry picked from commit 8421b03b16a4852a527256cb7cdce2ab2d318548)

Co-authored-by: Tom Wang <85062819+tommix...@users.noreply.github.com>
Co-authored-by: Hunter <hyou...@gmail.com>

files:
A Misc/NEWS.d/next/Library/2025-05-19-15-05-24.gh-issue-134235.pz9PwV.rst
M Lib/_pyrepl/_module_completer.py
M Lib/test/test_pyrepl/test_pyrepl.py

diff --git a/Lib/_pyrepl/_module_completer.py b/Lib/_pyrepl/_module_completer.py
index 347f05607c75c5..0606797226d1e0 100644
--- a/Lib/_pyrepl/_module_completer.py
+++ b/Lib/_pyrepl/_module_completer.py
@@ -81,8 +81,9 @@ def find_modules(self, path: str, prefix: str) -> list[str]:
     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
diff --git a/Lib/test/test_pyrepl/test_pyrepl.py 
b/Lib/test/test_pyrepl/test_pyrepl.py
index a1cfbe4c3cadb7..59f5d1f893f9fd 100644
--- a/Lib/test/test_pyrepl/test_pyrepl.py
+++ b/Lib/test/test_pyrepl/test_pyrepl.py
@@ -959,6 +959,26 @@ def test_import_completions(self):
                 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
index 00000000000000..a65df886919145
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-05-19-15-05-24.gh-issue-134235.pz9PwV.rst
@@ -0,0 +1,2 @@
+Updated tab completion on REPL to include builtin modules. Contributed by
+Tom Wang, Hunter Young

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: arch...@mail-archive.com

Reply via email to