| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
lectio's regenerated tridentine-calendar.ini (the fix that corrects the
15-entry rank cluster and adds the 5 missing entries this branch
re-bootstraps from) has 5 entries with no name.pl field at all
(agnes-secundo, boniface-martyr, eusebius-confessor, evaristus, theodore --
all either newly added or newly un-hidden). parse_names previously required
name.pl unconditionally (`field sec "name.pl"`, which dies on absence) --
correct for a source that always had it, wrong now that it legitimately
does not.
Names.t is an open, per-language assoc list (names.mli) with no rule that
every entry must carry every language colitur happens to know about, so
requiring pl here was this tool's own invented constraint, not a kernel
one. Falls back to an en-only Names.t when pl is absent, never a
placeholder string.
|
|
|
Convert lectio's tridentine-calendar.ini (322 entries) into
data/ef/sanctoral.sexp via a validating OCaml converter, tools/
bootstrap_sanctoral.ml, rather than a hand-written script: every field is
built through Slug.of_string, Colour.of_string and Vocab_ef.rank_of_string,
so the emitted sexp is valid by construction.
Two conversion decisions, both documented rather than buried:
- subject defaults to Subject.Saint, overriding Celebration.make's kernel
default of Subject.Temporal, for the 316 entries with no explicit class;
- rank = commemoration maps to status = Commemoration_only with an inferred
Class3 (not a citation -- it is what the 1960 reform reduced most simple
feasts from), recorded as an open item in the rules register for the
oracle to adjudicate.
Every celebration is tagged layer = Precedence_ef.universal_layer, the
provenance id RG 91's band classifier reads to tell the universal calendar
from proper/indult data.
The generated file carries a provenance header: source path, its SHA-256,
and the UTC conversion date, so re-bootstrapping against a newer lectio is
reproducible and diffable. Output is byte-identical across runs.
test/test_sanctoral_ef.ml loads the file through Layer.load and checks the
counts independently derived from the source INI (322 entries, 114
Commemoration_only, 12 Class1, no Subject.Temporal, every date resolves in
a leap year), plus two named spot-checks against the INI's own text -- one
entry with an explicit class field, one commemoration -- so a passing count
cannot hide the wrong 322 entries having been converted.
|