diff --git a/isort/core.py b/isort/core.py index d763ad469..9f577dac6 100644 --- a/isort/core.py +++ b/isort/core.py @@ -13,7 +13,8 @@ CIMPORT_IDENTIFIERS = ("cimport ", "cimport*", "from.cimport") IMPORT_START_IDENTIFIERS = ("from ", "from.import", "import ", "import*") + CIMPORT_IDENTIFIERS -COMMENT_INDICATORS = ('"""', "'''", "'", '"', "#") +DOCSTRING_INDICATORS = ('"""', "'''") +COMMENT_INDICATORS = DOCSTRING_INDICATORS + ("'", '"', "#") CODE_SORT_COMMENTS = ( "# isort: list", "# isort: dict", @@ -317,6 +318,7 @@ def process( and not in_quote and not import_section and not line.lstrip().startswith(COMMENT_INDICATORS) + and not line.rstrip().endswith(DOCSTRING_INDICATORS) ): import_section = line_separator.join(add_imports) + line_separator if end_of_file and index != 0: diff --git a/tests/unit/test_isort.py b/tests/unit/test_isort.py index 19452db6d..7a02884ba 100644 --- a/tests/unit/test_isort.py +++ b/tests/unit/test_isort.py @@ -873,6 +873,41 @@ def test_add_imports() -> None: " pass\n" ) + # On a file that has no pre-existing imports and a multiline docstring + test_input = ( + '"""Module docstring\n\nWith a second line\n"""\n' "class MyClass(object):\n pass\n" + ) + test_output = isort.code(code=test_input, add_imports=["from __future__ import print_function"]) + assert test_output == ( + '"""Module docstring\n' + "\n" + "With a second line\n" + '"""\n' + "from __future__ import print_function\n" + "\n" + "\n" + "class MyClass(object):\n" + " pass\n" + ) + + # On a file that has no pre-existing imports and a multiline docstring. + # In this example, the closing quotes for the docstring are on the final + # line rather than a separate one. + test_input = ( + '"""Module docstring\n\nWith a second line"""\n' "class MyClass(object):\n pass\n" + ) + test_output = isort.code(code=test_input, add_imports=["from __future__ import print_function"]) + assert test_output == ( + '"""Module docstring\n' + "\n" + 'With a second line"""\n' + "from __future__ import print_function\n" + "\n" + "\n" + "class MyClass(object):\n" + " pass\n" + ) + # On a file that has no pre-existing imports, and no doc-string test_input = "class MyClass(object):\n pass\n" test_output = isort.code(code=test_input, add_imports=["from __future__ import print_function"])