Skip to content

Commit 6861c2e

Browse files
authored
vendor decode_bytes (#249)
* add `decode_bytes` to `blackcompat` * use `decode_bytes` from `blackcompat` * correct the imports
1 parent 3155b82 commit 6861c2e

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

blackdoc/__main__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from rich.text import Text
77

88
from blackdoc import __version__, format_lines, formats
9-
from blackdoc.blackcompat import read_pyproject_toml
9+
from blackdoc.blackcompat import decode_bytes, read_pyproject_toml
1010
from blackdoc.colors import DiffHighlighter
1111
from blackdoc.console import err, out
1212
from blackdoc.diff import unified_diff
@@ -32,7 +32,7 @@ def check_format_names(string):
3232
def format_and_overwrite(path, mode):
3333
try:
3434
with open(path, mode="rb") as f:
35-
content, encoding, newline = black.decode_bytes(f.read())
35+
content, encoding, newline = decode_bytes(f.read(), mode)
3636

3737
lines = content.split("\n")
3838

blackdoc/blackcompat.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
For the license, see /licenses/black
44
"""
55

6+
import io
67
import os
78
import sys
89
from functools import lru_cache
910
from pathlib import Path
1011

1112
import tomli
13+
from black import Encoding, FileContent, Mode, NewLine, Preview, tokenize
1214
from pathspec import PathSpec
1315

1416

@@ -258,3 +260,38 @@ def gen_python_files(
258260
include_match = include.search(normalized_path) if include else True
259261
if include_match:
260262
yield child
263+
264+
265+
def decode_bytes(src: bytes, mode: Mode) -> tuple[FileContent, Encoding, NewLine]:
266+
"""Return a tuple of (decoded_contents, encoding, newline).
267+
268+
`newline` is either CRLF or LF but `decoded_contents` is decoded with
269+
universal newlines (i.e. only contains LF).
270+
"""
271+
srcbuf = io.BytesIO(src)
272+
encoding, lines = tokenize.detect_encoding(srcbuf.readline)
273+
if not lines:
274+
return "", encoding, "\n"
275+
276+
if Preview.normalize_cr_newlines in mode:
277+
if lines[0][-2:] == b"\r\n":
278+
if b"\r" in lines[0][:-2]:
279+
newline = "\r"
280+
else:
281+
newline = "\r\n"
282+
elif lines[0][-1:] == b"\n":
283+
if b"\r" in lines[0][:-1]:
284+
newline = "\r"
285+
else:
286+
newline = "\n"
287+
else:
288+
if b"\r" in lines[0]:
289+
newline = "\r"
290+
else:
291+
newline = "\n"
292+
else:
293+
newline = "\r\n" if lines[0][-2:] == b"\r\n" else "\n"
294+
295+
srcbuf.seek(0)
296+
with io.TextIOWrapper(srcbuf, encoding) as tiow:
297+
return tiow.read(), encoding, newline

0 commit comments

Comments
 (0)