diff --git a/README.md b/README.md index 2eaccc2..707b567 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ # typikon The Orthodox liturgical day: feasts, seasons and the fast, computed rather -than fetched. +than fetched. The Byzantine Catholic churches are here too, on their own +calendars and, where the law has been sourced, under their own particular law. Everything derives from the paschalion and the fixed calendar, so it needs no network, cannot go stale, and answers for any year you ask about. No API key, @@ -149,6 +150,30 @@ Bulgaria, Cyprus, Albania, Ukraine), the Finnish Orthodox Church, alone among the Orthodox in keeping the Gregorian Paschalion, and, as an add-on, four Byzantine Catholic churches. +## The Byzantine Catholic churches + +Four are modelled, and they are not a footnote on the Orthodox ones: they keep +different paschalions, and their fasting is a different kind of thing. + +| | calendar | fasting | +|---|---|---| +| `ruthenian` | Gregorian throughout | Ruthenian particular law, sourced | +| `ugcc` | Revised Julian feasts, Julian Pascha since 2023 | its own; not modelled | +| `melkite` | Gregorian; Middle Eastern parishes often keep Julian Pascha | its own; not modelled | +| `romanian-catholic` | Gregorian throughout | its own; not modelled | + +**A church's law is never borrowed from another.** Ruthenian particular law is +sourced from the Metropolia of Pittsburgh and is reported for that church only. +The rest are shown at the Typikon's discipline with **nothing reported as +binding**, because their own law has not been sourced and inventing one would +tell a Melkite that fourteen days a year oblige him under a law that was never +his. When a church's law is added, its entry will say so and its obligations +will appear. A test holds that line. + +See [the law and the fast](#the-law-and-the-fast-are-not-the-same-question) +for what `--typikon` does with this, which is the flag most Byzantine Catholics +will want. + ## The fast Six levels, ordered from strictest to laxest. They are the Typikon's own diff --git a/src/jurisdictions.rs b/src/jurisdictions.rs index 2a0006f..f6fae5f 100644 --- a/src/jurisdictions.rs +++ b/src/jurisdictions.rs @@ -201,11 +201,12 @@ pub const JURISDICTIONS: &[Jurisdiction] = &[ // eastern catholic Jurisdiction { key: "ruthenian", name: "Byzantine Catholic Metropolia of Pittsburgh", paschalion: GregP, menologion: RevJul, rule: Ruth, discipline: None, tradition: Sl, menaia: RUTHENIAN_MENAIA, note: "Gregorian throughout. Fasting is reported under Ruthenian particular law, which binds far less than the Typikon prescribes." }, - Jurisdiction { key: "ugcc", name: "Ukrainian Greek Catholic Church", paschalion: JulP, menologion: RevJul, rule: Ruth, discipline: None, tradition: Sl, menaia: RUTHENIAN_MENAIA, - note: "Moved the fixed feasts to the Revised Julian calendar on 1 September 2023, keeping the Julian Paschalion. Eparchies outside Ukraine vary; several keep the Gregorian Paschalion." }, - Jurisdiction { key: "melkite", name: "Melkite Greek Catholic Church", paschalion: GregP, menologion: RevJul, rule: Ruth, discipline: None, tradition: Gk, menaia: NO_MENAIA, - note: "Practice is not uniform: parishes in the Middle East commonly keep the Julian Paschalion for the sake of the local Orthodox." }, - Jurisdiction { key: "romanian-catholic", name: "Romanian Greek Catholic Church", paschalion: GregP, menologion: RevJul, rule: Ruth, discipline: None, tradition: Gk, menaia: NO_MENAIA, note: "" }, + Jurisdiction { key: "ugcc", name: "Ukrainian Greek Catholic Church", paschalion: JulP, menologion: RevJul, rule: Orth, discipline: None, tradition: Sl, menaia: RUTHENIAN_MENAIA, + note: "Moved the fixed feasts to the Revised Julian calendar on 1 September 2023, keeping the Julian Paschalion. Eparchies outside Ukraine vary; several keep the Gregorian Paschalion. Its particular law on fasting is its own and is not modelled here, so the days are shown at the Typikon and nothing is reported as binding." }, + Jurisdiction { key: "melkite", name: "Melkite Greek Catholic Church", paschalion: GregP, menologion: RevJul, rule: Orth, discipline: None, tradition: Gk, menaia: NO_MENAIA, + note: "Practice is not uniform: parishes in the Middle East commonly keep the Julian Paschalion for the sake of the local Orthodox. Its particular law on fasting is its own and is not modelled here, so the days are shown at the Typikon and nothing is reported as binding." }, + Jurisdiction { key: "romanian-catholic", name: "Romanian Greek Catholic Church", paschalion: GregP, menologion: RevJul, rule: Orth, discipline: None, tradition: Gk, menaia: NO_MENAIA, + note: "Its particular law on fasting is its own and is not modelled here, so the days are shown at the Typikon and nothing is reported as binding." }, ]; /// A jurisdiction key, a calendar name, or `None` for the default. diff --git a/src/rules/ruthenian.rs b/src/rules/ruthenian.rs index d718dbc..bf615b3 100644 --- a/src/rules/ruthenian.rs +++ b/src/rules/ruthenian.rs @@ -27,9 +27,15 @@ //! only Great and Holy Wednesday turns on the reading. If your eparchy reads it //! the other way, that Wednesday binds too. //! -//! Source: the Byzantine Catholic Metropolitan Church of Pittsburgh. Other -//! Eastern Catholic churches legislate their own; where this library maps them -//! onto this ruleset it is an approximation, and the jurisdiction entry says so. +//! Source: the Byzantine Catholic Metropolitan Church of Pittsburgh, and that +//! church only. +//! +//! Every Eastern Catholic church legislates its own fasting discipline, and +//! this ruleset is **not** lent to the others. Borrowing it told a Melkite +//! that fourteen days a year bound him under a law that was never his, which +//! is precisely the error the level/obligation split exists to prevent. A +//! church whose particular law has not been sourced is shown at the Typikon +//! with no obligation claimed, and its entry says so. use super::{Context, Rule, Vocabulary}; use crate::calendars::{Date, Weekday}; diff --git a/tests/typikon.rs b/tests/typikon.rs index cb52b22..fbe35ff 100644 --- a/tests/typikon.rs +++ b/tests/typikon.rs @@ -625,3 +625,38 @@ fn the_config_round_trips_all_three_axes() { } let _ = std::fs::remove_dir_all(&dir); } + +// ─────────────── no church is told another church's law binds ───────────── + +#[test] +fn only_the_church_whose_law_was_sourced_reports_an_obligation() { + use typikon::jurisdictions::{RuleKind, JURISDICTIONS}; + // Ruthenian particular law is sourced from the Metropolia of Pittsburgh. + // No other jurisdiction may borrow it: telling a Melkite that fourteen + // days a year bind him under a law that was never his is the error the + // level/obligation split exists to prevent. + for jur in JURISDICTIONS.iter() { + if jur.rule == RuleKind::Ruthenian { + assert_eq!(jur.key, "ruthenian", "{} borrows another church's law", jur.key); + } + } + + for key in ["melkite", "romanian-catholic", "ugcc"] { + let jur = resolve(Some(key)).unwrap(); + let binding = week(d("2026-01-01"), 365, jur) + .into_iter() + .filter(|x| x.is_obligatory()) + .count(); + assert_eq!(binding, 0, "{key} claims {binding} binding days it has no source for"); + // And the entry has to say why nothing binds. + assert!(jur.note.contains("not modelled"), "{key}: the note must say so"); + } + + // The one church whose law is sourced still reports it. + let ruthenian = resolve(Some("ruthenian")).unwrap(); + let binding = week(d("2026-01-01"), 365, ruthenian) + .into_iter() + .filter(|x| x.is_obligatory()) + .count(); + assert_eq!(binding, 14); +}