Skip to content

Commit 3c13f86

Browse files
committed
Do not suggest modules which are not legal identifiers
1 parent 75e4b55 commit 3c13f86

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

Lib/_pyrepl/readline.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -658,6 +658,12 @@ def complete(self, from_name: str | None, name: str | None) -> list[str]:
658658

659659
def find_modules(self, path: str, prefix: str) -> list[str]:
660660
"""Find all modules under 'path' that start with 'prefix'."""
661+
modules = self._find_modules(path, prefix)
662+
# Filter out invalid module names
663+
# (for example those containing dashes that cannot be imported with 'import')
664+
return [mod for mod in modules if mod.isidentifier()]
665+
666+
def _find_modules(self, path: str, prefix: str) -> list[str]:
661667
if not path:
662668
# Top-level import (e.g. `import foo<tab>`` or `from foo<tab>`)`
663669
return [name for _, name, _ in self.global_cache

Lib/test/test_pyrepl/test_pyrepl.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -938,6 +938,23 @@ def test_relative_import_completions(self):
938938
output = reader.readline()
939939
self.assertEqual(output, expected)
940940

941+
@patch("pkgutil.iter_modules", lambda: [(None, 'valid_name', None),
942+
(None, 'invalid-name', None)])
943+
def test_invalid_identifiers(self):
944+
# Make sure modules which are not valid identifiers
945+
# are not suggested as those cannot be imported via 'import'.
946+
cases = (
947+
("import valid\t\n", "import valid_name"),
948+
# 'invalid-name' contains a dash and should not be completed
949+
("import invalid\t\n", "import invalid"),
950+
)
951+
for code, expected in cases:
952+
with self.subTest(code=code):
953+
events = code_to_events(code)
954+
reader = self.prepare_reader(events, namespace={})
955+
output = reader.readline()
956+
self.assertEqual(output, expected)
957+
941958
def test_get_path_and_prefix(self):
942959
cases = (
943960
('', ('', '')),

0 commit comments

Comments
 (0)