pif / scripts /upload_to_hf.py
pramodmisra's picture
Secure client data: private HF dataset instead of public Space repo
565e87b
Raw
History Blame Contribute Delete
2.47 kB
"""Sync refresh_data.json to the PRIVATE HF dataset, then restart the Space.
Data lives in the private dataset (pramodmisra/pif-data), NOT in the public
Space repo (which is anonymously downloadable). On Space restart, start.py pulls
the dataset file via the HF_TOKEN Space secret and re-imports it.
Flow:
1. Compare the freshly-built local file against the dataset's current copy.
2. If unchanged, do nothing (no upload, no restart).
3. If changed, upload to the dataset and restart the Space to re-import.
Secret: HF_TOKEN (write scope) from the environment — never hardcoded.
Dependency: huggingface_hub (CI-only; not in the Space requirements).
"""
from __future__ import annotations
import os
import sys
from huggingface_hub import HfApi, hf_hub_download
DATA_REPO_ID = "pramodmisra/pif-data" # private dataset
SPACE_REPO_ID = "pramodmisra/pif" # public Space (web app)
REPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
REFRESH_FILE = os.path.join(REPO_ROOT, "refresh_data.json")
def _remote_bytes(api: HfApi) -> bytes | None:
"""Current dataset copy, or None if it doesn't exist yet."""
try:
path = hf_hub_download(
repo_id=DATA_REPO_ID, repo_type="dataset",
filename="refresh_data.json", token=api.token,
)
with open(path, "rb") as fh:
return fh.read()
except Exception:
return None
def main() -> None:
token = os.environ.get("HF_TOKEN")
if not token:
print("ERROR: HF_TOKEN not set in environment.", file=sys.stderr)
sys.exit(1)
if not os.path.exists(REFRESH_FILE):
print(f"ERROR: {REFRESH_FILE} not found.", file=sys.stderr)
sys.exit(1)
api = HfApi(token=token)
with open(REFRESH_FILE, "rb") as fh:
local = fh.read()
if local == _remote_bytes(api):
print("No change vs. dataset; skipping upload + restart.")
return
print(f"Uploading refresh_data.json -> dataset/{DATA_REPO_ID} ...")
api.upload_file(
path_or_fileobj=REFRESH_FILE,
path_in_repo="refresh_data.json",
repo_id=DATA_REPO_ID,
repo_type="dataset",
commit_message="chore: daily client refresh from Google Sheet",
)
print(f"Restarting Space {SPACE_REPO_ID} to re-import ...")
api.restart_space(repo_id=SPACE_REPO_ID)
print("Done; Space will re-pull the private dataset on boot.")
if __name__ == "__main__":
main()