diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e6707e3bb..f6cd220e2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -38,7 +38,7 @@ repos: exclude: ^(docs|holidays/countries/__init__.py|scripts/l10n/msgfmt.py) - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.2.0 + rev: v1.3.0 hooks: - id: mypy additional_dependencies: [types-all] diff --git a/README.rst b/README.rst index 6a7f40df5..c67497c0d 100644 --- a/README.rst +++ b/README.rst @@ -107,7 +107,7 @@ Available Countries .. _ISO 3166-1 alpha-2 code: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes .. _ISO 3166-2 code: https://en.wikipedia.org/wiki/ISO_3166-2 -We currently support 121 country codes. The standard way to refer to a country +We currently support 122 country codes. The standard way to refer to a country is by using its `ISO 3166-1 alpha-2 code`_, the same used for domain names, and for a subdivision its `ISO 3166-2 code`_. The following countries and subdivisions are available: @@ -123,6 +123,9 @@ subdivisions are available: * - Albania - AL - None + * - Algeria + - DZ + - None * - American Samoa - AS - None; Can also be loaded as country US, subdivision AS diff --git a/holidays/countries/__init__.py b/holidays/countries/__init__.py index d16ee4eba..4bc50c7d2 100644 --- a/holidays/countries/__init__.py +++ b/holidays/countries/__init__.py @@ -10,6 +10,7 @@ # License: MIT (see LICENSE file) from .albania import Albania, AL, ALB +from .algeria import Algeria, DZ, DZA from .american_samoa import AmericanSamoa, AS, ASM, HolidaysAS from .andorra import Andorra, AD, AND from .angola import Angola, AO, AGO diff --git a/holidays/countries/algeria.py b/holidays/countries/algeria.py new file mode 100644 index 000000000..31143b61e --- /dev/null +++ b/holidays/countries/algeria.py @@ -0,0 +1,70 @@ +from holidays.constants import JAN, JUL, NOV +from holidays.holiday_base import HolidayBase +from holidays.holiday_groups import IslamicHolidays, InternationalHolidays + + +class Algeria(HolidayBase, InternationalHolidays, IslamicHolidays): + """ + References: + - https://en.wikipedia.org/wiki/Public_holidays_in_Algeria + """ + + country = "DZ" + + def __init__(self, *args, **kwargs): + InternationalHolidays.__init__(self) + IslamicHolidays.__init__(self) + super().__init__(*args, **kwargs) + + def _populate(self, year): + super()._populate(year) + + # New Year's Day. + self._add_new_years_day("New Year's Day") + + # Amazigh New Year / Yennayer + # In January 2018, Algeria declared Yennayer a national holiday + if year >= 2018: + self._add_holiday("Amazigh New Year", JAN, 12) + + # Labour Day + self._add_labor_day("Labour Day") + + # Independence Day + if year >= 1962: + self._add_holiday("Independence Day", JUL, 5) + + # Revolution Day + if year >= 1963: + self._add_holiday("Revolution Day", NOV, 1) + + # Islamic New Year + self._add_islamic_new_year_day("Islamic New Year") + + # Ashura + self._add_ashura_day("Ashura Day") + + # Mawlid / Prophet's Birthday + self._add_mawlid_day("Prophet's Birthday") + + # As of April 30, 2023. Algeria has 3 days of Eid holidays + # (https://www.horizons.dz/english/archives/amp/12021) + # Eid al-Fitr - Feast Festive + self._add_eid_al_fitr_day("Eid al-Fitr") + self._add_eid_al_fitr_day_two("Eid al-Fitr Holiday") + if year >= 2024: + self._add_eid_al_fitr_day_three("Eid al-Fitr Holiday") + + # Eid al-Adha - Scarfice Festive + self._add_eid_al_adha_day("Eid al-Adha") + self._add_eid_al_adha_day_two("Eid al-Adha Holiday") + if year >= 2023: + self._add_eid_al_adha_day_three("Eid al-Adha Holiday") + + +class DZ(Algeria): + pass + + +class DZA(Algeria): + pass diff --git a/holidays/registry.py b/holidays/registry.py index ca8ee3976..79ff37dfd 100644 --- a/holidays/registry.py +++ b/holidays/registry.py @@ -18,6 +18,7 @@ COUNTRIES: RegistryDict = { "albania": ("Albania", "AL", "ALB"), + "algeria": ("Algeria", "DZ", "DZA"), "american_samoa": ("AmericanSamoa", "AS", "ASM", "HolidaysAS"), "andorra": ("Andorra", "AD", "AND"), "angola": ("Angola", "AO", "AGO"), diff --git a/tests/countries/test_algeria.py b/tests/countries/test_algeria.py new file mode 100644 index 000000000..6622846bc --- /dev/null +++ b/tests/countries/test_algeria.py @@ -0,0 +1,108 @@ +from holidays.countries.algeria import Algeria, DZ, DZA +from tests.common import TestCase + + +class TestAlgeria(TestCase): + @classmethod + def setUpClass(cls): + super().setUpClass(Algeria) + + def test_country_aliases(self): + self.assertCountryAliases(Algeria, DZ, DZA) + + def test_2022(self): + self.assertHoliday( + "2022-01-01", + "2022-01-12", + "2022-05-01", + "2022-05-02", + "2022-05-03", + "2022-07-05", + "2022-07-09", + "2022-07-10", + "2022-11-01", + ) + + def test_new_year_day(self): + self.assertHoliday( + "2022-01-01", + "2023-01-01", + ) + + def test_independence_day(self): + self.assertNoHoliday( + "1961-07-05", + "1962-07-04", + ) + self.assertHoliday( + "1962-07-05", + "1963-07-05", + ) + + def test_revolution_day(self): + self.assertNoHoliday("1962-11-01") + self.assertHoliday("1963-11-01") + + def test_amazigh_new_year(self): + self.assertNoHoliday("2017-01-12") + self.assertHoliday( + "2018-01-12", + "2023-01-12", + ) + + def test_labour_day(self): + self.assertNoHoliday( + "2021-05-02", + "2022-05-04", + "2023-05-02", + ) + self.assertHoliday( + "2021-05-01", + "2022-05-01", + "2023-05-01", + ) + + def test_islamic_holidays(self): + # Eid al-Fitr - Feast Festive + self.assertNoHoliday("2023-04-20") + self.assertHoliday( + "2023-04-21", + "2023-04-22", + ) + + # Eid al-Adha - Scarfice Festive + self.assertNoHoliday( + "2023-06-27", + "2023-07-02", + "2024-07-15", + "2024-07-19", + ) + self.assertHoliday( + "2023-06-28", + "2023-06-29", + "2023-06-30", + "2024-06-16", + "2024-06-17", + "2024-06-18", + ) + + # Islamic New Year + self.assertHoliday( + "2008-01-10", + "2008-12-29", + "2020-08-20", + ) + + # Ashura + self.assertNoHoliday("2023-07-29") + self.assertHoliday("2023-07-28") + + # Mawlid / Prophet's Birthday + self.assertNoHoliday( + "2021-10-19", + "2023-09-28", + ) + self.assertHoliday( + "2021-10-18", + "2023-09-27", + )