release: v0.7.0 — neobyzantine-org integration, saint cross-links, church coordinates#35
release: v0.7.0 — neobyzantine-org integration, saint cross-links, church coordinates#35nikolareljin wants to merge 9 commits into
Conversation
…erging, church coords Backend: - backend/app/models.py: add neobyzantine_url and neobyzantine_actor_slug (exclude=True) fields to Saint model for cross-linking to neobyzantine.org - backend/app/services/saints.py: _apply_overlay() now propagates overlay notes as extended_notes (so neobyzantine_hagiographies.json curated content surfaces at /hagiography endpoint even when OCA notes already exist); copies neobyzantine_url and neobyzantine_actor_slug from overlay to base saint Frontend: - frontend/src/App.jsx: SaintCard shows "Learn more on NeoByzantine.org →" link in Byzantine gold (#CFB53B) when saint.neobyzantine_url is present; hasBody now also true when neobyzantine_url present - frontend/src/traditions.js: lat/lng/seat added to all 40+ WORLD_CHURCHES entries (patriarchal see coordinates, WGS84) for future map feature Tooling: - scripts/sync-neobyzantine.py: syncs saints-links.json (exported from neobyzantine-org via `php artisan game:export`) into neobyzantine_hagiographies.json — adds neobyzantine_url + actor_slug to matched saints by name; --dry-run supported Closes #31, #32, #33; updates #16
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2ec76c4dfc
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…umer Data flow is OC → NBWS (API), not NBWS → OC (file export). neobyzantine-org reads saints/hagiographies from orthodox-calendar via CalendarController proxy. No sync script needed.
There was a problem hiding this comment.
Pull request overview
This v0.7.0 release adds static-data cross-linking from orthodox-calendar saints to neobyzantine.org and prepares church directory data for a future map view.
Changes:
- Adds neobyzantine saint URL/slug fields and propagates them through overlay merging.
- Shows a NeoByzantine.org link in saint cards when available.
- Adds church seat coordinates, a sync script, changelog entry, version bump, and traffic docs ignore rule.
Reviewed changes
Copilot reviewed 6 out of 7 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
backend/app/models.py |
Adds neobyzantine link/slug fields to Saint. |
backend/app/services/saints.py |
Propagates overlay notes and neobyzantine cross-link fields. |
frontend/src/App.jsx |
Renders NeoByzantine.org links on expandable saint cards. |
frontend/src/traditions.js |
Adds lat, lng, and seat metadata to world church entries. |
scripts/sync-neobyzantine.py |
Adds a sync utility for exported neobyzantine saint links. |
backend/app/main.py |
Bumps API version to 0.7.0. |
CHANGELOG.md |
Documents the 0.7.0 release changes. |
.gitignore |
Ignores generated docs/traffic/* files. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
…erbian saints - traditions.js: Assyrian Church of the East seat → Erbil, Iraq (lat 36.191, lng 44.009); Catholicos-Patriarch Gewargis III relocated patriarchate from Morton Grove, IL to Erbil in 2015 — fixes both wrong seat label and wrong coordinates (were pointing at Atlanta, GA area) - models.py: add extended_notes_source (exclude=True) to Saint for internal provenance tracking; add "neobyzantine" to HagiographyResponse.source Literal - services/saints.py (_apply_overlay): tag extended_notes_source="neobyzantine" when neobyzantine overlay notes populate extended_notes, so the source is no longer mislabeled as "goarch" in _format_hagiography_response - greek_saints.json: rebuilt from GOARCH annual planner ICS (2025-2026 + 2023-2024 via Wayback Machine); 60 → 1620 saints across 366 date entries; movable feasts (Pascha, Ascension, Pentecost, Cheesefare, etc.) filtered at import time to prevent year-boundary contamination; Feb 29 added from OCA Julian data - serbian_saints.json: refreshed from Wikipedia list via existing import_serbian.py - scripts/import_goarch_ics.py: new ICS import script for GOARCH annual planners; parses DESCRIPTION saints sections, strips movable feast day markers, merges into existing greek_saints.json with deduplication
- Add enrich_goarch_from_wayback.py: crawls 322 GOARCH chapel saint pages from the Wayback Machine CDX archive (exact timestamps to avoid Cloudflare redirect) and stores name/date/hagiography/URL in goarch_hagio_cache.json - Add goarch_contentids.txt + goarch_cdx_timestamps.json: CDX-derived index enabling reproducible re-runs without hitting the live GOARCH site - Enrich greek_saints.json: 65 saints now have goarch_url + hagiography_url pointing to GOARCH chapel pages; 39 of those also carry extended_notes extracted from the archived Reading sections - Fix import_goarch_ics.py: expand _MOVABLE_FEAST_RE to catch Holy Saturday and Sunday of the Myrrh-Bearing Women that previously leaked into the static fixed-feast data - Remove 4 leaked movable feast entries (Holy Saturday ×2, Sunday of Myrrh-Bearing Women ×2) from greek_saints.json - Fix import_serbian.py + re-import serbian_saints.json: html.unescape() removes   thin-spaces and [nn] footnote refs; 63 entries, 90 saints, notes now clean - Gitignore goarch_hagio_cache.json (generated, large, regeneratable)
| # Overlay notes become extended_notes when base has none — this lets the | ||
| # neobyzantine_hagiographies.json notes surface at /hagiography as curated content. | ||
| # Track provenance so _format_hagiography_response can label the source correctly. | ||
| if overlay.notes and not base.extended_notes: | ||
| base.extended_notes = overlay.notes | ||
| if overlay.neobyzantine_actor_slug or overlay.neobyzantine_url: | ||
| base.extended_notes_source = "neobyzantine" |
| _VEVENT_RE = re.compile(r"BEGIN:VEVENT(.*?)END:VEVENT", re.DOTALL) | ||
| _DTSTART_RE = re.compile(r"DTSTART[^:]*:(\d{4})(\d{2})(\d{2})") | ||
| _SUMMARY_RE = re.compile(r"^SUMMARY:(.+)$", re.MULTILINE) | ||
| _DESC_RE = re.compile(r"^DESCRIPTION:(.+)$", re.MULTILINE | re.DOTALL) |
| def _clean_name(name: str) -> str: | ||
| """Strip leading title prefixes (kept in the title field) to get a clean name.""" | ||
| # Remove parenthetical alternates "(also known as X)" | ||
| name = re.sub(r"\s*\(.*?\)", "", name) | ||
| # Normalize whitespace | ||
| return re.sub(r"\s+", " ", name).strip() |
| cdx_file = Path(__file__).parent.parent.parent / "tmp" / "cdx_timestamps.json" | ||
| _cdx_file_search = [ | ||
| Path("/tmp/cdx_timestamps.json"), | ||
| Path(__file__).parent / "goarch_cdx_timestamps.json", | ||
| ] |
| - `_apply_overlay()` now propagates overlay `notes` as `extended_notes`, surfacing `neobyzantine_hagiographies.json` curated content at `/hagiography` endpoint | ||
| - `SaintCard` frontend component shows "Learn more on NeoByzantine.org →" link (Byzantine gold `#CFB53B`) when `neobyzantine_url` is present | ||
| - `lat`, `lng`, `seat` coordinates added to all 40+ `WORLD_CHURCHES` entries (patriarchal see coordinates, WGS84) — groundwork for future map view | ||
| - `scripts/sync-neobyzantine.py` — syncs exported `saints-links.json` from neobyzantine-org into `neobyzantine_hagiographies.json`; `--dry-run` supported |
| - `scripts/sync-neobyzantine.py` — syncs exported `saints-links.json` from neobyzantine-org into `neobyzantine_hagiographies.json`; `--dry-run` supported | ||
|
|
||
| ### Changed | ||
| - `scripts/script-helpers` updated to 0.13.0 |
Add enrich_greek_from_oca.py that matches Greek (Revised Julian) saints against OCA (Julian) saints by nominal month-day — both traditions share the same MM-DD numbering for fixed feasts; no date offset needed. Name matching uses suffix-tolerant stemming (Methodios ↔ Methodius, Eustathios ↔ Eustathius) and handles OCA title quirks such as "Venerable and God-bearing Father Anthony the Great". Ambiguous primary-name matches (e.g. multiple Anthonys on the same date) are rejected unless secondary tokens confirm the identity. Results: 1616 saints total 693 (43%) have hagiography_url or goarch_url 662 (41%) have extended_notes (full text in-place, served by /hagiography) 667 (41%) have notes (brief excerpt for list views) Previously: 65 saints had GOARCH URLs from Wayback, 0 had in-place text from OCA. This commit adds 623 more hagiographies sourced from oca_julian.json, stored directly in greek_saints.json so no external request is needed at serve time.
Release 0.7.0
Wires up the orthodox-calendar → neobyzantine.org cross-linking infrastructure. Data flows from neobyzantine-org via a static
saints-links.jsonexport file (no runtime API dependency).Backend
backend/app/models.pySaint: addsneobyzantine_url(returned in API) andneobyzantine_actor_slug(exclude=True, internal)backend/app/services/saints.py_apply_overlay(): overlaynotesnow also populateextended_notes(neobyzantine curated content surfaces at/hagiographyeven when OCA notes exist); copiesneobyzantine_url+neobyzantine_actor_slugFrontend
frontend/src/App.jsxSaintCard: "Learn more on NeoByzantine.org →" link (Byzantine gold#CFB53B) whensaint.neobyzantine_urlpresentfrontend/src/traditions.jsWORLD_CHURCHESentries:lat,lng,seatadded (patriarchal see coordinates, WGS84)Tooling
scripts/sync-neobyzantine.py(new)saints-links.json(fromphp artisan game:exportin neobyzantine-org) intoneobyzantine_hagiographies.json--dry-runflag supportedVersion
backend/app/main.py: version →0.7.0CHANGELOG.md: 0.7.0 entry addedTest plan
python -m py_compile scripts/sync-neobyzantine.py— no errorspython scripts/sync-neobyzantine.py --input saints-links.json --dry-run— shows matchesSaint(name='Test', neobyzantine_url='https://neobyzantine.org/actors/test')validates OKneobyzantine_urlshows gold "Learn more" linkWORLD_CHURCHESentries havelat,lng,seatCloses #31, #32, #33; updates #16