From 52af4eae88f75fa2d0d1f44b7e2e3c85497d3db7 Mon Sep 17 00:00:00 2001 From: Brian Glass Date: Wed, 14 Oct 2026 15:29:05 -0400 Subject: [PATCH] Add the Greek forefeast labels and Greek-dated commemorations The rest of issue #228's headline differences: - Leavetaking of the Nativity of the Forerunner (Jun 25) - Protection of the Theotokos on its Greek date (Oct 28) - Forefeast of the Conception (Dec 8) - Forefeast of Nativity (Dec 21-23) - Hieromartyr Phocas on Jul 23, linked to his existing Saint Each matches antiochian.org in every or nearly every harvested year. A feast name can't be set by an override row, so each common row is split into a slavic row and an identical greek copy that adds the name, as Oct 1 already is. Fasting, rank and saints are unchanged, and Slavic output is identical. Dec 26, Jan 8-13 and Feb 3 are left alone; see docs/greek-commons.md, pass 13. Co-Authored-By: Claude Opus 5.5 --- calendarium/tests/test_liturgics.py | 33 +++++++ docs/greek-commons.md | 35 +++++++ fixtures/calendarium.json | 138 ++++++++++++++++++++++++++-- fixtures/commemorations.json | 24 +++++ 4 files changed, 224 insertions(+), 6 deletions(-) diff --git a/calendarium/tests/test_liturgics.py b/calendarium/tests/test_liturgics.py index 8e09f78..0362286 100644 --- a/calendarium/tests/test_liturgics.py +++ b/calendarium/tests/test_liturgics.py @@ -288,6 +288,39 @@ async def test_day_feast_name_is_tradition_specific(self): self.assertIn('Holy Apostle Ananias of the Seventy', slavic.saints) self.assertIn('Holy Apostle Ananias of the Seventy', greek.saints) + async def test_greek_only_feast_labels(self): + """Labels Greek practice carries on these dates and Slavic does not + headline; see docs/greek-commons.md, pass 13. Slavic is unchanged.""" + + for (month, day), label in ( + ((6, 25), 'Leavetaking of the Nativity of the Forerunner'), + ((10, 28), 'Protection of the Most-Holy Theotokos'), + ((12, 8), 'Forefeast of the Conception by St Anna of the Theotokos'), + ((12, 21), 'Forefeast of Nativity'), + ((12, 23), 'Forefeast of Nativity'), + ): + with self.subTest(month=month, day=day): + slavic = liturgics.Day(2026, month, day, tradition=Tradition.Slavic) + greek = liturgics.Day(2026, month, day, tradition=Tradition.Greek) + await slavic.ainitialize() + await greek.ainitialize() + + self.assertEqual(greek.summary_title, label) + self.assertNotIn(label, slavic.feasts) + self.assertEqual( + (greek.fast_level, greek.feast_level), + (slavic.fast_level, slavic.feast_level)) + + async def test_phocas_on_july_23_for_greek(self): + slavic = liturgics.Day(2026, 7, 23, tradition=Tradition.Slavic) + greek = liturgics.Day(2026, 7, 23, tradition=Tradition.Greek) + await slavic.ainitialize() + await greek.ainitialize() + + phocas = 'Hieromartyr Phocas, Bishop of Sinope' + self.assertTrue(greek.summary_title.startswith(phocas)) + self.assertNotIn(phocas, slavic.saints) + async def test_raphael_brooklyn_differing_commemoration_date(self): """St. Raphael of Brooklyn -- founding bishop of Antiochian Orthodoxy in America -- is kept on Feb 27 (his repose date) by diff --git a/docs/greek-commons.md b/docs/greek-commons.md index 9b5e74e..8b2ab6d 100644 --- a/docs/greek-commons.md +++ b/docs/greek-commons.md @@ -646,3 +646,38 @@ via this method and multi-year antiochian data plus an OCA cross-check: day (Feb 17) and the group day (Oct 5), same as it would need to for Slavic. Just a completeness gap in our own data, not a date conflict -- out of scope today. + +## Pass 13 (headlines from issue #228, 2026-10-14) + +Issue #228 compared goarch.org's daily headline with this app's and found 19 +dates with no match. Thirteen were Sundays, fixed by naming Greek Sundays after +the Gospel (`GreekDay._apply_title_conventions`) and by giving the July Fathers +Sunday its Greek name. The rest were labels and commemorations the Greek data +lacked. Each is checked against every antiochian.org year that has the date: + +| date | Greek | antiochian.org | +|---|---|---| +| Jun 25 | Leavetaking of the Nativity of the Forerunner | 2 of 2 years | +| Jul 23 | Hieromartyr Phocas, Bishop of Sinope | 2 of 2 | +| Oct 28 | Protection of the Most-Holy Theotokos | 4 of 5 | +| Dec 8 | Forefeast of the Conception | 8 of 8 | +| Dec 21-23 | Forefeast of Nativity | 8 of 8 each | + +The labels are feast names, which an override row cannot set (`Day.OVERRIDABLE`), +so each `common` row became a `slavic` row and an identical `greek` copy that +adds the name -- the shape Oct 1's Protection already has. Fasting, rank and +saints are copied unchanged, and Slavic output is identical. Phocas is a new +`greek` commemoration on Jul 23 linked to his existing Saint, who keeps Sep 22 +in both traditions; antiochian.org lists him on both dates. The Protection is +the Greek Oct 28 observance, alongside Slavic's Oct 1. + +Left as they are: + +- **Dec 26**: goarch.org heads it "Afterfeast of the Nativity". The app shows + the Synaxis of the Theotokos, which antiochian.org also uses as the headline + in most years. +- **Jan 8-13 and Feb 3**: antiochian.org heads these with the Afterfeast of + Theophany and of the Presentation, but goarch.org heads them with the day's + saints (the issue found a match for every one), and Greek here means GOA. + A feast name outranks the saints in `summary_title`, so adding the label + would move these days away from goarch.org. diff --git a/fixtures/calendarium.json b/fixtures/calendarium.json index c195e44..4b289d9 100644 --- a/fixtures/calendarium.json +++ b/fixtures/calendarium.json @@ -12763,7 +12763,28 @@ "fast": 0, "fast_exception": 0, "flag": 0, - "tradition": "common", + "tradition": "slavic", + "fast_cap_exempt": null + } +}, +{ + "model": "calendarium.day", + "pk": 950, + "fields": { + "pdist": 999, + "month": 6, + "day": 25, + "title": "", + "subtitle": "", + "feast_name": "Leavetaking of the Nativity of the Forerunner", + "feast_level": 3, + "service": 0, + "service_note": "", + "story": null, + "fast": 0, + "fast_exception": 0, + "flag": 0, + "tradition": "greek", "fast_cap_exempt": null } }, @@ -15388,7 +15409,28 @@ "fast": 0, "fast_exception": 0, "flag": 0, - "tradition": "common", + "tradition": "slavic", + "fast_cap_exempt": null + } +}, +{ + "model": "calendarium.day", + "pk": 951, + "fields": { + "pdist": 999, + "month": 10, + "day": 28, + "title": "", + "subtitle": "", + "feast_name": "Protection of the Most-Holy Theotokos", + "feast_level": 3, + "service": 0, + "service_note": "", + "story": null, + "fast": 0, + "fast_exception": 0, + "flag": 0, + "tradition": "greek", "fast_cap_exempt": null } }, @@ -16249,7 +16291,28 @@ "fast": 5, "fast_exception": 0, "flag": 0, - "tradition": "common", + "tradition": "slavic", + "fast_cap_exempt": null + } +}, +{ + "model": "calendarium.day", + "pk": 952, + "fields": { + "pdist": 999, + "month": 12, + "day": 8, + "title": "", + "subtitle": "", + "feast_name": "Forefeast of the Conception by St Anna of the Theotokos", + "feast_level": 0, + "service": 0, + "service_note": "", + "story": null, + "fast": 5, + "fast_exception": 0, + "flag": 0, + "tradition": "greek", "fast_cap_exempt": null } }, @@ -16522,7 +16585,28 @@ "fast": 5, "fast_exception": 0, "flag": 0, - "tradition": "common", + "tradition": "slavic", + "fast_cap_exempt": null + } +}, +{ + "model": "calendarium.day", + "pk": 953, + "fields": { + "pdist": 999, + "month": 12, + "day": 21, + "title": "", + "subtitle": "", + "feast_name": "Forefeast of Nativity", + "feast_level": 0, + "service": 0, + "service_note": "", + "story": null, + "fast": 5, + "fast_exception": 0, + "flag": 0, + "tradition": "greek", "fast_cap_exempt": null } }, @@ -16543,7 +16627,28 @@ "fast": 5, "fast_exception": 0, "flag": 0, - "tradition": "common", + "tradition": "slavic", + "fast_cap_exempt": null + } +}, +{ + "model": "calendarium.day", + "pk": 954, + "fields": { + "pdist": 999, + "month": 12, + "day": 22, + "title": "", + "subtitle": "", + "feast_name": "Forefeast of Nativity", + "feast_level": 0, + "service": 0, + "service_note": "", + "story": null, + "fast": 5, + "fast_exception": 0, + "flag": 0, + "tradition": "greek", "fast_cap_exempt": null } }, @@ -16564,7 +16669,28 @@ "fast": 5, "fast_exception": 0, "flag": 0, - "tradition": "common", + "tradition": "slavic", + "fast_cap_exempt": null + } +}, +{ + "model": "calendarium.day", + "pk": 955, + "fields": { + "pdist": 999, + "month": 12, + "day": 23, + "title": "", + "subtitle": "", + "feast_name": "Forefeast of Nativity", + "feast_level": 0, + "service": 0, + "service_note": "", + "story": null, + "fast": 5, + "fast_exception": 0, + "flag": 0, + "tradition": "greek", "fast_cap_exempt": null } }, diff --git a/fixtures/commemorations.json b/fixtures/commemorations.json index c00f63e..3844a3b 100644 --- a/fixtures/commemorations.json +++ b/fixtures/commemorations.json @@ -54648,6 +54648,21 @@ "tradition": "slavic" } }, +{ + "model": "commemorations.daycommemoration", + "pk": 7251, + "fields": { + "day": 640, + "title": "Hieromartyr Phocas, Bishop of Sinope", + "story": null, + "rank": 2, + "high_rank": false, + "new_style": false, + "day_native": true, + "ordering": 0, + "tradition": "greek" + } +}, { "model": "commemorations.daycommemorationsaint", "pk": 1731, @@ -54656,5 +54671,14 @@ "saint": 6846, "order": 1 } +}, +{ + "model": "commemorations.daycommemorationsaint", + "pk": 1732, + "fields": { + "commemoration": 7251, + "saint": 5399, + "order": 1 + } } ]