Skip to content

Commit 654d707

Browse files
committed
Insert "import" only when module name is complete
1 parent c33fefb commit 654d707

File tree

2 files changed

+17
-14
lines changed

2 files changed

+17
-14
lines changed

Lib/_pyrepl/_module_completer.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,9 @@ def complete(self, from_name: str | None, name: str | None, space_end: bool) ->
104104
path, prefix = self.get_path_and_prefix(from_name)
105105
modules = self.find_modules(path, prefix)
106106
names = [self.format_completion(path, module) for module in modules]
107-
if len(names) == 1:
108-
# One match: insert a space to allow for "import" suggestion
109-
names[0] = f"{names[0]} "
107+
if names == [from_name]:
108+
# Exact match already written: continue with import statement
109+
names = [f"{from_name} import "]
110110
return names, None
111111

112112
# from x.y import z<tab>
@@ -317,7 +317,7 @@ class ImportParser:
317317
- `import foo` -> Result(from_name=None, name='foo')
318318
- `import foo.` -> Result(from_name=None, name='foo.')
319319
- `from foo` -> Result(from_name='foo', name=None)
320-
- `from foo ` -> Result(from_name='foo', name=None, end_space=True)
320+
- `from foo ` -> Result(from_name='foo', name=None, space_end=True)
321321
- `from foo import bar` -> Result(from_name='foo', name='bar')
322322
- `from .foo import (` -> Result(from_name='.foo', name='')
323323

Lib/test/test_pyrepl/test_pyrepl.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1168,17 +1168,20 @@ def test_completions(self):
11681168
("import importlib.resources.\t\ta\t\n", "import importlib.resources.abc"),
11691169
("import foo, impo\t\n", "import foo, importlib"),
11701170
("import foo as bar, impo\t\n", "import foo as bar, importlib"),
1171-
("from impo\t\n", "from importlib "),
1171+
("from impo\t\n", "from importlib"),
11721172
("from impo\t\t\n", "from importlib import "),
1173+
("from impo\t\t\t\n", "from importlib import "),
11731174
("from impo \t\n", "from impo import "),
1174-
("from importlib.res\t\n", "from importlib.resources "),
1175-
("from importlib.\t\tres\t\n", "from importlib.resources "),
1175+
("from importlib\t\n", "from importlib import "),
1176+
("from importlib.res\t\n", "from importlib.resources"),
1177+
("from importlib.\t\tres\t\n", "from importlib.resources"),
11761178
("from importlib.res\t\t\n", "from importlib.resources import "),
11771179
("from importlib.res \t\n", "from importlib.res import "),
1178-
("from importlib.resources.ab\t\n", "from importlib.resources.abc "),
1180+
("from importlib.resources\t\n", "from importlib.resources import "),
1181+
("from importlib.resources.ab\t\n", "from importlib.resources.abc"),
11791182
("from importlib import mac\t\n", "from importlib import machinery"),
11801183
("from importlib import res\t\n", "from importlib import resources"),
1181-
("from importlib.res\timport a\t\n", "from importlib.resources import abc"),
1184+
("from importlib.res\t import a\t\n", "from importlib.resources import abc"),
11821185
("from importlib.res\t\ta\t\n", "from importlib.resources import abc"),
11831186
("from __phello__ import s\t\n", "from __phello__ import spam"), # frozen module
11841187
)
@@ -1196,10 +1199,10 @@ def test_private_completions(self):
11961199
cases = (
11971200
# Return public methods by default
11981201
("import \t\n", "import public"),
1199-
("from \t\n", "from public "),
1202+
("from \t\n", "from public"),
12001203
# Return private methods if explicitly specified
12011204
("import _\t\n", "import _private"),
1202-
("from _\t\n", "from _private "),
1205+
("from _\t\n", "from _private"),
12031206
)
12041207
for code, expected in cases:
12051208
with self.subTest(code=code):
@@ -1232,7 +1235,7 @@ def test_sub_module_private_completions(self):
12321235
def test_builtin_completion_top_level(self):
12331236
cases = (
12341237
("import bui\t\n", "import builtins"),
1235-
("from bui\t\n", "from builtins "),
1238+
("from bui\t\n", "from builtins"),
12361239
)
12371240
for code, expected in cases:
12381241
with self.subTest(code=code):
@@ -1245,11 +1248,11 @@ def test_relative_completions(self):
12451248
cases = (
12461249
(None, "from .readl\t\n", "from .readl"),
12471250
(None, "from . import readl\t\n", "from . import readl"),
1248-
("_pyrepl", "from .readl\t\n", "from .readline "),
1251+
("_pyrepl", "from .readl\t\n", "from .readline"),
12491252
("_pyrepl", "from . import readl\t\n", "from . import readline"),
12501253
("_pyrepl", "from .readline import mul\t\n", "from .readline import multiline_input"),
12511254
("_pyrepl", "from .. import toodeep\t\n", "from .. import toodeep"),
1252-
("concurrent", "from .futures.i\t\n", "from .futures.interpreter "),
1255+
("concurrent", "from .futures.i\t\n", "from .futures.interpreter"),
12531256
)
12541257
for package, code, expected in cases:
12551258
with self.subTest(code=code):

0 commit comments

Comments
 (0)