JSON Schema
Chaque fichier de data/ a un JSON Schema (draft-07) dans schema/. Les schémas sont générés à partir des types TypeScript ; les types, les schémas et les données ne peuvent donc pas diverger : la CI échoue dès que l'un des trois n'est pas d'accord avec les autres.
| Fichier de données | Schéma |
|---|---|
data/judicial-areas.json | judicial-areas.schema.json |
data/arrondissements.json | arrondissements.schema.json |
data/cantons.json | cantons.schema.json |
data/canton-boundaries.json | canton-boundaries.schema.json |
data/municipalities.json | municipalities.schema.json |
data/regions.json | regions.schema.json |
data/provinces.json | provinces.schema.json |
data/courts.json | courts.schema.json |
data/prisons.json | prisons.schema.json |
data/houses-of-justice.json | houses-of-justice.schema.json |
data/postal-codes.json | postal-codes.schema.json |
data/interest-rates.json | interest-rates.schema.json |
Le $id de chaque schéma est son URL sur ce site, par exemple https://pieterjanscheir.github.io/belgica/schema/courts.schema.json. Ils sont aussi dans le package npm sous belgica/schema/courts.schema.json.
Valider les données
import json
from urllib.request import urlopen
from jsonschema import validate # pip install jsonschema
# Épinglez un tag de version qui contient schema/ ; tant que le premier n'est pas publié, utilisez main
TAG = "main"
BASE = f"https://raw.githubusercontent.com/pieterjanscheir/belgica/{TAG}"
courts = json.load(urlopen(f"{BASE}/data/courts.json"))
schema = json.load(urlopen(f"{BASE}/schema/courts.schema.json"))
validate(courts, schema)import { Ajv } from 'ajv'
import addFormats from 'ajv-formats'
import courts from 'belgica/data/courts.json' with { type: 'json' }
import schema from 'belgica/schema/courts.schema.json' with { type: 'json' }
const ajv = new Ajv()
addFormats(ajv)
ajv.validate(schema, courts) // trueVous en aurez surtout besoin quand vous conservez une copie des données (un fork avec des enregistrements supplémentaires, un téléchargement mis en cache) et voulez savoir si elle a toujours la forme que le package attend.
Générer des types pour d'autres langages
Comme les schémas sont standard, vous pouvez générer des modèles au lieu de les écrire à la main : datamodel-code-generator pour Python (Pydantic), quicktype pour C#, Go, Java, Kotlin, Swift et d'autres encore.
datamodel-codegen --input courts.schema.json --input-file-type jsonschema --output courts.pydatapackage.json
La racine du dépôt contient un datapackage.json, un descripteur Frictionless Data Package : le fichier de métadonnées standard pour les jeux de données ouverts. Il liste chaque fichier de données avec son titre, sa description, son schéma, ses sources officielles, sa licence, et deux champs qui nous sont propres :
lastReviewed: le jour où le jeu de données a été vérifié pour la dernière fois par rapport à ses sources ;reviewEveryMonths: la fréquence à laquelle il doit être vérifié à nouveau. Le contrôle de fraîcheur ouvre une issue quand un jeu de données est en retard.