feat(cli,display): add --health check and repo description column
Add --health option to verify Gitea connectivity and display version. Add Description column (truncated at 40 chars) with --no-desc to hide it. Add get_version() method to GiteaClient. fixes #14 fixes #15 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -59,9 +59,35 @@ def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
|
||||
dest="format",
|
||||
help="Format de sortie (defaut: table).",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--health",
|
||||
action="store_true",
|
||||
default=False,
|
||||
help="Verifie la connexion Gitea et affiche la version. Exit 0 si OK, 1 sinon.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--no-desc",
|
||||
action="store_true",
|
||||
default=False,
|
||||
help="Masque la colonne Description dans le tableau.",
|
||||
)
|
||||
return parser.parse_args(argv)
|
||||
|
||||
|
||||
def _run_health_check(client: GiteaClient, console: Console) -> None:
|
||||
"""Execute le health check et affiche les resultats.
|
||||
|
||||
1. Appelle client.get_version() -> affiche "Gitea vX.Y.Z"
|
||||
2. Appelle client.get_repos() -> affiche "N repos accessibles"
|
||||
"""
|
||||
version_info = client.get_version()
|
||||
version = version_info.get("version", "inconnue")
|
||||
console.print(f"Gitea v{version}")
|
||||
|
||||
repos = client.get_repos()
|
||||
console.print(f"{len(repos)} repos accessibles")
|
||||
|
||||
|
||||
def main(argv: list[str] | None = None) -> None:
|
||||
"""Point d'entree principal.
|
||||
|
||||
@@ -90,6 +116,10 @@ def main(argv: list[str] | None = None) -> None:
|
||||
client = GiteaClient(url, token)
|
||||
|
||||
try:
|
||||
if args.health:
|
||||
_run_health_check(client, console)
|
||||
return
|
||||
|
||||
repos = collect_all(client, include=args.repo, exclude=args.exclude)
|
||||
except requests.ConnectionError:
|
||||
console.print("[red]Erreur : connexion refusee. Verifiez l'URL et le serveur Gitea.[/red]")
|
||||
@@ -111,4 +141,4 @@ def main(argv: list[str] | None = None) -> None:
|
||||
sorted_repos = sort_repos(repos, args.sort)
|
||||
print(export_json(sorted_repos)) # noqa: T201
|
||||
else:
|
||||
render_dashboard(repos, sort_key=args.sort)
|
||||
render_dashboard(repos, sort_key=args.sort, show_description=not args.no_desc)
|
||||
|
||||
@@ -126,6 +126,18 @@ class GiteaClient:
|
||||
params={"state": "open"},
|
||||
)
|
||||
|
||||
def get_version(self) -> dict:
|
||||
"""Retourne la version de l'instance Gitea.
|
||||
|
||||
Endpoint: GET /api/v1/version
|
||||
Retourne: {"version": "1.21.0"}
|
||||
Leve HTTPError si l'appel echoue.
|
||||
"""
|
||||
url = f"{self.base_url}/api/v1/version"
|
||||
resp = self._get_with_retry(url)
|
||||
resp.raise_for_status()
|
||||
return resp.json()
|
||||
|
||||
def get_latest_commit(self, owner: str, repo: str) -> dict | None:
|
||||
"""Retourne le dernier commit du repo, ou None si aucun.
|
||||
|
||||
|
||||
@@ -93,6 +93,13 @@ def _colorize_milestone_due(due_on: str | None) -> str:
|
||||
return "green"
|
||||
|
||||
|
||||
def _truncate(text: str, max_length: int = 40) -> str:
|
||||
"""Tronque le texte a max_length caracteres avec '...' si necessaire."""
|
||||
if len(text) <= max_length:
|
||||
return text
|
||||
return text[:max_length] + "..."
|
||||
|
||||
|
||||
def sort_repos(repos: list[RepoData], sort_key: str) -> list[RepoData]:
|
||||
"""Trie la liste des repos selon le critere donne.
|
||||
|
||||
@@ -126,15 +133,18 @@ def render_dashboard(
|
||||
repos: list[RepoData],
|
||||
console: Console | None = None,
|
||||
sort_key: str = "name",
|
||||
show_description: bool = True,
|
||||
) -> None:
|
||||
"""Affiche le dashboard complet dans le terminal.
|
||||
|
||||
- Tableau principal : nom repo, indicateurs (fork/archive/mirror),
|
||||
issues ouvertes, derniere release (tag + date relative)
|
||||
- Tableau principal : nom repo, description (optionnelle, tronquee a 40 chars),
|
||||
indicateurs (fork/archive/mirror), issues ouvertes, derniere release
|
||||
- Section milestones : par repo ayant des milestones,
|
||||
nom, progression (closed/total), date echeance
|
||||
|
||||
Le parametre console permet l'injection pour les tests.
|
||||
Si show_description est True, ajoute une colonne "Description"
|
||||
entre "Repo" et "Issues", tronquee a 40 caracteres.
|
||||
"""
|
||||
if console is None:
|
||||
console = Console()
|
||||
@@ -149,6 +159,8 @@ def render_dashboard(
|
||||
# Tableau principal
|
||||
table = Table(title="Gitea Dashboard")
|
||||
table.add_column("Repo", style="bold")
|
||||
if show_description:
|
||||
table.add_column("Description")
|
||||
table.add_column("Issues", justify="right")
|
||||
table.add_column("Release")
|
||||
table.add_column("Dernier commit")
|
||||
@@ -162,13 +174,19 @@ def render_dashboard(
|
||||
_format_relative_date(repo.last_commit_date) if repo.last_commit_date else "\u2014"
|
||||
)
|
||||
|
||||
table.add_row(
|
||||
name,
|
||||
f"[{issues_style}]{issues_str}[/{issues_style}]",
|
||||
release_str,
|
||||
commit_str,
|
||||
row = [name]
|
||||
if show_description:
|
||||
row.append(_truncate(repo.description or ""))
|
||||
row.extend(
|
||||
[
|
||||
f"[{issues_style}]{issues_str}[/{issues_style}]",
|
||||
release_str,
|
||||
commit_str,
|
||||
]
|
||||
)
|
||||
|
||||
table.add_row(*row)
|
||||
|
||||
console.print(table)
|
||||
|
||||
# Section milestones — uniquement si au moins un repo en a
|
||||
|
||||
Reference in New Issue
Block a user