Skip to content

Commit b1157ba

Browse files
loic-simonambv
authored andcommitted
Insert "import" only when module name is complete
1 parent b0afaad commit b1157ba

2 files changed

Lines changed: 17 additions & 14 deletions

File tree

‎Lib/_pyrepl/_module_completer.py‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,9 @@ def complete(
115115
path, prefix = self.get_path_and_prefix(from_name)
116116
modules = self.find_modules(path, prefix)
117117
names = [self.format_completion(path, module) for module in modules]
118-
if len(names) == 1:
119-
# One match: insert a space to allow for "import" suggestion
120-
names[0] = f"{names[0]} "
118+
if names == [from_name]:
119+
# Exact match already written: continue with import statement
120+
names = [f"{from_name} import "]
121121
# These are always modules, use dummy values to get the right color
122122
values = [sys] * len(names) if include_values else []
123123
return names, values, None
@@ -353,7 +353,7 @@ class ImportParser:
353353
- `import foo` -> Result(from_name=None, name='foo')
354354
- `import foo.` -> Result(from_name=None, name='foo.')
355355
- `from foo` -> Result(from_name='foo', name=None)
356-
- `from foo ` -> Result(from_name='foo', name=None, end_space=True)
356+
- `from foo ` -> Result(from_name='foo', name=None, space_end=True)
357357
- `from foo import bar` -> Result(from_name='foo', name='bar')
358358
- `from .foo import (` -> Result(from_name='.foo', name='')
359359

‎Lib/test/test_pyrepl/test_pyrepl.py‎

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1230,17 +1230,20 @@ def test_completions(self):
12301230
("import importlib.resources.\t\ta\t\n", "import importlib.resources.abc"),
12311231
("import foo, impo\t\n", "import foo, importlib"),
12321232
("import foo as bar, impo\t\n", "import foo as bar, importlib"),
1233-
("from impo\t\n", "from importlib "),
1233+
("from impo\t\n", "from importlib"),
12341234
("from impo\t\t\n", "from importlib import "),
1235+
("from impo\t\t\t\n", "from importlib import "),
12351236
("from impo \t\n", "from impo import "),
1236-
("from importlib.res\t\n", "from importlib.resources "),
1237-
("from importlib.\t\tres\t\n", "from importlib.resources "),
1237+
("from importlib\t\n", "from importlib import "),
1238+
("from importlib.res\t\n", "from importlib.resources"),
1239+
("from importlib.\t\tres\t\n", "from importlib.resources"),
12381240
("from importlib.res\t\t\n", "from importlib.resources import "),
12391241
("from importlib.res \t\n", "from importlib.res import "),
1240-
("from importlib.resources.ab\t\n", "from importlib.resources.abc "),
1242+
("from importlib.resources\t\n", "from importlib.resources import "),
1243+
("from importlib.resources.ab\t\n", "from importlib.resources.abc"),
12411244
("from importlib import mac\t\n", "from importlib import machinery"),
12421245
("from importlib import res\t\n", "from importlib import resources"),
1243-
("from importlib.res\timport a\t\n", "from importlib.resources import abc"),
1246+
("from importlib.res\t import a\t\n", "from importlib.resources import abc"),
12441247
("from importlib.res\t\ta\t\n", "from importlib.resources import abc"),
12451248
("from __phello__ import s\t\n", "from __phello__ import spam"), # frozen module
12461249
)
@@ -1258,10 +1261,10 @@ def test_private_completions(self):
12581261
cases = (
12591262
# Return public methods by default
12601263
("import \t\n", "import public"),
1261-
("from \t\n", "from public "),
1264+
("from \t\n", "from public"),
12621265
# Return private methods if explicitly specified
12631266
("import _\t\n", "import _private"),
1264-
("from _\t\n", "from _private "),
1267+
("from _\t\n", "from _private"),
12651268
)
12661269
for code, expected in cases:
12671270
with self.subTest(code=code):
@@ -1294,7 +1297,7 @@ def test_sub_module_private_completions(self):
12941297
def test_builtin_completion_top_level(self):
12951298
cases = (
12961299
("import bui\t\n", "import builtins"),
1297-
("from bui\t\n", "from builtins "),
1300+
("from bui\t\n", "from builtins"),
12981301
)
12991302
for code, expected in cases:
13001303
with self.subTest(code=code):
@@ -1307,11 +1310,11 @@ def test_relative_completions(self):
13071310
cases = (
13081311
(None, "from .readl\t\n", "from .readl"),
13091312
(None, "from . import readl\t\n", "from . import readl"),
1310-
("_pyrepl", "from .readl\t\n", "from .readline "),
1313+
("_pyrepl", "from .readl\t\n", "from .readline"),
13111314
("_pyrepl", "from . import readl\t\n", "from . import readline"),
13121315
("_pyrepl", "from .readline import mul\t\n", "from .readline import multiline_input"),
13131316
("_pyrepl", "from .. import toodeep\t\n", "from .. import toodeep"),
1314-
("concurrent", "from .futures.i\t\n", "from .futures.interpreter "),
1317+
("concurrent", "from .futures.i\t\n", "from .futures.interpreter"),
13151318
)
13161319
for package, code, expected in cases:
13171320
with self.subTest(code=code):

0 commit comments

Comments
 (0)