diff options
author | Timothy Edmund Crosley <timothy.crosley@gmail.com> | 2021-03-15 23:10:25 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-15 23:10:25 -0700 |
commit | 9042488762e10137fd535601d9f433f1e3920dad (patch) | |
tree | 8702cab734ff7f150873a346a6e455854dafb8d8 | |
parent | 2a7f57c65bf5d1d882e1314d0ed1f524427dcbe8 (diff) | |
parent | 9c18cbb630749925b71f9904e4581a8657c33d3a (diff) | |
download | isort-9042488762e10137fd535601d9f433f1e3920dad.tar.gz |
Merge pull request #1692 from PyCQA/issue/1688
Issue/1688
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | isort/core.py | 67 | ||||
-rw-r--r-- | isort/parse.py | 8 | ||||
-rw-r--r-- | tests/unit/test_ticketed_features.py | 21 |
4 files changed, 67 insertions, 30 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index b0107444..53271c10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ Find out more about isort's release policy [here](https://pycqa.github.io/isort/ - Implemented #1668: Added a safeguard against accidental usage against /. - Implemented #1638 / #1644: Provide a flag `--overwrite-in-place` to ensure same file handle is used after sorting. - Implemented #1684: Added support for extending skips with `--extend-skip` and `--extend-skip-glob`. + - Implemented #1688: Auto identification and skipping of some invalid import statements. - Documented #1685: Skip doesn't support plain directory names, but skip_glob does. ### 5.7.0 December 30th 2020 diff --git a/isort/core.py b/isort/core.py index 59878998..d763ad46 100644 --- a/isort/core.py +++ b/isort/core.py @@ -246,9 +246,6 @@ def process( ): import_section += line elif stripped_line.startswith(IMPORT_START_IDENTIFIERS): - did_contain_imports = contains_imports - contains_imports = True - new_indent = line[: -len(line.lstrip())] import_statement = line stripped_line = line.strip().split("#")[0] @@ -266,37 +263,47 @@ def process( stripped_line = line.strip().split("#")[0] import_statement += line - cimport_statement: bool = False if ( - import_statement.lstrip().startswith(CIMPORT_IDENTIFIERS) - or " cimport " in import_statement - or " cimport*" in import_statement - or " cimport(" in import_statement - or ".cimport" in import_statement - ): - cimport_statement = True - - if cimport_statement != cimports or ( - new_indent != indent - and import_section - and (not did_contain_imports or len(new_indent) < len(indent)) + import_statement.lstrip().startswith("from") + and "import" not in import_statement ): - indent = new_indent - if import_section: - next_cimports = cimport_statement - next_import_section = import_statement - import_statement = "" - not_imports = True - line = "" - else: - cimports = cimport_statement + line = import_statement + not_imports = True else: - if new_indent != indent: - if import_section and did_contain_imports: - import_statement = indent + import_statement.lstrip() + did_contain_imports = contains_imports + contains_imports = True + + cimport_statement: bool = False + if ( + import_statement.lstrip().startswith(CIMPORT_IDENTIFIERS) + or " cimport " in import_statement + or " cimport*" in import_statement + or " cimport(" in import_statement + or ".cimport" in import_statement + ): + cimport_statement = True + + if cimport_statement != cimports or ( + new_indent != indent + and import_section + and (not did_contain_imports or len(new_indent) < len(indent)) + ): + indent = new_indent + if import_section: + next_cimports = cimport_statement + next_import_section = import_statement + import_statement = "" + not_imports = True + line = "" else: - indent = new_indent - import_section += import_statement + cimports = cimport_statement + else: + if new_indent != indent: + if import_section and did_contain_imports: + import_statement = indent + import_statement.lstrip() + else: + indent = new_indent + import_section += import_statement else: not_imports = True diff --git a/isort/parse.py b/isort/parse.py index 307015e7..714e39ab 100644 --- a/isort/parse.py +++ b/isort/parse.py @@ -260,6 +260,7 @@ def file_contents(contents: str, config: Config = DEFAULT_CONFIG) -> ParsedConte for statement in statements: line, raw_line = _normalize_line(statement) type_of_import = import_type(line, config) or "" + raw_lines = [raw_line] if not type_of_import: out_lines.append(raw_line) continue @@ -288,6 +289,7 @@ def file_contents(contents: str, config: Config = DEFAULT_CONFIG) -> ParsedConte ): nested_comments[stripped_line] = comments[-1] import_string += line_separator + line + raw_lines.append(line) else: while line.strip().endswith("\\"): line, new_comment = parse_comments(in_lines[index]) @@ -310,6 +312,7 @@ def file_contents(contents: str, config: Config = DEFAULT_CONFIG) -> ParsedConte ): nested_comments[stripped_line] = comments[-1] import_string += line_separator + line + raw_lines.append(line) while not line.split("#")[0].strip().endswith(")") and index < line_count: line, new_comment = parse_comments(in_lines[index]) @@ -325,6 +328,7 @@ def file_contents(contents: str, config: Config = DEFAULT_CONFIG) -> ParsedConte ): nested_comments[stripped_line] = comments[-1] import_string += line_separator + line + raw_lines.append(line) stripped_line = _strip_syntax(line).strip() if ( @@ -348,6 +352,10 @@ def file_contents(contents: str, config: Config = DEFAULT_CONFIG) -> ParsedConte .replace("\\", " ") .replace("\n", " ") ) + if "import " not in import_string: + out_lines.extend(raw_lines) + continue + if " cimport " in import_string: parts = import_string.split(" cimport ") cimports = True diff --git a/tests/unit/test_ticketed_features.py b/tests/unit/test_ticketed_features.py index 130ef67c..dddb31bc 100644 --- a/tests/unit/test_ticketed_features.py +++ b/tests/unit/test_ticketed_features.py @@ -1008,3 +1008,24 @@ def function(): import numpy as np """ ) + + +def test_isort_auto_detects_and_ignores_invalid_from_imports_issue_1688(): + """isort should automatically detect and ignore incorrectly written from import statements + see: https://github.com/PyCQA/isort/issues/1688 + """ + assert ( + isort.code( + """ +from package1 import alright +from package2 imprt and_its_gone +from package3 import also_ok +""" + ) + == """ +from package1 import alright + +from package2 imprt and_its_gone +from package3 import also_ok +""" + ) |