Files
gitea-dashboard/src/gitea_dashboard/cli.py
sylvain 50768db31f 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 <noreply@anthropic.com>
2026-03-12 04:07:41 +01:00

115 lines
3.4 KiB
Python

"""Point d'entree pour le CLI gitea-dashboard."""
from __future__ import annotations
import argparse
import os
import sys
import requests
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, sort_repos
from gitea_dashboard.exporter import export_json
_DEFAULT_URL = "http://192.168.0.106:3000"
def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
"""Parse les arguments CLI.
Options:
--repo / -r : noms de repos a inclure (repeatable)
--exclude / -x : noms de repos a exclure (repeatable)
Returns:
Namespace avec .repo (list[str] | None) et .exclude (list[str] | None)
"""
parser = argparse.ArgumentParser(
description="Dashboard CLI affichant l'etat des repos Gitea.",
)
parser.add_argument(
"--repo",
"-r",
action="append",
default=None,
help="Filtrer par nom de repo (sous-chaine, insensible a la casse). Repeatable.",
)
parser.add_argument(
"--exclude",
"-x",
action="append",
default=None,
help="Exclure les repos par nom (sous-chaine, insensible a la casse). Repeatable.",
)
parser.add_argument(
"--sort",
"-s",
choices=["name", "issues", "release", "activity"],
default="name",
help="Critere de tri des repos (defaut: name).",
)
parser.add_argument(
"--format",
"-f",
choices=["table", "json"],
default="table",
dest="format",
help="Format de sortie (defaut: table).",
)
return parser.parse_args(argv)
def main(argv: list[str] | None = None) -> None:
"""Point d'entree principal.
Args:
argv: Arguments CLI. Si None, utilise sys.argv (via argparse).
1. Parse les options CLI (--repo, --exclude)
2. Lit GITEA_URL (defaut: http://192.168.0.106:3000) et GITEA_TOKEN (requis)
3. Cree le GiteaClient
4. Collecte les donnees via collect_all() avec filtres
5. Affiche via render_dashboard()
6. Gere les erreurs : config manquante, connexion refusee, timeout
"""
args = parse_args(argv)
console = Console(stderr=True)
token = os.environ.get("GITEA_TOKEN")
if not token:
console.print(
"[red]Erreur : GITEA_TOKEN non defini. Exportez la variable d'environnement.[/red]"
)
sys.exit(1)
url = os.environ.get("GITEA_URL", _DEFAULT_URL)
client = GiteaClient(url, token)
try:
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]")
sys.exit(1)
except requests.Timeout:
console.print(
"[red]Erreur : delai d'attente depasse. Le serveur Gitea ne repond pas.[/red]"
)
sys.exit(1)
except requests.RequestException as exc:
# Ne jamais afficher le token dans les messages d'erreur
msg = str(exc)
if token in msg:
msg = msg.replace(token, "***")
console.print(f"[red]Erreur API : {msg}[/red]")
sys.exit(1)
if args.format == "json":
sorted_repos = sort_repos(repos, args.sort)
print(export_json(sorted_repos)) # noqa: T201
else:
render_dashboard(repos, sort_key=args.sort)