Skip to content

Commit eb719af

Browse files
davidb-tadaclaude
andcommitted
feat(changelog): color-code and reorder summary badges
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 7019c1a commit eb719af

3 files changed

Lines changed: 35 additions & 20 deletions

File tree

datacontract/output/text_changelog_results.py

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,36 @@
11
import io
2+
from collections import Counter
23

34
from rich import box
45
from rich.console import Console
56
from rich.table import Table
67

7-
from datacontract.model.changelog import ChangelogResult, ChangelogType
8+
from datacontract.model.changelog import ChangelogEntry, ChangelogResult, ChangelogType
89

910
_VAL_W = 30
1011

12+
_CHANGE_COLOR = {
13+
ChangelogType.added: "green",
14+
ChangelogType.changed: "yellow",
15+
ChangelogType.removed: "red",
16+
}
17+
18+
_BADGE_ORDER = [ChangelogType.added, ChangelogType.changed, ChangelogType.removed]
19+
1120

1221
def write_text_changelog_results(result: ChangelogResult, console: Console):
1322
_print_summary(result, console)
1423
_print_table(result, console)
1524

1625

17-
def _badges(entries: list) -> str:
18-
removed = sum(1 for e in entries if e.type == ChangelogType.removed)
19-
changed = sum(1 for e in entries if e.type == ChangelogType.changed)
20-
added = sum(1 for e in entries if e.type == ChangelogType.added)
26+
def _badges(entries: list[ChangelogEntry]) -> str:
27+
counts = Counter(e.type for e in entries)
2128
parts = []
22-
if removed:
23-
parts.append(f"[ {removed} Removed ]")
24-
if changed:
25-
parts.append(f"[ {changed} Changed ]")
26-
if added:
27-
parts.append(f"[ {added} Added ]")
29+
for ct in _BADGE_ORDER:
30+
n = counts[ct]
31+
if n:
32+
color = _CHANGE_COLOR[ct]
33+
parts.append(f"[ [{color}]{n} {ct.value.capitalize()}[/{color}] ]")
2834
return " ".join(parts)
2935

3036

@@ -66,12 +72,9 @@ def _print_table(result: ChangelogResult, console: Console):
6672

6773

6874
def _with_markup(changelog_type: ChangelogType) -> str:
69-
if changelog_type == ChangelogType.added:
70-
return "[green]added[/green]"
71-
if changelog_type == ChangelogType.removed:
72-
return "[red]removed[/red]"
73-
if changelog_type == ChangelogType.changed:
74-
return "[yellow]changed[/yellow]"
75+
color = _CHANGE_COLOR.get(changelog_type)
76+
if color:
77+
return f"[{color}]{changelog_type.value}[/{color}]"
7578
return changelog_type.value
7679

7780

tests/fixtures/changelog/golden_changelog_text.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Summary
2-
[ 1 Removed ] [ 4 Changed ] [ 2 Added ]
2+
[ 2 Added ] [ 4 Changed ] [ 1 Removed ]
33
╭─────────┬───────────────────────────────────────╮
44
│ Change │ Field │
55
├─────────┼───────────────────────────────────────┤

tests/test_changelog_output_text.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,21 @@ def test_all_types(self):
4444
assert "3 Changed" in result
4545
assert "2 Added" in result
4646

47-
def test_ordering_removed_changed_added(self):
47+
def test_ordering_added_changed_removed(self):
4848
result = _badges(_make_entries(added=1, removed=1, changed=1))
49-
assert result.index("Removed") < result.index("Changed") < result.index("Added")
49+
assert result.index("Added") < result.index("Changed") < result.index("Removed")
50+
51+
def test_added_badge_green(self):
52+
result = _badges(_make_entries(added=1))
53+
assert "[ [green]1 Added[/green] ]" == result
54+
55+
def test_changed_badge_yellow(self):
56+
result = _badges(_make_entries(changed=1))
57+
assert "[ [yellow]1 Changed[/yellow] ]" == result
58+
59+
def test_removed_badge_red(self):
60+
result = _badges(_make_entries(removed=1))
61+
assert "[ [red]1 Removed[/red] ]" == result
5062

5163
def test_zero_count_omitted(self):
5264
result = _badges(_make_entries(added=3))

0 commit comments

Comments
 (0)