Siphonight 491efef8eb v1.4.10 — portage initial de l'app Android v1.4.10
Portage navigateur complet de l'app Android HormoneTrack v1.4.10 :
- moteur PK fidèle (Estrannaise tables ODS, Transfem Science V3C,
  WHSAH fit Mona, Bateman) — paramètres identiques, invariants Android
  préservés (fixes #19-#23, #35, #52-#62), 121 tests Node épinglés
- calibration par période d'ester et par modèle affiché (#60/#61)
- UI 6 écrans + éditeur, CurveChart Canvas (zoom/pan fractionnaire,
  prévision, pics/creux, fuseau configurable), rappels web
  (Notification API), seuils d'alerte, i18n FR/EN
- sauvegarde JSON v2 compatible Android bidirectionnelle (rétrocompat v1)
- 100 % local : localStorage, aucun serveur applicatif, aucune télémétrie
- processus : scripts/check.sh (syntaxe, i18n, tests, E2E navigateur,
  smoke HTTP), docs séparées (README + DEVELOPPEMENT + CHANGELOG)
- dépôt GIT SÉPARÉ de l'Android : historique 100 % propre, versions
  alignées sur l'Android porté, changelogs indépendants

Non porté (impossible dans un navigateur, documenté §12) : agenda
récurrent, notifications onglet fermé, montre.
2026-09-08 14:34:58 +02:00

69 lines
2.6 KiB
Python

#!/usr/bin/env python3
"""
serve.py — serveur statique de développement/test pour HormoneTrack Web.
Pourquoi un script dédié (au lieu de `python3 -m http.server`) :
- headers Cache-Control: no-cache → un rechargement teste toujours le code
à jour (indispensable en développement et en smoke-test) ;
- Content-Type corrects (json, svg, wasm-safe) sur toutes les plateformes ;
- messages de démarrage explicites (URL + raccourci ?demo=1 documenté).
⚠️ C'est un serveur de DÉVELOPPEMENT (mono-thread, sans TLS). Pour la
production, servir CE DOSSIER avec n'importe quel serveur statique
(nginx, caddy, Gitea pages, etc.) — l'app n'a AUCUN composant serveur.
Usage :
python3 scripts/serve.py [--port 8970] [--bind 127.0.0.1]
"""
import argparse
import mimetypes
import os
import sys
from http.server import HTTPServer, SimpleHTTPRequestHandler
# S'assurer que les types marginaux sont corrects (utile pour l'asset PK)
mimetypes.add_type("application/json", ".json")
mimetypes.add_type("image/svg+xml", ".svg")
mimetypes.add_type("text/markdown", ".md")
class NoCacheHandler(SimpleHTTPRequestHandler):
"""Handler statique avec cache désactivé (dev/test)."""
def end_headers(self):
self.send_header("Cache-Control", "no-cache, no-store, must-revalidate")
self.send_header("Pragma", "no-cache")
self.send_header("Expires", "0")
super().end_headers()
def log_message(self, format, *args):
# Log concis vers stdout (une ligne par requête)
sys.stderr.write(" %s\n" % (format % args))
def main():
parser = argparse.ArgumentParser(description="Serveur statique HormoneTrack Web (dev)")
parser.add_argument("--port", type=int, default=8970, help="port d'écoute (défaut 8970)")
parser.add_argument("--bind", default="127.0.0.1", help="interface d'écoute (défaut 127.0.0.1)")
args = parser.parse_args()
# Racine = le dossier parent de scripts/ (la racine du dépôt), peu importe
# d'où le script est appelé.
web_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
os.chdir(web_root)
server = HTTPServer((args.bind, args.port), NoCacheHandler)
print(f"HormoneTrack Web — serveur de dev sur http://{args.bind}:{args.port}/")
print(" app : http://" + f"{args.bind}:{args.port}/")
print(" mode démo : http://" + f"{args.bind}:{args.port}/?demo=1 (données de test, si store vide)")
print(" Ctrl-C pour arrêter")
try:
server.serve_forever()
except KeyboardInterrupt:
print("\narrêté")
if __name__ == "__main__":
main()