Fixes: #1662 Work-around for https://bugs.python.org/issue2142 The test has to slightly mess with its input data, because the utility functions default to ensuring the test data has a final newline, which defeats the point of the test. Signed-off-by: Paul "TBBle" Hampson <Paul.Hampson@Pobox.com>
This commit is contained in:
parent
0cbe19c813
commit
cd4295dd98
@ -28,6 +28,8 @@
|
|||||||
|
|
||||||
- speed up caching by avoiding pathlib (#1950)
|
- speed up caching by avoiding pathlib (#1950)
|
||||||
|
|
||||||
|
- `--diff` correctly indicates when a file doesn't end in a newline (#1662)
|
||||||
|
|
||||||
#### _Packaging_
|
#### _Packaging_
|
||||||
|
|
||||||
- Self-contained native _Black_ binaries are now provided for releases via GitHub
|
- Self-contained native _Black_ binaries are now provided for releases via GitHub
|
||||||
|
@ -132,6 +132,7 @@ Multiple contributions by:
|
|||||||
- [Pablo Galindo](mailto:Pablogsal@gmail.com)
|
- [Pablo Galindo](mailto:Pablogsal@gmail.com)
|
||||||
- [Paul Ganssle](mailto:p.ganssle@gmail.com)
|
- [Paul Ganssle](mailto:p.ganssle@gmail.com)
|
||||||
- [Paul Meinhardt](mailto:mnhrdt@gmail.com)
|
- [Paul Meinhardt](mailto:mnhrdt@gmail.com)
|
||||||
|
- [Paul "TBBle" Hampson](mailto:Paul.Hampson@Pobox.com)
|
||||||
- [Peter Bengtsson](mailto:mail@peterbe.com)
|
- [Peter Bengtsson](mailto:mail@peterbe.com)
|
||||||
- [Peter Grayson](mailto:pete@jpgrayson.net)
|
- [Peter Grayson](mailto:pete@jpgrayson.net)
|
||||||
- [Peter Stensmyr](mailto:peter.stensmyr@gmail.com)
|
- [Peter Stensmyr](mailto:peter.stensmyr@gmail.com)
|
||||||
|
@ -6425,14 +6425,14 @@ def assert_stable(src: str, dst: str, mode: Mode) -> None:
|
|||||||
|
|
||||||
|
|
||||||
@mypyc_attr(patchable=True)
|
@mypyc_attr(patchable=True)
|
||||||
def dump_to_file(*output: str) -> str:
|
def dump_to_file(*output: str, ensure_final_newline: bool = True) -> str:
|
||||||
"""Dump `output` to a temporary file. Return path to the file."""
|
"""Dump `output` to a temporary file. Return path to the file."""
|
||||||
with tempfile.NamedTemporaryFile(
|
with tempfile.NamedTemporaryFile(
|
||||||
mode="w", prefix="blk_", suffix=".log", delete=False, encoding="utf8"
|
mode="w", prefix="blk_", suffix=".log", delete=False, encoding="utf8"
|
||||||
) as f:
|
) as f:
|
||||||
for lines in output:
|
for lines in output:
|
||||||
f.write(lines)
|
f.write(lines)
|
||||||
if lines and lines[-1] != "\n":
|
if ensure_final_newline and lines and lines[-1] != "\n":
|
||||||
f.write("\n")
|
f.write("\n")
|
||||||
return f.name
|
return f.name
|
||||||
|
|
||||||
@ -6450,11 +6450,20 @@ def diff(a: str, b: str, a_name: str, b_name: str) -> str:
|
|||||||
"""Return a unified diff string between strings `a` and `b`."""
|
"""Return a unified diff string between strings `a` and `b`."""
|
||||||
import difflib
|
import difflib
|
||||||
|
|
||||||
a_lines = [line + "\n" for line in a.splitlines()]
|
a_lines = [line for line in a.splitlines(keepends=True)]
|
||||||
b_lines = [line + "\n" for line in b.splitlines()]
|
b_lines = [line for line in b.splitlines(keepends=True)]
|
||||||
return "".join(
|
diff_lines = []
|
||||||
difflib.unified_diff(a_lines, b_lines, fromfile=a_name, tofile=b_name, n=5)
|
for line in difflib.unified_diff(
|
||||||
)
|
a_lines, b_lines, fromfile=a_name, tofile=b_name, n=5
|
||||||
|
):
|
||||||
|
# Work around https://bugs.python.org/issue2142
|
||||||
|
# See https://www.gnu.org/software/diffutils/manual/html_node/Incomplete-Lines.html
|
||||||
|
if line[-1] == "\n":
|
||||||
|
diff_lines.append(line)
|
||||||
|
else:
|
||||||
|
diff_lines.append(line + "\n")
|
||||||
|
diff_lines.append("\\ No newline at end of file\n")
|
||||||
|
return "".join(diff_lines)
|
||||||
|
|
||||||
|
|
||||||
def cancel(tasks: Iterable["asyncio.Task[Any]"]) -> None:
|
def cancel(tasks: Iterable["asyncio.Task[Any]"]) -> None:
|
||||||
|
8
tests/data/missing_final_newline.diff
Normal file
8
tests/data/missing_final_newline.diff
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
--- [Deterministic header]
|
||||||
|
+++ [Deterministic header]
|
||||||
|
@@ -1,3 +1,3 @@
|
||||||
|
# A comment-only file, with no final EOL character
|
||||||
|
# This triggers https://bugs.python.org/issue2142
|
||||||
|
-# This is the line without the EOL character
|
||||||
|
\ No newline at end of file
|
||||||
|
+# This is the line without the EOL character
|
3
tests/data/missing_final_newline.py
Normal file
3
tests/data/missing_final_newline.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# A comment-only file, with no final EOL character
|
||||||
|
# This triggers https://bugs.python.org/issue2142
|
||||||
|
# This is the line without the EOL character
|
@ -300,7 +300,6 @@ def test_expression_diff(self) -> None:
|
|||||||
os.unlink(tmp_file)
|
os.unlink(tmp_file)
|
||||||
actual = result.output
|
actual = result.output
|
||||||
actual = diff_header.sub(DETERMINISTIC_HEADER, actual)
|
actual = diff_header.sub(DETERMINISTIC_HEADER, actual)
|
||||||
actual = actual.rstrip() + "\n" # the diff output has a trailing space
|
|
||||||
if expected != actual:
|
if expected != actual:
|
||||||
dump = black.dump_to_file(actual)
|
dump = black.dump_to_file(actual)
|
||||||
msg = (
|
msg = (
|
||||||
@ -1798,6 +1797,28 @@ def test_newline_comment_interaction(self) -> None:
|
|||||||
output = black.format_str(source, mode=DEFAULT_MODE)
|
output = black.format_str(source, mode=DEFAULT_MODE)
|
||||||
black.assert_stable(source, output, mode=DEFAULT_MODE)
|
black.assert_stable(source, output, mode=DEFAULT_MODE)
|
||||||
|
|
||||||
|
def test_bpo_2142_workaround(self) -> None:
|
||||||
|
|
||||||
|
# https://bugs.python.org/issue2142
|
||||||
|
|
||||||
|
source, _ = read_data("missing_final_newline.py")
|
||||||
|
# read_data adds a trailing newline
|
||||||
|
source = source.rstrip()
|
||||||
|
expected, _ = read_data("missing_final_newline.diff")
|
||||||
|
tmp_file = Path(black.dump_to_file(source, ensure_final_newline=False))
|
||||||
|
diff_header = re.compile(
|
||||||
|
rf"{re.escape(str(tmp_file))}\t\d\d\d\d-\d\d-\d\d "
|
||||||
|
r"\d\d:\d\d:\d\d\.\d\d\d\d\d\d \+\d\d\d\d"
|
||||||
|
)
|
||||||
|
try:
|
||||||
|
result = BlackRunner().invoke(black.main, ["--diff", str(tmp_file)])
|
||||||
|
self.assertEqual(result.exit_code, 0)
|
||||||
|
finally:
|
||||||
|
os.unlink(tmp_file)
|
||||||
|
actual = result.output
|
||||||
|
actual = diff_header.sub(DETERMINISTIC_HEADER, actual)
|
||||||
|
self.assertEqual(actual, expected)
|
||||||
|
|
||||||
|
|
||||||
with open(black.__file__, "r", encoding="utf-8") as _bf:
|
with open(black.__file__, "r", encoding="utf-8") as _bf:
|
||||||
black_source_lines = _bf.readlines()
|
black_source_lines = _bf.readlines()
|
||||||
|
Loading…
Reference in New Issue
Block a user