PyCQA / isort

A Python utility / library to sort imports.
https://pycqa.github.io/isort/
MIT License
6.49k stars 580 forks source link

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

Open TheVayt opened 7 months ago

TheVayt commented 7 months ago

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)