Add argparse-based CLI parsing with repeatable --repo/-r (include) and --exclude/-x (exclude) options. Filtering is case-insensitive substring matching, applied post-fetch in collect_all() per ADR-005. - parse_args() separated from main() for testability - main(argv=None) accepts argv for test injection - collect_all() gains optional include/exclude parameters - 14 new tests (8 filtering + 6 CLI parsing/integration) - All 51 tests pass, backward compatible (no args = v1.0.0 behavior) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
95 lines
2.8 KiB
Python
95 lines
2.8 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
|
|
|
|
_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.",
|
|
)
|
|
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)
|
|
|
|
render_dashboard(repos)
|