Aller au contenu

Initialisation Forge IoT — forge iot:init

Statut : commande de préparation. Elle copie la migration SQL Forge IoT du package vers mvc/migrations/ du projet, mais n'applique pas le SQL. C'est forge migration:apply qui le fait ensuite — séparation volontaire pour rester lisible et relisible.

Objectif

Boucler le parcours du starter Bonjour IoT : passer de la réponse pédagogique

{"error": "iot_storage_not_ready"}

à une table iot_events prête à être créée par forge migration:apply. Aucune connexion base, aucun SQL exécuté.

Usage

forge iot:init

Aucune option à ce ticket. Aide via :

forge iot:init --help

Flux recommandé

forge iot:doctor       # vérifier package, config, migration, API HTTP
forge iot:init         # copier la migration vers mvc/migrations/
forge migration:apply  # créer la table iot_events en base
forge run              # démarrer l'application

Avec ce parcours :

  • forge iot:doctor confirme que forge-mvc-iot est installé, que la configuration est correcte et que la migration est embarquée dans le package.
  • forge iot:init copie le .sql depuis le package vers mvc/migrations/ du projet. Idempotent.
  • forge migration:apply (commande Forge Core existante) crée la table.
  • forge run démarre le serveur — les routes /welcome-optin-iot/events et /api/iot/events peuvent maintenant retourner des données réelles.

Comportement

Cas normal — fichier copié

[OK] Migration IoT copiée : mvc/migrations/20260528120000_create_iot_events.sql

[INFO] Lance maintenant : forge migration:apply

Exit code : 0.

Cas idempotent — déjà présent, contenu identique

[OK] Migration IoT déjà présente (identique) : mvc/migrations/20260528120000_create_iot_events.sql

[INFO] Lance maintenant : forge migration:apply

Exit code : 0. La commande est sûre à rejouer.

Cas conflit — fichier présent, contenu différent

[WARN] mvc/migrations/20260528120000_create_iot_events.sql existe et diffère — aucune modification.

Exit code : 0. Aucun écrasement : si l'utilisateur a modifié la migration localement, la décision lui revient — la commande ne touche rien. Pour repartir de la version packagée, supprimer manuellement le fichier puis relancer forge iot:init.

Cas dossier inexistant

Si mvc/ existe mais pas mvc/migrations/, le dossier est créé :

[INFO] Dossier mvc/migrations/ créé.
[OK] Migration IoT copiée : mvc/migrations/20260528120000_create_iot_events.sql

[INFO] Lance maintenant : forge migration:apply

Cas hors projet Forge

[ERREUR] Ce dossier ne ressemble pas à un projet Forge.
Conseil : lance cette commande à la racine du projet (dossier mvc/ attendu).

Exit code : 1.

Lecture des migrations packagées

La commande utilise importlib.resources pour lire les ressources embarquées dans le package Python — fonctionne identiquement en install éditable (depuis le monorepo) et en install PyPI réelle.

Le ticket IOT-PACKAGE-DATA-MIGRATIONS-001 a embarqué les .sql via [tool.setuptools.package-data] dans pyproject.toml, garantissant que forge iot:init trouve toujours sa source quelle que soit l'installation.

Hors périmètre

Sont volontairement hors périmètre de cette commande :

  • pas de forge migration:apply automatique — séparation explicite préparation / exécution ;
  • pas de connexion à MariaDB ;
  • pas de vérification que la table iot_events existe déjà ;
  • pas de rollback de migration ;
  • pas d'option interactive (--force, --diff, etc.) ;
  • pas de subscriber MQTT lancé ;
  • pas de modification de fichiers en dehors de mvc/migrations/.

Module opt-in absent

Si forge-mvc-iot n'est pas installé, forge iot:init retourne :

Erreur : module forge-mvc-iot non installé.
indice : installe le module opt-in : pip install forge-mvc-iot

Forge Core reste fonctionnel sans le module — l'import est paresseux côté dispatcher (forge.py).

Voir aussi