ADR-050 : Opt-in QR Code forge-mvc-qrcode¶
Statut¶
Acceptée
S'inscrit dans ADR-004 (périmètre du core minimal) et
ADR-008-bis / ADR-016 (modèle opt-in) : une brique
générique mais non essentielle relève d'un paquet optionnel, pas du cœur.
Contexte¶
La génération de QR Codes est un besoin fréquent dans des applications variées :
badges, tickets, liens rapides, inventaire matériel, accès à une activité
pédagogique, lien vers un QCM, usages futurs avec MFA ou Forge Design.
Cette brique échoue volontairement au test de légitimité d'ADR-004 : « si je
retire cette fonction du core, une application Forge basique tourne-t-elle
encore ? » → oui. Le QR Code n'est pas une primitive du framework. Il ne doit pas
entrer dans Forge Core, ni devenir une dépendance obligatoire du cœur.
Décision¶
Créer l'opt-in forge-mvc-qrcode, découplé du core, avec une API minimale et
explicite :
QrCode.from_text(text)puisto_png()(octets PNG) etto_svg()(texte SVG) ;QrCodeResponse.from_text(text, fmt="png"|"svg")qui renvoie une
core.http.Responseservable depuis un contrôleur ;QrCodeErrorpour les entrées invalides (texte vide, format inconnu).
La règle de dépendance est unidirectionnelle :
Forge Core ne sait rien des QR Codes.
forge-mvc-qrcode fournit une API simple.
L'application décide ce qu'elle encode.
Bibliothèque retenue¶
segno : génération de QR Codes en pur Python, sans dépendance (pas de
Pillow), écriture PNG et SVG natives, licence BSD, maintenue. Déclarée
uniquement dans le pyproject.toml du paquet, jamais dans le cœur.
Conséquences¶
- Le cœur reste autonome : aucun import de
forge_mvc_qrcode,segnoabsent de
ses dépendances (verrouillé par un test). - Le paquet suit les conventions opt-in :
py.typed,# pyright: strict, smoke
test, doc embarquée (ADR-038) agrégée par le plugin monorepo.
Hors périmètre de ce socle¶
Commande CLI forge qrcode:*, stockage dans storage/, génération PDF, scanner
de QR Code, logique métier (badge, ticket, inventaire), intégration MFA/TOTP ou
Forge Design. Ces sujets relèvent de tickets ultérieurs.