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.
69 lines
2.6 KiB
Python
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()
|