| import os |
| from pathlib import Path |
|
|
| from dotenv import load_dotenv |
| from huggingface_hub import HfApi |
|
|
|
|
| def str_to_bool(value: str, default: bool = False) -> bool: |
| if value is None: |
| return default |
| return value.strip().lower() in {"1", "true", "yes", "y"} |
|
|
|
|
| def push_deployment_files_to_hf_space(env_path: str = ".env") -> str: |
| load_dotenv(env_path) |
| hf_username = os.getenv("HF_USERNAME") |
| hf_token = os.getenv("HF_TOKEN") |
| if not hf_username or not hf_token: |
| raise EnvironmentError(f"HF_USERNAME and HF_TOKEN must be set in {env_path}.") |
|
|
| space_repo = os.getenv("HF_SPACE_REPO", f"{hf_username}/predictive-maintenance-engine-space") |
| space_private = str_to_bool(os.getenv("HF_SPACE_PRIVATE"), default=False) |
| deployment_dir = Path(__file__).resolve().parent |
|
|
| required_files = ["Dockerfile", "README.md", "app.py", "requirements.txt", "deployment_config.json", ".dockerignore"] |
| missing_files = [file_name for file_name in required_files if not (deployment_dir / file_name).exists()] |
| if missing_files: |
| raise FileNotFoundError(f"Missing deployment files: {missing_files}") |
|
|
| api = HfApi(token=hf_token) |
| api.create_repo( |
| repo_id=space_repo, |
| repo_type="space", |
| space_sdk="docker", |
| private=space_private, |
| exist_ok=True, |
| ) |
| api.upload_folder( |
| repo_id=space_repo, |
| repo_type="space", |
| folder_path=str(deployment_dir), |
| path_in_repo=".", |
| ignore_patterns=["__pycache__/*", "*.pyc", ".env", "prediction_logs/*", "sample_prediction_inputs.csv"], |
| ) |
|
|
| space_url = f"https://huggingface.co/spaces/{space_repo}" |
| print("Deployment files pushed to Hugging Face Space:", space_url) |
| return space_url |
|
|
|
|
| if __name__ == "__main__": |
| push_deployment_files_to_hf_space() |
|
|