JSON Schema
data/ にあるすべてのファイルには、schema/ に JSON Schema(draft-07)が あります。スキーマは TypeScript の型から生成されるので、型・スキーマ・データの三つがずれることは ありません。三つのうちどれかが食い違えば CI が失敗します。
| データファイル | スキーマ |
|---|---|
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 |
各スキーマの $id はこのサイト上の URL です(例: https://pieterjanscheir.github.io/belgica/schema/courts.schema.json)。npm パッケージにも belgica/schema/courts.schema.json として含まれています。
データを検証する
python
import json
from urllib.request import urlopen
from jsonschema import validate # pip install jsonschema
# schema/ を含む release tag に固定する。最初の release が出るまでは 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)ts
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) // trueこれが役に立つのは主に、データのコピーを手元に持っている場合(独自のレコードを追加した fork、 キャッシュしたダウンロードなど)に、それがまだパッケージの想定する構造を保っているかを 確かめたいときです。
他の言語向けに型を生成する
スキーマは標準的な形式なので、モデルを手で書く代わりに生成できます。Python(Pydantic)には datamodel-code-generator、C#、Go、Java、 Kotlin、Swift などには quicktype が使えます。
bash
datamodel-codegen --input courts.schema.json --input-file-type jsonschema --output courts.pydatapackage.json
リポジトリのルートには datapackage.json があります。これは Frictionless Data Package のディスクリプタで、オープンデータセットの 標準的なメタデータファイルです。各データファイルについて、タイトル、説明、スキーマ、公式の 情報源、ライセンスと、このプロジェクト独自の二つのフィールドを記載しています。
lastReviewed:そのデータセットを最後に情報源と照合した日reviewEveryMonths:次に照合しなければならない間隔。データセットの照合期限が過ぎると、 鮮度チェックが issue を作成します。