From 8b9e45e18320d395152d3ea49b4d4071ed5312a3 Mon Sep 17 00:00:00 2001 From: Timothy Crosley Date: Sat, 10 Oct 2020 02:52:33 -0700 Subject: [PATCH 1/2] Fixed #1542: Bug in VERTICAL_PREFIX_FROM_MODULE_IMPORT wrap mode. --- CHANGELOG.md | 1 + isort/wrap_modes.py | 34 +++++++++++++++++++++------------- tests/unit/test_regressions.py | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f861830c3..e774eaad6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ Find out more about isort's release policy [here](https://pycqa.github.io/isort/ ### 5.6.2 TBD - Fixed #1548: On rare occasions an unecessary empty line can be added when an import is marked as skipped. + - Fixed #1542: Bug in VERTICAL_PREFIX_FROM_MODULE_IMPORT wrap mode. ### 5.6.1 [Hotfix] October 8, 2020 - Fixed #1546: Unstable (non-idempotent) behavior with certain src trees. diff --git a/isort/wrap_modes.py b/isort/wrap_modes.py index ccfc1cd5a..db89d0ecc 100644 --- a/isort/wrap_modes.py +++ b/isort/wrap_modes.py @@ -273,33 +273,41 @@ def vertical_hanging_indent_bracket(**interface): def vertical_prefix_from_module_import(**interface): if not interface["imports"]: return "" + prefix_statement = interface["statement"] - interface["statement"] += interface["imports"].pop(0) - while interface["imports"]: - next_import = interface["imports"].pop(0) - next_statement = isort.comments.add_to_line( - interface["comments"], - interface["statement"] + ", " + next_import, + output_statement = prefix_statement + interface["imports"].pop(0) + comments = interface["comments"] + + statement = output_statement + statement_with_comments = "" + for next_import in interface["imports"]: + statement = statement + ", " + next_import + statement_with_comments = isort.comments.add_to_line( + comments, + statement, removed=interface["remove_comments"], comment_prefix=interface["comment_prefix"], ) if ( - len(next_statement.split(interface["line_separator"])[-1]) + 1 + len(statement_with_comments.split(interface["line_separator"])[-1]) + 1 > interface["line_length"] ): - next_statement = ( + statement = ( isort.comments.add_to_line( interface["comments"], - f"{interface['statement']}", + output_statement, removed=interface["remove_comments"], comment_prefix=interface["comment_prefix"], ) + f"{interface['line_separator']}{prefix_statement}{next_import}" ) - interface["comments"] = [] - interface["statement"] = next_statement - return interface["statement"] - + comments = [] + output_statement = statement + + if comments and statement_with_comments: + output_statement = statement_with_comments + return output_statement + @_wrap_mode def hanging_indent_with_parentheses(**interface): diff --git a/tests/unit/test_regressions.py b/tests/unit/test_regressions.py index 87b533d63..248285429 100644 --- a/tests/unit/test_regressions.py +++ b/tests/unit/test_regressions.py @@ -1422,3 +1422,36 @@ def test_isort_shouldnt_split_skip_issue_1548(): import os """ ) + + +def test_isort_losing_imports_vertical_prefix_from_module_import_wrap_mode_issue_1542(): + """Ensure isort doesnt lose imports when a comment is combined with an import and + wrap mode VERTICAL_PREFIX_FROM_MODULE_IMPORT is used. + See: https://github.com/PyCQA/isort/issues/1542. + """ + assert isort.code( + """ +from xxxxxxxxxxxxxxxx import AAAAAAAAAA, BBBBBBBBBB +from xxxxxxxxxxxxxxxx import CCCCCCCCC, DDDDDDDDD # xxxxxxxxxxxxxxxxxx + +print(CCCCCCCCC) +""", + multi_line_output=9, + ) == """ +from xxxxxxxxxxxxxxxx import AAAAAAAAAA, BBBBBBBBBB # xxxxxxxxxxxxxxxxxx +from xxxxxxxxxxxxxxxx import CCCCCCCCC, DDDDDDDDD + +print(CCCCCCCCC) +""" + + assert isort.check_code( + """ +from xxxxxxxxxxxxxxxx import AAAAAAAAAA, BBBBBBBBBB + +from xxxxxxxxxxxxxxxx import CCCCCCCCC, DDDDDDDDD # xxxxxxxxxxxxxxxxxx isort: skip + +print(CCCCCCCCC) +""", + show_diff = True, + multi_line_output=9, + ) From e478e7c8f8a5e56dcda6f5b87f350445efdaaea0 Mon Sep 17 00:00:00 2001 From: Timothy Crosley Date: Sat, 10 Oct 2020 03:12:58 -0700 Subject: [PATCH 2/2] Fix formatting --- isort/wrap_modes.py | 10 +++++----- tests/unit/test_regressions.py | 13 ++++++++----- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/isort/wrap_modes.py b/isort/wrap_modes.py index db89d0ecc..02b793067 100644 --- a/isort/wrap_modes.py +++ b/isort/wrap_modes.py @@ -273,11 +273,11 @@ def vertical_hanging_indent_bracket(**interface): def vertical_prefix_from_module_import(**interface): if not interface["imports"]: return "" - + prefix_statement = interface["statement"] output_statement = prefix_statement + interface["imports"].pop(0) comments = interface["comments"] - + statement = output_statement statement_with_comments = "" for next_import in interface["imports"]: @@ -294,7 +294,7 @@ def vertical_prefix_from_module_import(**interface): ): statement = ( isort.comments.add_to_line( - interface["comments"], + comments, output_statement, removed=interface["remove_comments"], comment_prefix=interface["comment_prefix"], @@ -303,11 +303,11 @@ def vertical_prefix_from_module_import(**interface): ) comments = [] output_statement = statement - + if comments and statement_with_comments: output_statement = statement_with_comments return output_statement - + @_wrap_mode def hanging_indent_with_parentheses(**interface): diff --git a/tests/unit/test_regressions.py b/tests/unit/test_regressions.py index 248285429..873cc2f72 100644 --- a/tests/unit/test_regressions.py +++ b/tests/unit/test_regressions.py @@ -1429,20 +1429,23 @@ def test_isort_losing_imports_vertical_prefix_from_module_import_wrap_mode_issue wrap mode VERTICAL_PREFIX_FROM_MODULE_IMPORT is used. See: https://github.com/PyCQA/isort/issues/1542. """ - assert isort.code( - """ + assert ( + isort.code( + """ from xxxxxxxxxxxxxxxx import AAAAAAAAAA, BBBBBBBBBB from xxxxxxxxxxxxxxxx import CCCCCCCCC, DDDDDDDDD # xxxxxxxxxxxxxxxxxx print(CCCCCCCCC) """, - multi_line_output=9, - ) == """ + multi_line_output=9, + ) + == """ from xxxxxxxxxxxxxxxx import AAAAAAAAAA, BBBBBBBBBB # xxxxxxxxxxxxxxxxxx from xxxxxxxxxxxxxxxx import CCCCCCCCC, DDDDDDDDD print(CCCCCCCCC) """ + ) assert isort.check_code( """ @@ -1452,6 +1455,6 @@ def test_isort_losing_imports_vertical_prefix_from_module_import_wrap_mode_issue print(CCCCCCCCC) """, - show_diff = True, + show_diff=True, multi_line_output=9, )