# wololo4/calendar_merge architecture

> Architecture diagram of the GitHub repository wololo4/calendar_merge, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/wololo4/calendar_merge
- Repository: https://github.com/wololo4/calendar_merge

## Overview

calendar_merge gathers league/team feeds, downloads schedules, parses games into league calendars, and stores event records for filtered calendar export. The map emphasizes this runtime workflow plus team-ID refresh and the league-specific normalization data. Some connections rely on SOURCE INDEX references rather than inspected call sites; unsampled parser internals and feed configuration details are not inferred.

Main entry points: [`merge.py`](https://github.com/wololo4/calendar_merge/blob/main/merge.py) (Merge runner), [`utils/downloader.py`](https://github.com/wololo4/calendar_merge/blob/main/utils/downloader.py) (Download dispatch), [`parsers/ncaa.py`](https://github.com/wololo4/calendar_merge/blob/main/parsers/ncaa.py) (NCAA parser), [`parsers`](https://github.com/wololo4/calendar_merge/tree/main/parsers) (Other league parsers)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_orchestration["Workflow"]
  node_merge["Merge runner<br/>[merge.py]"]
  node_calendar_files["League calendars"]
end

subgraph group_ingest["Schedule ingestion"]
  node_feed_config["League feeds<br/>[feeds.yaml]"]
  node_feed_builder["Feed discovery<br/>[feeds.py]"]
  node_downloader["Download dispatch<br/>[downloader.py]"]
end

subgraph group_parsing["Calendar parsing"]
  node_hockeytech["HockeyTech parser<br/>[hockeytech.py]"]
  node_ncaa["NCAA parser<br/>[ncaa.py]"]
  node_league_parsers["Other league parsers"]
  node_parser_common["Parser utilities<br/>[common.py]"]
  node_league_mappings["League mappings"]
  node_event_builder["Event builder<br/>[ics.py]"]
  node_calendar_factory["Calendar factory<br/>[calendar.py]"]
end

subgraph group_state["Events and identity"]
  node_team_ids["Team ID refresh<br/>[team_id.py]"]
  node_database[("Event database<br/>[database.py]")]
  node_sqlite_file[("SQLite events<br/>[calendar.db]")]
end

node_operator(("Schedule refresh"))
node_league_sources["League schedules"]

node_operator -->|"starts refresh"| node_merge
node_merge -->|"loads feeds"| node_feed_builder
node_merge -->|"dispatches downloads"| node_downloader
node_merge -->|"uses event store"| node_database
node_feed_config -.->|"configures feeds"| node_feed_builder
node_feed_builder -.->|"discovers schedules"| node_league_sources
node_downloader -->|"fetches schedules"| node_league_sources
node_downloader -->|"dispatches parsing"| node_hockeytech
node_downloader -->|"dispatches parsing"| node_ncaa
node_downloader -->|"dispatches parsing"| node_league_parsers
node_hockeytech -->|"uses helpers"| node_parser_common
node_ncaa -->|"uses helpers"| node_parser_common
node_league_parsers -.->|"uses helpers"| node_parser_common
node_hockeytech -->|"builds events"| node_event_builder
node_ncaa -->|"builds events"| node_event_builder
node_league_parsers -.->|"builds events"| node_event_builder
node_ncaa -->|"normalizes teams"| node_league_mappings
node_league_parsers -.->|"uses mappings"| node_league_mappings
node_merge -.->|"refreshes team IDs"| node_team_ids
node_database -->|"reads and writes"| node_sqlite_file
node_database -->|"creates export calendar"| node_calendar_factory

click node_merge "https://github.com/wololo4/calendar_merge/blob/main/merge.py"
click node_feed_config "https://github.com/wololo4/calendar_merge/blob/main/feeds.yaml"
click node_feed_builder "https://github.com/wololo4/calendar_merge/blob/main/utils/feeds.py"
click node_downloader "https://github.com/wololo4/calendar_merge/blob/main/utils/downloader.py"
click node_hockeytech "https://github.com/wololo4/calendar_merge/blob/main/parsers/hockeytech.py"
click node_ncaa "https://github.com/wololo4/calendar_merge/blob/main/parsers/ncaa.py"
click node_league_parsers "https://github.com/wololo4/calendar_merge/tree/main/parsers"
click node_parser_common "https://github.com/wololo4/calendar_merge/blob/main/parsers/common.py"
click node_league_mappings "https://github.com/wololo4/calendar_merge/tree/main/dict"
click node_team_ids "https://github.com/wololo4/calendar_merge/blob/main/utils/team_id.py"
click node_event_builder "https://github.com/wololo4/calendar_merge/blob/main/utils/ics.py"
click node_calendar_factory "https://github.com/wololo4/calendar_merge/blob/main/utils/calendar.py"
click node_database "https://github.com/wololo4/calendar_merge/blob/main/utils/database.py"
click node_sqlite_file "https://github.com/wololo4/calendar_merge/blob/main/calendar.db"
click node_calendar_files "https://github.com/wololo4/calendar_merge/tree/main/calendars"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_merge,node_calendar_files toneBlue
class node_feed_config,node_feed_builder,node_downloader toneAmber
class node_hockeytech,node_ncaa,node_league_parsers,node_parser_common,node_league_mappings,node_event_builder,node_calendar_factory toneMint
class node_team_ids,node_database,node_sqlite_file toneRose
class node_operator,node_league_sources toneIndigo
```

## Components

### Workflow

- [Merge runner](https://github.com/wololo4/calendar_merge/blob/main/merge.py): `merge.py`
- [League calendars](https://github.com/wololo4/calendar_merge/tree/main/calendars): `calendars`

### Schedule ingestion

- [League feeds](https://github.com/wololo4/calendar_merge/blob/main/feeds.yaml): `feeds.yaml`
- [Feed discovery](https://github.com/wololo4/calendar_merge/blob/main/utils/feeds.py): `utils/feeds.py`
- [Download dispatch](https://github.com/wololo4/calendar_merge/blob/main/utils/downloader.py): `utils/downloader.py`

### Calendar parsing

- [HockeyTech parser](https://github.com/wololo4/calendar_merge/blob/main/parsers/hockeytech.py): `parsers/hockeytech.py`
- [NCAA parser](https://github.com/wololo4/calendar_merge/blob/main/parsers/ncaa.py): `parsers/ncaa.py`
- [Other league parsers](https://github.com/wololo4/calendar_merge/tree/main/parsers): `parsers`
- [Parser utilities](https://github.com/wololo4/calendar_merge/blob/main/parsers/common.py): `parsers/common.py`
- [League mappings](https://github.com/wololo4/calendar_merge/tree/main/dict): `dict`
- [Event builder](https://github.com/wololo4/calendar_merge/blob/main/utils/ics.py): `utils/ics.py`
- [Calendar factory](https://github.com/wololo4/calendar_merge/blob/main/utils/calendar.py): `utils/calendar.py`

### Events and identity

- [Team ID refresh](https://github.com/wololo4/calendar_merge/blob/main/utils/team_id.py): `utils/team_id.py`
- [Event database](https://github.com/wololo4/calendar_merge/blob/main/utils/database.py): `utils/database.py`
- [SQLite events](https://github.com/wololo4/calendar_merge/blob/main/calendar.db): `calendar.db`

### Other components

- **Schedule refresh**
- **League schedules**

## Connections

- Schedule refresh → Merge runner: starts refresh
- Merge runner → Feed discovery: loads feeds (evidence: `merge.py`)
- Merge runner → Download dispatch: dispatches downloads (evidence: `merge.py`)
- Merge runner → Event database: uses event store (evidence: `merge.py`)
- League feeds → Feed discovery: configures feeds
- Feed discovery → League schedules: discovers schedules
- Download dispatch → League schedules: fetches schedules (evidence: `utils/downloader.py`)
- Download dispatch → HockeyTech parser: dispatches parsing (evidence: `utils/downloader.py`)
- Download dispatch → NCAA parser: dispatches parsing (evidence: `utils/downloader.py`)
- Download dispatch → Other league parsers: dispatches parsing (evidence: `utils/downloader.py`)
- HockeyTech parser → Parser utilities: uses helpers (evidence: `parsers/hockeytech.py`)
- NCAA parser → Parser utilities: uses helpers (evidence: `parsers/ncaa.py`)
- Other league parsers → Parser utilities: uses helpers (evidence: `parsers/del_parser.py`)
- HockeyTech parser → Event builder: builds events (evidence: `parsers/hockeytech.py`)
- NCAA parser → Event builder: builds events (evidence: `parsers/ncaa.py`)
- Other league parsers → Event builder: builds events (evidence: `parsers/del_parser.py`)
- NCAA parser → League mappings: normalizes teams (evidence: `parsers/ncaa.py`)
- Other league parsers → League mappings: uses mappings (evidence: `parsers/del_parser.py`)
- Merge runner → Team ID refresh: refreshes team IDs
- Event database → SQLite events: reads and writes (evidence: `utils/database.py`)
- Event database → Calendar factory: creates export calendar (evidence: `utils/database.py`)
