from __future__ import annotations import argparse import json from .config import load_source_config from .contracts import generate_contracts from .export import start_export from .manifest import write_manifest from .source_db import inspect_tables def main() -> None: parser = argparse.ArgumentParser(description="Export BigQuery snapshots to GCS") parser.add_argument("--source", required=True, help="Path to source.yaml") subparsers = parser.add_subparsers(dest="command", required=True) subparsers.add_parser("generate-contracts") subparsers.add_parser("inspect-source") export_parser = subparsers.add_parser("export") export_parser.add_argument("--run-date") export_parser.add_argument("--run-id") export_parser.add_argument("--tables", help="Comma-separated table names") manifest_parser = subparsers.add_parser("write-manifest") manifest_parser.add_argument("--run-date", required=True) manifest_parser.add_argument("--run-id", required=True) manifest_parser.add_argument("--no-upload", action="store_true") args = parser.parse_args() config = load_source_config(args.source) if args.command == "generate-contracts": paths = generate_contracts(config) print(json.dumps({"contracts": [str(path) for path in paths]}, indent=2)) elif args.command == "inspect-source": tables = inspect_tables(config) print(json.dumps({"tables": [{"name": t.name, "primary_key": t.primary_key} for t in tables]}, indent=2)) elif args.command == "export": tables = [item.strip() for item in args.tables.split(",")] if args.tables else None print(json.dumps(start_export(config, args.run_date, args.run_id, tables), indent=2)) elif args.command == "write-manifest": path = write_manifest(config, args.run_date, args.run_id, upload=not args.no_upload) print(json.dumps({"manifest": str(path)}, indent=2)) if __name__ == "__main__": main()