Skip to content

isort.core.process incorrectly returns False if only changes to lines before imports were made, with no changes to raw import section #2242

@vqko

Description

@vqko

I found a bug where isort.core.process returns False when only changes to lines before imports were made, with no changes to raw import section.

isort.core.process:

...Returns True if there were changes that needed to be made (errors present) from what
was provided in the input_stream, otherwise False.

The bug results in isort not fixing files that require fixing only lines before imports.

For example isort file.py --lines-before-imports=10 does nothing for this file:

from a import b, x

foo = 'bar'

But this one will have 10 lines added before imports, just because imports are unsorted and isort.core.process returned True:

from a import x, b

foo = 'bar'

Example tests, 2 of which fail:

import isort

ln = '\n'

input_0 = "from a import b, x\n\nfoo = 'bar'\n"
input_1 = ln + input_0
input_0_unsorted = "from a import x, b\n\nfoo = 'bar'\n"
input_1_unsorted = ln + input_0_unsorted

# isort.code returns sorted code
# isort.check_code checks if code is correct
# Both functions call isort.core.process internally but isort.check_code gives us it's return value

assert isort.code(input_0) == input_0
assert isort.check_code(input_0)
assert isort.code(input_0, lines_before_imports=0) == input_0
assert isort.check_code(input_0, lines_before_imports=0)
assert isort.code(input_0, lines_before_imports=1) == input_1
assert not isort.check_code(input_0, lines_before_imports=1)  # AssertionError

assert isort.code(input_1) == input_1
assert isort.check_code(input_1)
assert isort.code(input_1, lines_before_imports=0) == input_0
assert not isort.check_code(input_1, lines_before_imports=0)  # AssertionError
assert isort.code(input_1, lines_before_imports=1) == input_1
assert isort.check_code(input_1, lines_before_imports=1)

assert isort.code(input_0_unsorted) == input_0
assert not isort.check_code(input_0_unsorted)
assert isort.code(input_0_unsorted, lines_before_imports=0) == input_0
assert not isort.check_code(input_0_unsorted, lines_before_imports=0)
assert isort.code(input_0_unsorted, lines_before_imports=1) == input_1
assert not isort.check_code(input_0_unsorted, lines_before_imports=1)

assert isort.code(input_1_unsorted) == input_1
assert not isort.check_code(input_1_unsorted)
assert isort.code(input_1_unsorted, lines_before_imports=0) == input_0
assert not isort.check_code(input_1_unsorted, lines_before_imports=0)
assert isort.code(input_1_unsorted, lines_before_imports=1) == input_1
assert not isort.check_code(input_1_unsorted, lines_before_imports=1)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions