From 50768db31f74955fdc20cca64e3415b64bcf9590 Mon Sep 17 00:00:00 2001 From: sylvain Date: Thu, 12 Mar 2026 04:07:41 +0100 Subject: [PATCH] fix(audit): sort milestones, sort JSON export, extract test helper - Fix milestone section using unsorted repos list - Apply --sort to --format json output - Rename _sort_repos to sort_repos (now used by cli.py) - Extract shared make_repo helper to tests/helpers.py - Move exporter import to module level in cli.py Co-Authored-By: Claude Opus 4.6 --- src/gitea_dashboard/cli.py | 8 +++--- src/gitea_dashboard/display.py | 6 ++--- tests/helpers.py | 30 +++++++++++++++++++++++ tests/test_display.py | 45 ++++++---------------------------- tests/test_exporter.py | 28 +-------------------- 5 files changed, 46 insertions(+), 71 deletions(-) create mode 100644 tests/helpers.py diff --git a/src/gitea_dashboard/cli.py b/src/gitea_dashboard/cli.py index a7cbfca..62eda56 100644 --- a/src/gitea_dashboard/cli.py +++ b/src/gitea_dashboard/cli.py @@ -11,7 +11,8 @@ from rich.console import Console from gitea_dashboard.client import GiteaClient from gitea_dashboard.collector import collect_all -from gitea_dashboard.display import render_dashboard +from gitea_dashboard.display import render_dashboard, sort_repos +from gitea_dashboard.exporter import export_json _DEFAULT_URL = "http://192.168.0.106:3000" @@ -107,8 +108,7 @@ def main(argv: list[str] | None = None) -> None: sys.exit(1) if args.format == "json": - from gitea_dashboard.exporter import export_json - - print(export_json(repos)) # noqa: T201 + sorted_repos = sort_repos(repos, args.sort) + print(export_json(sorted_repos)) # noqa: T201 else: render_dashboard(repos, sort_key=args.sort) diff --git a/src/gitea_dashboard/display.py b/src/gitea_dashboard/display.py index 653ee3b..628906a 100644 --- a/src/gitea_dashboard/display.py +++ b/src/gitea_dashboard/display.py @@ -93,7 +93,7 @@ def _colorize_milestone_due(due_on: str | None) -> str: return "green" -def _sort_repos(repos: list[RepoData], sort_key: str) -> list[RepoData]: +def sort_repos(repos: list[RepoData], sort_key: str) -> list[RepoData]: """Trie la liste des repos selon le critere donne. Args: @@ -144,7 +144,7 @@ def render_dashboard( return # Tri des repos - sorted_repos = _sort_repos(repos, sort_key) + sorted_repos = sort_repos(repos, sort_key) # Tableau principal table = Table(title="Gitea Dashboard") @@ -172,7 +172,7 @@ def render_dashboard( console.print(table) # Section milestones — uniquement si au moins un repo en a - repos_with_milestones = [r for r in repos if r.milestones] + repos_with_milestones = [r for r in sorted_repos if r.milestones] if repos_with_milestones: console.print() diff --git a/tests/helpers.py b/tests/helpers.py new file mode 100644 index 0000000..300eee2 --- /dev/null +++ b/tests/helpers.py @@ -0,0 +1,30 @@ +"""Shared test fixtures and helpers.""" + +from gitea_dashboard.collector import RepoData + + +def make_repo( + name="my-repo", + full_name="admin/my-repo", + description="A repo", + open_issues=3, + is_fork=False, + is_archived=False, + is_mirror=False, + latest_release=None, + milestones=None, + last_commit_date=None, +): + """Build a RepoData for testing.""" + return RepoData( + name=name, + full_name=full_name, + description=description, + open_issues=open_issues, + is_fork=is_fork, + is_archived=is_archived, + is_mirror=is_mirror, + latest_release=latest_release, + milestones=milestones if milestones is not None else [], + last_commit_date=last_commit_date, + ) diff --git a/tests/test_display.py b/tests/test_display.py index 20a7987..3dd15de 100644 --- a/tests/test_display.py +++ b/tests/test_display.py @@ -4,11 +4,13 @@ from io import StringIO from rich.console import Console -from gitea_dashboard.collector import RepoData from gitea_dashboard.display import ( render_dashboard, + sort_repos, ) +from tests.helpers import make_repo as _make_repo + def _make_console(): """Create a console that captures output for testing. @@ -20,33 +22,6 @@ def _make_console(): return Console(file=buf, force_terminal=True, width=120, highlight=False), buf -def _make_repo( - name="my-repo", - full_name="admin/my-repo", - description="A repo", - open_issues=3, - is_fork=False, - is_archived=False, - is_mirror=False, - latest_release=None, - milestones=None, - last_commit_date=None, -): - """Build a RepoData for testing.""" - return RepoData( - name=name, - full_name=full_name, - description=description, - open_issues=open_issues, - is_fork=is_fork, - is_archived=is_archived, - is_mirror=is_mirror, - latest_release=latest_release, - milestones=milestones if milestones is not None else [], - last_commit_date=last_commit_date, - ) - - class TestRenderDashboardTable: """Test the main repos table rendering.""" @@ -290,35 +265,32 @@ class TestColorizeMilestoneDue: class TestSortRepos: - """Test _sort_repos function.""" + """Test sort_repos function.""" def test_sort_by_name(self): """Sorts alphabetically by name (case-insensitive).""" - from gitea_dashboard.display import _sort_repos repos = [ _make_repo(name="Charlie"), _make_repo(name="alpha"), _make_repo(name="Bravo"), ] - result = _sort_repos(repos, "name") + result = sort_repos(repos, "name") assert [r.name for r in result] == ["alpha", "Bravo", "Charlie"] def test_sort_by_issues(self): """Sorts by issues count descending.""" - from gitea_dashboard.display import _sort_repos repos = [ _make_repo(name="low", open_issues=1), _make_repo(name="high", open_issues=10), _make_repo(name="mid", open_issues=5), ] - result = _sort_repos(repos, "issues") + result = sort_repos(repos, "issues") assert [r.name for r in result] == ["high", "mid", "low"] def test_sort_by_release(self): """Sorts by release date descending; repos without release last.""" - from gitea_dashboard.display import _sort_repos repos = [ _make_repo(name="no-rel", latest_release=None), @@ -331,17 +303,16 @@ class TestSortRepos: latest_release={"tag_name": "v2.0", "published_at": "2026-03-01T00:00:00Z"}, ), ] - result = _sort_repos(repos, "release") + result = sort_repos(repos, "release") assert [r.name for r in result] == ["new", "old", "no-rel"] def test_sort_by_activity(self): """Sorts by last commit date descending; repos without commit last.""" - from gitea_dashboard.display import _sort_repos repos = [ _make_repo(name="inactive", last_commit_date=None), _make_repo(name="old-commit", last_commit_date="2025-06-01T00:00:00Z"), _make_repo(name="recent", last_commit_date="2026-03-10T00:00:00Z"), ] - result = _sort_repos(repos, "activity") + result = sort_repos(repos, "activity") assert [r.name for r in result] == ["recent", "old-commit", "inactive"] diff --git a/tests/test_exporter.py b/tests/test_exporter.py index 408070b..4b34704 100644 --- a/tests/test_exporter.py +++ b/tests/test_exporter.py @@ -2,35 +2,9 @@ import json -from gitea_dashboard.collector import RepoData from gitea_dashboard.exporter import export_json, repos_to_dicts - -def _make_repo( - name="my-repo", - full_name="admin/my-repo", - description="A repo", - open_issues=3, - is_fork=False, - is_archived=False, - is_mirror=False, - latest_release=None, - milestones=None, - last_commit_date=None, -): - """Build a RepoData for testing.""" - return RepoData( - name=name, - full_name=full_name, - description=description, - open_issues=open_issues, - is_fork=is_fork, - is_archived=is_archived, - is_mirror=is_mirror, - latest_release=latest_release, - milestones=milestones if milestones is not None else [], - last_commit_date=last_commit_date, - ) +from tests.helpers import make_repo as _make_repo class TestReposToDicts: