JH-BK commited on
Commit
24a3eed
·
verified ·
1 Parent(s): bdf02fd

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +114 -0
app.py ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ import runpy
5
+ import sys
6
+ from pathlib import Path
7
+
8
+
9
+ def _env(name: str) -> str | None:
10
+ v = os.environ.get(name)
11
+ if v is None:
12
+ return None
13
+ v = v.strip()
14
+ return v or None
15
+
16
+
17
+ def _fail(msg: str) -> None:
18
+ """
19
+ Fail fast with a useful error message.
20
+
21
+ This file is intended to run as a Hugging Face *public* Space entrypoint.
22
+ It downloads a *private* Space snapshot at runtime and executes its app.
23
+ """
24
+ raise SystemExit(msg)
25
+
26
+
27
+ def _ensure_private_space_snapshot(
28
+ *,
29
+ repo_id: str,
30
+ token: str,
31
+ cache_dir: Path,
32
+ entrypoint_rel: str,
33
+ ) -> Path:
34
+ try:
35
+ from huggingface_hub import snapshot_download # type: ignore
36
+ except Exception as exc: # pragma: no cover
37
+ _fail(
38
+ "Missing dependency: huggingface_hub\n"
39
+ "Add it to your Space requirements.\n"
40
+ f"Import error: {exc}"
41
+ )
42
+
43
+ cache_dir.mkdir(parents=True, exist_ok=True)
44
+ entrypoint_path = (cache_dir / entrypoint_rel).resolve()
45
+
46
+ # Avoid re-downloading on every rerun: only download if the entrypoint is missing.
47
+ if entrypoint_path.exists():
48
+ return entrypoint_path
49
+
50
+ snapshot_download(
51
+ repo_id=str(repo_id),
52
+ repo_type="space",
53
+ token=str(token),
54
+ local_dir=str(cache_dir),
55
+ )
56
+
57
+ if not entrypoint_path.exists():
58
+ _fail(
59
+ "Downloaded private Space snapshot, but entrypoint file was not found.\n"
60
+ f"repo_id={repo_id}\n"
61
+ f"entrypoint={entrypoint_rel}\n"
62
+ f"cache_dir={cache_dir}"
63
+ )
64
+
65
+ return entrypoint_path
66
+
67
+
68
+ def main() -> None:
69
+ """
70
+ Configuration (recommended to set via HF Space 'Secrets' / 'Variables'):
71
+
72
+ - HF_TOKEN: Read token that can access the private Space repo.
73
+ - PRIVATE_SPACE_REPO_ID: e.g. "org-or-user/private-space-name"
74
+
75
+ Optional:
76
+ - PRIVATE_SPACE_ENTRYPOINT: relative path inside the private repo (default: "app.py")
77
+ - PRIVATE_SPACE_CACHE_DIR: local dir to store the downloaded snapshot (default: "private_space_cache")
78
+ """
79
+
80
+ token = _env("HF_TOKEN")
81
+ repo_id = _env("PRIVATE_SPACE_REPO_ID")
82
+ entrypoint_rel = _env("PRIVATE_SPACE_ENTRYPOINT") or "app.py"
83
+ cache_dir = Path(_env("PRIVATE_SPACE_CACHE_DIR") or "private_space_cache")
84
+
85
+ if not token:
86
+ _fail(
87
+ "HF_TOKEN is not set.\n"
88
+ "Set it as a Hugging Face Space Secret with read access to the private Space."
89
+ )
90
+ if not repo_id:
91
+ _fail(
92
+ "PRIVATE_SPACE_REPO_ID is not set.\n"
93
+ 'Example: PRIVATE_SPACE_REPO_ID="org-or-user/private-space-name"'
94
+ )
95
+
96
+ entrypoint_path = _ensure_private_space_snapshot(
97
+ repo_id=repo_id,
98
+ token=token,
99
+ cache_dir=cache_dir,
100
+ entrypoint_rel=entrypoint_rel,
101
+ )
102
+
103
+ # Make the private Space snapshot importable (for `from x import y` inside it).
104
+ cache_dir_str = str(cache_dir.resolve())
105
+ if cache_dir_str not in sys.path:
106
+ sys.path.insert(0, cache_dir_str)
107
+
108
+ # Execute the private entrypoint as if it were the main app file.
109
+ runpy.run_path(str(entrypoint_path), run_name="__main__")
110
+
111
+
112
+ if __name__ == "__main__":
113
+ main()
114
+