#!/usr/bin/env python3 """When B2 is capped: upload ``store_slim_b2.db`` to a Hub **dataset** and point the Space at it. Uses ``[huggingface].token`` from parser ``secrets.toml``. Sets Space **variables** (not secrets): ``KINK_HF_REQUIRE_FULL_CATALOG=1``, ``KINK_HF_DATASET_REPO``, and ``KINK_HF_DATASET_FILENAME`` (default ``store_slim_bootstrap.db``) so the image downloads the smaller full-catalog LFS object instead of copying the bundled demo seed. After this, run ``python scripts/publish_hf_space.py --verify`` to push code and smoke the app. Example:: export HF_SPACE_REPO=ronheichman/kink-discovery python scripts/deploy_hf_bootstrap_catalog.py """ from __future__ import annotations import argparse import os import sys import tomllib from pathlib import Path ROOT = Path(__file__).resolve().parent.parent if str(ROOT) not in sys.path: sys.path.insert(0, str(ROOT)) from backend.repo_dotenv import load_repo_dotenv DEFAULT_SECRETS = Path(os.environ.get("KINK_PARSER_SECRETS_TOML", Path.home() / "PycharmProjects/parser/secrets.toml")) def main() -> int: load_repo_dotenv() ap = argparse.ArgumentParser(description=__doc__) ap.add_argument("--secrets-toml", type=Path, default=DEFAULT_SECRETS) ap.add_argument( "--local-path", type=Path, default=ROOT / "data" / "store_slim_b2.db", ) ap.add_argument("--repo-id", default="ronheichman/kink-catalog-slim") ap.add_argument("--remote-filename", default="store_slim_bootstrap.db") ap.add_argument("--skip-hub-upload", action="store_true") args = ap.parse_args() repo_id = (os.environ.get("HF_SPACE_REPO") or "").strip() if not repo_id: print("deploy_hf_bootstrap_catalog: set HF_SPACE_REPO=owner/slug", file=sys.stderr) return 1 local = args.local_path.resolve() if not local.is_file(): print(f"deploy_hf_bootstrap_catalog: missing {local}", file=sys.stderr) return 1 token = (os.environ.get("HF_TOKEN") or os.environ.get("HUGGING_FACE_HUB_TOKEN") or "").strip() if not token and args.secrets_toml.is_file(): with args.secrets_toml.open("rb") as f: data = tomllib.load(f) token = ((data.get("huggingface") or {}).get("token") or "").strip() if not token: print( "deploy_hf_bootstrap_catalog: set HF_TOKEN / HUGGING_FACE_HUB_TOKEN or [huggingface].token in secrets.toml", file=sys.stderr, ) return 1 from huggingface_hub import HfApi api = HfApi(token=token) if not args.skip_hub_upload: api.create_repo(args.repo_id, repo_type="dataset", exist_ok=True) print( f"deploy_hf_bootstrap_catalog: uploading {local} → {args.repo_id}/{args.remote_filename} …", file=sys.stderr, ) api.upload_file( path_or_fileobj=str(local), path_in_repo=args.remote_filename, repo_id=args.repo_id, repo_type="dataset", ) api.add_space_variable( repo_id, "KINK_HF_DATASET_FILENAME", args.remote_filename, description="Bootstrap SQLite filename in kink-catalog-slim (slim ~280MiB)", token=token, ) api.add_space_variable( repo_id, "KINK_HF_REQUIRE_FULL_CATALOG", "1", description="Require remote full catalog bootstrap instead of bundled demo seed", token=token, ) api.add_space_variable( repo_id, "KINK_HF_DATASET_REPO", args.repo_id, description="Hub dataset for catalog (matches Dockerfile default)", token=token, ) print("deploy_hf_bootstrap_catalog: Space variables updated.", file=sys.stderr) print( f" HF_TOKEN=*** HF_SPACE_REPO={repo_id} python scripts/publish_hf_space.py --verify", file=sys.stderr, ) return 0 if __name__ == "__main__": raise SystemExit(main())