"""Simple task runner for common project workflows.""" from __future__ import annotations import argparse import os import subprocess import sys import time def run_cmd(cmd: list[str]) -> int: print(">", " ".join(cmd)) return subprocess.call(cmd) def task_install() -> int: return run_cmd([sys.executable, "-m", "pip", "install", "-r", "requirements.txt"]) def task_run() -> int: return run_cmd([sys.executable, "-m", "uvicorn", "api.main:app", "--host", "0.0.0.0", "--port", "8000"]) def task_space() -> int: return run_cmd([sys.executable, "app.py"]) def task_smoke() -> int: return run_cmd([sys.executable, "smoke_test.py"]) def task_compile() -> int: return run_cmd([sys.executable, "-m", "compileall", "."]) def task_docker_up() -> int: return run_cmd(["docker", "compose", "up", "--build"]) def task_docker_down() -> int: return run_cmd(["docker", "compose", "down"]) def task_hf_upload(repo_id: str, token: str, private: bool) -> int: cmd = [sys.executable, "upload_to_hf.py", "--repo-id", repo_id, "--token", token] if private: cmd.append("--private") return run_cmd(cmd) def task_serve_smoke() -> int: """Start API, run smoke test, then stop API.""" env = os.environ.copy() server_cmd = [sys.executable, "-m", "uvicorn", "api.main:app", "--host", "127.0.0.1", "--port", "8000"] print(">", " ".join(server_cmd)) server = subprocess.Popen(server_cmd, env=env) try: time.sleep(3) return run_cmd([sys.executable, "smoke_test.py"]) finally: server.terminate() try: server.wait(timeout=10) except subprocess.TimeoutExpired: server.kill() def main(): parser = argparse.ArgumentParser(description="Project task runner") sub = parser.add_subparsers(dest="task", required=True) sub.add_parser("install") sub.add_parser("run") sub.add_parser("space") sub.add_parser("smoke") sub.add_parser("compile") sub.add_parser("docker-up") sub.add_parser("docker-down") sub.add_parser("serve-smoke") hf = sub.add_parser("hf-upload") hf.add_argument("--repo-id", required=True) hf.add_argument("--token", required=True) hf.add_argument("--private", action="store_true") args = parser.parse_args() if args.task == "install": code = task_install() elif args.task == "run": code = task_run() elif args.task == "space": code = task_space() elif args.task == "smoke": code = task_smoke() elif args.task == "compile": code = task_compile() elif args.task == "docker-up": code = task_docker_up() elif args.task == "docker-down": code = task_docker_down() elif args.task == "serve-smoke": code = task_serve_smoke() else: code = task_hf_upload(args.repo_id, args.token, args.private) raise SystemExit(code) if __name__ == "__main__": main()