summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimothy Edmund Crosley <timothy.crosley@gmail.com>2021-03-22 23:29:16 -0700
committerGitHub <noreply@github.com>2021-03-22 23:29:16 -0700
commitf5e04479f2411e3e29d629ee6c57810153167eff (patch)
treef951ec7ad4c2d8fab04e7845f018b472a84b2910
parent9665722d4c4acf6fa4c95d4e7966793d03f3821d (diff)
parent2ccb49776957dbcb8b05ac4cc5eb9ef20a54a25d (diff)
downloadisort-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.py4
-rw-r--r--tests/unit/test_isort.py35
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"])