salescode-recapture-detector / scripts /check_deployment_package.py
Kartikeya Mishra
Deploy SalesCode recapture detector to Space
7c34b66
Raw
History Blame Contribute Delete
2.86 kB
import os
import sys
def main():
root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
os.chdir(root_dir)
print("--- Starting Deployment Package Check ---")
errors = []
# 1. Required files
required_files = [
"Dockerfile",
".dockerignore",
"requirements.txt",
"README.md",
"model.joblib",
"model_metadata.json",
"predict.py",
"features.py",
"backend/app.py",
"frontend/package.json"
]
for f in required_files:
if not os.path.exists(f):
errors.append(f"Missing required file/folder: {f}")
# 2. Check README.md for Hugging Face Frontmatter
if os.path.exists("README.md"):
with open("README.md", "r", encoding="utf-8") as f:
content = f.read()
if "sdk: docker" not in content or "app_port: 7860" not in content:
errors.append("README.md is missing 'sdk: docker' or 'app_port: 7860' YAML frontmatter.")
# 3. Check Dockerfile
if os.path.exists("Dockerfile"):
with open("Dockerfile", "r", encoding="utf-8") as f:
content = f.read()
if "EXPOSE 7860" not in content:
errors.append("Dockerfile does not contain 'EXPOSE 7860'.")
if "7860" not in content:
errors.append("Dockerfile does not seem to bind uvicorn to port 7860.")
# 4. Check requirements.txt
if os.path.exists("requirements.txt"):
with open("requirements.txt", "r", encoding="utf-8") as f:
content = f.read()
if "opencv-python-headless" not in content:
errors.append("requirements.txt must use 'opencv-python-headless' instead of 'opencv-python'.")
# 5. Check for forbidden large files (we won't fail strictly on zip if it's outside the build context, but good to warn)
forbidden_dirs = [
"dataset/Data",
"node_modules",
"venv",
".venv"
]
for d in forbidden_dirs:
if os.path.exists(d) and os.path.isdir(d):
print(f"[WARNING] Large directory exists locally: {d} (Ensure it is in .dockerignore!)")
if os.path.exists(".dockerignore"):
with open(".dockerignore", "r", encoding="utf-8") as f:
content = f.read()
if "dataset" not in content:
errors.append(".dockerignore must ignore 'dataset' folder.")
if "node_modules" not in content:
errors.append(".dockerignore must ignore 'node_modules' folder.")
if errors:
print("\n[FAIL] Deployment check failed with the following errors:")
for e in errors:
print(f" - {e}")
sys.exit(1)
else:
print("\n[PASS] Deployment package checks passed! Ready for Hugging Face Spaces.")
if __name__ == "__main__":
main()