+
Skip to content

Conversation

PPsyrius
Copy link
Collaborator

@PPsyrius PPsyrius commented Jul 24, 2025

Proposed change

  • Adds "Augsburg Peace Festival" for Augsburg subdivision (along the line of pre-existing city-level implementations as done for Italy)
  • Update Germany test cases to the new library-wide standard as of July 2025 (sort by date, remove unneeded checks, add missing test cases, etc.)

Resolves #2747 .

Type of change

  • New country/market holidays support (thank you!)
  • Supported country/market holidays update (calendar discrepancy fix, localization)
  • Existing code/documentation/test/process quality improvement (best practice, cleanup, refactoring, optimization)
  • Dependency update (version deprecation/pin/upgrade)
  • Bugfix (non-breaking change which fixes an issue)
  • Breaking change (a code change causing existing functionality to break)
  • New feature (new holidays functionality in general)

Checklist

Copy link
Contributor

coderabbitai bot commented Jul 24, 2025

Summary by CodeRabbit

  • New Features

    • Added support for Augsburg as a new city subdivision in Germany with its own local holiday, the Augsburg Peace Festival (Augsburger Hohes Friedensfest).
    • Augsburg’s public holidays are now available and localized in English, German, Thai, and Ukrainian.
  • Documentation

    • Updated documentation and holiday descriptions for Germany, including links to additional resources and clarification of subdivision categories.
  • Bug Fixes

    • Improved and standardized holiday tests for Germany, ensuring accurate coverage for all subdivisions and years.
  • Tests

    • Expanded and refactored test coverage for German public holidays, including new tests for Augsburg and other subdivision-specific holidays.
  • Chores

    • Updated localization files and metadata to the latest project version.

Walkthrough

This update adds Augsburg as a recognized city subdivision for Germany, updates documentation, and introduces the "Augsburger Hohes Friedensfest" as a public holiday for Augsburg. The change includes new and revised logic, test cases, localized translations, and a static holiday data snapshot for Augsburg from 1990 to 2050.

Changes

Files / Groups Change Summary
README.md Updated Germany subdivisions: changed "Lands" to "States", added "cities" with Augsburg.
holidays/countries/germany.py Added Augsburg as a subdivision; introduced logic and doc updates for Augsburg Peace Festival; added comments and references.
holidays/locale/*/LC_MESSAGES/DE.po Updated translation metadata; added "Augsburger Hohes Friedensfest" translation in German, English, Thai, and Ukrainian locales.
snapshots/countries/DE_AUGSBURG.json Added static holiday dataset for Augsburg (1990–2050), including the Augsburg Peace Festival.
tests/countries/test_germany.py Refactored and expanded tests; added/renamed test cases for Augsburg, new holidays, and improved subdivision/year coverage.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested reviewers

  • KJhellico

Note

⚡️ Unit Test Generation is now available in beta!

Learn more here, or try it out under "Finishing Touches" below.


📜 Recent review details

Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b1cfc51 and 1195acc.

📒 Files selected for processing (1)
  • README.md (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: KJhellico
PR: vacanza/holidays#2614
File: README.md:108-108
Timestamp: 2025-06-14T20:13:29.536Z
Learning: In the vacanza/holidays repository, the team prefers to manually update the country count in README.md when adding new countries, with tests in place to verify the count stays accurate. They are satisfied with this approach and do not want it automated.
Learnt from: KJhellico
PR: vacanza/holidays#2651
File: tests/countries/test_bonaire_sint_eustatius_and_saba.py:225-306
Timestamp: 2025-07-02T10:22:33.053Z
Learning: The `assertLocalizedHolidays` method in the vacanza/holidays project requires a complete list of all holidays from all subdivisions, not just subdivision-specific holidays. This is a framework requirement for proper localization testing.
Learnt from: PPsyrius
PR: vacanza/holidays#2537
File: tests/countries/test_finland.py:23-26
Timestamp: 2025-05-09T18:36:09.607Z
Learning: The holidays project prioritizes complete historical coverage in tests, verifying holidays from their first year of observance (e.g., 1853 for Finland) through future projections, rather than using shorter sliding windows.
Learnt from: PPsyrius
PR: vacanza/holidays#2642
File: holidays/countries/france.py:178-180
Timestamp: 2025-06-18T10:26:50.180Z
Learning: In the France holidays implementation, the _populate_subdiv_57_public_holidays() (Moselle) and _populate_subdiv_6ae_public_holidays() (Alsace) methods are functionally identical, both adding Good Friday (≥1893) and Saint Stephen's Day (≥1892) with the same legal references from August 16th, 1892. Therefore, for the deprecated "Alsace-Moselle" subdivision, calling either method produces the same result.
Learnt from: KJhellico
PR: vacanza/holidays#2398
File: tests/countries/test_guinea.py:237-239
Timestamp: 2025-04-02T18:38:35.164Z
Learning: In the vacanza/holidays project, the method assertLocalizedHolidays in country test files should be called with positional parameters rather than named parameters to maintain consistency with the rest of the codebase.
Learnt from: KJhellico
PR: vacanza/holidays#2623
File: README.md:0-0
Timestamp: 2025-07-10T11:00:13.195Z
Learning: The COUNTRIES dictionary in holidays/registry.py contains 211 entries as confirmed by KJhellico in PR #2623, not 214 as previously calculated.
Learnt from: PPsyrius
PR: vacanza/holidays#2750
File: tests/countries/test_germany.py:46-46
Timestamp: 2025-07-24T15:21:31.632Z
Learning: In the holidays project test files, the standard method name for testing the absence of holidays is `test_no_holidays`, not more descriptive names like `test_no_holidays_before_1990`. This is a consistent naming convention across country test files like France and Germany.
Learnt from: PPsyrius
PR: vacanza/holidays#2750
File: tests/countries/test_germany.py:46-46
Timestamp: 2025-07-24T15:21:31.632Z
Learning: In the holidays project test files, the standard method name for testing the absence of holidays is `test_no_holidays`, not more descriptive names like `test_no_holidays_before_1990`. This is a consistent naming convention across country test files like France and Germany.
Learnt from: KJhellico
PR: vacanza/holidays#2720
File: README.md:108-110
Timestamp: 2025-07-17T11:07:04.986Z
Learning: Always verify country counts in the holidays library by checking the current count in the COUNTRIES dictionary in holidays/registry.py directly, rather than relying on information from previous PRs, as the count changes frequently with new country additions.
Learnt from: KJhellico
PR: vacanza/holidays#2719
File: README.md:108-108
Timestamp: 2025-07-12T20:54:28.749Z
Learning: In PR #2719 adding Faroe Islands, KJhellico confirmed that the country count in README.md should be updated from 213 to 214, making 214 the accurate total after this addition.
Learnt from: PPsyrius
PR: vacanza/holidays#2642
File: holidays/countries/france.py:178-182
Timestamp: 2025-06-18T10:18:59.447Z
Learning: In the France holidays implementation, deprecated subdivision names like "Alsace-Moselle" and "Saint-Barthélémy" are handled through explicit conditionals in _populate_public_holidays() that map them to their corresponding new subdivision-specific holiday population methods, providing backward compatibility while users transition to the new ISO codes.
Learnt from: PPsyrius
PR: vacanza/holidays#2654
File: holidays/locale/de/LC_MESSAGES/CV.po:57-60
Timestamp: 2025-07-04T08:53:54.102Z
Learning: For Cape Verde German localization, holiday translations should follow Cape Verde-specific German terminology as found in sources like feelcaboverde.com, rather than standard German usage. The German translation choices are source-specific to Cape Verde context.
Learnt from: PPsyrius
PR: vacanza/holidays#2642
File: holidays/countries/french_southern_territories.py:41-44
Timestamp: 2025-06-18T10:07:58.780Z
Learning: Territorial holiday classes that inherit from parent countries (like HolidaysAX from Finland, HolidaysSJ from Norway, HolidaysTF from France) follow a standard pattern of silently overriding self.subdiv in their _populate_public_holidays() method without validation, as this ensures they always use the correct subdivision code for their territory regardless of user input.
Learnt from: PPsyrius
PR: vacanza/holidays#2654
File: holidays/locale/de/LC_MESSAGES/CV.po:37-40
Timestamp: 2025-07-04T08:54:03.203Z
Learning: In German localization for Cape Verde holidays, "Dia da Nacionalidade e dos Heróis Nacionais" is translated as "Tag der Nationalhelden" (not "Tag der Nationalität und der Nationalhelden") based on authoritative German language sources about Cape Verde holidays, specifically from feelcaboverde.com.
Learnt from: PPsyrius
PR: vacanza/holidays#2654
File: holidays/locale/de/LC_MESSAGES/CV.po:37-40
Timestamp: 2025-07-04T08:54:03.203Z
Learning: In German localization for Cape Verde holidays, "Dia da Nacionalidade e dos Heróis Nacionais" is translated as "Tag der Nationalhelden" (not "Tag der Nationalität und der Nationalhelden") based on authoritative German language sources about Cape Verde holidays, specifically from feelcaboverde.com.
Learnt from: PPsyrius
PR: vacanza/holidays#2642
File: holidays/countries/france.py:178-182
Timestamp: 2025-06-18T10:12:57.419Z
Learning: In the France holidays implementation, subdivisions like "GES" and "Metropole" that covered multiple departments with different holiday rules are completely deprecated rather than aliased, because aliasing them to a subset (like Alsace-Moselle) would provide incomplete or incorrect holiday data for the other covered regions. Complete deprecation is preferred over partial/incorrect data coverage.
⏰ Context from checks skipped due to timeout of 300000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Test build on macos-latest
  • GitHub Check: Test build on windows-latest
  • GitHub Check: Test build on ubuntu-latest
🔇 Additional comments (2)
README.md (2)

684-686: Germany row nicely reflects the new Augsburg city subdivision

The wording follows the Italy pattern (“cities: …”) and keeps the states list intact. Looks good to me.


108-110: Country-count matches registry
Confirmed 224 entries in COUNTRIES → README is accurate.

✨ Finishing Touches
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai generate unit tests to generate unit tests for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

codecov bot commented Jul 24, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (630f57a) to head (4212d46).

Additional details and impacted files
@@            Coverage Diff            @@
##               dev     #2750   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files          272       272           
  Lines        16240     16244    +4     
  Branches      2191      2192    +1     
=========================================
+ Hits         16240     16244    +4     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 305b3d6 and 2f779a6.

📒 Files selected for processing (8)
  • README.md (1 hunks)
  • holidays/countries/germany.py (5 hunks)
  • holidays/locale/de/LC_MESSAGES/DE.po (2 hunks)
  • holidays/locale/en_US/LC_MESSAGES/DE.po (2 hunks)
  • holidays/locale/th/LC_MESSAGES/DE.po (2 hunks)
  • holidays/locale/uk/LC_MESSAGES/DE.po (2 hunks)
  • snapshots/countries/DE_AUGSBURG.json (1 hunks)
  • tests/countries/test_germany.py (11 hunks)
🧰 Additional context used
🧠 Learnings (9)
📓 Common learnings
Learnt from: KJhellico
PR: vacanza/holidays#2614
File: README.md:108-108
Timestamp: 2025-06-14T20:13:29.536Z
Learning: In the vacanza/holidays repository, the team prefers to manually update the country count in README.md when adding new countries, with tests in place to verify the count stays accurate. They are satisfied with this approach and do not want it automated.
Learnt from: KJhellico
PR: vacanza/holidays#2651
File: tests/countries/test_bonaire_sint_eustatius_and_saba.py:225-306
Timestamp: 2025-07-02T10:22:33.053Z
Learning: The `assertLocalizedHolidays` method in the vacanza/holidays project requires a complete list of all holidays from all subdivisions, not just subdivision-specific holidays. This is a framework requirement for proper localization testing.
Learnt from: PPsyrius
PR: vacanza/holidays#2537
File: tests/countries/test_finland.py:23-26
Timestamp: 2025-05-09T18:36:09.607Z
Learning: The holidays project prioritizes complete historical coverage in tests, verifying holidays from their first year of observance (e.g., 1853 for Finland) through future projections, rather than using shorter sliding windows.
Learnt from: PPsyrius
PR: vacanza/holidays#2642
File: holidays/countries/france.py:178-180
Timestamp: 2025-06-18T10:26:50.180Z
Learning: In the France holidays implementation, the _populate_subdiv_57_public_holidays() (Moselle) and _populate_subdiv_6ae_public_holidays() (Alsace) methods are functionally identical, both adding Good Friday (≥1893) and Saint Stephen's Day (≥1892) with the same legal references from August 16th, 1892. Therefore, for the deprecated "Alsace-Moselle" subdivision, calling either method produces the same result.
Learnt from: KJhellico
PR: vacanza/holidays#2398
File: tests/countries/test_guinea.py:237-239
Timestamp: 2025-04-02T18:38:35.164Z
Learning: In the vacanza/holidays project, the method assertLocalizedHolidays in country test files should be called with positional parameters rather than named parameters to maintain consistency with the rest of the codebase.
Learnt from: KJhellico
PR: vacanza/holidays#2623
File: README.md:0-0
Timestamp: 2025-07-10T11:00:13.195Z
Learning: The COUNTRIES dictionary in holidays/registry.py contains 211 entries as confirmed by KJhellico in PR #2623, not 214 as previously calculated.
Learnt from: KJhellico
PR: vacanza/holidays#2720
File: README.md:108-110
Timestamp: 2025-07-17T11:07:04.986Z
Learning: Always verify country counts in the holidays library by checking the current count in the COUNTRIES dictionary in holidays/registry.py directly, rather than relying on information from previous PRs, as the count changes frequently with new country additions.
Learnt from: KJhellico
PR: vacanza/holidays#2719
File: README.md:108-108
Timestamp: 2025-07-12T20:54:28.749Z
Learning: In PR #2719 adding Faroe Islands, KJhellico confirmed that the country count in README.md should be updated from 213 to 214, making 214 the accurate total after this addition.
Learnt from: KJhellico
PR: vacanza/holidays#2593
File: holidays/countries/senegal.py:66-110
Timestamp: 2025-06-06T14:40:31.932Z
Learning: In the holidays library, within the _populate_public_holidays method, holidays should be arranged by calendar type (Islamic holidays first, then Gregorian holidays) without additional type grouping comments. The organization by calendar type is sufficient and follows the project's established conventions.
Learnt from: PPsyrius
PR: vacanza/holidays#2608
File: holidays/countries/saint_vincent_and_the_grenadines.py:30-30
Timestamp: 2025-06-07T07:37:55.516Z
Learning: For the vacanza/holidays repository, defer to the ruff configuration and pre-commit checks for coding standards rather than making manual suggestions about line length or style issues. If the automated checks pass, the code follows the project's standards.
Learnt from: PPsyrius
PR: vacanza/holidays#2642
File: holidays/countries/france.py:178-182
Timestamp: 2025-06-18T10:18:59.447Z
Learning: In the France holidays implementation, deprecated subdivision names like "Alsace-Moselle" and "Saint-Barthélémy" are handled through explicit conditionals in _populate_public_holidays() that map them to their corresponding new subdivision-specific holiday population methods, providing backward compatibility while users transition to the new ISO codes.
Learnt from: PPsyrius
PR: vacanza/holidays#2654
File: holidays/locale/de/LC_MESSAGES/CV.po:57-60
Timestamp: 2025-07-04T08:53:54.102Z
Learning: For Cape Verde German localization, holiday translations should follow Cape Verde-specific German terminology as found in sources like feelcaboverde.com, rather than standard German usage. The German translation choices are source-specific to Cape Verde context.
Learnt from: PPsyrius
PR: vacanza/holidays#2642
File: holidays/countries/french_southern_territories.py:41-44
Timestamp: 2025-06-18T10:07:58.780Z
Learning: Territorial holiday classes that inherit from parent countries (like HolidaysAX from Finland, HolidaysSJ from Norway, HolidaysTF from France) follow a standard pattern of silently overriding self.subdiv in their _populate_public_holidays() method without validation, as this ensures they always use the correct subdivision code for their territory regardless of user input.
Learnt from: PPsyrius
PR: vacanza/holidays#2654
File: holidays/locale/de/LC_MESSAGES/CV.po:37-40
Timestamp: 2025-07-04T08:54:03.203Z
Learning: In German localization for Cape Verde holidays, "Dia da Nacionalidade e dos Heróis Nacionais" is translated as "Tag der Nationalhelden" (not "Tag der Nationalität und der Nationalhelden") based on authoritative German language sources about Cape Verde holidays, specifically from feelcaboverde.com.
Learnt from: PPsyrius
PR: vacanza/holidays#2654
File: holidays/locale/de/LC_MESSAGES/CV.po:37-40
Timestamp: 2025-07-04T08:54:03.203Z
Learning: In German localization for Cape Verde holidays, "Dia da Nacionalidade e dos Heróis Nacionais" is translated as "Tag der Nationalhelden" (not "Tag der Nationalität und der Nationalhelden") based on authoritative German language sources about Cape Verde holidays, specifically from feelcaboverde.com.
Learnt from: PPsyrius
PR: vacanza/holidays#2642
File: holidays/countries/france.py:178-182
Timestamp: 2025-06-18T10:12:57.419Z
Learning: In the France holidays implementation, subdivisions like "GES" and "Metropole" that covered multiple departments with different holiday rules are completely deprecated rather than aliased, because aliasing them to a subset (like Alsace-Moselle) would provide incomplete or incorrect holiday data for the other covered regions. Complete deprecation is preferred over partial/incorrect data coverage.
README.md (1)

Learnt from: PPsyrius
PR: #2642
File: holidays/countries/france.py:178-182
Timestamp: 2025-06-18T10:18:59.447Z
Learning: In the France holidays implementation, deprecated subdivision names like "Alsace-Moselle" and "Saint-Barthélémy" are handled through explicit conditionals in _populate_public_holidays() that map them to their corresponding new subdivision-specific holiday population methods, providing backward compatibility while users transition to the new ISO codes.

holidays/locale/de/LC_MESSAGES/DE.po (15)

Learnt from: KJhellico
PR: #2676
File: holidays/locale/en_US/LC_MESSAGES/TN.po:17-28
Timestamp: 2025-06-26T15:34:35.476Z
Learning: In the holidays project, .po file header metadata updates (version numbers, revision dates, translator information) are legitimate changes when part of localization work and don't require make l10n regeneration. The make l10n command is primarily for formatting fixes and missing translator comments, not for intentional metadata updates.

Learnt from: KJhellico
PR: #2684
File: holidays/locale/it/LC_MESSAGES/SM.po:13-13
Timestamp: 2025-06-28T10:39:19.185Z
Learning: In the holidays project, .po file header comments use the format "# [Country] holidays." for default language files (without trailing hash) and "# [Country] holidays [locale] localization." for non-default language files (also without trailing hash).

Learnt from: KJhellico
PR: #2651
File: holidays/locale/nl/LC_MESSAGES/BQ.po:29-95
Timestamp: 2025-06-25T20:55:00.642Z
Learning: In the holidays library, Dutch locale files (.po) with X-Source-Language: nl should have empty msgstr entries when the target language is also Dutch. The library uses fallback=True with gettext, which returns the original msgid when msgstr is empty. This is the correct pattern for native language files and does not cause blank holiday names.

Learnt from: KJhellico
PR: #2259
File: holidays/locale/en_IN/LC_MESSAGES/IN.po:30-299
Timestamp: 2025-03-05T17:51:00.633Z
Learning: In the Holidays project, .po files for a country's default locale use empty msgstr fields as a standard convention.

Learnt from: KJhellico
PR: #2530
File: holidays/locale/ca/LC_MESSAGES/AD.po:31-40
Timestamp: 2025-05-06T15:25:44.333Z
Learning: In the Holidays project, msgid fields in localization files contain strings in the entity's default language (as defined by default_language attribute), not English source strings as in standard gettext implementations.

Learnt from: KJhellico
PR: #2388
File: holidays/locale/en_CI/LC_MESSAGES/CI.po:88-88
Timestamp: 2025-03-30T18:25:07.087Z
Learning: In the holidays library, localization files have a specific structure: message comments are in standard English (en_US) describing the holiday, while actual translations (msgstr) should use the locale-specific terminology (e.g., en_CI for Ivory Coast English). For example, "Night of Power" in standard English is translated as "Lailatou-Kadr" in Ivory Coast English.

Learnt from: PPsyrius
PR: #2676
File: holidays/locale/ar/LC_MESSAGES/EG.po:0-0
Timestamp: 2025-06-25T10:09:29.029Z
Learning: In the holidays library, msgstr fields can be left empty for source/default_language files when using Lingva, the localization tool used by the project.

Learnt from: KJhellico
PR: #2259
File: holidays/locale/en_IN/LC_MESSAGES/IN.po:285-299
Timestamp: 2025-03-08T11:28:48.652Z
Learning: In the holidays project, message IDs (msgids) in locale files use region-specific naming conventions (e.g., "Muharram", "Id-ul-Fitr" in en_IN locale for India), while translator comments use internationally recognized names from the project's default locale (en_US) such as "Ashura", "Eid al-Fitr". This difference is intentional for proper localization.

Learnt from: PPsyrius
PR: #2438
File: holidays/locale/ar_IQ/LC_MESSAGES/IQ.po:35-81
Timestamp: 2025-04-17T17:08:48.082Z
Learning: In holiday PO files, when the file represents the default language of an entity (e.g., ar_IQ for Iraq), no translations in msgstr are required as the msgid values are already in the target language.

Learnt from: PPsyrius
PR: #2537
File: holidays/locale/sv_FI/LC_MESSAGES/AX.po:17-27
Timestamp: 2025-05-10T04:34:02.406Z
Learning: The Plural-Forms header isn't used in .po file generation for the holidays project and doesn't need to be manually added to localization files.

Learnt from: PPsyrius
PR: #2537
File: holidays/countries/finland.py:249-253
Timestamp: 2025-05-10T04:02:13.815Z
Learning: Holiday name comments directly above tr() function calls in the holidays package should only contain the holiday name itself (e.g., "# Independence Day.") without any additional context, dates, or historical information.

Learnt from: ankushhKapoor
PR: #2601
File: holidays/locale/en_MN/LC_MESSAGES/MN.po:13-14
Timestamp: 2025-06-11T18:32:25.595Z
Learning: For non-default locale .po files, the header comment format is:
# <Country> holidays <locale> localization. (no trailing hash).

Learnt from: PPsyrius
PR: #2654
File: holidays/locale/de/LC_MESSAGES/CV.po:57-60
Timestamp: 2025-07-04T08:53:54.102Z
Learning: For Cape Verde German localization, holiday translations should follow Cape Verde-specific German terminology as found in sources like feelcaboverde.com, rather than standard German usage. The German translation choices are source-specific to Cape Verde context.

Learnt from: PPsyrius
PR: #2654
File: holidays/locale/de/LC_MESSAGES/CV.po:37-40
Timestamp: 2025-07-04T08:54:03.203Z
Learning: In German localization for Cape Verde holidays, "Dia da Nacionalidade e dos Heróis Nacionais" is translated as "Tag der Nationalhelden" (not "Tag der Nationalität und der Nationalhelden") based on authoritative German language sources about Cape Verde holidays, specifically from feelcaboverde.com.

Learnt from: PPsyrius
PR: #2654
File: holidays/locale/de/LC_MESSAGES/CV.po:37-40
Timestamp: 2025-07-04T08:54:03.203Z
Learning: In German localization for Cape Verde holidays, "Dia da Nacionalidade e dos Heróis Nacionais" is translated as "Tag der Nationalhelden" (not "Tag der Nationalität und der Nationalhelden") based on authoritative German language sources about Cape Verde holidays, specifically from feelcaboverde.com.

holidays/locale/th/LC_MESSAGES/DE.po (15)

Learnt from: KJhellico
PR: #2676
File: holidays/locale/en_US/LC_MESSAGES/TN.po:17-28
Timestamp: 2025-06-26T15:34:35.476Z
Learning: In the holidays project, .po file header metadata updates (version numbers, revision dates, translator information) are legitimate changes when part of localization work and don't require make l10n regeneration. The make l10n command is primarily for formatting fixes and missing translator comments, not for intentional metadata updates.

Learnt from: KJhellico
PR: #2684
File: holidays/locale/it/LC_MESSAGES/SM.po:13-13
Timestamp: 2025-06-28T10:39:19.185Z
Learning: In the holidays project, .po file header comments use the format "# [Country] holidays." for default language files (without trailing hash) and "# [Country] holidays [locale] localization." for non-default language files (also without trailing hash).

Learnt from: KJhellico
PR: #2530
File: holidays/locale/ca/LC_MESSAGES/AD.po:31-40
Timestamp: 2025-05-06T15:25:44.333Z
Learning: In the Holidays project, msgid fields in localization files contain strings in the entity's default language (as defined by default_language attribute), not English source strings as in standard gettext implementations.

Learnt from: KJhellico
PR: #2388
File: holidays/locale/en_CI/LC_MESSAGES/CI.po:88-88
Timestamp: 2025-03-30T18:25:07.087Z
Learning: In the holidays library, localization files have a specific structure: message comments are in standard English (en_US) describing the holiday, while actual translations (msgstr) should use the locale-specific terminology (e.g., en_CI for Ivory Coast English). For example, "Night of Power" in standard English is translated as "Lailatou-Kadr" in Ivory Coast English.

Learnt from: ankushhKapoor
PR: #2601
File: holidays/locale/en_MN/LC_MESSAGES/MN.po:13-14
Timestamp: 2025-06-11T18:32:25.595Z
Learning: For non-default locale .po files, the header comment format is:
# <Country> holidays <locale> localization. (no trailing hash).

Learnt from: KJhellico
PR: #2651
File: holidays/locale/nl/LC_MESSAGES/BQ.po:29-95
Timestamp: 2025-06-25T20:55:00.642Z
Learning: In the holidays library, Dutch locale files (.po) with X-Source-Language: nl should have empty msgstr entries when the target language is also Dutch. The library uses fallback=True with gettext, which returns the original msgid when msgstr is empty. This is the correct pattern for native language files and does not cause blank holiday names.

Learnt from: KJhellico
PR: #2687
File: holidays/locale/en_US/LC_MESSAGES/CF.po:13-28
Timestamp: 2025-06-29T09:37:35.283Z
Learning: In the holidays project, .po files follow a standard formatting convention where there is always a blank line after the metadata header section (after the "X-Source-Language" line). This blank line separates the header from the actual translation content and should not be removed.

Learnt from: PPsyrius
PR: #2537
File: holidays/locale/sv_FI/LC_MESSAGES/AX.po:17-27
Timestamp: 2025-05-10T04:34:02.406Z
Learning: The Plural-Forms header isn't used in .po file generation for the holidays project and doesn't need to be manually added to localization files.

Learnt from: PPsyrius
PR: #2678
File: holidays/locale/th/LC_MESSAGES/US.po:30-34
Timestamp: 2025-06-26T13:20:10.172Z
Learning: In the holidays library Thai localizations, the "observed" format consistently uses "ชดเชย%s" without spaces between the Thai word and placeholder across all .po files in the codebase.

Learnt from: KJhellico
PR: #2608
File: holidays/locale/en_VC/LC_MESSAGES/VC.po:1-14
Timestamp: 2025-06-10T12:17:58.880Z
Learning: In the holidays project, .po files should use the full multi-line header format including the project description, authors, website, and license information, rather than a single-line comment format.

Learnt from: PPsyrius
PR: #2537
File: holidays/countries/finland.py:249-253
Timestamp: 2025-05-10T04:02:13.815Z
Learning: Holiday name comments directly above tr() function calls in the holidays package should only contain the holiday name itself (e.g., "# Independence Day.") without any additional context, dates, or historical information.

Learnt from: KJhellico
PR: #2259
File: holidays/locale/en_IN/LC_MESSAGES/IN.po:30-299
Timestamp: 2025-03-05T17:51:00.633Z
Learning: In the Holidays project, .po files for a country's default locale use empty msgstr fields as a standard convention.

Learnt from: PPsyrius
PR: #2676
File: holidays/locale/ar/LC_MESSAGES/EG.po:0-0
Timestamp: 2025-06-25T10:09:29.029Z
Learning: In the holidays library, msgstr fields can be left empty for source/default_language files when using Lingva, the localization tool used by the project.

Learnt from: PPsyrius
PR: #2537
File: holidays/countries/finland.py:0-0
Timestamp: 2025-05-10T04:32:15.760Z
Learning: In the holidays package, detailed historical context and additional information should be added as comments at the method level or above conditional blocks, while comments directly above tr() function calls should only contain the holiday name itself (e.g., "# Independence Day.").

Learnt from: KJhellico
PR: #2259
File: holidays/locale/en_IN/LC_MESSAGES/IN.po:285-299
Timestamp: 2025-03-08T11:28:48.652Z
Learning: In the holidays project, message IDs (msgids) in locale files use region-specific naming conventions (e.g., "Muharram", "Id-ul-Fitr" in en_IN locale for India), while translator comments use internationally recognized names from the project's default locale (en_US) such as "Ashura", "Eid al-Fitr". This difference is intentional for proper localization.

holidays/locale/uk/LC_MESSAGES/DE.po (15)

Learnt from: KJhellico
PR: #2676
File: holidays/locale/en_US/LC_MESSAGES/TN.po:17-28
Timestamp: 2025-06-26T15:34:35.476Z
Learning: In the holidays project, .po file header metadata updates (version numbers, revision dates, translator information) are legitimate changes when part of localization work and don't require make l10n regeneration. The make l10n command is primarily for formatting fixes and missing translator comments, not for intentional metadata updates.

Learnt from: KJhellico
PR: #2684
File: holidays/locale/it/LC_MESSAGES/SM.po:13-13
Timestamp: 2025-06-28T10:39:19.185Z
Learning: In the holidays project, .po file header comments use the format "# [Country] holidays." for default language files (without trailing hash) and "# [Country] holidays [locale] localization." for non-default language files (also without trailing hash).

Learnt from: KJhellico
PR: #2530
File: holidays/locale/ca/LC_MESSAGES/AD.po:31-40
Timestamp: 2025-05-06T15:25:44.333Z
Learning: In the Holidays project, msgid fields in localization files contain strings in the entity's default language (as defined by default_language attribute), not English source strings as in standard gettext implementations.

Learnt from: KJhellico
PR: #2388
File: holidays/locale/en_CI/LC_MESSAGES/CI.po:88-88
Timestamp: 2025-03-30T18:25:07.087Z
Learning: In the holidays library, localization files have a specific structure: message comments are in standard English (en_US) describing the holiday, while actual translations (msgstr) should use the locale-specific terminology (e.g., en_CI for Ivory Coast English). For example, "Night of Power" in standard English is translated as "Lailatou-Kadr" in Ivory Coast English.

Learnt from: KJhellico
PR: #2651
File: holidays/locale/nl/LC_MESSAGES/BQ.po:29-95
Timestamp: 2025-06-25T20:55:00.642Z
Learning: In the holidays library, Dutch locale files (.po) with X-Source-Language: nl should have empty msgstr entries when the target language is also Dutch. The library uses fallback=True with gettext, which returns the original msgid when msgstr is empty. This is the correct pattern for native language files and does not cause blank holiday names.

Learnt from: PPsyrius
PR: #2537
File: holidays/locale/sv_FI/LC_MESSAGES/AX.po:17-27
Timestamp: 2025-05-10T04:34:02.406Z
Learning: The Plural-Forms header isn't used in .po file generation for the holidays project and doesn't need to be manually added to localization files.

Learnt from: KJhellico
PR: #2687
File: holidays/locale/en_US/LC_MESSAGES/CF.po:13-28
Timestamp: 2025-06-29T09:37:35.283Z
Learning: In the holidays project, .po files follow a standard formatting convention where there is always a blank line after the metadata header section (after the "X-Source-Language" line). This blank line separates the header from the actual translation content and should not be removed.

Learnt from: PPsyrius
PR: #2438
File: holidays/locale/ar_IQ/LC_MESSAGES/IQ.po:35-81
Timestamp: 2025-04-17T17:08:48.082Z
Learning: In holiday PO files, when the file represents the default language of an entity (e.g., ar_IQ for Iraq), no translations in msgstr are required as the msgid values are already in the target language.

Learnt from: ankushhKapoor
PR: #2601
File: holidays/locale/en_MN/LC_MESSAGES/MN.po:13-14
Timestamp: 2025-06-11T18:32:25.595Z
Learning: For non-default locale .po files, the header comment format is:
# <Country> holidays <locale> localization. (no trailing hash).

Learnt from: KJhellico
PR: #2608
File: holidays/locale/en_VC/LC_MESSAGES/VC.po:1-14
Timestamp: 2025-06-10T12:17:58.880Z
Learning: In the holidays project, .po files should use the full multi-line header format including the project description, authors, website, and license information, rather than a single-line comment format.

Learnt from: PPsyrius
PR: #2537
File: holidays/countries/finland.py:249-253
Timestamp: 2025-05-10T04:02:13.815Z
Learning: Holiday name comments directly above tr() function calls in the holidays package should only contain the holiday name itself (e.g., "# Independence Day.") without any additional context, dates, or historical information.

Learnt from: KJhellico
PR: #2259
File: holidays/locale/en_IN/LC_MESSAGES/IN.po:30-299
Timestamp: 2025-03-05T17:51:00.633Z
Learning: In the Holidays project, .po files for a country's default locale use empty msgstr fields as a standard convention.

Learnt from: PPsyrius
PR: #2676
File: holidays/locale/ar/LC_MESSAGES/EG.po:0-0
Timestamp: 2025-06-25T10:09:29.029Z
Learning: In the holidays library, msgstr fields can be left empty for source/default_language files when using Lingva, the localization tool used by the project.

Learnt from: PPsyrius
PR: #2537
File: holidays/countries/finland.py:0-0
Timestamp: 2025-05-10T04:32:15.760Z
Learning: In the holidays package, detailed historical context and additional information should be added as comments at the method level or above conditional blocks, while comments directly above tr() function calls should only contain the holiday name itself (e.g., "# Independence Day.").

Learnt from: KJhellico
PR: #2608
File: tests/countries/test_saint_vincent_and_the_grenadines.py:162-178
Timestamp: 2025-07-02T18:17:53.342Z
Learning: In the Saint Vincent and the Grenadines holidays implementation, New Year's Day is added without observed rules using _add_new_years_day() and should not include observed rule testing in its test method. Only holidays explicitly wrapped with _add_observed() have observed behavior.

holidays/countries/germany.py (31)

Learnt from: PPsyrius
PR: #2642
File: holidays/countries/france.py:178-180
Timestamp: 2025-06-18T10:26:50.180Z
Learning: In the France holidays implementation, the _populate_subdiv_57_public_holidays() (Moselle) and _populate_subdiv_6ae_public_holidays() (Alsace) methods are functionally identical, both adding Good Friday (≥1893) and Saint Stephen's Day (≥1892) with the same legal references from August 16th, 1892. Therefore, for the deprecated "Alsace-Moselle" subdivision, calling either method produces the same result.

Learnt from: PPsyrius
PR: #2642
File: holidays/countries/france.py:178-182
Timestamp: 2025-06-18T10:18:59.447Z
Learning: In the France holidays implementation, deprecated subdivision names like "Alsace-Moselle" and "Saint-Barthélémy" are handled through explicit conditionals in _populate_public_holidays() that map them to their corresponding new subdivision-specific holiday population methods, providing backward compatibility while users transition to the new ISO codes.

Learnt from: PPsyrius
PR: #2642
File: holidays/countries/france.py:184-206
Timestamp: 2025-06-18T10:58:28.058Z
Learning: In the holidays library France implementation, creating shared private methods between subdivision-specific holiday population methods (like _populate_subdiv_57_public_holidays and _populate_subdiv_6ae_public_holidays) is not supported by the current framework architecture, so duplicate code between functionally identical subdivision methods should be left as-is.

Learnt from: PPsyrius
PR: #2642
File: holidays/countries/french_southern_territories.py:41-44
Timestamp: 2025-06-18T10:07:58.780Z
Learning: Territorial holiday classes that inherit from parent countries (like HolidaysAX from Finland, HolidaysSJ from Norway, HolidaysTF from France) follow a standard pattern of silently overriding self.subdiv in their _populate_public_holidays() method without validation, as this ensures they always use the correct subdivision code for their territory regardless of user input.

Learnt from: PPsyrius
PR: #2638
File: holidays/countries/svalbard_and_jan_mayen.py:1-12
Timestamp: 2025-06-16T11:42:28.293Z
Learning: In the holidays library codebase, country implementation files in holidays/countries/ follow a standard convention of NOT having module-level docstrings. They start with the license header comment block, followed by imports, then class definitions. This is consistent across all country implementations like austria.py, belgium.py, canada.py, etc.

Learnt from: PPsyrius
PR: #2643
File: holidays/countries/mauritius.py:144-169
Timestamp: 2025-06-19T02:34:18.382Z
Learning: Custom holiday classes that extend _CustomHinduHolidays, _CustomIslamicHolidays, _CustomBuddhistHolidays, etc. in the holidays library do not use docstrings. They follow a pattern of using only inline comments above date dictionaries, as seen in Malaysia, Singapore, UAE, and other country implementations.

Learnt from: PPsyrius
PR: #2489
File: holidays/countries/sao_tome_and_principe.py:22-26
Timestamp: 2025-04-23T14:55:35.504Z
Learning: References in holidays classes should only be included if they're used for test case cross-checks or provide historical context about when holidays were added/removed, not just for the sake of having more references.

Learnt from: PPsyrius
PR: #2489
File: holidays/countries/sao_tome_and_principe.py:22-26
Timestamp: 2025-04-23T14:55:35.504Z
Learning: References in holidays classes should only be included if they're used for test case cross-checks or provide historical context about when holidays were added/removed, not just for the sake of having more references.

Learnt from: PPsyrius
PR: #2537
File: holidays/countries/finland.py:0-0
Timestamp: 2025-05-10T04:32:15.760Z
Learning: In the holidays package, detailed historical context and additional information should be added as comments at the method level or above conditional blocks, while comments directly above tr() function calls should only contain the holiday name itself (e.g., "# Independence Day.").

Learnt from: PPsyrius
PR: #2632
File: holidays/countries/solomon_islands.py:95-98
Timestamp: 2025-06-16T12:28:31.641Z
Learning: Library-wide holiday patterns and their optimizations should be handled at the base class level (like InternationalHolidays) rather than documenting workarounds in individual country modules. This maintains separation of concerns and avoids documentation duplication.

Learnt from: PPsyrius
PR: #2323
File: holidays/countries/macau.py:407-461
Timestamp: 2025-03-04T11:32:45.095Z
Learning: In the holidays library, the standard approach for organizing static holidays is to use separate dictionaries for different categories (government, mandatory, and public), which are utilized by syntactic sugar methods.

Learnt from: PPsyrius
PR: #2323
File: holidays/countries/macau.py:407-461
Timestamp: 2025-03-04T11:32:45.095Z
Learning: In the holidays library, the standard approach for organizing static holidays is to use separate dictionaries for different categories (like special_government_holidays, special_mandatory_holidays, and special_public_holidays), which are utilized by syntactic sugar methods to pick up the appropriate holidays based on the selected category.

Learnt from: PPsyrius
PR: #2323
File: holidays/countries/macau.py:407-461
Timestamp: 2025-03-04T11:32:45.095Z
Learning: In the holidays library, the standard approach for organizing static holidays is to use separate dictionaries for different categories (like special_government_holidays, special_mandatory_holidays, and special_public_holidays), which are utilized by syntactic sugar methods to pick up the appropriate holidays based on the selected category.

Learnt from: PPsyrius
PR: #2642
File: holidays/countries/france.py:178-182
Timestamp: 2025-06-18T10:12:57.419Z
Learning: In the France holidays implementation, subdivisions like "GES" and "Metropole" that covered multiple departments with different holiday rules are completely deprecated rather than aliased, because aliasing them to a subset (like Alsace-Moselle) would provide incomplete or incorrect holiday data for the other covered regions. Complete deprecation is preferred over partial/incorrect data coverage.

Learnt from: PPsyrius
PR: #2638
File: holidays/countries/svalbard_and_jan_mayen.py:26-32
Timestamp: 2025-06-16T11:46:35.303Z
Learning: In the holidays library, Norwegian subdivisions all yield the same holiday results regardless of the subdivision code used. This is similar to how Åland is implemented as a simple alias of Finland holidays with just a country code override.

Learnt from: PPsyrius
PR: #2638
File: holidays/countries/svalbard_and_jan_mayen.py:26-32
Timestamp: 2025-06-16T11:46:35.303Z
Learning: In the holidays library, Norwegian subdivisions all yield the same holiday results regardless of the subdivision code used. This is similar to how Åland is implemented as a simple alias of Finland holidays with just a country code override.

Learnt from: PPsyrius
PR: #2638
File: holidays/countries/svalbard_and_jan_mayen.py:26-32
Timestamp: 2025-06-16T11:46:35.303Z
Learning: In the holidays library, Norwegian subdivisions all yield the same holiday results regardless of the subdivision code used. This is similar to how Åland is implemented as a simple alias of Finland holidays with just a country code override.

Learnt from: PPsyrius
PR: #2638
File: holidays/countries/svalbard_and_jan_mayen.py:26-32
Timestamp: 2025-06-16T11:46:35.303Z
Learning: When creating country holiday aliases that inherit from parent countries (like Svalbard and Jan Mayen from Norway, or Åland from Finland), it's standard practice to hardcode a specific subdivision code in the _populate methods since the subdivision codes for the parent country yield identical results. The Åland Islands implementation serves as the reference pattern for this approach.

Learnt from: PPsyrius
PR: #2638
File: holidays/countries/svalbard_and_jan_mayen.py:26-32
Timestamp: 2025-06-16T11:46:35.303Z
Learning: When creating country holiday aliases that inherit from parent countries (like Svalbard and Jan Mayen from Norway, or Åland from Finland), it's common and acceptable to hardcode a specific subdivision code since the subdivision codes for the parent country yield identical results.

Learnt from: PPsyrius
PR: #2638
File: holidays/countries/svalbard_and_jan_mayen.py:26-32
Timestamp: 2025-06-16T11:46:35.303Z
Learning: When creating country holiday aliases that inherit from parent countries (like Svalbard and Jan Mayen from Norway, or Åland from Finland), it's common and acceptable to hardcode a specific subdivision code since the subdivision codes for the parent country yield identical results.

Learnt from: KJhellico
PR: #2386
File: holidays/countries/nepal.py:24-26
Timestamp: 2025-03-30T20:18:46.006Z
Learning: In the holidays library, country classes do not directly implement _populate(). Instead, they implement specialized methods like _populate_public_holidays(), and the base class HolidayBase handles the orchestration by calling these specialized methods.

Learnt from: PPsyrius
PR: #2609
File: holidays/countries/nauru.py:57-60
Timestamp: 2025-06-14T11:04:31.180Z
Learning: In the holidays library, the base HolidayBase._populate() method already includes a guard clause that prevents holiday population methods like _populate_public_holidays() from being called when the year is before start_year or after end_year. Therefore, individual country implementations do not need to add their own guard clauses for years before independence or other start dates.

Learnt from: PPsyrius
PR: #2706
File: holidays/countries/cayman_islands.py:80-97
Timestamp: 2025-07-10T03:36:16.461Z
Learning: In the holidays library, date dictionaries that map years to specific dates (like queens_birthday_dates, special holiday dates, etc.) are typically defined within the _populate_public_holidays method rather than as module-level constants. This is the established library-wide pattern and should be maintained for consistency.

Learnt from: PPsyrius
PR: #2706
File: holidays/countries/cayman_islands.py:80-97
Timestamp: 2025-07-10T03:36:16.461Z
Learning: In the holidays library, date dictionaries that map years to specific dates (like queens_birthday_dates, spring_bank_dates, thanksgiving_day_dates, etc.) are typically defined within the _populate_public_holidays method rather than as module-level constants. This is the established library-wide pattern seen across multiple country implementations including United Kingdom, United States, Sri Lanka, and others.

Learnt from: Wasif-Shahzad
PR: #2409
File: holidays/countries/qatar.py:27-46
Timestamp: 2025-04-03T16:58:27.175Z
Learning: In the holidays library, method names like _add_holiday_2nd_tue_of_feb() and _add_holiday_1st_sun_of_mar() use calendar constants like FEB, TUE, MAR, and SUN internally through parent class implementations even when these constants don't appear directly in the file.

Learnt from: KJhellico
PR: #2593
File: holidays/countries/senegal.py:66-110
Timestamp: 2025-06-06T14:40:31.932Z
Learning: In the holidays library, within the _populate_public_holidays method, holidays should be arranged by calendar type (Islamic holidays first, then Gregorian holidays) without additional type grouping comments. The organization by calendar type is sufficient and follows the project's established conventions.

Learnt from: KJhellico
PR: #2606
File: holidays/countries/faroe_islands.py:62-67
Timestamp: 2025-06-15T15:24:53.055Z
Learning: The HolidayBase class uses __getattr__ to dynamically implement _add_holiday_* methods through pattern matching, including patterns like _add_holiday_<n>_days_past_easter, _add_holiday_<month>_<day>, and various weekday-relative patterns. Methods like _add_holiday_26_days_past_easter are not explicitly defined but are dynamically generated when called.

Learnt from: PPsyrius
PR: #2354
File: holidays/countries/fiji.py:185-188
Timestamp: 2025-03-19T16:53:00.375Z
Learning: In the Fiji holidays implementation, the special_public_holidays_observed dictionary in FijiStaticHolidays is only used for exceptions to the normal observance rules, not for documenting all holidays. Only 2019's Constitution Day needed a special entry as it didn't follow the standard patterns.

Learnt from: PPsyrius
PR: #2537
File: holidays/countries/finland.py:249-253
Timestamp: 2025-05-10T04:02:13.815Z
Learning: Holiday name comments directly above tr() function calls in the holidays package should only contain the holiday name itself (e.g., "# Independence Day.") without any additional context, dates, or historical information.

Learnt from: PPsyrius
PR: #2354
File: holidays/countries/fiji.py:146-159
Timestamp: 2025-03-19T16:54:58.657Z
Learning: In the holidays library implementation, explicit holiday dates (like Diwali in Fiji) are only defined for historical years with official sources (2016-2025). Future dates beyond the explicitly defined range are automatically calculated by methods like _add_diwali, which provide approximations when official dates aren't yet available.

Learnt from: KJhellico
PR: #2635
File: holidays/countries/bhutan.py:13-16
Timestamp: 2025-06-16T14:08:09.492Z
Learning: In the holidays library, translation is performed in the _add_holiday methods, not at the string level. Holiday strings passed to _add_holiday_* methods are processed through the translation machinery within those methods, so using tr() or self.tr() wrappers is unnecessary.

holidays/locale/en_US/LC_MESSAGES/DE.po (18)

Learnt from: KJhellico
PR: #2676
File: holidays/locale/en_US/LC_MESSAGES/TN.po:17-28
Timestamp: 2025-06-26T15:34:35.476Z
Learning: In the holidays project, .po file header metadata updates (version numbers, revision dates, translator information) are legitimate changes when part of localization work and don't require make l10n regeneration. The make l10n command is primarily for formatting fixes and missing translator comments, not for intentional metadata updates.

Learnt from: KJhellico
PR: #2684
File: holidays/locale/it/LC_MESSAGES/SM.po:13-13
Timestamp: 2025-06-28T10:39:19.185Z
Learning: In the holidays project, .po file header comments use the format "# [Country] holidays." for default language files (without trailing hash) and "# [Country] holidays [locale] localization." for non-default language files (also without trailing hash).

Learnt from: PPsyrius
PR: #2537
File: holidays/locale/sv_FI/LC_MESSAGES/AX.po:17-27
Timestamp: 2025-05-10T04:34:02.406Z
Learning: The Plural-Forms header isn't used in .po file generation for the holidays project and doesn't need to be manually added to localization files.

Learnt from: KJhellico
PR: #2687
File: holidays/locale/en_US/LC_MESSAGES/CF.po:13-28
Timestamp: 2025-06-29T09:37:35.283Z
Learning: In the holidays project, .po files follow a standard formatting convention where there is always a blank line after the metadata header section (after the "X-Source-Language" line). This blank line separates the header from the actual translation content and should not be removed.

Learnt from: KJhellico
PR: #2608
File: holidays/locale/en_VC/LC_MESSAGES/VC.po:1-14
Timestamp: 2025-06-10T12:17:58.880Z
Learning: In the holidays project, .po files should use the full multi-line header format including the project description, authors, website, and license information, rather than a single-line comment format.

Learnt from: KJhellico
PR: #2530
File: holidays/locale/ca/LC_MESSAGES/AD.po:31-40
Timestamp: 2025-05-06T15:25:44.333Z
Learning: In the Holidays project, msgid fields in localization files contain strings in the entity's default language (as defined by default_language attribute), not English source strings as in standard gettext implementations.

Learnt from: ankushhKapoor
PR: #2601
File: holidays/locale/en_MN/LC_MESSAGES/MN.po:13-14
Timestamp: 2025-06-11T18:32:25.595Z
Learning: For non-default locale .po files, the header comment format is:
# <Country> holidays <locale> localization. (no trailing hash).

Learnt from: KJhellico
PR: #2388
File: holidays/locale/en_CI/LC_MESSAGES/CI.po:88-88
Timestamp: 2025-03-30T18:25:07.087Z
Learning: In the holidays library, localization files have a specific structure: message comments are in standard English (en_US) describing the holiday, while actual translations (msgstr) should use the locale-specific terminology (e.g., en_CI for Ivory Coast English). For example, "Night of Power" in standard English is translated as "Lailatou-Kadr" in Ivory Coast English.

Learnt from: KJhellico
PR: #2651
File: holidays/locale/nl/LC_MESSAGES/BQ.po:29-95
Timestamp: 2025-06-25T20:55:00.642Z
Learning: In the holidays library, Dutch locale files (.po) with X-Source-Language: nl should have empty msgstr entries when the target language is also Dutch. The library uses fallback=True with gettext, which returns the original msgid when msgstr is empty. This is the correct pattern for native language files and does not cause blank holiday names.

Learnt from: KJhellico
PR: #2259
File: holidays/locale/en_IN/LC_MESSAGES/IN.po:30-299
Timestamp: 2025-03-05T17:51:00.633Z
Learning: In the Holidays project, .po files for a country's default locale use empty msgstr fields as a standard convention.

Learnt from: PPsyrius
PR: #2537
File: holidays/countries/finland.py:249-253
Timestamp: 2025-05-10T04:02:13.815Z
Learning: Holiday name comments directly above tr() function calls in the holidays package should only contain the holiday name itself (e.g., "# Independence Day.") without any additional context, dates, or historical information.

Learnt from: PPsyrius
PR: #2676
File: holidays/locale/ar/LC_MESSAGES/EG.po:0-0
Timestamp: 2025-06-25T10:09:29.029Z
Learning: In the holidays library, msgstr fields can be left empty for source/default_language files when using Lingva, the localization tool used by the project.

Learnt from: PPsyrius
PR: #2537
File: holidays/countries/finland.py:0-0
Timestamp: 2025-05-10T04:32:15.760Z
Learning: In the holidays package, detailed historical context and additional information should be added as comments at the method level or above conditional blocks, while comments directly above tr() function calls should only contain the holiday name itself (e.g., "# Independence Day.").

Learnt from: KJhellico
PR: #2259
File: holidays/locale/en_IN/LC_MESSAGES/IN.po:285-299
Timestamp: 2025-03-08T11:28:48.652Z
Learning: In the holidays project, message IDs (msgids) in locale files use region-specific naming conventions (e.g., "Muharram", "Id-ul-Fitr" in en_IN locale for India), while translator comments use internationally recognized names from the project's default locale (en_US) such as "Ashura", "Eid al-Fitr". This difference is intentional for proper localization.

Learnt from: PPsyrius
PR: #2654
File: holidays/locale/de/LC_MESSAGES/CV.po:37-40
Timestamp: 2025-07-04T08:54:03.203Z
Learning: In German localization for Cape Verde holidays, "Dia da Nacionalidade e dos Heróis Nacionais" is translated as "Tag der Nationalhelden" (not "Tag der Nationalität und der Nationalhelden") based on authoritative German language sources about Cape Verde holidays, specifically from feelcaboverde.com.

Learnt from: PPsyrius
PR: #2654
File: holidays/locale/de/LC_MESSAGES/CV.po:37-40
Timestamp: 2025-07-04T08:54:03.203Z
Learning: In German localization for Cape Verde holidays, "Dia da Nacionalidade e dos Heróis Nacionais" is translated as "Tag der Nationalhelden" (not "Tag der Nationalität und der Nationalhelden") based on authoritative German language sources about Cape Verde holidays, specifically from feelcaboverde.com.

Learnt from: PPsyrius
PR: #2407
File: holidays/locale/en_TL/LC_MESSAGES/TL.po:42-44
Timestamp: 2025-04-03T05:58:00.033Z
Learning: The en_TL (English for Timor-Leste) localization for holidays intentionally uses "World" instead of "International" (e.g., "World Labour Day") to maintain accuracy with official Timor-Leste government sources, even though code comments and other localizations like en_US use "International".

Learnt from: PPsyrius
PR: #2407
File: holidays/locale/en_TL/LC_MESSAGES/TL.po:42-44
Timestamp: 2025-04-03T05:58:00.033Z
Learning: The en_TL (English for Timor-Leste) localization for holidays intentionally uses "World" instead of "International" (e.g., "World Labour Day") to maintain accuracy with official Timor-Leste government sources, even though code comments and other localizations like en_US use "International".

snapshots/countries/DE_AUGSBURG.json (18)

Learnt from: PPsyrius
PR: #2407
File: snapshots/countries/TL_COMMON.json:7-7
Timestamp: 2025-04-03T05:59:57.480Z
Learning: In the holidays project, snapshot files (like snapshots/countries/TL_COMMON.json) are auto-generated when running make snapshot and should not be manually edited. Semicolons (;) in holiday entries are used as separators when multiple holidays occur on the same date.

Learnt from: KJhellico
PR: #2654
File: snapshots/countries/CV_RS.json:471-478
Timestamp: 2025-06-24T17:26:17.728Z
Learning: Snapshot files in the holidays library (like those in snapshots/countries/) are generated automatically and should not be manually edited. Any issues with snapshot content should be addressed in the source code that generates them, not in the snapshot files themselves.

Learnt from: PPsyrius
PR: #2642
File: holidays/countries/france.py:178-180
Timestamp: 2025-06-18T10:26:50.180Z
Learning: In the France holidays implementation, the _populate_subdiv_57_public_holidays() (Moselle) and _populate_subdiv_6ae_public_holidays() (Alsace) methods are functionally identical, both adding Good Friday (≥1893) and Saint Stephen's Day (≥1892) with the same legal references from August 16th, 1892. Therefore, for the deprecated "Alsace-Moselle" subdivision, calling either method produces the same result.

Learnt from: PPsyrius
PR: #2349
File: snapshots/countries/TW_COMMON.json:9-12
Timestamp: 2025-03-13T07:50:10.598Z
Learning: JSON files in the snapshots/ directory (like snapshots/countries/TW_COMMON.json) are automatically generated by the make snapshot command and not meant to be manually edited.

Learnt from: PPsyrius
PR: #2537
File: tests/countries/test_finland.py:23-26
Timestamp: 2025-05-09T18:36:09.607Z
Learning: The holidays project prioritizes complete historical coverage in tests, verifying holidays from their first year of observance (e.g., 1853 for Finland) through future projections, rather than using shorter sliding windows.

Learnt from: PPsyrius
PR: #2642
File: holidays/countries/france.py:178-182
Timestamp: 2025-06-18T10:12:57.419Z
Learning: In the France holidays implementation, subdivisions like "GES" and "Metropole" that covered multiple departments with different holiday rules are completely deprecated rather than aliased, because aliasing them to a subset (like Alsace-Moselle) would provide incomplete or incorrect holiday data for the other covered regions. Complete deprecation is preferred over partial/incorrect data coverage.

Learnt from: PPsyrius
PR: #2642
File: holidays/countries/france.py:178-182
Timestamp: 2025-06-18T10:18:59.447Z
Learning: In the France holidays implementation, deprecated subdivision names like "Alsace-Moselle" and "Saint-Barthélémy" are handled through explicit conditionals in _populate_public_holidays() that map them to their corresponding new subdivision-specific holiday population methods, providing backward compatibility while users transition to the new ISO codes.

Learnt from: PPsyrius
PR: #2489
File: holidays/countries/sao_tome_and_principe.py:1-12
Timestamp: 2025-04-24T04:59:38.436Z
Learning: The holidays library uses a standard file header across country implementation files that includes copyright information, authors, website, and license details. New country implementation files should follow this same header format.

Learnt from: PPsyrius
PR: #2489
File: holidays/countries/sao_tome_and_principe.py:1-12
Timestamp: 2025-04-24T04:59:38.436Z
Learning: The holidays library uses a standard file header across country implementation files that includes copyright information, authors, website, and license details. New country implementation files should follow this same header format.

Learnt from: PPsyrius
PR: #2643
File: holidays/countries/mauritius.py:144-169
Timestamp: 2025-06-19T02:34:18.382Z
Learning: Custom holiday classes that extend _CustomHinduHolidays, _CustomIslamicHolidays, _CustomBuddhistHolidays, etc. in the holidays library do not use docstrings. They follow a pattern of using only inline comments above date dictionaries, as seen in Malaysia, Singapore, UAE, and other country implementations.

Learnt from: PPsyrius
PR: #2706
File: holidays/countries/cayman_islands.py:80-97
Timestamp: 2025-07-10T03:36:16.461Z
Learning: In the holidays library, date dictionaries that map years to specific dates (like queens_birthday_dates, spring_bank_dates, thanksgiving_day_dates, etc.) are typically defined within the _populate_public_holidays method rather than as module-level constants. This is the established library-wide pattern seen across multiple country implementations including United Kingdom, United States, Sri Lanka, and others.

Learnt from: PPsyrius
PR: #2354
File: holidays/countries/fiji.py:146-159
Timestamp: 2025-03-19T16:54:58.657Z
Learning: In the holidays library implementation, explicit holiday dates (like Diwali in Fiji) are only defined for historical years with official sources (2016-2025). Future dates beyond the explicitly defined range are automatically calculated by methods like _add_diwali, which provide approximations when official dates aren't yet available.

Learnt from: PPsyrius
PR: #2706
File: holidays/countries/cayman_islands.py:80-97
Timestamp: 2025-07-10T03:36:16.461Z
Learning: In the holidays library, date dictionaries that map years to specific dates (like queens_birthday_dates, special holiday dates, etc.) are typically defined within the _populate_public_holidays method rather than as module-level constants. This is the established library-wide pattern and should be maintained for consistency.

Learnt from: PPsyrius
PR: #2654
File: holidays/locale/de/LC_MESSAGES/CV.po:57-60
Timestamp: 2025-07-04T08:53:54.102Z
Learning: For Cape Verde German localization, holiday translations should follow Cape Verde-specific German terminology as found in sources like feelcaboverde.com, rather than standard German usage. The German translation choices are source-specific to Cape Verde context.

Learnt from: PPsyrius
PR: #2654
File: holidays/locale/de/LC_MESSAGES/CV.po:37-40
Timestamp: 2025-07-04T08:54:03.203Z
Learning: In German localization for Cape Verde holidays, "Dia da Nacionalidade e dos Heróis Nacionais" is translated as "Tag der Nationalhelden" (not "Tag der Nationalität und der Nationalhelden") based on authoritative German language sources about Cape Verde holidays, specifically from feelcaboverde.com.

Learnt from: PPsyrius
PR: #2654
File: holidays/locale/de/LC_MESSAGES/CV.po:37-40
Timestamp: 2025-07-04T08:54:03.203Z
Learning: In German localization for Cape Verde holidays, "Dia da Nacionalidade e dos Heróis Nacionais" is translated as "Tag der Nationalhelden" (not "Tag der Nationalität und der Nationalhelden") based on authoritative German language sources about Cape Verde holidays, specifically from feelcaboverde.com.

Learnt from: PPsyrius
PR: #2354
File: holidays/countries/fiji.py:185-188
Timestamp: 2025-03-19T16:53:00.375Z
Learning: In the Fiji holidays implementation, the special_public_holidays_observed dictionary in FijiStaticHolidays is only used for exceptions to the normal observance rules, not for documenting all holidays. Only 2019's Constitution Day needed a special entry as it didn't follow the standard patterns.

Learnt from: PPsyrius
PR: #2489
File: holidays/countries/sao_tome_and_principe.py:86-88
Timestamp: 2025-04-23T09:22:41.753Z
Learning: For holiday definitions in the holidays package, keep comments simple with just the holiday name (e.g., "# Independence Day.") rather than including dates or historical context, as the function names already encode the date information.

tests/countries/test_germany.py (30)

Learnt from: PPsyrius
PR: #2416
File: tests/countries/test_turkmenistan.py:52-64
Timestamp: 2025-04-05T04:47:27.213Z
Learning: For holiday tests in the vacanza/holidays project, structure tests by individual holidays rather than by years. Each test method should focus on a specific holiday and test it across multiple years (from start_year through 2050) using helper methods like assertHolidayName. For fixed holidays, use generators like (f"{year}-01-01" for year in range(1991, 2051)). For movable holidays, specify individual dates for specific years followed by a range check.

Learnt from: KJhellico
PR: #2530
File: tests/countries/test_andorra.py:23-28
Timestamp: 2025-05-06T21:07:11.577Z
Learning: In the holidays project, test methods for country holidays follow a standard form where year ranges are explicitly recreated in each test method rather than being stored as class variables, to maintain consistency across all country tests.

Learnt from: PPsyrius
PR: #2386
File: tests/countries/test_nepal.py:499-536
Timestamp: 2025-04-05T06:49:06.217Z
Learning: In the holidays project, test files follow a dual testing approach: individual methods test specific holidays across multiple years, while comprehensive year-specific tests (e.g., test_2025) verify all holidays for a specific year in a single assertion. Both approaches serve different testing purposes and complement each other.

Learnt from: PPsyrius
PR: #2416
File: tests/countries/test_turkmenistan.py:85-86
Timestamp: 2025-04-05T04:29:38.042Z
Learning: For testing holiday implementations in the vacanza/holidays repository, recommend using from tests.common import CommonCountryTests as the base class instead of directly using unittest.TestCase to maintain consistency with project conventions and leverage common test utilities.

Learnt from: PPsyrius
PR: #2489
File: holidays/countries/sao_tome_and_principe.py:22-26
Timestamp: 2025-04-23T14:55:35.504Z
Learning: References in holidays classes should only be included if they're used for test case cross-checks or provide historical context about when holidays were added/removed, not just for the sake of having more references.

Learnt from: PPsyrius
PR: #2489
File: holidays/countries/sao_tome_and_principe.py:22-26
Timestamp: 2025-04-23T14:55:35.504Z
Learning: References in holidays classes should only be included if they're used for test case cross-checks or provide historical context about when holidays were added/removed, not just for the sake of having more references.

Learnt from: PPsyrius
PR: #2642
File: holidays/countries/france.py:178-180
Timestamp: 2025-06-18T10:26:50.180Z
Learning: In the France holidays implementation, the _populate_subdiv_57_public_holidays() (Moselle) and _populate_subdiv_6ae_public_holidays() (Alsace) methods are functionally identical, both adding Good Friday (≥1893) and Saint Stephen's Day (≥1892) with the same legal references from August 16th, 1892. Therefore, for the deprecated "Alsace-Moselle" subdivision, calling either method produces the same result.

Learnt from: PPsyrius
PR: #2615
File: tests/countries/test_anguilla.py:1-12
Timestamp: 2025-06-16T15:48:48.680Z
Learning: Test files in the holidays repository follow a standardized structure without module or class docstrings. All country test files use the same pattern: license header, imports, and class definition (class Test{Country}(CommonCountryTests, TestCase):) without docstrings. This is an established codebase convention that should be maintained for consistency.

Learnt from: PPsyrius
PR: #2537
File: tests/countries/test_finland.py:23-26
Timestamp: 2025-05-09T18:36:09.607Z
Learning: The holidays project prioritizes complete historical coverage in tests, verifying holidays from their first year of observance (e.g., 1853 for Finland) through future projections, rather than using shorter sliding windows.

Learnt from: PPsyrius
PR: #2601
File: tests/countries/test_mongolia.py:128-156
Timestamp: 2025-06-15T11:52:39.572Z
Learning: In the vacanza/holidays project tests, when testing holidays that span multiple consecutive days across many years (like Mongolia's National Festival spanning July 11-13), prefer explicit for loops over complex nested generator expressions with unpacking. The explicit loops are more readable, easier to maintain, and better communicate the testing intent even though the Big O complexity is equivalent.

Learnt from: KJhellico
PR: #2532
File: tests/countries/test_cocos_islands.py:78-89
Timestamp: 2025-05-12T15:31:58.079Z
Learning: In the holidays project, tests for movable holidays (like Easter Monday) should always use static date sets only, not calculation functions.

Learnt from: KJhellico
PR: #2398
File: holidays/countries/guinea.py:106-110
Timestamp: 2025-04-04T10:52:41.546Z
Learning: In the Guinea holidays implementation, observed Eid al-Fitr cases are properly covered by the test_eid_al_fitr_day() method, which tests both the regular holiday dates and the observed dates when the holiday falls on a non-working day (for years >= 2023).

Learnt from: KJhellico
PR: #2623
File: tests/countries/test_christmas_island.py:136-146
Timestamp: 2025-07-09T21:16:35.145Z
Learning: In Christmas Island's holiday implementation, the test_christmas_day method cannot use assertNoNonObservedHoliday because in some years observed Christmas Day overlaps with Boxing Day when both holidays are moved due to weekend conflicts, causing the standard non-observed holiday check to fail inappropriately.

Learnt from: KJhellico
PR: #2398
File: holidays/countries/guinea.py:106-110
Timestamp: 2025-04-04T10:52:41.546Z
Learning: In the Guinea holidays implementation, observed Eid al-Fitr cases are covered by the test_eid_al_fitr_day() method, which tests both regular holiday dates and the observed dates when the holiday falls on a non-working day (for years >= 2023).

Learnt from: KJhellico
PR: #2701
File: holidays/countries/palestine.py:122-122
Timestamp: 2025-07-08T10:21:37.055Z
Learning: In Palestine, Easter follows the same naming pattern as Christmas - both the first and second days of Easter have identical names for the respective religious groups (Catholic or Orthodox). The implementation correctly uses _add_easter_sunday for nationwide holidays and _add_easter_monday for group-specific second days, but both share the same Arabic name "عيد الفصح المجيد".

Learnt from: PPsyrius
PR: #2642
File: holidays/countries/french_southern_territories.py:41-44
Timestamp: 2025-06-18T10:07:58.780Z
Learning: Territorial holiday classes that inherit from parent countries (like HolidaysAX from Finland, HolidaysSJ from Norway, HolidaysTF from France) follow a standard pattern of silently overriding self.subdiv in their _populate_public_holidays() method without validation, as this ensures they always use the correct subdivision code for their territory regardless of user input.

Learnt from: PPsyrius
PR: #2678
File: tests/countries/test_united_states_virgin_islands.py:59-84
Timestamp: 2025-06-25T10:36:39.909Z
Learning: In the holidays library, test methods typically do not have docstrings. Only special test methods that need specific explanation (like edge cases or unique behaviors) have docstrings. Regular test methods like test_l10n_default, test_l10n_th, test_government_holidays, etc. should not have docstrings added.

Learnt from: PPsyrius
PR: #2642
File: holidays/countries/france.py:178-182
Timestamp: 2025-06-18T10:18:59.447Z
Learning: In the France holidays implementation, deprecated subdivision names like "Alsace-Moselle" and "Saint-Barthélémy" are handled through explicit conditionals in _populate_public_holidays() that map them to their corresponding new subdivision-specific holiday population methods, providing backward compatibility while users transition to the new ISO codes.

Learnt from: KJhellico
PR: #2398
File: tests/countries/test_guinea.py:237-239
Timestamp: 2025-04-02T18:38:35.164Z
Learning: In the vacanza/holidays project, the method assertLocalizedHolidays in country test files should be called with positional parameters rather than named parameters to maintain consistency with the rest of the codebase.

Learnt from: KJhellico
PR: #2608
File: tests/countries/test_saint_vincent_and_the_grenadines.py:162-178
Timestamp: 2025-07-02T18:21:59.302Z
Learning: In the Saint Vincent and the Grenadines holiday tests, for holidays without observed rules that only require a single assertHolidayName call, pass the holiday name directly as a string literal rather than storing it in a variable first for cleaner, more concise code.

Learnt from: PPsyrius
PR: #2354
File: holidays/countries/fiji.py:146-159
Timestamp: 2025-03-19T16:54:58.657Z
Learning: In the holidays library implementation, explicit holiday dates (like Diwali in Fiji) are only defined for historical years with official sources (2016-2025). Future dates beyond the explicitly defined range are automatically calculated by methods like _add_diwali, which provide approximations when official dates aren't yet available.

Learnt from: PPsyrius
PR: #2654
File: holidays/locale/de/LC_MESSAGES/CV.po:37-40
Timestamp: 2025-07-04T08:54:03.203Z
Learning: In German localization for Cape Verde holidays, "Dia da Nacionalidade e dos Heróis Nacionais" is translated as "Tag der Nationalhelden" (not "Tag der Nationalität und der Nationalhelden") based on authoritative German language sources about Cape Verde holidays, specifically from feelcaboverde.com.

Learnt from: PPsyrius
PR: #2654
File: holidays/locale/de/LC_MESSAGES/CV.po:37-40
Timestamp: 2025-07-04T08:54:03.203Z
Learning: In German localization for Cape Verde holidays, "Dia da Nacionalidade e dos Heróis Nacionais" is translated as "Tag der Nationalhelden" (not "Tag der Nationalität und der Nationalhelden") based on authoritative German language sources about Cape Verde holidays, specifically from feelcaboverde.com.

Learnt from: PPsyrius
PR: #2706
File: holidays/countries/cayman_islands.py:80-97
Timestamp: 2025-07-10T03:36:16.461Z
Learning: In the holidays library, date dictionaries that map years to specific dates (like queens_birthday_dates, spring_bank_dates, thanksgiving_day_dates, etc.) are typically defined within the _populate_public_holidays method rather than as module-level constants. This is the established library-wide pattern seen across multiple country implementations including United Kingdom, United States, Sri Lanka, and others.

Learnt from: PPsyrius
PR: #2642
File: snapshots/countries/FR_6AE.json:690-706
Timestamp: 2025-06-18T10:33:29.809Z
Learning: During the French "journée de solidarité" experiment (2004-2007), Whit Monday was removed nationwide from 2005-2007, including in Alsace-Moselle subdivisions (FR_57, FR_6AE) that typically maintain additional regional holidays like Good Friday and Saint Stephen's Day.

Learnt from: KJhellico
PR: #2654
File: holidays/countries/cabo_verde.py:133-141
Timestamp: 2025-07-14T20:23:48.198Z
Learning: The holidays library provides helper methods _add_holiday_2nd_sun_of_may() and _add_holiday_3rd_sun_of_jun() for adding holidays on the 2nd Sunday of May and 3rd Sunday of June respectively. These methods are used across multiple country implementations including Latvia, Finland, Belarus, Malaysia, Madagascar, and Cape Verde.

Learnt from: PPsyrius
PR: #2489
File: holidays/countries/sao_tome_and_principe.py:86-88
Timestamp: 2025-04-23T09:22:41.753Z
Learning: For holiday definitions in the holidays package, keep comments simple with just the holiday name (e.g., "# Independence Day.") rather than including dates or historical context, as the function names already encode the date information.

Learnt from: Wasif-Shahzad
PR: #2409
File: holidays/countries/qatar.py:27-46
Timestamp: 2025-04-03T16:58:27.175Z
Learning: In the holidays library, method names like _add_holiday_2nd_tue_of_feb() and _add_holiday_1st_sun_of_mar() use calendar constants like FEB, TUE, MAR, and SUN internally through parent class implementations even when these constants don't appear directly in the file.

Learnt from: PPsyrius
PR: #2354
File: holidays/countries/fiji.py:185-188
Timestamp: 2025-03-19T16:53:00.375Z
Learning: In the Fiji holidays implementation, the special_public_holidays_observed dictionary in FijiStaticHolidays is only used for exceptions to the normal observance rules, not for documenting all holidays. Only 2019's Constitution Day needed a special entry as it didn't follow the standard patterns.

Learnt from: KJhellico
PR: #2465
File: holidays/countries/suriname.py:219-251
Timestamp: 2025-04-13T19:10:31.502Z
Learning: The _CustomIslamicHolidays classes in this project contain only exact verified holiday dates from reliable sources, rather than calculated or estimated future dates. This is by design to ensure accuracy, particularly for religious holidays that may follow lunar calendars or depend on local observations.

🧬 Code Graph Analysis (1)
holidays/countries/germany.py (2)
holidays/groups/christian.py (4)
  • _add_epiphany_day (290-306)
  • _add_corpus_christi_day (247-257)
  • _add_all_saints_day (97-105)
  • _add_assumption_of_mary_day (148-164)
holidays/groups/international.py (1)
  • _add_womens_day (187-197)
🔇 Additional comments (21)
README.md (1)

684-687: Subdivision list correctly extended with Augsburg – looks consistent.

The new “cities: Augsburg” addition matches the naming style already used for Italy’s city-level entries and keeps the existing semicolon delimiter. No further action needed.

holidays/locale/th/LC_MESSAGES/DE.po (2)

17-27: Header bump to 0.78 acknowledged.

Version, revision stamp and generator update align with the rest of the repository’s recent locale bumps. Nothing else to flag.


106-109: New Thai translation reads well.

“Augsburger Hohes Friedensfest → วันเทศกาลสันติภาพเอาก์สบวร์ก” follows Thai phrasing conventions and the “ชดเชย%s” rule isn’t involved, so we’re good.

holidays/locale/en_US/LC_MESSAGES/DE.po (2)

17-27: Metadata update is routine.

Project-Id, revision date and Poedit version updated consistently. No concerns.


106-109: English translation added and clear.

“Augsburg Peace Festival” is an accurate rendering and matches snapshot/test terminology.

holidays/locale/uk/LC_MESSAGES/DE.po (2)

17-27: Header refresh looks fine.

Nothing unexpected in the metadata tweaks.


106-109: Ukrainian translation reads naturally.

“Аугсбурзьке свято миру” captures the meaning and follows existing style.

holidays/locale/de/LC_MESSAGES/DE.po (2)

16-27: Header sync confirmed.

Version bump and dates align with other locale files.


105-108: msgid added with empty msgstr – correct for default language file.

German is the source language, so leaving msgstr "" is expected. Good to merge.

snapshots/countries/DE_AUGSBURG.json (1)

1-792: Auto-generated snapshot file looks correct.

This snapshot file appears to be properly generated with the Augsburg Peace Festival appearing consistently on August 8th from 1991 onwards.

holidays/countries/germany.py (5)

35-37: Good addition of relevant references.

The Bavaria's Feiertagsgesetz reference is particularly appropriate since it likely covers the legal basis for Augsburg's Peace Festival.


157-164: Comments improve code clarity.

The added comments follow the project convention of simple holiday name comments.

Also applies to: 173-174, 178-179, 188-189, 196-197, 201-202, 209-210, 217-218, 222-229, 232-233, 236-237, 241-242, 246-247, 249-250, 257-258, 262-263


265-271: Augsburg subdivision implementation looks correct.

The method properly inherits Bayern holidays and adds the city-specific Peace Festival starting from 1991.


291-292: Helpful comment for the special holiday.


44-81: No alias entry required for “Augsburg”

The pattern in italy.py only adds aliases for names that don’t exactly match their subdivision codes (e.g. “Forlì”→“Forli”). Since “Augsburg” is identical to its code, no subdivisions_aliases entry is needed.

tests/countries/test_germany.py (6)

46-53: Comprehensive test coverage for no holidays before 1990.

Good addition of subdivision-specific testing.


54-67: Well-structured special holidays test.


73-85: Augsburg correctly included in Epiphany observance.

Since Augsburg inherits Bayern holidays, this is the expected behavior.


286-298: Proper test coverage for Augsburg Peace Festival.

The test correctly verifies this city-specific holiday.


271-279: Consistent inclusion of Augsburg in Bayern holidays.

Also applies to: 362-369


426-426: Localization tests properly updated.

All language variants correctly include the Augsburg Peace Festival.

Also applies to: 451-451, 476-476, 501-501

Copy link
Collaborator

@KJhellico KJhellico left a comment

Choose a reason for hiding this comment

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

Good implementation! Although I've always been a little bit concerned about this non-standardization of Italy with its individual cities... Later we'll have to think of something regarding #1713.

@PPsyrius PPsyrius requested a review from KJhellico July 24, 2025 15:03
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (1)
tests/countries/test_germany.py (1)

107-114: Consider reducing date lists for movable holidays

While the explicit date lists ensure accuracy, they could be reduced to a smaller representative set (e.g., 2020-2025) to improve readability without sacrificing test effectiveness. This would align with past review suggestions about managing long date lists.

Also applies to: 147-153, 165-171, 192-200, 209-215, 228-234

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8639592 and ea2fc6d.

📒 Files selected for processing (1)
  • tests/countries/test_germany.py (5 hunks)
⏰ Context from checks skipped due to timeout of 300000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Test build on windows-latest
  • GitHub Check: Test build on ubuntu-latest
  • GitHub Check: Test build on macos-latest
🔇 Additional comments (9)
tests/countries/test_germany.py (9)

54-66: Good consolidation of special holiday tests

The consolidation of Berlin's special holidays into a single method improves maintainability while maintaining proper test coverage.


68-71: Clean implementation for New Year's Day test

Good addition. The test properly validates the holiday from 1991 onwards.


78-78: Correct addition of Augsburg subdivision

The inclusion of Augsburg in the Epiphany holiday test aligns with the PR objectives.


86-103: Well-structured test for International Women's Day

Excellent handling of subdivision-specific start years (BE: 2019, MV: 2023) with proper validation.


238-238: Appropriate inclusion of Augsburg for Corpus Christi

The addition maintains consistency with the city's Catholic tradition.


251-263: Key test for Augsburg Peace Festival properly implemented

This test correctly validates the PR's main objective - adding the Augsburg Peace Festival exclusively for the Augsburg subdivision on August 8.


302-321: Excellent handling of complex Reformation Day logic

The test correctly captures the nuanced start years: immediate from 1990 for eastern states, from 2017 for northern states (with the special 2017 nationwide observance), and only 2017 for others.


335-361: Well-structured pre/post-1995 split for Repentance and Prayer Day

The test properly handles the transition where this holiday became Saxony-exclusive after 1994.


386-386: Complete localization coverage for Augsburg Peace Festival

All localizations properly include the new holiday with appropriate translations.

Also applies to: 411-411, 436-436, 461-461

@coderabbitai coderabbitai bot mentioned this pull request Jul 24, 2025
9 tasks
Copy link

sonarqubecloud bot commented Aug 4, 2025

Copy link
Collaborator

@KJhellico KJhellico left a comment

Choose a reason for hiding this comment

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

LGTM!

@arkid15r arkid15r added this pull request to the merge queue Aug 4, 2025
Merged via the queue into vacanza:dev with commit feab68b Aug 4, 2025
34 checks passed
@KJhellico KJhellico mentioned this pull request Aug 4, 2025
@PPsyrius PPsyrius deleted the de_augsburg branch August 5, 2025 02:33
@stefanhintermayr
Copy link

Sorry, I didn't find the "Augsburger Peace Festival". On the newest HA Version. What did i do wrong?

@PPsyrius
Copy link
Collaborator Author

Ok, I've verified that the new "Augsburg" subdivision isn't included for core 2025.8.1 (but they definitely got the new v0.78 according to their patch note and the fact that Pitcairn is available in the setup menu) - same issue also applies for New Zealand's special "South Canterbury" holidays subdivision.

This might be something with HA side's subdiv mapping.

@gjohansson-ST
Copy link

It was expected that if you have sub div aliases that it would be complete. According to this PR that's not the case hence I can verify in HA that Augsburg is available (in dev) but as it's not part of the aliases, it comes out blank.
Need to mod HA accordingly.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add missing Germany public holiday

5 participants

点击 这是indexloc提供的php浏览器服务,不要输入任何密码和下载