spb/toit-ka Public
Toit-Ka — louer ou acheter un toit au Québec, un seul endroit (fusion Lou-Ka × Immo-Ka) — www.toit-ka.com
Python 40.2%
TypeScript 39%
CSS 20.2%
HTML 0.7%
1# Author: Simon-Pierre Boucher2# Contact: contact@spboucher.ai3# Project: Toit-Ka4# -----------------------------------------------------------------------------5# run.py : point d'entrée CLI unique de Toit-Ka6# serve [port] — API FastAPI + frontend (défaut 8097)7# etl — une passe : répliques -> toitka.db (normalisation villes/types)8# watch [minutes] — boucle : replicate (si configuré) + etl (défaut 30 min)9# replicate — tire les snapshots des BD lou-ka / immo-ka (nodes prod)10# villes — rapport de canonicalisation des villes (audit)11# -----------------------------------------------------------------------------12from __future__ import annotations1314import os15import sys16from pathlib import Path1718ROOT = Path(__file__).resolve().parent192021def _load_env() -> None:22 """Charge .env à la main (aucune dépendance), sans écraser l'environnement."""23 env = ROOT / ".env"24 if not env.exists():25 return26 for line in env.read_text(encoding="utf-8").splitlines():27 line = line.strip()28 if not line or line.startswith("#") or "=" not in line:29 continue30 k, _, v = line.partition("=")31 os.environ.setdefault(k.strip(), v.strip().strip('"').strip("'"))323334def main() -> None:35 _load_env()36 cmd = sys.argv[1] if len(sys.argv) > 1 else "serve"3738 if cmd == "serve":39 import uvicorn40 port = int(sys.argv[2]) if len(sys.argv) > 2 else 809741 uvicorn.run("toitka.web:app", host="0.0.0.0", port=port)42 elif cmd == "etl":43 from toitka import etl44 etl.run()45 elif cmd == "watch":46 from toitka import etl47 minutes = float(sys.argv[2]) if len(sys.argv) > 2 else 3048 etl.watch(minutes * 60)49 elif cmd == "replicate":50 from toitka import replicate51 replicate.run()52 elif cmd == "villes":53 from toitka import etl54 etl.rapport_villes()55 else:56 print(__doc__ or "Commandes : serve | etl | watch | replicate | villes")57 sys.exit(1)585960if __name__ == "__main__":61 main()62