Repository: vacanza/holidays
Pull request #2302 (2025-02-18 21:15:08)

Update AZ holidays: add 2025 substituted holidays
<!--
  Thanks for contributing to holidays!
-->

## Proposed change

<!--
  Describe the big picture of your changes.
  Don't forget to link your PR to an existing issue if any.
-->

Update AZ holidays: add 2025 substituted holidays.

Unusual case: this time, working days are moved not to weekend, but to non-working days that are "observed" from other holidays.

## Type of change

<!--
  Type of change you want to introduce. Please, check one (1) box only!
  If your PR requires multiple boxes to be checked, most likely it needs to
  be split into multiple PRs.
-->

- [ ] New country/market holidays support (thank you!)
- [x] 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

<!--
  Put an `x` in the boxes that apply. You can change them after PR is created.
-->

- [x] I've followed the [contributing guidelines][contributing-guidelines]
- [x] I've successfully run `make check`, all checks and tests are green

<!--
  Thanks again for your contribution!
-->

[contributing-guidelines]: https://github.com/vacanza/holidays/blob/dev/CONTRIBUTING.rst
[docs]: https://github.com/vacanza/holidays/tree/dev/docs/source


sonarqubecloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2302) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [1 New issue](https://sonarcloud.io/project/issues?id=vacanza_python-holidays&pullRequest=2302&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=vacanza_python-holidays&pullRequest=2302&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=vacanza_python-holidays&pullRequest=2302&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=vacanza_python-holidays&pullRequest=2302&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=vacanza_python-holidays&pullRequest=2302&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2302)


codecov[bot]: ## [Codecov](https://app.codecov.io/gh/vacanza/holidays/pull/2302?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vacanza) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 100.00%. Comparing base [(`7b87007`)](https://app.codecov.io/gh/vacanza/holidays/commit/7b870078fd922e5d0871ce153b7572e2b32681b4?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vacanza) to head [(`7118ce3`)](https://app.codecov.io/gh/vacanza/holidays/commit/7118ce3515be2408e68aa7d7fde274d9d0670f0f?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vacanza).

<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff            @@
##               dev     #2302   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files          201       201           
  Lines        12332     12338    +6     
  Branches      1768      1770    +2     
=========================================
+ Hits         12332     12338    +6     
```

</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/vacanza/holidays/pull/2302?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vacanza).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vacanza).


Patch:
diff --git a/holidays/countries/azerbaijan.py b/holidays/countries/azerbaijan.py
index 64e482d0..f4d4ccbc 100644
--- a/holidays/countries/azerbaijan.py
+++ b/holidays/countries/azerbaijan.py
@@ -68,7 +68,9 @@ class Azerbaijan(ObservedHolidayBase, InternationalHolidays, IslamicHolidays, St
             dts_non_observed.add(self._add_holiday_jan_20(tr("Ümumxalq hüzn günü")))
 
         # Women's Day.
-        dts_observed.add(self._add_womens_day(tr("Qadınlar günü")))
+        dt = self._add_womens_day(tr("Qadınlar günü"))
+        if self._year != 2025:
+            dts_observed.add(dt)
 
         # Spring Festival.
         name = tr("Novruz bayramı")
@@ -135,7 +137,9 @@ class Azerbaijan(ObservedHolidayBase, InternationalHolidays, IslamicHolidays, St
         if self._year >= 1993:
             # Eid al-Fitr.
             name = tr("Ramazan bayrami")
-            dts_bairami.update(self._add_eid_al_fitr_day(name))
+            dt = self._add_eid_al_fitr_day(name)
+            if self._year != 2025:
+                dts_bairami.update(dt)
             if self._year >= 2006:
                 dts_bairami.update(self._add_eid_al_fitr_day_two(name))
 
@@ -217,6 +221,7 @@ class AzerbaijanIslamicHolidays(_CustomIslamicHolidays):
         2022: (JUL, 9),
         2023: (JUN, 28),
         2024: (JUN, 16),
+        2025: (JUN, 6),
     }
 
     EID_AL_FITR_DATES = {
@@ -243,6 +248,7 @@ class AzerbaijanIslamicHolidays(_CustomIslamicHolidays):
         2022: (MAY, 2),
         2023: (APR, 21),
         2024: (APR, 10),
+        2025: (MAR, 30),
     }
 
 
@@ -258,11 +264,17 @@ class AzerbaijanStaticHolidays:
         - https://nk.gov.az/az/senedler/qerarlar/is-ve-istirahet-gunlerinin-yerlerinin-deyisdirilme-7843
         - https://nk.gov.az/az/senedler/qerarlar/is-ve-istirahet-gunlerinin-yerlerinin-deyisdirilme-8332
         - https://nk.gov.az/az/senedler/qerarlar/is-ve-istirahet-gunlerinin-yerlerinin-deyisdirilme-8449
+        - https://nk.gov.az/az/senedler/qerarlar/is-ve-istirahet-gunlerinin-yerlerinin-deyisdirilme-8623
     Special holidays references:
         - https://www.msk.gov.az/en/elections/pages/municipal-elections/belediyye-29-01-2025
     """
 
     eid_al_adha = tr("Qurban bayrami")
+
+    eid_al_fitr = tr("Ramazan bayrami")
+
+    womens_day = tr("Qadınlar günü")
+
     # Substituted date format.
     substituted_date_format = tr("%d.%m.%Y")
     # Day off (substituted from %s).
@@ -323,5 +335,9 @@ class AzerbaijanStaticHolidays:
 
     special_public_holidays_observed = {
         2007: (JAN, 3, eid_al_adha),
+        2025: (
+            (MAR, 27, womens_day),
+            (MAR, 28, eid_al_fitr),
+        ),
         2072: (JAN, 5, eid_al_adha),
     }
diff --git a/snapshots/countries/AZ_COMMON.json b/snapshots/countries/AZ_COMMON.json
index c5672109..e60a155c 100644
--- a/snapshots/countries/AZ_COMMON.json
+++ b/snapshots/countries/AZ_COMMON.json
@@ -740,7 +740,6 @@
     "2025-01-20": "Martyrs' Day",
     "2025-01-29": "Municipal elections",
     "2025-03-08": "Women's Day",
-    "2025-03-10": "Women's Day (observed)",
     "2025-03-20": "Spring Festival",
     "2025-03-21": "Spring Festival",
     "2025-03-22": "Spring Festival",
@@ -748,14 +747,15 @@
     "2025-03-24": "Spring Festival",
     "2025-03-25": "Spring Festival (observed)",
     "2025-03-26": "Spring Festival (observed)",
-    "2025-03-30": "Eid al-Fitr (estimated)",
-    "2025-03-31": "Eid al-Fitr (estimated)",
-    "2025-04-01": "Eid al-Fitr (observed, estimated)",
+    "2025-03-27": "Women's Day (observed)",
+    "2025-03-28": "Eid al-Fitr (observed)",
+    "2025-03-30": "Eid al-Fitr",
+    "2025-03-31": "Eid al-Fitr",
     "2025-05-09": "Victory over Fascism Day",
     "2025-05-28": "Independence Day",
-    "2025-06-06": "Eid al-Adha (estimated)",
-    "2025-06-07": "Eid al-Adha (estimated)",
-    "2025-06-09": "Eid al-Adha (observed, estimated)",
+    "2025-06-06": "Eid al-Adha",
+    "2025-06-07": "Eid al-Adha",
+    "2025-06-09": "Eid al-Adha (observed)",
     "2025-06-15": "National Liberation Day",
     "2025-06-16": "National Liberation Day (observed)",
     "2025-06-26": "Armed Forces Day",


Test patch:
diff --git a/tests/countries/test_azerbaijan.py b/tests/countries/test_azerbaijan.py
index 3464d9c8..083e0f65 100644
--- a/tests/countries/test_azerbaijan.py
+++ b/tests/countries/test_azerbaijan.py
@@ -35,6 +35,8 @@ class TestAzerbaijan(CommonCountryTests, WorkingDayTests, TestCase):
             "2019-12-27",
             "2024-02-07",
             "2025-01-29",
+            "2025-03-27",
+            "2025-03-28",
             "2072-01-05",
         )