"""Réutilisation des briques déjà livrées (workflow #5 · zéro duplication). L'audit 5D ne redéfinit rien qui existe ailleurs dans le mandat. On importe — jamais on ne duplique — : - `validate` : le validateur JSON-Schema maison du Publiciste (draft-07, sous-ensemble) → valider le rapport SANS pip, le gate CI Gitea Actions tournant sans réseau (CLAUDE.md #2). - `is_filled` : la notion partagée de « champ réellement rempli » (un placeholder ou un `null` n'est PAS rempli) — au cœur de l'anti-invention #6. - `RoleResolver` : la table `role_id → nom de rôle Frappe` du module CRM, seule autorité de nommage des rôles (contrat RBAC). - `roles_targeting` : la lecture des rôles RBAC qui visent un DocType, déjà écrite pour le générateur CONFOTUR. Import par `sys.path` (idiome des modules voisins) — une seule source de vérité. """ from __future__ import annotations import os import sys _HERE = os.path.dirname(os.path.abspath(__file__)) # qa/audit_5d/qalib → 05_deliverables_mvp _DELIVERABLES = os.path.normpath(os.path.join(_HERE, "..", "..", "..")) _GEN = os.path.join(_DELIVERABLES, "faisabilite", "generator") _PUB = os.path.join(_DELIVERABLES, "publiciste") _WF = os.path.join(_DELIVERABLES, "crm", "workflow_vente") _CONF = os.path.join(_DELIVERABLES, "legal", "confotur") for _p in (_GEN, _PUB, _WF, _CONF): if _p not in sys.path: sys.path.insert(0, _p) from genlib import model # type: ignore # noqa: E402 from lib import validator # type: ignore # noqa: E402 from wflib.rbac import RoleResolver # type: ignore # noqa: E402 from cflib import rbac_scan # type: ignore # noqa: E402 is_filled = model.is_filled validate = validator.validate roles_targeting = rbac_scan.roles_targeting load_contract = rbac_scan.load_contract __all__ = [ "is_filled", "validate", "RoleResolver", "roles_targeting", "load_contract", ]