diff --git a/scripts/release.py b/scripts/release.py index f80ed2f..4e730a2 100644 --- a/scripts/release.py +++ b/scripts/release.py @@ -204,46 +204,43 @@ def diff_apps( # Table rendering for release notes -def make_app_table_row(app: dict[str, Any]) -> str: +def make_app_table_row(app: dict[str, Any], change: str) -> str: display_name = f'{get_display_name(app)}' obtainium_link = make_obtainium_link(app) - badge = f'Add to Obtainium!' + badge = f'Add to Obtainium!' if change != "Removed" else "-" std = "✅" if should_include_app(app, "standard") else "❌" ds = "✅" if should_include_app(app, "dual-screen") else "❌" - return f"| {display_name} | {badge} | {std} | {ds} |" + return f"| {display_name} | {badge} | {change} | {std} | {ds} |" -TABLE_HEADER = ( - "| Application Name | Add to Obtainium | Included in export json? | Included in DS json? |\n" - "|------------------|------------------|---------------------------|----------------------|" +CHANGES_TABLE_HEADER = ( + "| Application | Add to Obtainium | Change | Standard | Dual-Screen |\n" + "|-------------|------------------|--------|----------|-------------|" ) -def generate_app_table(apps: list[dict[str, Any]], group_by_category: bool = False) -> str: - if not apps: +def generate_changes_table( + added: list[dict[str, Any]], + changed: list[dict[str, Any]], + removed: list[dict[str, Any]], +) -> str: + rows: list[tuple[str, dict[str, Any]]] = [] + for app in added: + rows.append(("Added", app)) + for app in changed: + rows.append(("Updated", app)) + for app in removed: + rows.append(("Removed", app)) + + if not rows: return "" - if not group_by_category: - lines = [TABLE_HEADER] - for app in sorted(apps, key=lambda a: get_display_name(a).lower()): - lines.append(make_app_table_row(app)) - return "\n".join(lines) + rows.sort(key=lambda r: get_display_name(r[1]).lower()) - # Group by category - categorized: defaultdict[str, list[dict[str, Any]]] = defaultdict(list) - for app in apps: - for cat in app.get("categories", ["Other"]): - categorized[cat].append(app) - - sections: list[str] = [] - for category in sorted(categorized.keys()): - sections.append(f"### {category}\n") - sections.append(TABLE_HEADER) - for app in sorted(categorized[category], key=lambda a: get_display_name(a).lower()): - sections.append(make_app_table_row(app)) - sections.append("") - - return "\n".join(sections) + lines = [CHANGES_TABLE_HEADER] + for change, app in rows: + lines.append(make_app_table_row(app, change)) + return "\n".join(lines) def _git_log_lines(since_tag: str | None, pretty_format: str) -> list[str]: @@ -328,20 +325,9 @@ def generate_release_notes( lines.append(f"- {contributor}") lines.append("") - if added: - lines.append("## New Apps\n") - lines.append(generate_app_table(added, group_by_category=True)) - lines.append("") - - if changed: - lines.append("## App Updates\n") - lines.append(generate_app_table(changed, group_by_category=False)) - lines.append("") - - if removed: - lines.append("## Removed Apps\n") - for app in sorted(removed, key=lambda a: get_display_name(a).lower()): - lines.append(f"- {get_display_name(app)}") + if added or changed or removed: + lines.append("## App Changes\n") + lines.append(generate_changes_table(added, changed, removed)) lines.append("") return "\n".join(lines)