feat(config): add YAML config and graceful pagination timeout
fixes #17, fixes #18 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -11,6 +11,7 @@ from rich.console import Console
|
||||
|
||||
from gitea_dashboard.client import GiteaClient
|
||||
from gitea_dashboard.collector import collect_all
|
||||
from gitea_dashboard.config import load_config, merge_config
|
||||
from gitea_dashboard.display import render_dashboard, sort_repos
|
||||
from gitea_dashboard.exporter import export_json
|
||||
|
||||
@@ -71,9 +72,63 @@ def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
|
||||
default=False,
|
||||
help="Masque la colonne Description dans le tableau.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--config",
|
||||
default=None,
|
||||
help="Chemin vers un fichier de configuration YAML alternatif.",
|
||||
)
|
||||
return parser.parse_args(argv)
|
||||
|
||||
|
||||
def _resolve_config(args: argparse.Namespace) -> argparse.Namespace:
|
||||
"""Resout la configuration en appliquant la priorite CLI > env > config > defaults.
|
||||
|
||||
1. Charge le fichier config (args.config ou chemin par defaut)
|
||||
2. Lit les variables d'environnement pertinentes
|
||||
3. Fusionne avec les valeurs CLI
|
||||
4. Retourne un Namespace enrichi
|
||||
"""
|
||||
file_config = load_config(args.config)
|
||||
|
||||
env_vars: dict = {}
|
||||
gitea_url_env = os.environ.get("GITEA_URL")
|
||||
if gitea_url_env:
|
||||
env_vars["url"] = gitea_url_env
|
||||
gitea_auth_env = os.environ.get("GITEA_TOKEN")
|
||||
if gitea_auth_env:
|
||||
env_vars["auth"] = gitea_auth_env
|
||||
|
||||
cli_args: dict = {}
|
||||
if args.sort != "name":
|
||||
cli_args["sort"] = args.sort
|
||||
if args.repo is not None:
|
||||
cli_args["include"] = args.repo
|
||||
if args.exclude is not None:
|
||||
cli_args["exclude"] = args.exclude
|
||||
if args.no_desc:
|
||||
cli_args["no_desc"] = True
|
||||
|
||||
defaults = {
|
||||
"url": _DEFAULT_URL,
|
||||
"sort": "name",
|
||||
"no_desc": False,
|
||||
}
|
||||
|
||||
merged = merge_config(cli_args, env_vars, file_config, defaults)
|
||||
|
||||
args.resolved_url = merged.get("url", _DEFAULT_URL)
|
||||
args.resolved_auth = merged.get("auth")
|
||||
args.sort = merged.get("sort", args.sort)
|
||||
if merged.get("include") and args.repo is None:
|
||||
args.repo = merged["include"]
|
||||
if merged.get("exclude") and args.exclude is None:
|
||||
args.exclude = merged["exclude"]
|
||||
if merged.get("no_desc") and not args.no_desc:
|
||||
args.no_desc = merged["no_desc"]
|
||||
|
||||
return args
|
||||
|
||||
|
||||
def _run_health_check(client: GiteaClient, console: Console) -> None:
|
||||
"""Execute le health check et affiche les resultats.
|
||||
|
||||
@@ -104,16 +159,28 @@ def main(argv: list[str] | None = None) -> None:
|
||||
args = parse_args(argv)
|
||||
console = Console(stderr=True)
|
||||
|
||||
token = os.environ.get("GITEA_TOKEN")
|
||||
if not token:
|
||||
try:
|
||||
args = _resolve_config(args)
|
||||
except (FileNotFoundError, ValueError) as exc:
|
||||
console.print(f"[red]Erreur config : {exc}[/red]")
|
||||
sys.exit(1)
|
||||
|
||||
auth = args.resolved_auth if hasattr(args, "resolved_auth") and args.resolved_auth else None
|
||||
if not auth:
|
||||
auth = os.environ.get("GITEA_TOKEN")
|
||||
if not auth:
|
||||
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)
|
||||
url = (
|
||||
args.resolved_url
|
||||
if hasattr(args, "resolved_url")
|
||||
else os.environ.get("GITEA_URL", _DEFAULT_URL)
|
||||
)
|
||||
|
||||
client = GiteaClient(url, token)
|
||||
client = GiteaClient(url, auth)
|
||||
|
||||
try:
|
||||
if args.health:
|
||||
@@ -132,8 +199,8 @@ def main(argv: list[str] | None = None) -> None:
|
||||
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, "***")
|
||||
if auth in msg:
|
||||
msg = msg.replace(auth, "***")
|
||||
console.print(f"[red]Erreur API : {msg}[/red]")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user