JSON Schema
Cada archivo de data/ tiene un JSON Schema (draft-07) en schema/. Los esquemas se generan a partir de los tipos de TypeScript, de modo que los tipos, los esquemas y los datos no pueden divergir: la CI falla cuando cualquiera de los tres no coincide.
| Archivo de datos | Esquema |
|---|---|
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 |
El $id de cada esquema es su URL en este sitio, p. ej. https://pieterjanscheir.github.io/belgica/schema/courts.schema.json. También están en el paquete npm como belgica/schema/courts.schema.json.
Validar los datos
import json
from urllib.request import urlopen
from jsonschema import validate # pip install jsonschema
# Fija un release tag que incluya schema/; hasta que salga el primero, usa 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) // trueNormalmente lo querrás cuando guardas una copia de los datos (un fork con registros extra, una descarga en caché) y quieres saber que sigue teniendo la estructura que espera el paquete.
Generar tipos para otros lenguajes
Como los esquemas son estándar, puedes generar modelos en lugar de escribirlos a mano: datamodel-code-generator para Python (Pydantic), quicktype para C#, Go, Java, Kotlin, Swift y más.
datamodel-codegen --input courts.schema.json --input-file-type jsonschema --output courts.pydatapackage.json
La raíz del repositorio tiene un datapackage.json, un descriptor Frictionless Data Package: el archivo de metadatos estándar para conjuntos de datos abiertos. Enumera cada archivo de datos con su título, descripción, esquema, fuentes oficiales y licencia, y dos campos propios:
lastReviewed: el día en que el conjunto de datos se comprobó por última vez frente a sus fuentes;reviewEveryMonths: cada cuánto debe volver a comprobarse. La comprobación de actualidad abre un issue cuando un conjunto de datos está atrasado.