From d6b1c924e1c5a3bfd5fc724861b929a89f53a5c6 Mon Sep 17 00:00:00 2001 From: Kristjan ESPERANTO <35647502+KristjanESPERANTO@users.noreply.github.com> Date: Tue, 13 Jan 2026 21:55:47 +0100 Subject: [PATCH 1/7] tests: harden holiday validator - Enforce UUID format + global uniqueness; flag missing Ids - Check StartDate ordering and date parsing with clear errors - Require key columns/values and correct CSV line numbers - Consistent CSV handling (UTF-8 BOM), deterministic runs, single success message --- bin/test_all_tables.py | 276 +++++++++++++++++++++++++++++++++++------ 1 file changed, 239 insertions(+), 37 deletions(-) diff --git a/bin/test_all_tables.py b/bin/test_all_tables.py index aabbf2f..9b955da 100755 --- a/bin/test_all_tables.py +++ b/bin/test_all_tables.py @@ -1,38 +1,215 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 + +from __future__ import annotations from argparse import ArgumentParser from pathlib import Path +import sys +from uuid import UUID import pandas as pd -def _check_duration(df: pd.DataFrame, filename: Path) -> None: - """Parses StartDate and EndDate as YYYY-MM-DD and checks that EndDate if after the - StartDate""" +REQUIRED_COLUMNS = { + "Id", + "Country", + "StartDate", + "EndDate", + "Type", + "RegionalScope", + "Name", +} + +# Columns that must exist and must not be empty per row. +REQUIRED_NON_EMPTY = { + "Id", + "Country", + "StartDate", + "Type", + "RegionalScope", + "Name", +} + + +def _csv_line(row_index: int) -> int: + # +1 for header, +1 for 0-based index -> line number + return row_index + 2 + + +def _read_csv(path: Path) -> pd.DataFrame: + # Use UTF-8 with BOM and force strings to avoid accidental type coercion. + # Treat only empty fields as missing. + return pd.read_csv( + path, + sep=";", + encoding="utf-8-sig", + dtype=str, + keep_default_na=False, + na_values=[""], + ) + + +def _check_required_columns(df: pd.DataFrame, filename: Path) -> list[str]: + missing = REQUIRED_COLUMNS - set(df.columns) + if not missing: + return [] + return [f"{filename}: missing required columns: {sorted(missing)}"] + + +def _check_required_values(df: pd.DataFrame, filename: Path) -> list[str]: + errors: list[str] = [] + for col in sorted(REQUIRED_NON_EMPTY): + if col not in df.columns: + continue + missing = df[col].isna() + if not missing.any(): + continue + for idx in missing[missing].index[:10]: + errors.append(f"{filename} (line {_csv_line(int(idx))}): missing value in column '{col}'") + more = int(missing.sum()) - min(10, int(missing.sum())) + if more > 0: + errors.append(f"{filename}: {more} more missing '{col}' values not shown") + return errors + - df.StartDate = pd.to_datetime(df.StartDate, format="%Y-%m-%d") - df.EndDate = pd.to_datetime(df.EndDate, format="%Y-%m-%d") - positive_duration_mask = df.EndDate.isna() | ((df.EndDate >= df.StartDate)) - if not positive_duration_mask.all(): - raise ValueError( - f"Holidays with negative duration in '{filename}':\n" - f"{df[~positive_duration_mask]}" +def _check_country_column(df: pd.DataFrame, filename: Path, expected_country: str) -> list[str]: + if "Country" not in df: + return [] + wrong = df[~df["Country"].isna() & (df["Country"] != expected_country)] + if wrong.empty: + return [] + lines = ", ".join(str(_csv_line(int(i))) for i in wrong.index[:10]) + return [ + f"{filename}: Country column mismatch (expected '{expected_country}') at lines {lines}" + ] + + +def _parse_dates(df: pd.DataFrame, filename: Path) -> tuple[pd.Series, pd.Series, list[str]]: + errors: list[str] = [] + + start_raw = df["StartDate"] + end_raw = df["EndDate"] + + start_parsed = pd.to_datetime(start_raw, format="%Y-%m-%d", errors="coerce") + end_parsed = pd.to_datetime(end_raw, format="%Y-%m-%d", errors="coerce") + + invalid_start = start_raw.notna() & start_parsed.isna() + invalid_end = end_raw.notna() & end_parsed.isna() + + if invalid_start.any(): + bad = df[invalid_start].head(10) + for idx, val in bad["StartDate"].items(): + errors.append(f"{filename} (line {_csv_line(int(idx))}): invalid StartDate '{val}'") + + if invalid_end.any(): + bad = df[invalid_end].head(10) + for idx, val in bad["EndDate"].items(): + errors.append(f"{filename} (line {_csv_line(int(idx))}): invalid EndDate '{val}'") + + return start_parsed, end_parsed, errors + + +def _check_duration( + start_dates: pd.Series, end_dates: pd.Series, filename: Path +) -> list[str]: + # EndDate may be empty -> allowed. If present, must be >= StartDate. + mask = end_dates.notna() & start_dates.notna() & (end_dates < start_dates) + if not mask.any(): + return [] + + errors: list[str] = [] + for idx in mask[mask].index[:10]: + errors.append( + f"{filename} (line {_csv_line(int(idx))}): EndDate < StartDate ({end_dates.loc[idx].date()} < {start_dates.loc[idx].date()})" ) + more = int(mask.sum()) - len(errors) + if more > 0: + errors.append(f"{filename}: {more} more negative durations not shown") + return errors + + +def _check_sorting(start_dates: pd.Series, filename: Path) -> list[str]: + # Only compare rows with valid StartDate values. + errors: list[str] = [] + for i in range(len(start_dates) - 1): + a = start_dates.iloc[i] + b = start_dates.iloc[i + 1] + if pd.isna(a) or pd.isna(b): + continue + if a > b: + errors.append( + f"{filename}: not sorted by StartDate: line {_csv_line(i)} ({a.date()}) > line {_csv_line(i + 1)} ({b.date()})" + ) + if len(errors) >= 5: + break + return errors + + +def _split_csv_list(value: str) -> list[str]: + return [part.strip() for part in value.split(",") if part.strip()] + + +def _check_subdivisions(df: pd.DataFrame, subdivisions: set[str], filename: Path) -> list[str]: + if not subdivisions: + return [] + if "Subdivisions" not in df.columns: + return [] + + used: set[str] = set() + for val in df["Subdivisions"].dropna(): + used.update(_split_csv_list(val)) + unknown = used - subdivisions + if not unknown: + return [] + return [f"{filename}: unknown Subdivisions values: {sorted(unknown)}"] + + +def _check_uuids_and_global_uniqueness( + df: pd.DataFrame, filename: Path, seen: dict[str, tuple[Path, int]] +) -> list[str]: + if "Id" not in df.columns: + return [f"{filename}: missing Id column"] + + errors: list[str] = [] + for idx, raw in df["Id"].items(): + line = _csv_line(int(idx)) + if pd.isna(raw) or str(raw).strip() == "": + errors.append(f"{filename} (line {line}): missing UUID") + continue + + try: + normalized = str(UUID(str(raw))).lower() + except (ValueError, AttributeError, TypeError): + errors.append(f"{filename} (line {line}): invalid UUID '{raw}'") + continue -def _check_subdivisions( - df: pd.DataFrame, subdivisions: set[str], filename: Path -) -> None: - """Checks that the subdivisions in df are also present in subdivisions.csv""" - if "Subdivisions" in df: - unknown_subdivisions = set( - df.Subdivisions.dropna().map(lambda x: x.split(",")).explode() - ) - set(subdivisions) - if unknown_subdivisions: - raise ValueError( - f"Unknown subdivisions in {filename}: {unknown_subdivisions}. " - f"Known are {subdivisions}" + if normalized in seen: + prev_file, prev_line = seen[normalized] + errors.append( + "Duplicate UUID " + + normalized + + ":\n" + + f" - {prev_file} (line {prev_line})\n" + + f" - {filename} (line {line})" ) + else: + seen[normalized] = (filename, line) + + return errors + + +def _load_subdivisions(country_dir: Path) -> set[str]: + subdivisions_csv = country_dir / "subdivisions.csv" + if not subdivisions_csv.exists(): + return set() + try: + df = _read_csv(subdivisions_csv) + except pd.errors.ParserError: + return set() + if "ShortName" not in df.columns: + return set() + return set(df["ShortName"].dropna().astype(str)) def main() -> None: @@ -42,23 +219,48 @@ def main() -> None: ) args = parser.parse_args() - for country_dir in sorted(args.data_folder.iterdir()): - if not country_dir.is_dir(): - continue + errors: list[str] = [] + seen_uuids: dict[str, tuple[Path, int]] = {} - try: - df_subdivisions = pd.read_csv(country_dir / "subdivisions.csv", sep=";", keep_default_na=False) - subdivisions = set(df_subdivisions.ShortName) - except FileNotFoundError: - subdivisions = {} + for country_dir in sorted([p for p in args.data_folder.iterdir() if p.is_dir()]): + expected_country = country_dir.name.upper() + subdivisions = _load_subdivisions(country_dir) + + holidays_dir = country_dir / "holidays" + if not holidays_dir.exists(): + continue - for holidays_file in (country_dir / "holidays").iterdir(): + for holidays_file in sorted(holidays_dir.glob("*.csv")): try: - df = pd.read_csv(holidays_file, sep=";") + df = _read_csv(holidays_file) except pd.errors.ParserError as error: - raise ValueError(f"Could not parse '{holidays_file}'") from error - _check_subdivisions(df, subdivisions, holidays_file) - _check_duration(df, holidays_file) + errors.append(f"{holidays_file}: could not parse CSV - {error}") + continue + + errors.extend(_check_required_columns(df, holidays_file)) + if REQUIRED_COLUMNS - set(df.columns): + # Don’t cascade on missing columns. + continue + + errors.extend(_check_required_values(df, holidays_file)) + + errors.extend(_check_country_column(df, holidays_file, expected_country)) + errors.extend(_check_uuids_and_global_uniqueness(df, holidays_file, seen_uuids)) + + start_dates, end_dates, date_errors = _parse_dates(df, holidays_file) + errors.extend(date_errors) + errors.extend(_check_duration(start_dates, end_dates, holidays_file)) + errors.extend(_check_sorting(start_dates, holidays_file)) + errors.extend(_check_subdivisions(df, subdivisions, holidays_file)) + + if errors: + print(f"Validation failed with {len(errors)} error(s):\n", file=sys.stderr) + for message in errors: + print(f"- {message}", file=sys.stderr) + sys.exit(1) + + print("✓ All validations passed") -main() +if __name__ == "__main__": + main() From 514eddd6a17f7148f2aafbf52f6e9621c4a784f5 Mon Sep 17 00:00:00 2001 From: Kristjan ESPERANTO <35647502+KristjanESPERANTO@users.noreply.github.com> Date: Tue, 13 Jan 2026 22:00:21 +0100 Subject: [PATCH 2/7] chore: sort entries chronically --- src/ch/holidays/holidays.school.fr.csv | 42 +++++++++++++------------- src/ch/holidays/holidays.school.ow.csv | 4 +-- src/ch/holidays/holidays.school.vs.csv | 14 ++++----- src/hr/holidays/holidays.school.csv | 2 +- src/li/holidays/holidays.school.csv | 2 +- src/nl/holidays/holidays.school.csv | 2 +- src/pt/holidays/holidays.national.csv | 2 +- 7 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/ch/holidays/holidays.school.fr.csv b/src/ch/holidays/holidays.school.fr.csv index 037b9ea..2452ca9 100644 --- a/src/ch/holidays/holidays.school.fr.csv +++ b/src/ch/holidays/holidays.school.fr.csv @@ -1,53 +1,53 @@ Id;Country;StartDate;EndDate;Type;RegionalScope;Name;Subdivisions;Comment 119a075c-8036-46ea-afc3-3c85ce6254a1;CH;2020-02-22;2020-03-01;School;Regional;DE Sport,FR Sport,IT Sport,EN Sport;FR;FR Écoles primaires (ville) -50b56606-025b-4c4f-9815-852703511946;CH;2020-04-04;2020-04-19;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;FR;FR Écoles primaires (ville) -3636a79a-2935-4ebf-972d-fe479c99b714;CH;2020-07-04;2020-08-26;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;FR;FR Écoles primaires (ville) -8d6e0cb0-c1fb-437b-a02f-4775c609329e;CH;2020-10-17;2020-11-01;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;FR;FR Écoles primaires (ville) -64f04edd-723f-48d7-af66-88428ae819fe;CH;2020-12-19;2021-01-03;School;Regional;DE Winter,FR Noël,IT Inverno,EN Christmas;FR;FR Écoles primaires (ville) 82a3aeb9-9139-4512-adda-26860a051919;CH;2020-02-22;2020-03-01;School;Regional;DE Sport,FR Sport,IT Sport,EN Sport;FR;FR Écoles sec. II +50b56606-025b-4c4f-9815-852703511946;CH;2020-04-04;2020-04-19;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;FR;FR Écoles primaires (ville) 09c80203-4bea-40ef-9ea5-388b4ab88177;CH;2020-04-04;2020-04-19;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;FR;FR Écoles sec. II 96616a64-2ab6-4ab1-9d50-9f9ef71efce9;CH;2020-06-27;2020-08-26;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;FR;FR Écoles sec. II +3636a79a-2935-4ebf-972d-fe479c99b714;CH;2020-07-04;2020-08-26;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;FR;FR Écoles primaires (ville) +8d6e0cb0-c1fb-437b-a02f-4775c609329e;CH;2020-10-17;2020-11-01;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;FR;FR Écoles primaires (ville) fd9e68c7-0d0f-4572-8454-e5e8b897aa3b;CH;2020-10-17;2020-11-01;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;FR;FR Écoles sec. II +64f04edd-723f-48d7-af66-88428ae819fe;CH;2020-12-19;2021-01-03;School;Regional;DE Winter,FR Noël,IT Inverno,EN Christmas;FR;FR Écoles primaires (ville) 5b983843-297b-4f47-a212-7eeade8adedf;CH;2020-12-19;2021-01-03;School;Regional;DE Winter,FR Noël,IT Inverno,EN Christmas;FR;FR Écoles sec. II 4563590b-5412-47fe-96fc-3f5433071191;CH;2021-02-13;2021-02-21;School;Regional;DE Sport,FR Sport,IT Sport,EN Sport;FR;FR Écoles primaires (ville) -d64446e4-4e5d-4045-959e-349daf0b53af;CH;2021-04-02;2021-04-18;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;FR;FR Écoles primaires (ville) -e8ba4fcb-e5e1-48a6-8a9b-154cae38109a;CH;2021-07-10;2021-08-25;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;FR;FR Écoles primaires (ville) -1c3c5465-3fc9-4870-bcf0-e2c7a1aea04a;CH;2021-10-16;2021-11-01;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;FR;FR Écoles primaires (ville) -39d8f076-5b64-44ed-b3c3-6f27ce88418d;CH;2021-12-24;2022-01-09;School;Regional;DE Winter,FR Noël,IT Inverno,EN Christmas;FR;FR Écoles primaires (ville) 9ee2a040-ec06-4efc-b65a-ebaf6b8c981d;CH;2021-02-13;2021-02-21;School;Regional;DE Sport,FR Sport,IT Sport,EN Sport;FR;FR Écoles sec. II +d64446e4-4e5d-4045-959e-349daf0b53af;CH;2021-04-02;2021-04-18;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;FR;FR Écoles primaires (ville) b3ae725c-7558-487a-93a5-1625ae78bee1;CH;2021-04-02;2021-04-18;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;FR;FR Écoles sec. II 1cf61c56-8b29-459e-a946-8b31f981a22b;CH;2021-07-03;2021-08-25;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;FR;FR Écoles sec. II +e8ba4fcb-e5e1-48a6-8a9b-154cae38109a;CH;2021-07-10;2021-08-25;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;FR;FR Écoles primaires (ville) +1c3c5465-3fc9-4870-bcf0-e2c7a1aea04a;CH;2021-10-16;2021-11-01;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;FR;FR Écoles primaires (ville) 890c92da-16b9-412d-bdb1-ababc2393993;CH;2021-10-16;2021-11-01;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;FR;FR Écoles sec. II +39d8f076-5b64-44ed-b3c3-6f27ce88418d;CH;2021-12-24;2022-01-09;School;Regional;DE Winter,FR Noël,IT Inverno,EN Christmas;FR;FR Écoles primaires (ville) 0dda5ad3-2db9-45c0-9046-c299a26a2618;CH;2021-12-24;2022-01-09;School;Regional;DE Winter,FR Noël,IT Inverno,EN Christmas;FR;FR Écoles sec. II 600513d8-49e6-4ab0-b02e-1126b4ebc481;CH;2022-02-26;2022-03-06;School;Regional;DE Sport,FR Sport,IT Sport,EN Sport;FR;FR Écoles primaires (ville) -64da44c8-9d38-49bb-9e02-9f4c9ed124b2;CH;2022-04-15;2022-05-01;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;FR;FR Écoles primaires (ville) -36f7fdaa-4656-4835-8d28-231bb3166eb5;CH;2022-07-09;2022-08-24;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;FR;FR Écoles primaires (ville) -e5f50f70-e674-47f4-aabb-349d73d4f128;CH;2022-10-15;2022-10-30;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;FR;FR Écoles primaires (ville) -df80a444-329c-4186-adea-4a581561dfed;CH;2022-12-24;2023-01-08;School;Regional;DE Winter,FR Noël,IT Inverno,EN Christmas;FR;FR Écoles primaires (ville) 9222ff07-db8d-4feb-9d9d-5ab16bdff220;CH;2022-02-26;2022-03-06;School;Regional;DE Sport,FR Sport,IT Sport,EN Sport;FR;FR Écoles sec. II +64da44c8-9d38-49bb-9e02-9f4c9ed124b2;CH;2022-04-15;2022-05-01;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;FR;FR Écoles primaires (ville) 4ba961b7-5cbd-4dd1-96ee-679ee1d636a3;CH;2022-04-15;2022-05-01;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;FR;FR Écoles sec. II 7708f6b0-4a4f-46a1-993f-1aaaf9cc5fca;CH;2022-07-02;2022-08-24;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;FR;FR Écoles sec. II +36f7fdaa-4656-4835-8d28-231bb3166eb5;CH;2022-07-09;2022-08-24;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;FR;FR Écoles primaires (ville) +e5f50f70-e674-47f4-aabb-349d73d4f128;CH;2022-10-15;2022-10-30;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;FR;FR Écoles primaires (ville) 87f05848-67a1-41b5-bf5c-2aeb7cd4bbb5;CH;2022-10-15;2022-10-30;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;FR;FR Écoles sec. II +df80a444-329c-4186-adea-4a581561dfed;CH;2022-12-24;2023-01-08;School;Regional;DE Winter,FR Noël,IT Inverno,EN Christmas;FR;FR Écoles primaires (ville) e113857a-bc7c-486a-b110-c628502e8c9a;CH;2022-12-24;2023-01-08;School;Regional;DE Winter,FR Noël,IT Inverno,EN Christmas;FR;FR Écoles sec. II bddf60c2-139e-4cd4-818e-143149785688;CH;2023-02-18;2023-02-26;School;Regional;DE Sport,FR Sport,IT Sport,EN Sport;FR;FR Écoles primaires (ville) -d9cd5e9e-c260-4567-bc34-8f0fd69031fc;CH;2023-04-07;2023-04-23;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;FR;FR Écoles primaires (ville) -69a260d0-e5ed-4de4-8499-15d9931946ce;CH;2023-07-08;2023-08-23;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;FR;FR Écoles primaires (ville) -e6ac679f-e28c-4fe4-be35-f715f64633ae;CH;2023-10-14;2023-10-29;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;FR;FR Écoles primaires (ville) -6d474421-2977-46ec-b690-ef6f4b37301e;CH;2023-12-23;2024-01-07;School;Regional;DE Winter,FR Noël,IT Inverno,EN Christmas;FR;FR Écoles primaires (ville) b34ecd7f-4e39-476b-a254-b5ff9186b1a4;CH;2023-02-18;2023-02-26;School;Regional;DE Sport,FR Sport,IT Sport,EN Sport;FR;FR Écoles sec. II +d9cd5e9e-c260-4567-bc34-8f0fd69031fc;CH;2023-04-07;2023-04-23;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;FR;FR Écoles primaires (ville) 086241fb-dbd1-4028-bbd7-bdd3b65ccbab;CH;2023-04-07;2023-04-23;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;FR;FR Écoles sec. II 92daab0e-44c8-4e50-b326-cbfba7561286;CH;2023-07-01;2023-08-23;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;FR;FR Écoles sec. II +69a260d0-e5ed-4de4-8499-15d9931946ce;CH;2023-07-08;2023-08-23;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;FR;FR Écoles primaires (ville) +e6ac679f-e28c-4fe4-be35-f715f64633ae;CH;2023-10-14;2023-10-29;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;FR;FR Écoles primaires (ville) b00c11bf-c02b-407d-95ae-7abb2987dfd5;CH;2023-10-14;2023-10-29;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;FR;FR Écoles sec. II +6d474421-2977-46ec-b690-ef6f4b37301e;CH;2023-12-23;2024-01-07;School;Regional;DE Winter,FR Noël,IT Inverno,EN Christmas;FR;FR Écoles primaires (ville) bde36e0c-6dc4-45df-a717-96e906724bc5;CH;2023-12-23;2024-01-07;School;Regional;DE Winter,FR Noël,IT Inverno,EN Christmas;FR;FR Écoles sec. II 6e4a5707-c1b1-4667-8166-6c68708dbee7;CH;2024-02-10;2024-02-18;School;Regional;DE Sport,FR Sport,IT Sport,EN Sport;FR;FR Écoles primaires (ville) -28e0920a-ef7b-4f83-93de-da7572cbb2fe;CH;2024-03-29;2024-04-14;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;FR;FR Écoles primaires (ville) -6ac9c6c0-80c7-41b8-bbcc-49843abc1816;CH;2024-07-06;2024-08-21;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;FR;FR Écoles primaires (ville) -cc72d591-60b3-4a1b-8e46-0cea19a3be70;CH;2024-10-12;2024-10-27;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;FR;FR Écoles primaires (ville) -c1064601-75a8-48f3-8b11-fe2723ad386a;CH;2024-12-21;2025-01-05;School;Regional;DE Winter,FR Noël,IT Inverno,EN Christmas;FR;FR Écoles primaires (ville) 3e685926-ca35-4a5a-a900-4a50d0bcaf0d;CH;2024-02-10;2024-02-18;School;Regional;DE Sport,FR Sport,IT Sport,EN Sport;FR;FR Écoles sec. II +28e0920a-ef7b-4f83-93de-da7572cbb2fe;CH;2024-03-29;2024-04-14;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;FR;FR Écoles primaires (ville) f96c70a8-38b2-42ad-b35c-00f926d625e9;CH;2024-03-29;2024-04-14;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;FR;FR Écoles sec. II 5c7b1ca0-7ee3-4c14-af87-462117e59835;CH;2024-06-29;2024-08-21;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;FR;FR Écoles sec. II +6ac9c6c0-80c7-41b8-bbcc-49843abc1816;CH;2024-07-06;2024-08-21;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;FR;FR Écoles primaires (ville) +cc72d591-60b3-4a1b-8e46-0cea19a3be70;CH;2024-10-12;2024-10-27;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;FR;FR Écoles primaires (ville) c7c83d56-3033-4d42-b48d-134c7763a001;CH;2024-10-12;2024-10-27;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;FR;FR Écoles sec. II +c1064601-75a8-48f3-8b11-fe2723ad386a;CH;2024-12-21;2025-01-05;School;Regional;DE Winter,FR Noël,IT Inverno,EN Christmas;FR;FR Écoles primaires (ville) 001679f0-f154-40f5-afd1-8c82c31f256b;CH;2024-12-21;2025-01-05;School;Regional;DE Winter,FR Noël,IT Inverno,EN Christmas;FR;FR Écoles sec. II e54a2771-2ca0-4358-a962-2ca638259909;CH;2025-03-01;2025-03-09;School;Regional;DE Sport,FR Sport,IT Sport,EN Sport;FR; 83f330e6-22dd-4695-b061-e51c79c772a8;CH;2025-04-18;2025-05-04;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;FR; @@ -56,7 +56,7 @@ e54a2771-2ca0-4358-a962-2ca638259909;CH;2025-03-01;2025-03-09;School;Regional;DE cb2bca83-6104-484e-86c5-06da05b42f21;CH;2025-12-20;2026-01-02;School;Regional;DE Winter,FR Noël,IT Inverno,EN Christmas;FR; e367d3fc-61f6-4a75-a38b-a90fbb9bd4b1;CH;2026-02-14;2026-02-22;School;Regional;DE Sport,FR Sport,IT Sport,EN Sport;FR;FR Écoles primaires (ville), Écoles sec. II 8c8976c1-6f8e-496a-8017-2c557e2c1a0d;CH;2026-04-03;2026-04-19;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;FR;FR Écoles primaires (ville), Écoles sec. II -7749db7a-3271-454b-bca3-3aee9070096b;CH;2026-07-11;2026-08-26;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;FR;FR Écoles primaires (ville) 1d230866-ba57-4315-941c-54bb52586cb9;CH;2026-07-04;2026-08-26;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;FR;FR Écoles sec. II +7749db7a-3271-454b-bca3-3aee9070096b;CH;2026-07-11;2026-08-26;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;FR;FR Écoles primaires (ville) e3489777-4737-4801-9e17-8bef71491211;CH;2026-10-10;2026-10-25;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;FR;FR Écoles primaires (ville), Écoles sec. II 23dc7b32-26c9-4b01-857d-f60c9a9d83d9;CH;2026-12-19;2027-01-03;School;Regional;DE Winter,FR Noël,IT Inverno,EN Christmas;FR;FR Écoles primaires (ville), Écoles sec. II diff --git a/src/ch/holidays/holidays.school.ow.csv b/src/ch/holidays/holidays.school.ow.csv index 73f7a51..0cf1c76 100644 --- a/src/ch/holidays/holidays.school.ow.csv +++ b/src/ch/holidays/holidays.school.ow.csv @@ -28,8 +28,8 @@ fdf2e241-35b9-4f7f-8fc4-abe70852d093;CH;2024-07-06;2024-08-18;School;Regional;DE f9269753-9e72-4888-8110-0d67baa2f985;CH;2025-02-27;2025-03-09;School;Regional;DE Sport,FR Sport,IT Sport,EN Sport;OW;DE Ausnahmeregelung für Gemeinde Engelberg 357ab7e7-6546-49cf-80b1-456174409bfa;CH;2025-04-18;2025-05-04;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;OW;DE Alle Schulen ausser Engelberg 505e623a-77b5-428f-943a-e2fd0c05363c;CH;2025-04-18;2025-05-04;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;OW;DE Ausnahmeregelung für Gemeinde Engelberg -6c6e6050-1d09-4fc2-b34e-33bc34dfc941;CH;2025-07-05;2025-08-17;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;OW;DE Alle Schulen ausser Engelberg 7d78ad4e-4649-4457-a8ee-5f2c871304ee;CH;2025-06-28;2025-08-10;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;OW;DE Ausnahmeregelung für Gemeinde Engelberg +6c6e6050-1d09-4fc2-b34e-33bc34dfc941;CH;2025-07-05;2025-08-17;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;OW;DE Alle Schulen ausser Engelberg b967a0bf-e573-487f-8794-c4ff25592909;CH;2025-09-27;2025-10-12;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;OW;DE Alle Schulen ausser Engelberg 17eeaf52-f1de-4d6e-9c95-9d6c9653bb8f;CH;2025-10-04;2025-10-26;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;OW;DE Ausnahmeregelung für Gemeinde Engelberg f7617252-d95d-472b-9140-789ec3eaabee;CH;2025-12-24;2026-01-06;School;Regional;DE Winter,FR Noël,IT Inverno,EN Christmas;OW;DE Alle Schulen ausser Engelberg @@ -38,8 +38,8 @@ d1d83361-1282-4580-bddb-8e2137dc5aef;CH;2025-12-24;2026-01-06;School;Regional;DE 426b159d-4e02-49ba-a1e7-378c5d75907c;CH;2026-02-12;2026-02-22;School;Regional;DE Sport,FR Sport,IT Sport,EN Sport;OW;DE Ausnahmeregelung für Gemeinde Engelberg 86e10b68-6c09-402b-abc8-d63e21549fc4;CH;2026-04-03;2026-04-19;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;OW;DE Alle Schulen ausser Engelberg 67e2b06b-5bca-4364-9d38-0da71639d5d3;CH;2026-04-03;2026-04-19;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;OW;DE Ausnahmeregelung für Gemeinde Engelberg -d57a3d59-3e74-47c1-8fab-98f97652e328;CH;2026-07-04;2026-08-16;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;OW;DE Alle Schulen ausser Engelberg ca1ec27f-b294-4c67-9fdc-bd8038ea05f8;CH;2026-06-27;2026-08-09;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;OW;DE Ausnahmeregelung für Gemeinde Engelberg +d57a3d59-3e74-47c1-8fab-98f97652e328;CH;2026-07-04;2026-08-16;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;OW;DE Alle Schulen ausser Engelberg 8a9aa84e-acc1-4bb5-b521-9eb82465ce4d;CH;2026-09-25;2026-10-11;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;OW;DE Alle Schulen ausser Engelberg ce728d25-e09f-45da-be4e-c684cd25d0fc;CH;2026-10-03;2026-10-25;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;OW;DE Ausnahmeregelung für Gemeinde Engelberg 2df41431-eb99-48e3-a9dc-02f55d7f843a;CH;2026-12-24;2027-01-06;School;Regional;DE Winter,FR Noël,IT Inverno,EN Christmas;OW;DE Alle Schulen ausser Engelberg diff --git a/src/ch/holidays/holidays.school.vs.csv b/src/ch/holidays/holidays.school.vs.csv index 00896b4..9f7e68d 100644 --- a/src/ch/holidays/holidays.school.vs.csv +++ b/src/ch/holidays/holidays.school.vs.csv @@ -30,8 +30,8 @@ fcb0dc69-8e5b-4627-8121-c86444eec508;CH;2022-04-15;2022-04-24;School;Regional;DE a24eff71-d7ba-4ffb-8c3c-76387929aeb8;CH;2022-04-30;2022-05-15;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;VS;DE Ausnahmeregelung für Tourismusgemeinden 422e4341-bd3d-4c59-a2e7-bca186d90a99;CH;2022-05-07;2022-05-15;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;VS;DE deutschsprachig,FR germanophone,EN German-speaking e1e090ad-aec1-4a7b-bf03-409c7a557b28;CH;2022-06-25;2022-08-17;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;VS;FR francophon,DE französischsprachig,EN French-speaking -d2974038-1d00-4737-b864-87809074e7c2;CH;2022-06-30;2022-08-15;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;VS;DE deutschsprachig,FR germanophone,EN German-speaking 40339073-e12f-4e2d-9a58-dcb817e6a4f0;CH;2022-06-29;2022-08-15;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;VS;DE Ausnahmeregelung für Tourismusgemeinden +d2974038-1d00-4737-b864-87809074e7c2;CH;2022-06-30;2022-08-15;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;VS;DE deutschsprachig,FR germanophone,EN German-speaking 941af5ca-f548-486d-9471-9672a9f4dce1;CH;2022-10-08;2022-10-23;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;VS;DE deutschsprachig,FR germanophone,EN German-speaking 3c1aa067-98e0-4a86-8c19-55920cad005d;CH;2022-10-13;2022-10-23;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;VS;FR francophon,DE französischsprachig,EN French-speaking 5d45b319-9332-4afa-b157-51fa2f3a649b;CH;2022-12-24;2023-01-08;School;Regional;DE Winter,FR Noël,IT Inverno,EN Christmas;VS;DE deutschsprachig,FR germanophone,EN German-speaking @@ -63,24 +63,24 @@ ce91fe63-1404-44c1-8cf9-1af3aa621292;CH;2024-10-12;2024-10-27;School;Regional;DE 5942bc88-890a-4783-bc72-081a0f95746e;CH;2025-02-22;2025-03-09;School;Regional;DE Sport,FR Sport,IT Sport,EN Sport;VS;DE deutschsprachig,FR germanophone,EN German-speaking ecb29901-eebb-4196-955d-0ff27f67137a;CH;2025-03-01;2025-03-09;School;Regional;DE Sport,FR Sport,IT Sport,EN Sport;VS;DE Ausnahmeregelung für Tourismusgemeinden 81a4e1a2-bbc4-4682-9da3-2fa3cf14e2dc;CH;2025-03-01;2025-03-09;School;Regional;DE Sport,FR Sport,IT Sport,EN Sport;VS;FR francophon,DE französischsprachig,EN French-speaking -fdbe6121-c87e-406d-a573-82970b32670d;CH;2025-04-10;2025-04-18;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;VS;DE deutschsprachig,FR germanophone,EN German-speaking ca62a945-e2df-4d90-b91a-438d70334c53;CH;2025-04-03;2025-04-18;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;VS;DE Ausnahmeregelung für Tourismusgemeinden +fdbe6121-c87e-406d-a573-82970b32670d;CH;2025-04-10;2025-04-18;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;VS;DE deutschsprachig,FR germanophone,EN German-speaking 34c7cc54-780b-4818-9ba5-da4ec5b7dccb;CH;2025-04-18;2025-04-27;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;VS;FR francophon,DE französischsprachig,EN French-speaking -982d216d-4600-4530-a5ac-f9652e3b0a52;CH;2025-06-28;2025-08-17;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;VS;DE deutschsprachig,FR germanophone,EN German-speaking 29ecea63-e530-4c6a-bc36-0b7138391e28;CH;2025-06-19;2025-08-20;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;VS;FR francophon,DE französischsprachig,EN French-speaking +982d216d-4600-4530-a5ac-f9652e3b0a52;CH;2025-06-28;2025-08-17;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;VS;DE deutschsprachig,FR germanophone,EN German-speaking 51efd9ec-50fb-4911-b215-9597f1ccc04e;CH;2025-10-11;2025-10-26;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;VS;DE deutschsprachig,FR germanophone,EN German-speaking 67671b34-5ffa-4b1e-ac7c-b53ec10a23c2;CH;2025-10-16;2025-10-26;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;VS;FR francophon,DE französischsprachig,EN French-speaking 51a0d5f5-887b-473c-ae71-50ec9810e17f;CH;2025-12-20;2026-01-04;School;Regional;DE Winter,FR Noël,IT Inverno,EN Christmas;VS;DE deutschsprachig,FR germanophone,EN German-speaking 6f39fe8c-3a5a-4bce-9139-ebc936c97e11;CH;2025-12-20;2026-01-04;School;Regional;DE Winter,FR Noël,IT Inverno,EN Christmas;VS;FR francophon,DE französischsprachig,EN French-speaking +10acd396-1754-408c-819d-70fa8927bd7f;CH;2026-02-14;2026-02-22;School;Regional;DE Sport,FR Sport,IT Sport,EN Sport;VS;FR francophon,DE französischsprachig,EN French-speaking d588c426-dd25-4b50-9eb2-7a31f8574688;CH;2026-02-21;2026-03-08;School;Regional;DE Sport,FR Sport,IT Sport,EN Sport;VS;DE deutschsprachig, ohne Tourismusgemeinden,FR germanophone,EN German-speaking 99411413-1720-4277-b384-05f8e98cf115;CH;2026-02-28;2026-03-08;School;Regional;DE Sport,FR Sport,IT Sport,EN Sport;VS;DE Tourismusgemeinden Oberwallis, FR Communes touristiques du Haut-Valais, EN Tourism communities of Upper Valais -10acd396-1754-408c-819d-70fa8927bd7f;CH;2026-02-14;2026-02-22;School;Regional;DE Sport,FR Sport,IT Sport,EN Sport;VS;FR francophon,DE französischsprachig,EN French-speaking -c644d239-51f5-48ea-9e1d-cea3c854f824;CH;2026-05-09;2026-05-17;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;VS;DE deutschsprachig, ohne Tourismusgemeinden,FR germanophone,EN German-speaking -2cceac57-0ce5-4601-bf08-72ecfca15560;CH;2026-05-02;2026-05-17;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;VS;DE Tourismusgemeinden Oberwallis, FR Communes touristiques du Haut-Valais, EN Tourism communities of Upper Valais ecac62ba-abc6-404a-9b1b-4146c882c027;CH;2026-04-03;2026-04-12;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;VS;FR francophon,DE französischsprachig,EN French-speaking +2cceac57-0ce5-4601-bf08-72ecfca15560;CH;2026-05-02;2026-05-17;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;VS;DE Tourismusgemeinden Oberwallis, FR Communes touristiques du Haut-Valais, EN Tourism communities of Upper Valais +c644d239-51f5-48ea-9e1d-cea3c854f824;CH;2026-05-09;2026-05-17;School;Regional;DE Frühling,FR Printemps,IT Primavera,EN Spring;VS;DE deutschsprachig, ohne Tourismusgemeinden,FR germanophone,EN German-speaking +b79386a5-6c2b-4589-8af3-ed1425629a6d;CH;2026-06-27;2026-08-19;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;VS;FR francophon,DE französischsprachig,EN French-speaking 94e0ec78-3a39-4d86-811f-c8293ef4e313;CH;2026-07-01;2026-08-16;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;VS;DE deutschsprachig, ohne Tourismusgemeinden,FR germanophone,EN German-speaking 38e2e44d-c5cc-42aa-aff0-a21af93f27fd;CH;2026-07-01;2026-08-16;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;VS;DE Tourismusgemeinden Oberwallis, FR Communes touristiques du Haut-Valais, EN Tourism communities of Upper Valais -b79386a5-6c2b-4589-8af3-ed1425629a6d;CH;2026-06-27;2026-08-19;School;Regional;DE Sommer,FR Été,IT Estate,EN Summer;VS;FR francophon,DE französischsprachig,EN French-speaking 349193b0-f8a1-401a-8361-2b3bccc16959;CH;2026-10-10;2026-10-25;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;VS;DE deutschsprachig, ohne Tourismusgemeinden,FR germanophone,EN German-speaking d881bd2d-ab0c-48ab-a365-62deca82db20;CH;2026-10-10;2026-10-25;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;VS;DE Tourismusgemeinden Oberwallis, FR Communes touristiques du Haut-Valais, EN Tourism communities of Upper Valais fc2d8db0-18b1-4499-a214-835c0c15409e;CH;2026-10-15;2026-10-25;School;Regional;DE Herbst,FR Automne,IT Autunno,EN Autumn;VS;FR francophon,DE französischsprachig,EN French-speaking diff --git a/src/hr/holidays/holidays.school.csv b/src/hr/holidays/holidays.school.csv index 5059e45..1eef3b0 100644 --- a/src/hr/holidays/holidays.school.csv +++ b/src/hr/holidays/holidays.school.csv @@ -3,8 +3,8 @@ a38c2a6f-04b3-43cf-a70e-6b8baaab3c94;HR;2019-12-23;2020-01-03;School;National;HR Zimski odmor,DE Winterferien,EN Winter holidays;HR Opcija II za raspodjelu praznika,EN Option II for the distribution of holidays,DE Option II für die Verteilung der Feiertage 556a8554-b857-4c83-b933-d276c40482df;HR;2019-12-23;2020-01-03;School;National;HR Zimski odmor (prvi dio),DE Winterferien (1. Teil),EN Winter holidays (first part);HR Opcija IV za raspodjelu praznika,EN Option IV for the distribution of holidays,DE Option IV für die Verteilung der Feiertage 6b2ee43d-d99d-486e-8c5e-0288a6a3ea10;HR;2020-02-24;2020-02-28;School;National;HR Zimski odmor (drugi dio),DE Winterferien (2. Teil),EN Winter holidays (second part);HR Opcija IV za raspodjelu praznika,EN Option IV for the distribution of holidays,DE Option IV für die Verteilung der Feiertage -5ff84527-54e2-4336-b81b-7823594b9b83;HR;2020-04-10;2020-04-17;School;National;HR Proljetni odmor,DE Frühlingsferien,EN Spring holidays;HR Opcija I i II za raspodjelu praznika,EN Option I and II for the distribution of holidays,DE Option I und II für die Verteilung der Feiertage 51563360-633d-4584-b763-bf32a5fee851;HR;2020-04-09;2020-04-10;School;National;HR Proljetni odmor,DE Frühlingsferien,EN Spring holidays;HR Opcija III i IV za raspodjelu praznika,EN Option III and IV for the distribution of holidays,DE Option III und IV für die Verteilung der Feiertage +5ff84527-54e2-4336-b81b-7823594b9b83;HR;2020-04-10;2020-04-17;School;National;HR Proljetni odmor,DE Frühlingsferien,EN Spring holidays;HR Opcija I i II za raspodjelu praznika,EN Option I and II for the distribution of holidays,DE Option I und II für die Verteilung der Feiertage 54b657cb-4dc0-492d-9abc-22eefc2edf6d;HR;2020-06-18;2020-09-06;School;National;HR Ljetni odmor,DE Sommerferien,EN Summer holidays; 07f2ada8-96e8-419f-8719-3cd3ba5c8a9e;HR;2020-11-02;2020-11-03;School;National;HR Jesenski odmor,DE Herbstferien,EN Autumn holidays; 7d6dad7e-5d04-46e5-a814-b050c9ef2da7;HR;2020-12-24;2021-01-08;School;National;HR Zimski odmor (prvi dio),DE Winterferien (Teil 1),EN Winter holidays (part 2); diff --git a/src/li/holidays/holidays.school.csv b/src/li/holidays/holidays.school.csv index d8feb65..8263a79 100644 --- a/src/li/holidays/holidays.school.csv +++ b/src/li/holidays/holidays.school.csv @@ -33,8 +33,8 @@ d593e2b2-3c1b-4d1b-9982-e34b37d8da56;LI;2023-07-08;2023-08-20;School;National;;D 7cf5b5ae-14ee-4814-a3ae-a0f88df17e57;LI;2023-10-07;2023-10-22;School;National;;DE Herbstferien,EN Autumn holidays; 7d51a6bb-516a-4aef-9c08-15de8a6dff66;LI;2023-12-23;2024-01-07;School;National;;DE Winterferien,EN Christmas holidays; 1f1b81b9-be10-4044-aff3-adad6719634d;LI;2024-02-10;2024-02-18;School;National;;DE Sportferien,EN Sport holidays; -22f808e2-1605-44f4-969e-95a49eedc9a8;LI;2024-03-29;2024-04-14;School;National;;DE Frühlingsferien,EN Spring holidays; f43ab627-4e7c-42af-9d31-1bbdc0eaea33;LI;2024-03-28;;School;National;HalfDay;DE Schulfrei,EN No lessons;DE Ab Mittag,EN From noon +22f808e2-1605-44f4-969e-95a49eedc9a8;LI;2024-03-29;2024-04-14;School;National;;DE Frühlingsferien,EN Spring holidays; 3dfacfa6-fa3a-4450-b8fb-03896a1e63bc;LI;2024-05-10;;School;National;;DE Schulfrei,EN No lessons; a454897e-1a49-40d9-82d1-c29234d4bdb1;LI;2024-05-31;;School;National;;DE Schulfrei,EN No lessons; 16ee6ffb-6cd0-462a-8913-8654baf7a84f;LI;2024-07-06;2024-08-18;School;National;;DE Sommerferien,EN Summer holidays; diff --git a/src/nl/holidays/holidays.school.csv b/src/nl/holidays/holidays.school.csv index 7596cf1..810dc8b 100644 --- a/src/nl/holidays/holidays.school.csv +++ b/src/nl/holidays/holidays.school.csv @@ -27,8 +27,8 @@ f4dac7bd-6c7d-4493-a23d-c442f61b1e4c;NL;2022-07-09;2022-08-21;School;Regional;NL c7e751f0-cc53-4c9d-ba52-14ff8dc407b0;NL;2022-10-15;2022-10-23;School;Regional;NL Herfstvakantie,DE Herbstferien,EN Autumn Holidays;NO d52d91c1-7f4e-4912-9e09-c621b505c87c;NL;2022-10-22;2022-10-30;School;Regional;NL Herfstvakantie,DE Herbstferien,EN Autumn Holidays;MI,ZU 8a9a7f0e-4153-417f-a829-06d7b401fa0c;NL;2022-12-24;2023-01-08;School;Regional;NL Kerstvakantie,DE Weihnachtsferien,EN Christmas Holidays;NO,MI,ZU -a577e713-3fd0-4834-9e03-637ee15accde;NL;2023-02-25;2023-03-05;School;Regional;NL Voorjaarsvakantie,DE Frühjahrsferien,EN Spring Holidays;NO,MI 43997580-01f4-4881-ab2d-9e25efaea6ea;NL;2023-02-18;2023-02-26;School;Regional;NL Voorjaarsvakantie,DE Frühjahrsferien,EN Spring Holidays;ZU +a577e713-3fd0-4834-9e03-637ee15accde;NL;2023-02-25;2023-03-05;School;Regional;NL Voorjaarsvakantie,DE Frühjahrsferien,EN Spring Holidays;NO,MI 4860ddf8-6037-46d6-8683-9efb1af4205b;NL;2023-04-29;2023-05-07;School;Regional;NL Meivakantie,DE Maiferien,EN May Holidays;NO,MI,ZU a9d18bf0-296b-4183-b6ae-7b0a6a1cfbf3;NL;2023-07-08;2023-08-20;School;Regional;NL Zomervakantie,DE Sommerferien,EN Summer Holidays;MI 74411783-8fc2-4a24-9ffa-05978108e556;NL;2023-07-15;2023-08-27;School;Regional;NL Zomervakantie,DE Sommerferien,EN Summer Holidays;ZU diff --git a/src/pt/holidays/holidays.national.csv b/src/pt/holidays/holidays.national.csv index b5e41b4..e84ae6d 100644 --- a/src/pt/holidays/holidays.national.csv +++ b/src/pt/holidays/holidays.national.csv @@ -75,8 +75,8 @@ ac3c22a4-41f6-4a53-a580-7d811e5be3eb;PT;2024-08-15;;Public;National;PT Assunçã 035df30c-4f45-4e47-9205-75e2b5dcf802;PT;2025-04-20;;Public;National;PT Domingo de Páscoa,EN Easter Sunday,DE Ostersonntag 40b8df7c-98b5-4333-8449-1ef5a81a586b;PT;2025-04-25;;Public;National;PT Dia da Liberdade,EN Liberty Day,DE Tag der Freiheit 37b51c8a-de34-4d38-898c-2e9504474fc8;PT;2025-05-01;;Public;National;PT Dia do Trabalhador,EN Labor Day,DE Tag der Arbeit -4008d91f-4308-41c8-bf50-927d709ba511;PT;2025-06-19;;Public;National;PT Corpo de Deus,EN Corpus Christi,DE Fronleichnam 8b912098-6f90-48e0-9971-ee0039744575;PT;2025-06-10;;Public;National;PT Dia de Portugal / de Camões e das Comunidades Portuguesas,EN Portugal Day,DE Portugiesischer Nationalfeiertag +4008d91f-4308-41c8-bf50-927d709ba511;PT;2025-06-19;;Public;National;PT Corpo de Deus,EN Corpus Christi,DE Fronleichnam 1b06541b-f2c3-46ea-a897-046652f0ee82;PT;2025-08-15;;Public;National;PT Assunção de Nossa Senhora,EN Assumption Day,DE Mariä Himmelfahrt 7f92fd24-535d-404d-a8b7-a363f632eb1c;PT;2025-10-05;;Public;National;PT Implantação da República,EN Republic Day,DE Tag der Republik 2442451c-3186-48b6-ba4e-fc52d8282fa9;PT;2025-11-01;;Public;National;PT Todos-os-Santos,EN All Saints' Day,DE Allerheiligen From 70795f108d66cd581a6283b26be82738ea123f20 Mon Sep 17 00:00:00 2001 From: Kristjan ESPERANTO <35647502+KristjanESPERANTO@users.noreply.github.com> Date: Thu, 15 Jan 2026 23:32:22 +0100 Subject: [PATCH 3/7] fix(mc): correct year for Grand Prix historique holiday entry --- src/mc/holidays/holidays.school.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mc/holidays/holidays.school.csv b/src/mc/holidays/holidays.school.csv index c911f77..d1ee847 100644 --- a/src/mc/holidays/holidays.school.csv +++ b/src/mc/holidays/holidays.school.csv @@ -2,7 +2,7 @@ 29828389-14f2-4a04-abc9-7fa7cf304d9e;MC;2019-12-21;2020-01-05;School;National;FR Vacances de Noël,DE Weihnachtsferien,EN Christmas holidays 5001171a-2491-44df-a9db-716a86eb91b0;MC;2020-02-15;2020-03-01;School;National;FR Vacances d’hiver,DE Winterferien,EN Winter half-term-holidays 74a0412c-ffd1-41e8-bb4e-859a2d752c65;MC;2020-04-11;2020-04-26;School;National;FR Vacances de printemps,DE Frühjahrsferien,EN Spring half-term-holidays -ec1a2931-ad1f-411e-95c4-09d60fb57502;MC;2022-05-08;;School;National;FR Grand Prix historique,DE Historischer Grand Prix,EN Historic Grand Prix +ec1a2931-ad1f-411e-95c4-09d60fb57502;MC;2020-05-08;;School;National;FR Grand Prix historique,DE Historischer Grand Prix,EN Historic Grand Prix 52bd9783-fc39-45df-b383-c68f2857bd0c;MC;2020-05-21;2020-05-24;School;National;FR Grand Prix de Formule 1 et Pentecôte,DE Grand Prix und Pfingstmontag,EN Grand Prix and Whit Monday d409a499-5e6d-4dc0-8221-2931b906eec8;MC;2020-06-27;2020-09-06;School;National;FR Vacances d’été,DE Sommerferien,EN Summer holidays c77c4bf9-3231-4208-a47b-38be432f673c;MC;2020-10-22;2020-11-02;School;National;FR Vacances de la Toussaint,DE Ferien zu Allerheiligen,EN All Saint's Day holiday From 0869909d5684f0baf2a2b98ed70a0bb548230e7f Mon Sep 17 00:00:00 2001 From: Kristjan ESPERANTO <35647502+KristjanESPERANTO@users.noreply.github.com> Date: Tue, 13 Jan 2026 22:08:37 +0100 Subject: [PATCH 4/7] chore: remove empty entries from holidays data --- src/ru/holidays/holidays.public.csv | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/ru/holidays/holidays.public.csv b/src/ru/holidays/holidays.public.csv index cd5d713..dc592fb 100644 --- a/src/ru/holidays/holidays.public.csv +++ b/src/ru/holidays/holidays.public.csv @@ -130,9 +130,3 @@ f6779c4d-3ece-4b8c-8d96-6440688c28d3;RU;2030-02-23;;Public;National;RU День d1edc896-ee82-49b9-b876-8009e4667a9c;RU;2030-05-09;;Public;National;RU День Победы,DE Tag des Sieges,EN Victory Day; 44484299-3edf-40a6-8d60-62e8ee6b87b1;RU;2030-06-12;;Public;National;RU День России,DE Russlandtag,EN Russia Day; 120b5b0e-8b5a-41de-bd0e-bff8196bf1b7;RU;2030-11-04;;Public;National;RU День народного единства,DE Tag der nationalen Einheit,EN National Unity Day; -;;;;;;; -;;;;;;; -;;;;;;; -;;;;;;; -;;;;;;; -;;;;;;; From 3469fa662e26d64a22415b94b81fe6f986349f4f Mon Sep 17 00:00:00 2001 From: Kristjan ESPERANTO <35647502+KristjanESPERANTO@users.noreply.github.com> Date: Tue, 13 Jan 2026 22:08:56 +0100 Subject: [PATCH 5/7] fix(si): update Christmas holiday year from 2020 to 2021 --- src/si/holidays/holidays.public.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/si/holidays/holidays.public.csv b/src/si/holidays/holidays.public.csv index 68b3061..77348fc 100644 --- a/src/si/holidays/holidays.public.csv +++ b/src/si/holidays/holidays.public.csv @@ -25,7 +25,7 @@ fa6d76f7-32dc-4c81-b7ed-00653c8e2c91;SI;2021-06-25;;Public;National;SL dan drža 142ccaed-dc3b-4777-94d6-b6f371f29ae1;SI;2021-08-15;;Public;National;SL Marijino vnebovzetje,DE Mariä Himmelfahrt,EN Assumption Day 4f508f22-86fe-422c-adf7-73c5acdc6365;SI;2021-10-31;;Public;National;SL dan reformacije,DE Reformationstag,EN Reformation Day 8ed46905-fc09-4373-b725-b187832bdaab;SI;2021-11-01;;Public;National;SL dan spomina na mrtve,DE Tag der Toten,EN Day of Remembrance for the Dead -6f9c8d2c-8951-493d-9c36-bc58d504b86a;SI;2020-12-25;;Public;National;SL božič,DE Weihnachten,EN Christmas Day +6f9c8d2c-8951-493d-9c36-bc58d504b86a;SI;2021-12-25;;Public;National;SL božič,DE Weihnachten,EN Christmas Day b094d424-9c7c-4d3e-9104-2f8c8dec0284;SI;2021-12-26;;Public;National;SL dan samostojnosti in enotnosti,DE Tag der Unabhängigkeit und Einheit,EN Independence and Unity Day 2a02e7cb-18ab-4836-b206-52be1f2c6933;SI;2022-01-01;2022-01-02;Public;National;SL novo leto,DE Neujahrsferien,EN New Year Holiday ba091cba-799a-4dfc-bf79-aca13c29fdb8;SI;2022-02-08;;Public;National;SL Prešernov dan,DE Prešeren-Tag,EN Prešeren Day From e5b42ab52d30d2a5a5cf87e97149622e483af15b Mon Sep 17 00:00:00 2001 From: Kristjan ESPERANTO <35647502+KristjanESPERANTO@users.noreply.github.com> Date: Tue, 13 Jan 2026 22:20:32 +0100 Subject: [PATCH 6/7] chore: trigger data check also on pull requests --- .github/workflows/check-data.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check-data.yaml b/.github/workflows/check-data.yaml index 60bf411..e5f24e9 100644 --- a/.github/workflows/check-data.yaml +++ b/.github/workflows/check-data.yaml @@ -1,6 +1,6 @@ name: Check Data -on: [push] +on: [push, pull_request] jobs: build: From e3938f1f5c00c570472276fcf1d2b3af351b56f6 Mon Sep 17 00:00:00 2001 From: Kristjan ESPERANTO <35647502+KristjanESPERANTO@users.noreply.github.com> Date: Tue, 13 Jan 2026 22:21:36 +0100 Subject: [PATCH 7/7] chore: update GitHub actions to use checkout and setup-python v6 --- .github/workflows/check-data.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check-data.yaml b/.github/workflows/check-data.yaml index e5f24e9..aa17498 100644 --- a/.github/workflows/check-data.yaml +++ b/.github/workflows/check-data.yaml @@ -9,9 +9,9 @@ jobs: matrix: python-version: ["3.10"] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v6 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v3 + uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} - name: Install dependencies