From 47649983f4dc48ca9d1b7d80021daa3d11484c91 Mon Sep 17 00:00:00 2001 From: funkpower Date: Fri, 18 Sep 2026 12:44:09 -0400 Subject: [PATCH] drop the terminal screenshot, and make the examples checkable The screenshot was a picture of the Python CLI: it predated the formats, the tradition in the header and --typikon, and a picture cannot be diffed against the program anyway. Every example is now a console block of real output. tests/readme-examples.py runs each one and diffs it, which found four things wrong in the process of writing them: the hero example printed today rather than a fixed date, so it was wrong for any reader on any other day; the Ruthenian example depended on whatever the reader's config remembered; a tradition block held two commands and was checking neither; and the JSON had a hand-collapsed array that the program does not emit. It also found a real bug. --typikon could be turned on by the config file and there was no way to turn it off again from the command line, so on this machine showed the Typikon's discipline with no way to ask for the law. --no-typikon now does that. The Rust example is a test rather than prose, for the same reason. --- README.md | 146 +++++++++++++++++++++++++++++++++++---- docs/cli.png | Bin 53833 -> 0 bytes src/main.rs | 15 +++- tests/readme-examples.py | 84 ++++++++++++++++++++++ tests/readme_rust.rs | 30 ++++++++ 5 files changed, 258 insertions(+), 17 deletions(-) delete mode 100644 docs/cli.png create mode 100755 tests/readme-examples.py create mode 100644 tests/readme_rust.rs diff --git a/README.md b/README.md index a90da5f..2eaccc2 100644 --- a/README.md +++ b/README.md @@ -7,12 +7,11 @@ 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, no service that might be gone next year, no cache to invalidate. -![typikon on the command line](docs/cli.png) - ```console -$ typikon +$ typikon --jurisdiction rocor --date 2026-03-18 + Wednesday 18 March 2026 — 5 March in the church calendar - Russian Orthodox Church Outside Russia · the Typikon + Russian Orthodox Church Outside Russia · the Typikon · slavic usage 🥬 The Holy Martyr Conon @@ -21,6 +20,22 @@ $ typikon Great Fast ``` +A week at a time, which is what you want the day before a fast begins: + +```console +$ typikon --jurisdiction antiochian --date 2027-04-26 --days 7 + + Antiochian Orthodox Church · the Typikon + + 🥬 Mon 26 Apr xerophagy — no oil or wine The Holy Hieromartyr Basil, Bishop… + 🥬 Tue 27 Apr xerophagy — no oil or wine The Holy Hieromartyr Symeon, kinsman… + 🥬 Wed 28 Apr xerophagy — no oil or wine The Holy Apostles Jason and Sosipater + 🫒 Thu 29 Apr wine and oil permitted Great and Holy Thursday + ⛔ Fri 30 Apr no food until evening Great and Holy Friday + 🥬 Sat 1 May xerophagy — no oil or wine Great and Holy Saturday + 🍖 Sun 2 May no fast The Radiant and Life-giving… +``` + ## Install One static binary, no runtime to install first. @@ -81,6 +96,21 @@ Every jurisdiction carries the usage its books follow. `--tradition slavic` or `--tradition greek` overrides it, which is what you want for a parish that does not match its jurisdiction's default. +```console +$ typikon -j goarch --date 2026-10-01 --format tsv --fields rank,sign,fast,title +rank sign fast title +vigil ✚ none The Protection of our Most Holy Lady the Theotokos +``` + +```console +$ typikon -j goarch --date 2026-10-01 --tradition slavic --format tsv --fields rank,sign,fast,title +rank sign fast title +great ⊕ none The Protection of our Most Holy Lady the Theotokos +``` + +The rank is not decoration: it is what lifts a Wednesday or Friday fast, so the +usage changes what you eat as well as what you sing. + ### Which calendar? Pick a reckoning without naming a church: @@ -151,18 +181,43 @@ For an Eastern Catholic church the two come apart sharply, and reporting only the law makes the Great Fast look like four days of abstinence a year. That is what binds; it is not what is kept. +What the law requires, which is the first four days of the Great Fast: + ```console -$ typikon -j ruthenian --typikon +$ typikon -j ruthenian --no-typikon --days 4 --date 2026-02-16 + + Byzantine Catholic Metropolia of Pittsburgh · Ruthenian particular law + + 🥬 Mon 16 Feb* no meat, fish, eggs or dairy Clean Monday — the first day of the… + 🥬 Tue 17 Feb no meat, fish, eggs or dairy The Holy Great Martyr Theodore the… + 🥬 Wed 18 Feb* no meat, fish, eggs or dairy Our Holy Father Leo, Pope of Rome (461) + 🥬 Thu 19 Feb no meat, fish, eggs or dairy The Holy Apostle Archippus + + * obligatory. Everything unmarked is customary and does not bind. ``` -shows the day at the Typikon's full discipline while still reporting what your -own church's law obliges, and still marking it. A week of the Great Fast under -Ruthenian law is seven days of "no meat, fish, eggs or dairy" with three of -them starred; the same week at the Typikon's discipline runs from a total fast -on Clean Monday through xerophagy, wine and oil, and a saint's relaxation, with -the same three days starred. Nothing about the obligation changes. +And what is kept, with `--typikon`: -It is a no-op for a jurisdiction already reckoning by the Typikon. +```console +$ typikon -j ruthenian --typikon --days 4 --date 2026-02-16 + + Byzantine Catholic Metropolia of Pittsburgh · the Typikon, obliging under Ruthenian particular law + + ⛔ Mon 16 Feb* no food until evening Clean Monday — the first day of the… + 🫒 Tue 17 Feb wine and oil permitted The Holy Great Martyr Theodore the… + 🥬 Wed 18 Feb* xerophagy — no oil or wine Our Holy Father Leo, Pope of Rome (461) + 🥬 Thu 19 Feb xerophagy — no oil or wine The Holy Apostle Archippus + + * obligatory. Everything unmarked is customary and does not bind. +``` + +The same three days are starred in both. That is the point: the flag changes +what is *kept*, not what *binds*. Tuesday relaxes to wine and oil because St +Theodore the Recruit is of polyeleos rank, which is the menologion doing its +work. + +`--no-typikon` forces the law back, for when the config remembers otherwise. +Either way it is a no-op for a jurisdiction already reckoning by the Typikon. Where usages differ (Great Thursday, the Exaltation, Lazarus Saturday), this follows the common published rule and names it in the day's reason so you can @@ -175,10 +230,39 @@ spiritual father can. ```console $ typikon --days 7 # for a person $ typikon --format json --days 7 # for a bar, a widget, a script -$ typikon --format csv --days 365 # for a spreadsheet -$ typikon --format tsv --fields date,fast,title $ typikon --format ics --days 365 > orthodox.ics -$ typikon --year 2027 # a year's key dates, to check against yours +``` + +Delimited output, for a spreadsheet or a pipeline. RFC 4180 quoting, one header +row, one row per day: + +```console +$ typikon -j rocor --date 2026-03-16 --days 3 --format csv \ + --fields date,church_date,fast,title + +date,church_date,fast,title +2026-03-16,3 March,xerophagy,"The Holy Martyrs Eutropius, Cleonicus and Basiliscus" +2026-03-17,4 March,xerophagy,Our Venerable Father Gerasimus of the Jordan +2026-03-18,5 March,xerophagy,The Holy Martyr Conon +``` + +A year's key dates, to check against the one your parish prints: + +```console +$ typikon --year 2027 -j goarch + + 2027 · Greek Orthodox Archdiocese of America + + publican pharisee 2027-02-21 Sun + meatfare 2027-03-07 Sun + cheesefare 2027-03-14 Sun + clean monday 2027-03-15 Mon + great fast end 2027-04-23 Fri + lazarus saturday 2027-04-24 Sat + palm sunday 2027-04-25 Sun + great friday 2027-04-30 Fri + pascha 2027-05-02 Sun + … ``` Every day of vigil rank or above carries the mark its books print beside it: @@ -194,6 +278,38 @@ The JSON shape is flat and stable. Front ends are the thing most likely to be written by someone else, and a schema that shifts underneath them is a bad neighbour. +```console +$ typikon -j rocor --date 2026-03-18 --json --indent 2 +{ + "date": "2026-03-18", + "weekday": "Wednesday", + "jurisdiction": "rocor", + "calendar": "old", + "churchDate": "5 March", + "season": "Great Fast", + "cycle": null, + "feast": null, + "rank": null, + "sign": null, + "tradition": "slavic", + "title": "The Holy Martyr Conon", + "commemorations": [ + "The Holy Martyr Conon" + ], + "fast": "xerophagy", + "fastLabel": "xerophagy — no oil or wine", + "emoji": "🥬", + "reason": "a weekday of the Great Fast", + "obligation": "customary", + "binds": "none", + "pascha": "2026-04-12", + "daysToPascha": 25, + "julianOffset": 13 +} +``` + +One day is an object; several are `{"days": [...]}`. + ## As a library ```rust diff --git a/docs/cli.png b/docs/cli.png deleted file mode 100644 index f339f5d61eacb8286a2c31927ea7d1b11c412b2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53833 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 $i%0z{ZGXv4D~iW_+r!H_;08xT_rtPF5Tf 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, @@ -345,7 +350,13 @@ fn run() -> Result { Some(t) => jurisdictions::Tradition::parse(t) .ok_or_else(|| format!("unknown tradition {t:?}; try slavic or greek"))?, }; - let discipline = if args.typikon || saved.typikon { + // A flag either way beats the file; with neither, the file decides. + let typikon = if args.no_typikon { + false + } else { + args.typikon || saved.typikon + }; + let discipline = if typikon { Some(jurisdictions::RuleKind::Orthodox) } else { base.discipline diff --git a/tests/readme-examples.py b/tests/readme-examples.py new file mode 100755 index 0000000..3ef95f3 --- /dev/null +++ b/tests/readme-examples.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python3 +"""Run every console example in the README and diff it against the real output. + +A README whose examples have quietly stopped being true is worse than one with +no examples in it, and the output of this program changes shape often enough +that hand-checking does not hold. Every ```console block whose single command +is `typikon ...` is executed and compared line for line. + + tests/readme-examples.py # against ./target/release/typikon + TYPIKON=/usr/bin/typikon tests/readme-examples.py + +A block ending in a horizontal ellipsis is treated as a prefix, for listings +too long to paste whole. +""" +import difflib +import os +import re +import shlex +import subprocess +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +BINARY = os.environ.get("TYPIKON") or str(ROOT / "target" / "release" / "typikon") + + +def commands_and_body(block): + """Split a console block into its commands and its expected output, + joining backslash continuations.""" + out, buf = [], "" + for line in block.rstrip("\n").split("\n"): + if buf: + buf += " " + line.strip().rstrip("\\ ") + if not line.rstrip().endswith("\\"): + out.append("$ " + buf) + buf = "" + continue + if line.startswith("$ ") and line.rstrip().endswith("\\"): + buf = line[2:].rstrip("\\ ") + else: + out.append(line) + if buf: + out.append("$ " + buf) + cmds = [l[2:] for l in out if l.startswith("$ ")] + body = "\n".join(l for l in out if not l.startswith("$ ")).strip("\n") + return cmds, body + + +def main(): + if not Path(BINARY).exists(): + print(f" {BINARY} not built; run cargo build --release", file=sys.stderr) + return 77 + env = dict(os.environ, COLUMNS="88") + # The examples must not depend on whatever this machine remembers. + env.pop("TYPIKON_JURISDICTION", None) + env["XDG_CONFIG_HOME"] = str(ROOT / "target" / "readme-config") + + text = (ROOT / "README.md").read_text(encoding="utf-8") + checked = bad = skipped = 0 + for block in re.findall(r"```console\n(.*?)```", text, re.S): + cmds, expected = commands_and_body(block) + if len(cmds) != 1 or not cmds[0].startswith("typikon") or not expected: + skipped += 1 + continue + argv = [BINARY] + shlex.split(cmds[0])[1:] + got = subprocess.run(argv, capture_output=True, text=True, env=env).stdout.strip("\n") + checked += 1 + if expected.rstrip().endswith("…"): + ok = got.startswith(expected.rstrip()[:-1].rstrip("\n")) + else: + ok = got == expected + if not ok: + bad += 1 + print(f" MISMATCH {cmds[0]}") + for line in difflib.unified_diff( + expected.split("\n"), got.split("\n"), "README", "actual", lineterm="" + ): + print(" ", line) + print(f"\n {checked} README examples run, {bad} mismatched, {skipped} not executable") + return 1 if bad else 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tests/readme_rust.rs b/tests/readme_rust.rs new file mode 100644 index 0000000..a1fd087 --- /dev/null +++ b/tests/readme_rust.rs @@ -0,0 +1,30 @@ +//! The README's Rust example, compiled and asserted, so it cannot quietly +//! stop being true. The prose version elides the error handling; this is the +//! same calls with the results checked. + +use typikon::calendars::Date; +use typikon::day::describe; +use typikon::fasting::Level; +use typikon::jurisdictions::resolve; + +#[test] +fn the_readme_library_example_is_true() { + let rocor = resolve(Some("rocor")).unwrap(); + let day = describe(Date::from_ymd(2026, 9, 18).unwrap(), rocor); + + assert_eq!(day.church_date, "5 September"); + assert_eq!(day.fast, Level::Xerophagy); + assert_eq!(day.title(), "The Holy Prophet Zachariah, father of the Forerunner"); + assert!(!day.is_obligatory()); + + assert_eq!(typikon::paschalion::julian_pascha(2027).iso(), "2027-05-02"); + assert_eq!(typikon::paschalion::gregorian_pascha(2027).iso(), "2027-03-28"); +} + +#[test] +fn the_readme_level_example_is_true() { + // No saint brings fish into Lent. + assert_eq!(Level::Xerophagy.relaxed_to(Level::Fish, Level::WineOil), Level::WineOil); + // And relaxing never tightens. + assert_eq!(Level::Fish.relaxed_to(Level::WineOil, Level::WineOil), Level::Fish); +}