diff options
| author | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-19 08:41:23 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-19 08:41:23 +0200 |
| commit | 063d4058346f7dc03eb0aa5ba394b9a872d3f1e3 (patch) | |
| tree | 93d1ff06c91affc6586c64dc0326460b675f9e9b /schema | |
| parent | 5828571fa31a0480838d1ede210002ab50768c64 (diff) | |
| download | colitur-063d4058346f7dc03eb0aa5ba394b9a872d3f1e3.tar.gz colitur-063d4058346f7dc03eb0aa5ba394b9a872d3f1e3.zip | |
feat(render): CSV and JSON emitters, and the published contract
Both consume the VIEW, not the kernel, so every emitter and every
template describe exactly the same fields -- there is one vocabulary,
not five.
CSV is RFC 4180: a field with a comma is quoted. That is live on real
data, not hypothetical -- 'St. Joseph, Spouse of the Bl. Virgin Mary'
would otherwise split into two columns.
JSON is hand-rolled because the dependency list is frozen and escaping
is the only subtlety. Control characters below 0x20 are \u-escaped per
RFC 8259 section 7.
There are no numbers in the view, deliberately: a consumer never has to
guess whether week is 2 or "2".
schema/day-v1.json pins the shape. Once a phone subscribes or a site
fetches this, it is a promise to strangers -- adding a field is minor,
renaming one means /v2/.
Diffstat (limited to 'schema')
| -rw-r--r-- | schema/day-v1.json | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/schema/day-v1.json b/schema/day-v1.json new file mode 100644 index 0000000..b48133a --- /dev/null +++ b/schema/day-v1.json @@ -0,0 +1,73 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://colitur/schema/day-v1.json", + "title": "colitur liturgical year, v1", + "type": "object", + "required": ["rite", "year", "months", "days"], + "properties": { + "rite": { "type": "string" }, + "year": { "type": "string", "pattern": "^[0-9]{4}$" }, + "months": { "type": "array", "items": { "$ref": "#/$defs/month" } }, + "days": { "type": "array", "items": { "$ref": "#/$defs/day" } } + }, + "$defs": { + "month": { + "type": "object", + "required": ["num", "name", "days", "weeks"], + "properties": { + "num": { "type": "string" }, + "name": { "type": "object", "additionalProperties": { "type": "string" } }, + "days": { "type": "array", "items": { "$ref": "#/$defs/day" } }, + "weeks": { "type": "array", "items": { "$ref": "#/$defs/week" } } + } + }, + "week": { + "type": "object", + "required": ["num", "days"], + "properties": { + "num": { "type": "string" }, + "days": { "type": "array", "minItems": 7, "maxItems": 7, "items": { "$ref": "#/$defs/day" } } + } + }, + "day": { + "type": "object", + "required": ["iso", "dom", "dow", "in_month", "season", "week", "slug", + "name", "rank", "colour", "is_white", "is_red", "is_green", + "is_violet", "is_rose", "is_black", "subject", "comms", + "transferred_in", "transferred_out", "first", "gospel", "last"], + "properties": { + "iso": { "type": "string", "description": "empty on a grid padding cell" }, + "dom": { "type": "string" }, + "dow": { "type": "string", "description": "0 = Sunday" }, + "in_month": { "type": "boolean", "description": "false = grid padding cell" }, + "season": { "type": "string" }, + "week": { "type": "string", "description": "empty when the rite numbers no week here" }, + "slug": { "type": "string" }, + "name": { "type": "object", "additionalProperties": { "type": "string" } }, + "rank": { "type": "string" }, + "colour": { "type": "string", "enum": ["white","red","green","violet","rose","black",""] }, + "is_white": { "type": "boolean" }, "is_red": { "type": "boolean" }, + "is_green": { "type": "boolean" }, "is_violet":{ "type": "boolean" }, + "is_rose": { "type": "boolean" }, "is_black": { "type": "boolean" }, + "subject": { "type": "string" }, + "comms": { + "type": "array", + "items": { + "type": "object", + "required": ["slug", "name", "privileged"], + "properties": { + "slug": { "type": "string" }, + "name": { "type": "object", "additionalProperties": { "type": "string" } }, + "privileged": { "type": "boolean" } + } + } + }, + "transferred_in": { "type": "array", "items": { "type": "object" } }, + "transferred_out": { "type": "array", "items": { "type": "object" } }, + "first": { "type": "string", "description": "Epistle/Lesson citation, never scripture text" }, + "gospel": { "type": "string", "description": "Gospel citation, never scripture text" }, + "last": { "type": "boolean", "description": "true on the 7th cell of a grid row" } + } + } + } +} |
