Skip to content

release: v0.7.0 — neobyzantine-org integration, saint cross-links, church coordinates#35

Open
nikolareljin wants to merge 9 commits into
mainfrom
release/0.7.0
Open

release: v0.7.0 — neobyzantine-org integration, saint cross-links, church coordinates#35
nikolareljin wants to merge 9 commits into
mainfrom
release/0.7.0

Conversation

@nikolareljin

Copy link
Copy Markdown
Owner

Release 0.7.0

Wires up the orthodox-calendar → neobyzantine.org cross-linking infrastructure. Data flows from neobyzantine-org via a static saints-links.json export file (no runtime API dependency).

Backend

backend/app/models.py

  • Saint: adds neobyzantine_url (returned in API) and neobyzantine_actor_slug (exclude=True, internal)

backend/app/services/saints.py

  • _apply_overlay(): overlay notes now also populate extended_notes (neobyzantine curated content surfaces at /hagiography even when OCA notes exist); copies neobyzantine_url + neobyzantine_actor_slug

Frontend

frontend/src/App.jsx

  • SaintCard: "Learn more on NeoByzantine.org →" link (Byzantine gold #CFB53B) when saint.neobyzantine_url present

frontend/src/traditions.js

  • All 40+ WORLD_CHURCHES entries: lat, lng, seat added (patriarchal see coordinates, WGS84)

Tooling

scripts/sync-neobyzantine.py (new)

  • Syncs saints-links.json (from php artisan game:export in neobyzantine-org) into neobyzantine_hagiographies.json
  • --dry-run flag supported

Version

  • backend/app/main.py: version → 0.7.0
  • CHANGELOG.md: 0.7.0 entry added

Test plan

  • python -m py_compile scripts/sync-neobyzantine.py — no errors
  • python scripts/sync-neobyzantine.py --input saints-links.json --dry-run — shows matches
  • Saint(name='Test', neobyzantine_url='https://neobyzantine.org/actors/test') validates OK
  • Saint card with neobyzantine_url shows gold "Learn more" link
  • WORLD_CHURCHES entries have lat, lng, seat

Closes #31, #32, #33; updates #16

…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

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread backend/app/services/saints.py
…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.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread backend/app/services/saints.py
Comment thread frontend/src/traditions.js Outdated
…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)

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 14 changed files in this pull request and generated 6 comments.

Comment on lines +341 to +347
# 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)
Comment on lines +173 to +178
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()
Comment on lines +189 to +193
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",
]
Comment thread CHANGELOG.md
- `_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
Comment thread CHANGELOG.md
- `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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: integrate neobyzantine_hagiographies.json as primary hagiography source

2 participants