Preserve crlf line endings in blackd (#3257)
Co-authored-by: KotlinIsland <kotlinisland@users.noreply.github.com>
This commit is contained in:
parent
27d7ea43eb
commit
0359b85b58
@ -54,7 +54,7 @@
|
||||
|
||||
### _Blackd_
|
||||
|
||||
<!-- Changes to blackd -->
|
||||
- Windows style (CRLF) newlines will be preserved (#3257).
|
||||
|
||||
### Integrations
|
||||
|
||||
|
@ -406,6 +406,11 @@ file that are not enforced yet but might be in a future version of the formatter
|
||||
- use variable annotations instead of type comments, even for stubs that target older
|
||||
versions of Python.
|
||||
|
||||
### Line endings
|
||||
|
||||
_Black_ will normalize line endings (`\n` or `\r\n`) based on the first line ending of
|
||||
the file.
|
||||
|
||||
## Pragmatism
|
||||
|
||||
Early versions of _Black_ used to be absolutist in some respects. They took after its
|
||||
|
@ -133,6 +133,13 @@ async def handle(request: web.Request, executor: Executor) -> web.Response:
|
||||
executor, partial(black.format_file_contents, req_str, fast=fast, mode=mode)
|
||||
)
|
||||
|
||||
# Preserve CRLF line endings
|
||||
if req_str[req_str.find("\n") - 1] == "\r":
|
||||
formatted_str = formatted_str.replace("\n", "\r\n")
|
||||
# If, after swapping line endings, nothing changed, then say so
|
||||
if formatted_str == req_str:
|
||||
raise black.NothingChanged
|
||||
|
||||
# Only output the diff in the HTTP response
|
||||
only_diff = bool(request.headers.get(DIFF_HEADER, False))
|
||||
if only_diff:
|
||||
|
@ -1286,6 +1286,17 @@ def test_preserves_line_endings_via_stdin(self) -> None:
|
||||
if nl == "\n":
|
||||
self.assertNotIn(b"\r\n", output)
|
||||
|
||||
def test_normalize_line_endings(self) -> None:
|
||||
with TemporaryDirectory() as workspace:
|
||||
test_file = Path(workspace) / "test.py"
|
||||
for data, expected in (
|
||||
(b"c\r\nc\n ", b"c\r\nc\r\n"),
|
||||
(b"l\nl\r\n ", b"l\nl\n"),
|
||||
):
|
||||
test_file.write_bytes(data)
|
||||
ff(test_file, write_back=black.WriteBack.YES)
|
||||
self.assertEqual(test_file.read_bytes(), expected)
|
||||
|
||||
def test_assert_equivalent_different_asts(self) -> None:
|
||||
with self.assertRaises(AssertionError):
|
||||
black.assert_equivalent("{}", "None")
|
||||
|
@ -209,3 +209,20 @@ async def test_cors_headers_present(self) -> None:
|
||||
response = await self.client.post("/", headers={"Origin": "*"})
|
||||
self.assertIsNotNone(response.headers.get("Access-Control-Allow-Origin"))
|
||||
self.assertIsNotNone(response.headers.get("Access-Control-Expose-Headers"))
|
||||
|
||||
@unittest_run_loop
|
||||
async def test_preserves_line_endings(self) -> None:
|
||||
for data in (b"c\r\nc\r\n", b"l\nl\n"):
|
||||
# test preserved newlines when reformatted
|
||||
response = await self.client.post("/", data=data + b" ")
|
||||
self.assertEqual(await response.text(), data.decode())
|
||||
# test 204 when no change
|
||||
response = await self.client.post("/", data=data)
|
||||
self.assertEqual(response.status, 204)
|
||||
|
||||
@unittest_run_loop
|
||||
async def test_normalizes_line_endings(self) -> None:
|
||||
for data, expected in ((b"c\r\nc\n", "c\r\nc\r\n"), (b"l\nl\r\n", "l\nl\n")):
|
||||
response = await self.client.post("/", data=data)
|
||||
self.assertEqual(await response.text(), expected)
|
||||
self.assertEqual(response.status, 200)
|
||||
|
Loading…
Reference in New Issue
Block a user