Skip to content

Commit c14b433

Browse files
committed
Add colors to diffs printed by --dry
1 parent 0ff46e8 commit c14b433

File tree

5 files changed

+133
-8
lines changed

5 files changed

+133
-8
lines changed

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,16 @@ To see unused code findings:
2020
deadcode .
2121
```
2222

23-
To see suggested fixes:
23+
To see suggested fixes for all files:
2424
```shell
2525
deadcode . --fix --dry
2626
```
2727

28+
To see suggested fixes for only `foo.py` file:
29+
```shell
30+
deadcode . --fix --dry foo.py
31+
```
32+
2833
To fix:
2934
```shell
3035
deadcode . --fix

deadcode/actions/fix_or_show_unused_code.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from deadcode.data_types import Args
99
from deadcode.visitor.code_item import CodeItem
1010
from deadcode.utils.flatten_lists import flatten_list
11+
from deadcode.utils.add_colors_to_diff import add_colors_to_diff
1112
from deadcode.visitor.ignore import _match
1213

1314

@@ -41,7 +42,11 @@ def fix_or_show_unused_code(unused_items: Iterable[CodeItem], args: Args) -> str
4142
with open(filename, "r") as f:
4243
diff = unified_diff(f.readlines(), updated_file_content_lines, fromfile=filename, tofile=filename)
4344
# TODO: consider printing result instantly to save memory
44-
result.append("".join(diff))
45+
diff_str = "".join(diff)
46+
if args.no_color:
47+
result.append(diff_str)
48+
else:
49+
result.append(add_colors_to_diff(diff_str))
4550

4651
elif args.fix:
4752
with open(filename, "w") as f:

deadcode/tests/cli_args/test_dry.py

Lines changed: 73 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from deadcode.cli import main
22
from deadcode.tests.base import BaseTestCase
3-
from textwrap import dedent
3+
from deadcode.utils.fix_indent import fix_indent
44

55

66
class TestDryCliOption(BaseTestCase):
@@ -17,7 +17,7 @@ class UnusedClass:
1717
self.assertEqual(
1818
unused_names,
1919
(
20-
dedent(
20+
fix_indent(
2121
"""\
2222
foo.py:1:0: DC03 Class `UnusedClass` is never used
2323
@@ -56,7 +56,7 @@ class UnusedClass:
5656
self.assertEqual(
5757
unused_names,
5858
(
59-
dedent(
59+
fix_indent(
6060
"""\
6161
foo.py:1:0: DC03 Class `UnusedClass` is never used
6262
@@ -99,7 +99,7 @@ def unused_function():
9999
unused_names = main(["ignore_names_by_pattern.py", "--no-color", "--dry"])
100100
self.assertEqual(
101101
unused_names,
102-
dedent(
102+
fix_indent(
103103
"""\
104104
bar.py:1:0: DC02 Function `unused_function` is never used
105105
foo.py:1:0: DC03 Class `UnusedClass` is never used
@@ -155,7 +155,7 @@ def unused_function():
155155
unused_names = main(["ignore_names_by_pattern.py", "--no-color", "--dry", "foo.py"])
156156
self.assertEqual(
157157
unused_names,
158-
dedent(
158+
fix_indent(
159159
"""\
160160
bar.py:1:0: DC02 Function `unused_function` is never used
161161
foo.py:1:0: DC03 Class `UnusedClass` is never used
@@ -224,7 +224,7 @@ class UnusedClass:
224224
self.assertEqual(
225225
unused_names,
226226
(
227-
dedent(
227+
fix_indent(
228228
"""\
229229
foo.py:1:0: DC03 Class `UnusedClass` is never used
230230
@@ -249,3 +249,70 @@ class UnusedClass:
249249
print("Dont change this file")"""
250250
}
251251
)
252+
253+
def test_coloring_of_a_diff(self):
254+
self.files = {
255+
"foo.py": """
256+
class UnusedClass:
257+
pass
258+
259+
print("Dont change this file")""",
260+
"bar.py": """
261+
def unused_function():
262+
pass
263+
264+
with open("tmp.txt", "r") as unused_var:
265+
pass
266+
267+
print("Dont change this file")""",
268+
}
269+
270+
unused_names = main(["ignore_names_by_pattern.py", "--dry"])
271+
self.assertEqual(
272+
unused_names,
273+
fix_indent(
274+
"""\
275+
bar.py:1:0: \x1b[91mDC02\x1b[0m Function `\x1b[1munused_function\x1b[0m` is never used
276+
bar.py:4:29: \x1b[91mDC01\x1b[0m Variable `\x1b[1munused_var\x1b[0m` is never used
277+
foo.py:1:0: \x1b[91mDC03\x1b[0m Class `\x1b[1mUnusedClass\x1b[0m` is never used
278+
279+
\x1b[31m--- bar.py\x1b[0m
280+
\x1b[32m+++ bar.py\x1b[0m
281+
@@ -1,7 +1,4 @@
282+
\x1b[31m-def unused_function():\x1b[0m
283+
\x1b[31m- pass\x1b[0m
284+
\x1b[31m-\x1b[0m
285+
\x1b[31m-with open("tmp.txt", "r") as unused_var:\x1b[0m
286+
\x1b[32m+with open("tmp.txt", "r"):\x1b[0m
287+
pass
288+
289+
print("Dont change this file")
290+
291+
\x1b[31m--- foo.py\x1b[0m
292+
\x1b[32m+++ foo.py\x1b[0m
293+
@@ -1,4 +1 @@
294+
\x1b[31m-class UnusedClass:\x1b[0m
295+
\x1b[31m- pass\x1b[0m
296+
\x1b[31m-\x1b[0m
297+
print("Dont change this file")
298+
"""
299+
),
300+
)
301+
302+
self.assertFiles(
303+
{
304+
"foo.py": """
305+
class UnusedClass:
306+
pass
307+
308+
print("Dont change this file")""",
309+
"bar.py": """
310+
def unused_function():
311+
pass
312+
313+
with open("tmp.txt", "r") as unused_var:
314+
pass
315+
316+
print("Dont change this file")""",
317+
}
318+
)
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from unittest import TestCase
2+
from deadcode.utils.fix_indent import fix_indent
3+
4+
from deadcode.utils.add_colors_to_diff import add_colors_to_diff
5+
6+
7+
class TestAddColorsToDiff(TestCase):
8+
def test_add_colors_to_diff(self):
9+
diff = fix_indent(
10+
"""\
11+
--- foo.py
12+
+++ foo.py
13+
@@ -1,4 +1 @@
14+
-class UnusedClass:
15+
- pass
16+
-
17+
-with open("tmp.txt") as f:
18+
+with open("tmp.txt"):
19+
pass"""
20+
)
21+
22+
colorful_diff = add_colors_to_diff(diff)
23+
24+
self.assertEqual(
25+
colorful_diff,
26+
fix_indent(
27+
"""\
28+
\x1b[31m--- foo.py\x1b[0m
29+
\x1b[32m+++ foo.py\x1b[0m
30+
@@ -1,4 +1 @@
31+
\x1b[31m-class UnusedClass:\x1b[0m
32+
\x1b[31m- pass\x1b[0m
33+
\x1b[31m-\x1b[0m
34+
\x1b[31m-with open("tmp.txt") as f:\x1b[0m
35+
\x1b[32m+with open("tmp.txt"):\x1b[0m
36+
pass"""
37+
),
38+
)

deadcode/utils/add_colors_to_diff.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
def add_colors_to_diff(diff: str) -> str:
2+
colorful_lines = []
3+
for line in diff.split("\n"):
4+
colorful_line = line
5+
if line.startswith("-"):
6+
colorful_line = f"\033[31m{colorful_line}\033[0m"
7+
if line.startswith("+"):
8+
colorful_line = f"\033[32m{colorful_line}\033[0m"
9+
colorful_lines.append(colorful_line)
10+
return "\n".join(colorful_lines)

0 commit comments

Comments
 (0)