Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/black/output.py: 54%
61 statements
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-07 06:15 +0000
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-07 06:15 +0000
1"""Nice output for Black.
3The double calls are for patching purposes in tests.
4"""
6import json
7import tempfile
8from typing import Any, Optional
10from click import echo, style
11from mypy_extensions import mypyc_attr
14@mypyc_attr(patchable=True)
15def _out(message: Optional[str] = None, nl: bool = True, **styles: Any) -> None:
16 if message is not None:
17 if "bold" not in styles:
18 styles["bold"] = True
19 message = style(message, **styles)
20 echo(message, nl=nl, err=True)
23@mypyc_attr(patchable=True)
24def _err(message: Optional[str] = None, nl: bool = True, **styles: Any) -> None:
25 if message is not None:
26 if "fg" not in styles:
27 styles["fg"] = "red"
28 message = style(message, **styles)
29 echo(message, nl=nl, err=True)
32@mypyc_attr(patchable=True)
33def out(message: Optional[str] = None, nl: bool = True, **styles: Any) -> None:
34 _out(message, nl=nl, **styles)
37def err(message: Optional[str] = None, nl: bool = True, **styles: Any) -> None:
38 _err(message, nl=nl, **styles)
41def ipynb_diff(a: str, b: str, a_name: str, b_name: str) -> str:
42 """Return a unified diff string between each cell in notebooks `a` and `b`."""
43 a_nb = json.loads(a)
44 b_nb = json.loads(b)
45 diff_lines = [
46 diff(
47 "".join(a_nb["cells"][cell_number]["source"]) + "\n",
48 "".join(b_nb["cells"][cell_number]["source"]) + "\n",
49 f"{a_name}:cell_{cell_number}",
50 f"{b_name}:cell_{cell_number}",
51 )
52 for cell_number, cell in enumerate(a_nb["cells"])
53 if cell["cell_type"] == "code"
54 ]
55 return "".join(diff_lines)
58def diff(a: str, b: str, a_name: str, b_name: str) -> str:
59 """Return a unified diff string between strings `a` and `b`."""
60 import difflib
62 a_lines = a.splitlines(keepends=True)
63 b_lines = b.splitlines(keepends=True)
64 diff_lines = []
65 for line in difflib.unified_diff(
66 a_lines, b_lines, fromfile=a_name, tofile=b_name, n=5
67 ):
68 # Work around https://bugs.python.org/issue2142
69 # See:
70 # https://www.gnu.org/software/diffutils/manual/html_node/Incomplete-Lines.html
71 if line[-1] == "\n":
72 diff_lines.append(line)
73 else:
74 diff_lines.append(line + "\n")
75 diff_lines.append("\\ No newline at end of file\n")
76 return "".join(diff_lines)
79def color_diff(contents: str) -> str:
80 """Inject the ANSI color codes to the diff."""
81 lines = contents.split("\n")
82 for i, line in enumerate(lines):
83 if line.startswith("+++") or line.startswith("---"):
84 line = "\033[1m" + line + "\033[0m" # bold, reset
85 elif line.startswith("@@"):
86 line = "\033[36m" + line + "\033[0m" # cyan, reset
87 elif line.startswith("+"):
88 line = "\033[32m" + line + "\033[0m" # green, reset
89 elif line.startswith("-"):
90 line = "\033[31m" + line + "\033[0m" # red, reset
91 lines[i] = line
92 return "\n".join(lines)
95@mypyc_attr(patchable=True)
96def dump_to_file(*output: str, ensure_final_newline: bool = True) -> str:
97 """Dump `output` to a temporary file. Return path to the file."""
98 with tempfile.NamedTemporaryFile(
99 mode="w", prefix="blk_", suffix=".log", delete=False, encoding="utf8"
100 ) as f:
101 for lines in output:
102 f.write(lines)
103 if ensure_final_newline and lines and lines[-1] != "\n":
104 f.write("\n")
105 return f.name