RRC / src /racing_reports /cli.py
pablogrois's picture
Deploy MVP: API JSON + SPA + bundle/cache de artifacts CORE
e58615a
Raw
History Blame Contribute Delete
2.78 kB
from __future__ import annotations
import argparse
from pathlib import Path
from racing_reports.artifacts import DEFAULT_REPORT_ARTIFACTS
from racing_reports.datastore import DataStore
from racing_reports.match_index import MatchIndex
from racing_reports.runner import ReportRunner, request_from_yaml
def _sync(args) -> None:
store = DataStore()
path = store.sync_preprocessed(args.league, args.season, force=args.force)
print(path)
artifacts = list(args.artifact or [])
if args.with_artifacts:
artifacts.extend(DEFAULT_REPORT_ARTIFACTS)
for artifact in dict.fromkeys(artifacts):
print(store.sync_artifact(artifact, force=args.force))
def _list_matches(args) -> None:
idx = MatchIndex(DataStore())
df = idx.build(args.league, args.season)
if args.query:
q = args.query.lower()
mask = (
df["home_team"].str.lower().str.contains(q, na=False)
| df["away_team"].str.lower().str.contains(q, na=False)
| df["match_id"].str.lower().str.contains(q, na=False)
| df["date"].str.lower().str.contains(q, na=False)
)
df = df[mask]
print(df.to_string(index=False))
def _run(args) -> None:
request = request_from_yaml(Path(args.config))
result = ReportRunner().run(request)
print(f"Output dir: {result.output_dir}")
for name, path in result.html_paths.items():
print(f"{name}: {path}")
print(f"manifest: {result.manifest_path}")
def build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(prog="racing-reports")
sub = parser.add_subparsers(required=True)
sync = sub.add_parser("sync", help="Descarga preprocessed/artifacts desde Azure al cache local.")
sync.add_argument("--league", required=True)
sync.add_argument("--season", required=True)
sync.add_argument("--force", action="store_true")
sync.add_argument("--with-artifacts", action="store_true", help="Descarga artifacts estándar para reportes predictivos.")
sync.add_argument("--artifact", action="append", help="Artifact relativo a AZURE_REPORT_ARTIFACTS_ROOT.")
sync.set_defaults(func=_sync)
lm = sub.add_parser("list-matches", help="Lista partidos disponibles en el preprocessed cacheado.")
lm.add_argument("--league", required=True)
lm.add_argument("--season", required=True)
lm.add_argument("--query")
lm.set_defaults(func=_list_matches)
run = sub.add_parser("run", help="Genera reportes desde un YAML.")
run.add_argument("--config", required=True)
run.set_defaults(func=_run)
return parser
def main(argv: list[str] | None = None) -> None:
parser = build_parser()
args = parser.parse_args(argv)
args.func(args)
if __name__ == "__main__":
main()