Skip to content

Commit 9042488

Browse files
Merge pull request #1692 from PyCQA/issue/1688
Issue/1688
2 parents 2a7f57c + 9c18cbb commit 9042488

File tree

4 files changed

+67
-30
lines changed

4 files changed

+67
-30
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ Find out more about isort's release policy [here](https://pycqa.github.io/isort/
1414
- Implemented #1668: Added a safeguard against accidental usage against /.
1515
- Implemented #1638 / #1644: Provide a flag `--overwrite-in-place` to ensure same file handle is used after sorting.
1616
- Implemented #1684: Added support for extending skips with `--extend-skip` and `--extend-skip-glob`.
17+
- Implemented #1688: Auto identification and skipping of some invalid import statements.
1718
- Documented #1685: Skip doesn't support plain directory names, but skip_glob does.
1819

1920
### 5.7.0 December 30th 2020

isort/core.py

Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -246,9 +246,6 @@ def process(
246246
):
247247
import_section += line
248248
elif stripped_line.startswith(IMPORT_START_IDENTIFIERS):
249-
did_contain_imports = contains_imports
250-
contains_imports = True
251-
252249
new_indent = line[: -len(line.lstrip())]
253250
import_statement = line
254251
stripped_line = line.strip().split("#")[0]
@@ -266,37 +263,47 @@ def process(
266263
stripped_line = line.strip().split("#")[0]
267264
import_statement += line
268265

269-
cimport_statement: bool = False
270266
if (
271-
import_statement.lstrip().startswith(CIMPORT_IDENTIFIERS)
272-
or " cimport " in import_statement
273-
or " cimport*" in import_statement
274-
or " cimport(" in import_statement
275-
or ".cimport" in import_statement
276-
):
277-
cimport_statement = True
278-
279-
if cimport_statement != cimports or (
280-
new_indent != indent
281-
and import_section
282-
and (not did_contain_imports or len(new_indent) < len(indent))
267+
import_statement.lstrip().startswith("from")
268+
and "import" not in import_statement
283269
):
284-
indent = new_indent
285-
if import_section:
286-
next_cimports = cimport_statement
287-
next_import_section = import_statement
288-
import_statement = ""
289-
not_imports = True
290-
line = ""
291-
else:
292-
cimports = cimport_statement
270+
line = import_statement
271+
not_imports = True
293272
else:
294-
if new_indent != indent:
295-
if import_section and did_contain_imports:
296-
import_statement = indent + import_statement.lstrip()
273+
did_contain_imports = contains_imports
274+
contains_imports = True
275+
276+
cimport_statement: bool = False
277+
if (
278+
import_statement.lstrip().startswith(CIMPORT_IDENTIFIERS)
279+
or " cimport " in import_statement
280+
or " cimport*" in import_statement
281+
or " cimport(" in import_statement
282+
or ".cimport" in import_statement
283+
):
284+
cimport_statement = True
285+
286+
if cimport_statement != cimports or (
287+
new_indent != indent
288+
and import_section
289+
and (not did_contain_imports or len(new_indent) < len(indent))
290+
):
291+
indent = new_indent
292+
if import_section:
293+
next_cimports = cimport_statement
294+
next_import_section = import_statement
295+
import_statement = ""
296+
not_imports = True
297+
line = ""
297298
else:
298-
indent = new_indent
299-
import_section += import_statement
299+
cimports = cimport_statement
300+
else:
301+
if new_indent != indent:
302+
if import_section and did_contain_imports:
303+
import_statement = indent + import_statement.lstrip()
304+
else:
305+
indent = new_indent
306+
import_section += import_statement
300307
else:
301308
not_imports = True
302309

isort/parse.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ def file_contents(contents: str, config: Config = DEFAULT_CONFIG) -> ParsedConte
260260
for statement in statements:
261261
line, raw_line = _normalize_line(statement)
262262
type_of_import = import_type(line, config) or ""
263+
raw_lines = [raw_line]
263264
if not type_of_import:
264265
out_lines.append(raw_line)
265266
continue
@@ -288,6 +289,7 @@ def file_contents(contents: str, config: Config = DEFAULT_CONFIG) -> ParsedConte
288289
):
289290
nested_comments[stripped_line] = comments[-1]
290291
import_string += line_separator + line
292+
raw_lines.append(line)
291293
else:
292294
while line.strip().endswith("\\"):
293295
line, new_comment = parse_comments(in_lines[index])
@@ -310,6 +312,7 @@ def file_contents(contents: str, config: Config = DEFAULT_CONFIG) -> ParsedConte
310312
):
311313
nested_comments[stripped_line] = comments[-1]
312314
import_string += line_separator + line
315+
raw_lines.append(line)
313316

314317
while not line.split("#")[0].strip().endswith(")") and index < line_count:
315318
line, new_comment = parse_comments(in_lines[index])
@@ -325,6 +328,7 @@ def file_contents(contents: str, config: Config = DEFAULT_CONFIG) -> ParsedConte
325328
):
326329
nested_comments[stripped_line] = comments[-1]
327330
import_string += line_separator + line
331+
raw_lines.append(line)
328332

329333
stripped_line = _strip_syntax(line).strip()
330334
if (
@@ -348,6 +352,10 @@ def file_contents(contents: str, config: Config = DEFAULT_CONFIG) -> ParsedConte
348352
.replace("\\", " ")
349353
.replace("\n", " ")
350354
)
355+
if "import " not in import_string:
356+
out_lines.extend(raw_lines)
357+
continue
358+
351359
if " cimport " in import_string:
352360
parts = import_string.split(" cimport ")
353361
cimports = True

tests/unit/test_ticketed_features.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,3 +1008,24 @@ def function():
10081008
import numpy as np
10091009
"""
10101010
)
1011+
1012+
1013+
def test_isort_auto_detects_and_ignores_invalid_from_imports_issue_1688():
1014+
"""isort should automatically detect and ignore incorrectly written from import statements
1015+
see: https://github.com/PyCQA/isort/issues/1688
1016+
"""
1017+
assert (
1018+
isort.code(
1019+
"""
1020+
from package1 import alright
1021+
from package2 imprt and_its_gone
1022+
from package3 import also_ok
1023+
"""
1024+
)
1025+
== """
1026+
from package1 import alright
1027+
1028+
from package2 imprt and_its_gone
1029+
from package3 import also_ok
1030+
"""
1031+
)

0 commit comments

Comments
 (0)