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()