aboutsummaryrefslogtreecommitdiff
path: root/CHANGELOG.md
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-18 14:27:13 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-18 14:27:13 +0200
commit94d95fd9b26e6bdd39fd08b7555948df56eee1ed (patch)
treefb68726d8add65a10b470750ba90a1d023216a9d /CHANGELOG.md
parentc47d59cbc5f73a4a695757b93e6d8c7709e0b5e8 (diff)
downloadcolitur-94d95fd9b26e6bdd39fd08b7555948df56eee1ed.tar.gz
colitur-94d95fd9b26e6bdd39fd08b7555948df56eee1ed.zip
docs: CHANGELOG entry for 0.7.0
Diffstat (limited to 'CHANGELOG.md')
-rw-r--r--CHANGELOG.md3
1 files changed, 3 insertions, 0 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 866a338..dc47dfc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,9 @@
One line per release. Versions are git tags (`vX.Y.Z`).
+## [0.7.0] - 2026-08-18
+- A flat INI form for overlays, a reference man page, and two real local calendars. **`colitur convert FILE.ini`** transpiles a flat, section-per-slug format to the S-expression one — `status`, `subject` and `layer` all default, so an ordinary local saint's feast says only what distinguishes it, and dates flatten to `MM-DD`, `easter+N` and `oct/sun/-1`. It is a front door, not a second data model: it parses to exactly the `Overlay.t` the sexp form does, and a test asserts the two produce identical values. It is deliberately less expressive — `Add`, `Suppress`, single-field `Edit` — and refuses `Replace`, multi-field and citation edits *by name* rather than dropping them. **The conversion verifies its own output**: the emitted text is parsed back with the same function that loads an overlay and must mean what the INI said, or nothing is written — a transpiler emitting valid-but-wrong sexp is the failure a convenience format invites, and `colitur check` could never catch it. That check was wrong on the first attempt in exactly that way, re-serialising the parsed value instead of parsing the emitted text; a mutation corrupting the renderer sailed through it, and the fix makes the same mutation redden two tests. **`colitur-overlay(5)`** documents the format in full — every directive, every field, the three date shapes — and, more usefully, *how an overlay is applied*: load, merge, resolve, emit, with the point made explicit that overlay entries take part in precedence on equal terms, so "my feast does not appear" is almost always a lost contest rather than a load failure. **Two real calendars ship** beside the invented example: **Poland**, 17 entries from the *Calendarium Perpetuum pro Dioecesium Poloniae* (1964), with three unrecoverable classes marked as inferences and a warning about the 1921/1934 *Proprium Poloniae* still bound into many missals; and **Benedictine**, two entries and a comment explaining why — the monastic rite grades feasts Duplex and Semiduplex below II class, where the Roman calendar has III and IV, so most Benedictine propers cannot be expressed here at all, and rather than invent a mapping the source never states, that file lists two dozen excluded feasts by name. Both are examples, not authorities. 405 tests.
+
## [0.6.0] - 2026-08-18
- Writing a local calendar gets a feedback loop. An overlay is still **applied, not validated** — the five test layers assert things about the *shipped* calendar and cannot vouch for a user's file — but until now the only way to learn whether yours did what you meant was to generate a year of output and grep for your own slug, and the only way to see that a directive matched nothing was to notice a warning scroll past among 365 lines. **`colitur check FILE ...`** loads each overlay, applies it to the real shipped calendar, and reports the directive counts, the slug each one targets, and any directive that found no target; it exits 2 on a load failure or an unmatched directive, so it composes into a Makefile or a pre-commit hook. It answers three narrow questions — does the file parse, does every directive find its target, what does the merged result contain — and does *not* check a calendar against the rubrics, which the help text and man page both say, because the name invites a stronger reading than the command earns. **`colitur new-overlay`** prints a commented starter to stdout for redirection, rather than writing a file where it likes; every value in it is a placeholder that will appear in `day` output if left unedited, so a half-finished overlay is visible rather than silently inert. **The format is less hostile too**: `citations` and `layer` may now be omitted from an added celebration, defaulting to empty and to the overlay's own `id` — they were the two of eight fields carrying nothing an author could supply, and omitting them used to fail with `lib/kernel/celebration.ml.t_of_sexp: the following record elements were undefined`, naming a source file the author will never open. An explicitly stated value still wins, pinned in both directions. Parse errors stop naming kernel source paths. The leniency is scoped to overlays alone: `Layer.load`, which reads the shipped sanctoral, stays strict, because a missing field there is a defect rather than a convenience. 398 tests.