| from __future__ import annotations |
|
|
| import sys |
| from pathlib import Path |
|
|
| ROOT = Path(__file__).resolve().parents[1] |
| if str(ROOT) not in sys.path: |
| sys.path.insert(0, str(ROOT)) |
|
|
| from server.app import app |
| from server.environment import SecretsAuditEnvironment |
|
|
|
|
| def require(condition: bool, message: str) -> None: |
| if not condition: |
| raise SystemExit(message) |
|
|
|
|
| def main() -> None: |
| readme = (ROOT / "README.md").read_text(encoding="utf-8") |
| dockerfile = (ROOT / "Dockerfile").read_text(encoding="utf-8") |
| dockerignore = (ROOT / ".dockerignore").read_text(encoding="utf-8") |
| openenv_manifest = (ROOT / "openenv.yaml").read_text(encoding="utf-8") |
| pyproject = (ROOT / "pyproject.toml").read_text(encoding="utf-8") |
| uv_lock = (ROOT / "uv.lock").read_text(encoding="utf-8") |
|
|
| require("sdk: docker" in readme, "README.md is missing Hugging Face docker metadata.") |
| require("app_port: 7860" in readme, "README.md is missing app_port: 7860.") |
| require("spec_version: 1" in openenv_manifest, "openenv.yaml is missing spec_version: 1.") |
| require("runtime: fastapi" in openenv_manifest, "openenv.yaml must declare runtime: fastapi.") |
| require("app: server.app:app" in openenv_manifest, "openenv.yaml must point to server.app:app.") |
| require("port: 7860" in openenv_manifest, "openenv.yaml must declare port 7860.") |
| require("[project]" in pyproject, "pyproject.toml is missing a [project] table.") |
| require('name = "openenv-secrets-audit-env"' in pyproject, "pyproject.toml is missing the expected project name.") |
| require('requires-python = ">=3.11"' in pyproject, "pyproject.toml must declare requires-python >=3.11.") |
| require("[project.scripts]" in pyproject, "pyproject.toml is missing a [project.scripts] table.") |
| require('server = "server.app:main"' in pyproject, 'pyproject.toml must define server = "server.app:main".') |
| require("openenv-core>=0.2.0" in pyproject or "openenv>=0.2.0" in pyproject, "pyproject.toml must include openenv-core>=0.2.0 or openenv>=0.2.0.") |
| require("version = 1" in uv_lock or "version = 2" in uv_lock or "version = 3" in uv_lock, "uv.lock is missing or invalid.") |
| require("EXPOSE 7860" in dockerfile, "Dockerfile must expose port 7860.") |
| require("uvicorn server.app:app" in dockerfile or "uvicorn server.app:app" in (ROOT / "hf_space_entrypoint.sh").read_text(encoding="utf-8"), "Space startup command is missing uvicorn.") |
| require(".env" in dockerignore, ".dockerignore must exclude .env.") |
| require("runtime/" in dockerignore, ".dockerignore must exclude runtime/.") |
| require(app.title == "SecretsAuditEnv", "FastAPI app failed to import correctly.") |
|
|
| env = SecretsAuditEnvironment() |
| tasks = env.list_tasks() |
| require(len(tasks) == 13, f"Expected 13 tasks, found {len(tasks)}.") |
|
|
| print("Space readiness checks passed.") |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|