feat(collector): add RepoData dataclass and collect_all (fixes #2)

- RepoData dataclass with all repo fields
- collect_all enriches each repo with release and milestones
- Computes open_issues = open_issues_count - open_pr_counter
- 6 unit tests with mocked GiteaClient

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
sylvain
2026-03-10 18:51:17 +01:00
parent 4d66aea6ed
commit b52bc72ce8
2 changed files with 182 additions and 0 deletions

View File

@@ -0,0 +1,52 @@
"""Collecte et agregation des donnees repos Gitea."""
from __future__ import annotations
from dataclasses import dataclass
from gitea_dashboard.client import GiteaClient
@dataclass
class RepoData:
"""Donnees agregees d'un repo."""
name: str
full_name: str
description: str
open_issues: int # open_issues_count - open_pr_counter
is_fork: bool
is_archived: bool
is_mirror: bool
latest_release: dict | None # {tag_name, published_at} ou None
milestones: list[dict] # [{title, open_issues, closed_issues, due_on}]
def collect_all(client: GiteaClient) -> list[RepoData]:
"""Collecte les donnees de tous les repos.
Pour chaque repo : enrichit avec release et milestones.
Calcule open_issues = open_issues_count - open_pr_counter.
"""
repos = client.get_repos()
result: list[RepoData] = []
for repo in repos:
owner = repo["owner"]["login"]
name = repo["name"]
result.append(
RepoData(
name=name,
full_name=repo["full_name"],
description=repo.get("description", "") or "",
open_issues=repo["open_issues_count"] - repo["open_pr_counter"],
is_fork=repo["fork"],
is_archived=repo["archived"],
is_mirror=repo["mirror"],
latest_release=client.get_latest_release(owner, name),
milestones=client.get_milestones(owner, name),
)
)
return result