diff options
author | Timothy Edmund Crosley <timothy.crosley@gmail.com> | 2021-03-22 23:29:16 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-22 23:29:16 -0700 |
commit | f5e04479f2411e3e29d629ee6c57810153167eff (patch) | |
tree | f951ec7ad4c2d8fab04e7845f018b472a84b2910 | |
parent | 9665722d4c4acf6fa4c95d4e7966793d03f3821d (diff) | |
parent | 2ccb49776957dbcb8b05ac4cc5eb9ef20a54a25d (diff) | |
download | isort-f5e04479f2411e3e29d629ee6c57810153167eff.tar.gz |
Merge pull request #1695 from jonafato/fix-multiline-docstring-ending-on-line-add_import
Fix bug regarding multiline docstrings
-rw-r--r-- | isort/core.py | 4 | ||||
-rw-r--r-- | tests/unit/test_isort.py | 35 |
2 files changed, 38 insertions, 1 deletions
diff --git a/isort/core.py b/isort/core.py index d763ad46..9f577dac 100644 --- a/isort/core.py +++ b/isort/core.py @@ -13,7 +13,8 @@ from .settings import FILE_SKIP_COMMENTS 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 19452db6..7a02884b 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"]) |