diff --git a/CHANGES.rst b/CHANGES.rst index fe9d3980c..c036b28e1 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -43,6 +43,7 @@ Fixed - Work around a `pathlib.Path.resolve` bug in Python 3.8 and 3.9 on Windows. The work-around should be removed when Python 3.8 and 3.9 are no longer supported. - Add missing configuration flag for Flynt_. +- Only split source code lines at Python's universal newlines (LF, CRLF, CR). 2.1.1_ - 2024-04-16 diff --git a/constraints-oldest.txt b/constraints-oldest.txt index 462f7e015..a1ea2bb39 100644 --- a/constraints-oldest.txt +++ b/constraints-oldest.txt @@ -4,7 +4,8 @@ # interpreter and Python ependencies. Keep this up-to-date with minimum # versions in `setup.cfg`. black==22.3.0 -darkgraylib==2.1.0 +# TODO: change to darkgraylib==2.1.1 when it's released +darkgraylib @ git+https://github.com/akaihola/darkgraylib@newline-splitting defusedxml==0.7.1 flake8-2020==1.6.1 flake8-bugbear==22.1.11 diff --git a/setup.cfg b/setup.cfg index f30182804..472261086 100644 --- a/setup.cfg +++ b/setup.cfg @@ -28,7 +28,8 @@ package_dir = packages = find: install_requires = # NOTE: remember to keep `constraints-oldest.txt` in sync with these - darkgraylib~=2.1.0 + # TODO: update to darkgraylib~=2.1.1 when released + darkgraylib @ git+https://github.com/akaihola/darkgraylib@newline-splitting toml>=0.10.0 typing_extensions>=4.0.1 # NOTE: remember to keep `.github/workflows/python-package.yml` in sync diff --git a/src/darker/tests/test_main_drop_changes_on_unedited_lines.py b/src/darker/tests/test_main_drop_changes_on_unedited_lines.py new file mode 100644 index 000000000..03afffd40 --- /dev/null +++ b/src/darker/tests/test_main_drop_changes_on_unedited_lines.py @@ -0,0 +1,65 @@ +"""Tests for `__main__._drop_changes_on_unedited_lines`""" + +# pylint: disable=use-dict-literal + +from pathlib import Path +from unittest.mock import Mock + +import pytest + +from darker.__main__ import _drop_changes_on_unedited_lines +from darkgraylib.utils import TextDocument + + +@pytest.mark.kwparametrize( + dict( + content=TextDocument("s = 'reformat'\n"), + new_chunks=[(1, ("s = 'reformat'",), ('s = "reformat"',))], + ), + dict( + content=TextDocument('s = "keep"\n'), + new_chunks=[(1, ('s = "keep"',), ('s = "keep"',))], + ), + dict( + content=TextDocument("""l1 = "first line"\nl2 = 'second line'\n"""), + new_chunks=[ + ( + 1, + ('l1 = "first line"', "l2 = 'second line'"), + ('l1 = "first line"', 'l2 = "second line"'), + ) + ], + ), + dict( + content=TextDocument( + "# coding: iso-8859-5\n# б\x85б\x86\n", encoding="iso-8859-5" + ), + new_chunks=[ + ( + 1, + ("# coding: iso-8859-5", "# б\x85б\x86"), + ("# coding: iso-8859-5", "# б\x85б\x86"), + ) + ], + ), +) +def test_unchanged_content(tmp_path, content, new_chunks): + """Test that no reformats make it through for unmodified files.""" + # A mock object that always returns an empty list of changed lines + edited_linenums_differ = Mock() + edited_linenums_differ.revision_vs_lines = Mock(return_value=[]) + # The expected result is the same as the input content, unmodified + expect = content + + result = _drop_changes_on_unedited_lines( + new_chunks, + abspath_in_rev2=tmp_path / "file.py", + relpath_in_repo=Path("file.py"), + edited_linenums_differ=edited_linenums_differ, + rev2_content=content, + rev2_isorted=content, + has_isort_changes=False, + has_fstring_changes=False, + ) + + assert result == expect