Instagram / Fixit

Advanced Python linting framework with auto-fixes and hierarchical configuration that makes it easy to write custom in-repo lint rules.
https://fixit.rtfd.io/en/latest/
Other
666 stars 62 forks source link

Circular fix applied involving Path and ComparePrimitivesByEqual #375

Closed nth10sd closed 10 months ago

nth10sd commented 1 year ago

Create a testcase.py file:

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as f:
    fn_ = Path(f) / "test.txt"
    fn_.write_text("Testing!\n")

    assert fn_.read_text() == "Testing!\n"  # No fixit error

    assert (Path(f) / "test.txt").samefile(fn_)  # Assert passes, so they are identical
    assert (Path(f) / "test.txt").read_text() == "Testing!\n"  # fixit shows an error

Run the following command once:

grep "shows an error" testcase.py ; fixit lint --diff testcase.py ; fixit fix --automatic testcase.py ; grep "shows an error" testcase.py

You will get the first output:

    assert (Path(f) / "test.txt").read_text() == "Testing!\n"  # fixit shows an error
testcase.py@11:11 CompareSingletonPrimitivesByIs: Comparisons to singleton primitives should not be done with == or !=, as they check equality rather than identiy. Use `is` or `is not` instead. (has autofix)
--- a/testcase.py
+++ b/testcase.py
@@ -10,2 +10,2 @@
     assert (Path(f) / "test.txt").samefile(fn_)  # Assert passes, so they are identical
-    assert (Path(f) / "test.txt").read_text() == "Testing!\n"  # fixit shows an error
+    assert (Path(f) / "test.txt").read_text() is "Testing!\n"  # fixit shows an error
🛠️  1 file checked, 1 file with errors, 1 auto-fix available 🛠️
testcase.py@11:11 CompareSingletonPrimitivesByIs: Comparisons to singleton primitives should not be done with == or !=, as they check equality rather than identiy. Use `is` or `is not` instead. (has autofix)
🛠️  1 file checked, 1 file with errors, 1 auto-fix available, 1 fix applied 🛠️
    assert (Path(f) / "test.txt").read_text() is "Testing!\n"  # fixit shows an error

Run the command again, you will get this second set of fixes back to the original:

    assert (Path(f) / "test.txt").read_text() is "Testing!\n"  # fixit shows an error
testcase.py@11:11 ComparePrimitivesByEqual: Don't use `is` or `is not` to compare primitives, as they compare references. Use == or != instead. (has autofix)
--- a/testcase.py
+++ b/testcase.py
@@ -10,2 +10,2 @@
     assert (Path(f) / "test.txt").samefile(fn_)  # Assert passes, so they are identical
-    assert (Path(f) / "test.txt").read_text() is "Testing!\n"  # fixit shows an error
+    assert (Path(f) / "test.txt").read_text() == "Testing!\n"  # fixit shows an error
🛠️  1 file checked, 1 file with errors, 1 auto-fix available 🛠️
testcase.py@11:11 ComparePrimitivesByEqual: Don't use `is` or `is not` to compare primitives, as they compare references. Use == or != instead. (has autofix)
🛠️  1 file checked, 1 file with errors, 1 auto-fix available, 1 fix applied 🛠️
    assert (Path(f) / "test.txt").read_text() == "Testing!\n"  # fixit shows an error

Run the command over and over again, it will keep suggesting and applying the fix in the circular manner repeatedly.

libcst 1.0.1 fixit 2.0.0.post1

amyreese commented 10 months ago

This should be fixed by #391