Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
1b939a3
Add json schemas
Skillkiller Jan 12, 2026
4e0563a
Fix id in json schema
Skillkiller Jan 15, 2026
0a3bb56
Fix schema name
Skillkiller Jan 15, 2026
c76c0ac
Add raw data for school holidays
Skillkiller Jan 15, 2026
7e1e3a6
Add raw data for public holidays
Skillkiller Jan 15, 2026
a31d2a7
Remove ics files and ignore ics folders
Skillkiller Jan 16, 2026
955b52a
Add notebook file to test new ics generators
Skillkiller Jan 16, 2026
032432f
Add script to fetch and save public holidays data from OpenHolidays API
Skillkiller Apr 19, 2026
76185f1
Add public holiday override schema for manual data adjustments
Skillkiller Apr 19, 2026
d22fbc7
Add script to merge public holidays data with overrides and metadata
Skillkiller Apr 20, 2026
eb7dfa8
Add $schema property to public holiday override schema
Skillkiller Apr 20, 2026
167f442
Add empty holiday override JSON files
Skillkiller Apr 20, 2026
5001378
Add metadata to result json
Skillkiller Apr 21, 2026
6cc2712
Add public holiday schema with metadata and holiday properties
Skillkiller Apr 21, 2026
2a0ee96
Add $schema property to metadata in enrich_with_metadata function
Skillkiller Apr 21, 2026
c973d37
Refactor enrich_with_metadata to return the final JSON structure dire…
Skillkiller Apr 21, 2026
1a69edc
Remove timezone offset replacement in get_now_iso function
Skillkiller Apr 22, 2026
39eb41c
Implement ICS file generation from public holiday JSON data
Skillkiller Apr 22, 2026
b301da9
Remove old json schemas and files
Skillkiller Apr 22, 2026
6e445f8
Rename public holiday scripts
Skillkiller Apr 22, 2026
9fa8ade
Refactor public holiday scripts to use centralized configuration and …
Skillkiller Apr 23, 2026
b5ef327
Add scripts for fetching, merging, and generating school holidays dat…
Skillkiller Apr 23, 2026
dba9e7c
Add JSON schemas for school holidays and school holiday overrides
Skillkiller Apr 24, 2026
fcfc438
Update ICS result dir for school holidays to "Ferien"
Skillkiller Apr 29, 2026
a9b9788
Add empty school holiday override files
Skillkiller Apr 29, 2026
5dbea94
Add GitHub Actions workflow for automated holiday data updates
Skillkiller Apr 29, 2026
265472c
Delete branches from automated closed prs
Skillkiller Apr 29, 2026
4be79a2
Update GitHub Actions to use latest checkout and Python versions
Skillkiller Apr 29, 2026
0ede3ab
Add .gitignore to exclude __pycache__ directory
Skillkiller Apr 29, 2026
92ec364
Update pull request title
Skillkiller Apr 29, 2026
283b152
Move website files into website folder
Skillkiller Apr 30, 2026
a118835
Add script to generate website pages from ICS data
Skillkiller Apr 30, 2026
c3646be
Add website generation configuration and update page generation script
Skillkiller Apr 30, 2026
58b04c8
Adjust error messages
Skillkiller Apr 30, 2026
74b5450
Remove template file after generating website output
Skillkiller Apr 30, 2026
8fc5639
Update workflow for gh pages deployment
Skillkiller Apr 30, 2026
056cbc3
Remove old now unused files
Skillkiller Apr 30, 2026
ef38284
Deploy page on manuel workflow trigger on master branch
Skillkiller May 1, 2026
a738f30
Add calendar properties and event transparency
Skillkiller May 1, 2026
0112857
Skip entries with local regional scope in holiday processing
Skillkiller May 2, 2026
0f67fe8
Change event name to adept old name pattern
Skillkiller May 2, 2026
ddef27a
Add CALSCALE and SOURCE to VCALENDAR event
Skillkiller May 2, 2026
7338caf
Normalize property names in calendar generation
Skillkiller May 2, 2026
fe32d91
Normalize property names in event generation
Skillkiller May 2, 2026
9998e0b
idempotent website generation with template/result separation
Skillkiller May 2, 2026
82c45c4
Remove old test file
Skillkiller May 2, 2026
853e71f
Remove old script
Skillkiller May 2, 2026
a114790
Remove unused imports
Skillkiller May 2, 2026
9e66c37
Update file reading mode to UTF-8 in calendar fixtures
Skillkiller May 2, 2026
56a873a
Add script to compare old and new ics files
Skillkiller May 2, 2026
157e9db
Update expected calendar name
Skillkiller May 2, 2026
bf7b733
Update README.md
Skillkiller May 11, 2026
4b56674
Update website template
Skillkiller May 11, 2026
2f134f5
Setup jekyll pages-themes/cayman
Skillkiller May 11, 2026
1bca356
Add assignee to automated holiday update pull request
Skillkiller May 11, 2026
b89649c
chore: update public and school holidays data
github-actions[bot] May 11, 2026
051d946
feat: add script to generate combined public holidays ICS
Skillkiller May 13, 2026
bd8543f
fix: correct spelling of "Bundesweite" in calendar naming
Skillkiller May 13, 2026
d3024df
feat: add event period handling and overlap detection in calendar tests
Skillkiller May 13, 2026
219d54a
feat: add functionality to ignore specific holiday entries during mer…
Skillkiller May 13, 2026
a22366d
Add group filtering for public and school holidays by group informati…
Skillkiller May 13, 2026
8ab825b
feat: add manually school holiday entries for Thüringen in JSON override
Skillkiller May 13, 2026
a622bd3
feat: add manually school holiday entries for Sachsen in JSON override
Skillkiller May 13, 2026
d82d9f3
feat: add manually school holiday entries for Bremen in JSON override
Skillkiller May 14, 2026
93f3274
feat: add manually school holiday entries for various states in JSON …
Skillkiller May 14, 2026
c5f0827
Update result jsons
Skillkiller May 14, 2026
b164035
fix: wrong entry titles
Skillkiller May 16, 2026
fad8afe
fix: remove wrong holiday entries from MV.json
Skillkiller May 16, 2026
7531deb
fix: update result jsons after override json change
Skillkiller May 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 33 additions & 25 deletions .github/workflows/jekyll-gh-pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,46 +17,54 @@ concurrency:
cancel-in-progress: true

jobs:
check:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 0

- name: Set up Python
uses: actions/setup-python@v4
uses: actions/setup-python@v6
with:
python-version: '3.X'
cache: 'pip'
python-version: "3.14"
cache: pip

- name: Install dependencies
run: pip install -r tests/requirements.txt
run: |
python -m pip install --upgrade pip
pip install -r tests/requirements.txt

- name: Generate public holidays ics
run: python scripts/03_generate_public_holidays_ics.py

- name: Generate school holidays ics
run: python scripts/03_generate_school_holidays_ics.py

- name: Generate combined public holidays ics
run: python scripts/04_generate_public_holidays_aggregated_ics.py

- name: Run unit tests
run: pytest

- name: Generate page
run: python scripts/generate_page.py

build:
runs-on: ubuntu-latest
needs: check
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up Python 3
uses: actions/setup-python@v2
with:
python-version: "3.X"
- name: Build page
run: bash generate_page.sh
working-directory: scripts
- name: Setup Pages
uses: actions/configure-pages@v5
uses: actions/configure-pages@v6

- name: Build with Jekyll
uses: actions/jekyll-build-pages@v1
with:
source: ./page
source: ./website_result
destination: ./_site

- name: Upload artifact
uses: actions/upload-pages-artifact@v3
uses: actions/upload-pages-artifact@v5

deploy:
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
if: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/master'
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
Expand All @@ -65,4 +73,4 @@ jobs:
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
uses: actions/deploy-pages@v5
121 changes: 121 additions & 0 deletions .github/workflows/update-holidays.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
name: Update holiday data

on:
schedule:
- cron: "0 8 * * 3"
workflow_dispatch:
inputs:
close_old_prs:
description: Close previously opened automated holiday PRs before creating a new one
type: boolean
default: true
required: true

permissions:
contents: write
pull-requests: write
issues: write

concurrency:
group: update-holiday-data
cancel-in-progress: false

jobs:
update:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 0

- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.14"
cache: pip

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r tests/requirements.txt

- name: Fetch public holidays
run: python scripts/01_fetch_public_holidays.py

- name: Fetch school holidays
run: python scripts/01_fetch_school_holidays.py

- name: Merge public holidays
run: python scripts/02_merge_public_holidays.py

- name: Merge school holidays
run: python scripts/02_merge_school_holidays.py

- name: Prepare branch name
shell: bash
run: |
branch_name="update/holidays-$(date -u +%Y-%m-%d)-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
echo "BRANCH_NAME=${branch_name}" >> "$GITHUB_ENV"

- name: Ensure automated PR label exists
shell: bash
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_LABEL: automated-holiday-update
run: |
if ! gh label list --json name --jq '.[].name' | grep -Fxq "${PR_LABEL}"; then
gh label create "${PR_LABEL}" --color "1d76db" --description "Automated holiday data update PR"
fi

- name: Close old automated PRs
if: github.event_name != 'workflow_dispatch' || inputs.close_old_prs
shell: bash
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_LABEL: automated-holiday-update
run: |
set -euo pipefail

mapfile -t pr_numbers < <(gh pr list --state open --label "${PR_LABEL}" --json number --jq '.[].number')
if [[ ${#pr_numbers[@]} -eq 0 ]]; then
echo "No open PRs found with label ${PR_LABEL}"
exit 0
fi

for pr_number in "${pr_numbers[@]}"; do
echo "Closing PR #${pr_number}"
gh pr close "${pr_number}" --delete-branch --comment "Closed automatically by a newer automated holiday update run."
done

- name: Check for data changes
id: changes
shell: bash
run: |
if git status --short -- data/public_holidays/raw data/public_holidays/result data/school_holidays/raw data/school_holidays/result | grep -q .; then
echo "has_changes=true" >> "$GITHUB_OUTPUT"
else
echo "has_changes=false" >> "$GITHUB_OUTPUT"
fi

- name: Create pull request
if: steps.changes.outputs.has_changes == 'true'
uses: peter-evans/create-pull-request@v8
with:
token: ${{ secrets.GITHUB_TOKEN }}
branch: ${{ env.BRANCH_NAME }}
base: master
title: "Update public and school holidays data"
body: Automated update of public and school holiday data.
commit-message: "chore: update public and school holidays data"
committer: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
labels: automated-holiday-update
assignees: Skillkiller
sign-commits: true
delete-branch: true
add-paths: |
data/public_holidays/raw/**
data/public_holidays/result/**
data/school_holidays/raw/**
data/school_holidays/result/**
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
page/
page/
Feiertage/
Ferien/
website_result/
Loading