TEMPORA — Framework pour les corpus historiquesALNOP — Profil du framework TEMPORA
TEMPORA — Framework pour les corpus historiques
Le noyau TEMPORA fournit les contrats communs aux corpus historiques. Les profils déclarent les choix propres à chaque corpus. Les adaptateurs transforment les données d’origine en objets que le noyau sait valider et analyser.
Architecture : noyau, profils et applications
| Niveau | Responsabilité |
|---|---|
| Noyau | Chargement des profils, validation, modèle canonique, ingestion et analyses |
| Profil | Période, langues, vocabulaires, règles de validation et mappings d’import |
| Adaptateur | Conversion des données d’origine et conservation de leur provenance |
| Application | Consultation du corpus et parcours de contribution du profil |
ALNOP fournit un exemple complet de profil et d’application de consultation. Les analyses v3 et les imports utilisent une copie de travail locale. Profil ALNOP · Modèle et migration · Import local · Analyses
Valider un profil
npm run validate:profiles
npm run validate:profiles -- --profile profiles/alnop/profile.json
La première commande découvre les configurations publiées sous profiles/, vérifie leurs identifiants et valide les opérations ALNOP avec les vocabulaires actuels. La seconde vérifie un manifeste explicite, sans importer de corpus. Les formats et contraintes figurent dans schemas/tempora.profile.schema.json, version 1.0.0.
Le profil ALNOP reprend la fenêtre annuelle de validation historique existante : 1954 à 1962 inclus. Il ne restreint pas artificiellement le dernier jour au 5 juillet. Cette fenêtre est une règle technique du profil, pas une preuve de date ni une mesure d'exhaustivité historique. Les vocabulaires restent lus depuis les données canoniques ; ils ne sont pas recopiés dans le profil.
Charger une configuration
const {loadProfile} = require('./src/framework/profile-loader');
const profile = loadProfile('/chemin/projet/profiles/alnop/profile.json', {
rootDirectory: '/chemin/projet'
});
Le chargeur accepte uniquement un fichier JSON UTF-8 explicite, de taille inférieure ou égale à 128 Kio, situé dans la racine autorisée après résolution des liens. Aucun accès réseau n'est effectué. La découverte ne parcourt que les sous-répertoires immédiats du dossier fourni, chacun contenant profile.json.
Un profil peut hériter d'un parent par extends, chemin relatif vers un fichier situé dans la même racine autorisée. Les cycles et les chaînes trop longues sont refusés. Chaque parent doit lui-même être valide. Les objets sont fusionnés récursivement ; les tableaux sont remplacés intégralement. Une redéfinition de langues doit donc aussi adapter les alias dont les langues ne sont plus déclarées.
Le schéma valide la configuration résolue après héritage. Un manifeste enfant peut ne fournir que extends et les champs qu'il remplace. Les identifiants et espaces de noms doivent rester uniques dans un registre découvert.
La priorité est : parent, manifeste enfant, puis surcharges explicites. Les surcharges d'exécution concernent uniquement parameters et severities :
const adjusted = loadProfile('/racine/profiles/example/profile.json', {
rootDirectory: '/racine',
parameters: {limits: {sample: 20}},
severities: {'event-type': 'warning'}
});
Les surcharges de sévérité doivent désigner une règle existante. Les paramètres sont exposés à l'appelant ; ils ne reconfigurent pas automatiquement l'atlas ou les algorithmes ALNOP. Les résultats sont des objets gelés et indépendants, sans cache global partagé entre profils.
Compatibilité et limites
Le contrat de chargement utilise la version de compatibilité 3.0.0. La propriété framework accepte une plage bornée de la forme >=3.0.0 <4.0.0 ; les expressions SemVer plus complexes ne sont pas prises en charge. Une version de schéma inconnue ou une plage incompatible provoque une erreur explicite. Cette version de contrat ne signifie pas que toutes les capacités d'une plateforme v3 sont disponibles.
Ce composant prend actuellement en charge le calendrier grégorien, les jours ISO de 0001 à 9999, les bornes ouvertes ou inconnues dans les intervalles et le référentiel EPSG:4326. Un calendrier ou un CRS non pris en charge est refusé ; aucune conversion silencieuse n'est réalisée. Le contrôle du CRS du profil ne remplace pas une validation géométrique.
Validation configurable
const {createValidator} = require('./src/framework/validation');
const validator = createValidator(profile, {
taxonomies: {
event_types: ['type déclaré'],
territorial_units: ['territoire déclaré']
}
});
const result = validator.validate({
id: 'EXAMPLE_1',
start_date: {earliest: null, latest: null},
event_type: ['type déclaré'],
territory_ids: []
});
Les valeurs des taxonomies sont fournies par l'appelant. Le noyau ne lit pas de données métier et n'importe pas le profil ALNOP. Trois types de règles sont disponibles :
| Type | Contrôle |
|---|---|
required |
Valeur présente et non vide |
date_range |
Jours valides, bornes ordonnées et respect de la fenêtre du profil |
vocabulary |
Valeur ou liste de valeurs appartenant à une taxonomie fournie |
Les sévérités sont error, warning et info. Seuls les diagnostics error rendent valid faux. Chaque diagnostic conserve un code, le champ concerné et l'identifiant de règle. Un champ facultatif absent n'est pas rendu obligatoire par une autre règle ; utiliser required lorsque nécessaire. Les chemins de champs sont des propriétés explicites séparées par des points, sans exécution de code ni parcours des prototypes.
Les alias de vocabulaire doivent être déclarés avec langue, valeur et cible canonique. Leur correspondance est exacte ; les graphies originales ne sont pas modifiées. Une cible absente ou un alias ambigu est refusé. Ce mécanisme n'établit aucune identité de personne ou de lieu et ne traduit aucun texte.
Ces contrôles complètent les schémas et règles canoniques existants. Un résultat valide ne certifie ni la provenance documentaire ni la vérité d'un fait historique.
Interface d'adaptateur
defineAdapter vérifie une interface composée de id, formats, parse et serialize. Il conserve les fonctions fournies et fige les métadonnées. Il n'implémente pas à lui seul une ingestion CSV/GeoJSON, une quarantaine ou une publication. Les adaptateurs doivent déclarer leurs limites et être testés séparément.
Erreurs et compatibilité ALNOP
Les erreurs de configuration utilisent ProfileError avec code, message et details. Les codes distinguent notamment schéma invalide, incompatibilité de version, calendrier non pris en charge, chemin interdit, héritage cyclique et taxonomie absente.
Un chemin absent ou des options d'appel invalides sont également refusés par des erreurs typées (PROFILE_ARGUMENT_INVALID, PROFILE_ROOT_INVALID) avant tout accès au fichier.
L'adaptateur src/profiles/alnop.js projette les champs utiles pour ces règles sans modifier les objets d'origine. Le validateur Python historique lit désormais sa fenêtre annuelle depuis le même profil. Les chemins d'exports et les routes API v1/v2 restent identiques. Aucun nouvel endpoint TEMPORA n'est annoncé par ce guide.
Modèle canonique et migration
Le modèle canonique TEMPORA v3 fournit les schémas versionnés, les invariants temporels et spatiaux et une migration ALNOP réversible sur une copie intacte. La commande npm run migrate:tempora vérifie le parcours sans écrire dans les données de production.
Importer des propositions
Le pipeline d’import local utilise des mappings versionnés pour préparer et contrôler des propositions JSON, CSV et GeoJSON. Les notices acceptées restent proposées dans une copie de travail privée.
Analyses documentaires
Le guide des analyses décrit les rapprochements, la comparaison des assertions, la couverture et l’évaluation sur des cas fictifs annotés.