diff --git a/README.rst b/README.rst index e2c55c314..1de0b2817 100644 --- a/README.rst +++ b/README.rst @@ -243,7 +243,7 @@ The list of supported countries, their subdivisions and supported languages - * - Canada - CA - - Provinces and territories: AB, BC, MB, NB, NL, NS, NT, NU, **ON**, PE, QC, SK, YT + - Provinces and territories: AB, BC, MB, NB, NL, NS, NT, NU, ON, PE, QC, SK, YT - ar, **en**, fr, th * - Chad - TD diff --git a/holidays/constants.py b/holidays/constants.py index e18e65873..130648eca 100644 --- a/holidays/constants.py +++ b/holidays/constants.py @@ -38,9 +38,9 @@ # Supported holiday categories. BANK = "bank" -EXTENDED = "extended" GOVERNMENT = "government" HALF_DAY = "half_day" +OPTIONAL = "optional" PUBLIC = "public" SCHOOL = "school" WORKDAY = "workday" @@ -55,12 +55,12 @@ BANK, CHINESE, CHRISTIAN, - EXTENDED, GOVERNMENT, HALF_DAY, HEBREW, HINDU, ISLAMIC, + OPTIONAL, PUBLIC, SCHOOL, WORKDAY, diff --git a/holidays/countries/canada.py b/holidays/countries/canada.py index 12c771126..92dd56e47 100644 --- a/holidays/countries/canada.py +++ b/holidays/countries/canada.py @@ -13,6 +13,7 @@ from gettext import gettext as tr from holidays.calendars.gregorian import MAR, APR, JUN, JUL +from holidays.constants import GOVERNMENT, OPTIONAL, PUBLIC from holidays.groups import ChristianHolidays, InternationalHolidays from holidays.observed_holiday_base import ( ObservedHolidayBase, @@ -20,14 +21,29 @@ SAT_SUN_TO_NEXT_MON, SAT_SUN_TO_NEXT_MON_TUE, SUN_TO_NEXT_MON, + SUN_TO_NEXT_TUE, ) class Canada(ObservedHolidayBase, ChristianHolidays, InternationalHolidays): + """ + References: + - https://en.wikipedia.org/wiki/Public_holidays_in_Canada + - https://web.archive.org/web/20130703014214/http://www.hrsdc.gc.ca/eng/labour/overviews/employment_standards/holidays.shtml # noqa: E501 + - https://www.alberta.ca/alberta-general-holidays + - https://www2.gov.bc.ca/gov/content/employment-business/employment-standards-advice/employment-standards/statutory-holidays # noqa: E501 + - http://web2.gov.mb.ca/laws/statutes/ccsm/r120e.php + - https://www2.gnb.ca/content/gnb/en/departments/elg/local_government/content/governance/content/days_of_rest_act.html # noqa: E501 + - https://www.ontario.ca/document/your-guide-employment-standards-act-0/public-holidays + - https://www.officeholidays.com/countries/canada/ + - https://www.timeanddate.com/holidays/canada/ + """ + country = "CA" default_language = "en" # %s (Observed). observed_label = tr("%s (Observed)") + supported_categories = {GOVERNMENT, OPTIONAL, PUBLIC} subdivisions = ( "AB", "BC", @@ -46,9 +62,6 @@ class Canada(ObservedHolidayBase, ChristianHolidays, InternationalHolidays): supported_languages = ("ar", "en", "fr", "th") def __init__(self, *args, **kwargs): - # Default subdivision to ON; prov for backwards compatibility - if not kwargs.get("subdiv", kwargs.get("prov")): - kwargs["subdiv"] = "ON" ChristianHolidays.__init__(self) InternationalHolidays.__init__(self) super().__init__(observed_rule=SAT_SUN_TO_NEXT_MON, *args, **kwargs) @@ -56,48 +69,91 @@ def __init__(self, *args, **kwargs): def _get_nearest_monday(self, *args) -> date: return self._get_observed_date(date(self._year, *args), rule=ALL_TO_NEAREST_MON) - def _populate(self, year): - if year <= 1866: - return None - - super()._populate(year) + def _add_common_holidays(self): + """Nationwide statutory holidays.""" # New Year's Day. self._add_observed(self._add_new_years_day(tr("New Year's Day"))) # Good Friday. self._add_good_friday(tr("Good Friday")) - # Easter Monday. - self._add_easter_monday(tr("Easter Monday")) - if year <= 1982: - # Dominion Day. - self._add_observed(self._add_holiday_jul_1(tr("Dominion Day"))) + if self._year >= 1879: + self._canada_day = self._add_holiday_jul_1( + # Canada Day. + tr("Canada Day") + if self._year >= 1983 + # Dominion Day. + else tr("Dominion Day") + ) if self._year >= 1894: # Labour Day. self._add_holiday_1st_mon_of_sep(tr("Labour Day")) + # Christmas Day. + self._add_christmas_day(tr("Christmas Day")) + + def _populate_public_holidays(self): + if self._year <= 1866: + return None + + self._add_common_holidays() + + self._add_observed(self._christmas_day) + + def _populate_government_holidays(self): + """Holidays for federally regulated workplaces.""" + + if self._year <= 1866: + return None + + self._add_common_holidays() + + if self._year >= 1953: + # Victoria Day. + self._add_holiday_1st_mon_before_may_24(tr("Victoria Day")) + + if self._year >= 1879: + self._add_observed(self._canada_day) + + if self._year >= 2021: + self._add_observed( + # National Day for Truth and Reconciliation. + self._add_holiday_sep_30(tr("National Day for Truth and Reconciliation")) + ) + + self._add_thanksgiving_day() + + if self._year >= 1931: + # Remembrance Day. + self._add_observed(self._add_remembrance_day(tr("Remembrance Day"))) + + self._add_observed(self._christmas_day, rule=SAT_SUN_TO_NEXT_MON_TUE) + + # Boxing Day. self._add_observed( - # Christmas Day. - self._add_christmas_day(tr("Christmas Day")), - rule=SAT_SUN_TO_NEXT_MON_TUE, + self._add_christmas_day_two(tr("Boxing Day")), rule=SAT_SUN_TO_NEXT_MON_TUE ) + def _populate_optional_holidays(self): + if self._year <= 1866: + return None + + # Christmas Day. self._add_observed( - # Boxing Day. - self._add_christmas_day_two(tr("Boxing Day")), - rule=SAT_SUN_TO_NEXT_MON_TUE, + self._add_christmas_day(tr("Christmas Day")), rule=SAT_SUN_TO_NEXT_MON_TUE ) - def _add_family_day(self): - # Family Day. - self._add_holiday_3rd_mon_of_feb(tr("Family Day")) + # Boxing Day. + self._add_observed( + self._add_christmas_day_two(tr("Boxing Day")), rule=SAT_SUN_TO_NEXT_MON_TUE + ) - def _add_thanksgiving(self): + def _add_thanksgiving_day(self): if self._year >= 1931: - # Thanksgiving. - name = tr("Thanksgiving") + # Thanksgiving Day. + name = tr("Thanksgiving Day") # in 1935, Canadian Thanksgiving was moved due to the General # Election falling on the second Monday of October # http://tiny.cc/can_thkgvg @@ -106,47 +162,41 @@ def _add_thanksgiving(self): else: self._add_holiday_2nd_mon_of_oct(name) - def _add_queens_funeral(self): - if self._year == 2022: - # Funeral of Queen Elizabeth II. - self._add_holiday_sep_19(tr("Funeral of Her Majesty the Queen Elizabeth II")) - - def _add_subdiv_holidays(self): - if self._year >= 1983: - self._add_observed( - self._add_holiday_jul_1( - ( - # Memorial Day. - tr("Memorial Day") - if self.subdiv == "NL" - # Canada Day. - else tr("Canada Day") - ) - ) - ) - - super()._add_subdiv_holidays() - - def _add_subdiv_ab_holidays(self): + def _add_subdiv_ab_public_holidays(self): if self._year >= 1990: - self._add_family_day() + # Family Day. + self._add_holiday_3rd_mon_of_feb(tr("Family Day")) if self._year >= 1953: # Victoria Day. self._add_holiday_1st_mon_before_may_24(tr("Victoria Day")) + if self._year >= 1879: + self._add_observed(self._canada_day, rule=SUN_TO_NEXT_MON) + + self._add_thanksgiving_day() + + if self._year >= 1931: + # Remembrance Day. + self._add_observed(self._add_remembrance_day(tr("Remembrance Day"))) + + def _add_subdiv_ab_optional_holidays(self): + # Easter Monday. + self._add_easter_monday(tr("Easter Monday")) + # https://en.wikipedia.org/wiki/Civic_Holiday#Alberta if self._year >= 1974: # Heritage Day. self._add_holiday_1st_mon_of_aug(tr("Heritage Day")) - self._add_thanksgiving() + if self._year >= 2021: + # National Day for Truth and Reconciliation. + self._add_holiday_sep_30(tr("National Day for Truth and Reconciliation")) - if self._year >= 1931: - # Remembrance Day. - self._add_remembrance_day(tr("Remembrance Day")) + # Boxing Day. + self._add_christmas_day_two(tr("Boxing Day")) - def _add_subdiv_bc_holidays(self): + def _add_subdiv_bc_public_holidays(self): if self._year >= 2013: name = tr("Family Day") if self._year >= 2019: @@ -158,24 +208,29 @@ def _add_subdiv_bc_holidays(self): # Victoria Day. self._add_holiday_1st_mon_before_may_24(tr("Victoria Day")) + if self._year >= 1879: + self._add_observed(self._canada_day, rule=SUN_TO_NEXT_MON) + # https://en.wikipedia.org/wiki/Civic_Holiday#British_Columbia if self._year >= 1974: # British Columbia Day. self._add_holiday_1st_mon_of_aug(tr("British Columbia Day")) - self._add_queens_funeral() + if self._year == 2022: + # Funeral of Queen Elizabeth II. + self._add_holiday_sep_19(tr("Funeral of Her Majesty the Queen Elizabeth II")) if self._year >= 2023: # National Day for Truth and Reconciliation. self._add_holiday_sep_30(tr("National Day for Truth and Reconciliation")) - self._add_thanksgiving() + self._add_thanksgiving_day() if self._year >= 1931: # Remembrance Day. self._add_remembrance_day(tr("Remembrance Day")) - def _add_subdiv_mb_holidays(self): + def _add_subdiv_mb_public_holidays(self): if self._year >= 2008: # Louis Riel Day. self._add_holiday_3rd_mon_of_feb(tr("Louis Riel Day")) @@ -184,6 +239,9 @@ def _add_subdiv_mb_holidays(self): # Victoria Day. self._add_holiday_1st_mon_before_may_24(tr("Victoria Day")) + self._add_thanksgiving_day() + + def _add_subdiv_mb_optional_holidays(self): if self._year >= 1900: name = ( # Terry Fox Day. @@ -194,36 +252,55 @@ def _add_subdiv_mb_holidays(self): ) self._add_holiday_1st_mon_of_aug(name) - if self._year >= 2021: - # National Day for Truth and Reconciliation. - self._add_holiday_sep_30(tr("National Day for Truth and Reconciliation")) - - self._add_thanksgiving() - if self._year >= 1931: # Remembrance Day. self._add_remembrance_day(tr("Remembrance Day")) - def _add_subdiv_nb_holidays(self): + def _add_subdiv_nb_public_holidays(self): if self._year >= 2018: - self._add_family_day() - - if self._year >= 1953: - # Victoria Day. - self._add_holiday_1st_mon_before_may_24(tr("Victoria Day")) + # Family Day. + self._add_holiday_3rd_mon_of_feb(tr("Family Day")) # https://en.wikipedia.org/wiki/Civic_Holiday#New_Brunswick - if self._year >= 1900: + if self._year >= 1975: # New Brunswick Day. self._add_holiday_1st_mon_of_aug(tr("New Brunswick Day")) - self._add_queens_funeral() + if self._year == 2022: + # Funeral of Queen Elizabeth II. + self._add_holiday_sep_19(tr("Funeral of Her Majesty the Queen Elizabeth II")) if self._year >= 1931: # Remembrance Day. self._add_remembrance_day(tr("Remembrance Day")) - def _add_subdiv_nl_holidays(self): + def _add_subdiv_nb_optional_holidays(self): + if self._year >= 1953: + # Victoria Day. + self._add_holiday_1st_mon_before_may_24(tr("Victoria Day")) + + self._add_thanksgiving_day() + + # Boxing Day. + self._add_christmas_day_two(tr("Boxing Day")) + + def _add_subdiv_nl_public_holidays(self): + if self._year >= 1917: + # Memorial Day. + self._add_holiday_jul_1(tr("Memorial Day")) + + if self._year >= 1879: + self._add_observed(self._canada_day) + + if self._year == 2022: + # Funeral of Queen Elizabeth II. + self._add_holiday_sep_19(tr("Funeral of Her Majesty the Queen Elizabeth II")) + + if self._year >= 1931: + # Remembrance Day. + self._add_observed(self._add_remembrance_day(tr("Remembrance Day"))) + + def _add_subdiv_nl_optional_holidays(self): if self._year >= 1900: # St. Patrick's Day. self._add_holiday(tr("St. Patrick's Day"), self._get_nearest_monday(MAR, 17)) @@ -240,33 +317,35 @@ def _add_subdiv_nl_holidays(self): # Discovery Day. self._add_holiday(tr("Discovery Day"), self._get_nearest_monday(JUN, 24)) - self._add_queens_funeral() + if self._year >= 1900: + # Orangemen's Day. + self._add_holiday(tr("Orangemen's Day"), self._get_nearest_monday(JUL, 12)) - if self._year >= 1931: - # Remembrance Day. - self._add_observed( - self._add_remembrance_day(tr("Remembrance Day")), rule=SUN_TO_NEXT_MON - ) + self._add_thanksgiving_day() + + # Boxing Day. + self._add_christmas_day_two(tr("Boxing Day")) - def _add_subdiv_ns_holidays(self): + def _add_subdiv_ns_public_holidays(self): # http://novascotia.ca/lae/employmentrights/NovaScotiaHeritageDay.asp if self._year >= 2015: # Heritage Day. self._add_holiday_3rd_mon_of_feb(tr("Heritage Day")) - self._add_queens_funeral() - - if self._year >= 2021: - # National Day for Truth and Reconciliation. - self._add_holiday_sep_30(tr("National Day for Truth and Reconciliation")) + if self._year == 2022: + # Funeral of Queen Elizabeth II. + self._add_holiday_sep_19(tr("Funeral of Her Majesty the Queen Elizabeth II")) - if self._year >= 1931: + if self._year >= 1981: # Remembrance Day. - self._add_observed( - self._add_remembrance_day(tr("Remembrance Day")), rule=SUN_TO_NEXT_MON - ) + self._add_observed(self._add_remembrance_day(tr("Remembrance Day"))) - def _add_subdiv_nt_holidays(self): + def _add_subdiv_ns_optional_holidays(self): + if self._year >= 1996: + # Natal Day. + self._add_holiday_1st_mon_of_aug(tr("Natal Day")) + + def _add_subdiv_nt_public_holidays(self): if self._year >= 1953: # Victoria Day. self._add_holiday_1st_mon_before_may_24(tr("Victoria Day")) @@ -279,45 +358,63 @@ def _add_subdiv_nt_holidays(self): # Civic Holiday. self._add_holiday_1st_mon_of_aug(tr("Civic Holiday")) - self._add_thanksgiving() + if self._year >= 2022: + # National Day for Truth and Reconciliation. + self._add_holiday_sep_30(tr("National Day for Truth and Reconciliation")) + + self._add_thanksgiving_day() if self._year >= 1931: # Remembrance Day. - self._add_observed( - self._add_remembrance_day(tr("Remembrance Day")), rule=SUN_TO_NEXT_MON - ) + self._add_remembrance_day(tr("Remembrance Day")) - def _add_subdiv_nu_holidays(self): + def _add_subdiv_nu_public_holidays(self): if self._year >= 1953: # Victoria Day. self._add_holiday_1st_mon_before_may_24(tr("Victoria Day")) - if self._year >= 2000: - dt = (APR, 1) if self._year == 2000 else (JUL, 9) - # Nunavut Day. - self._add_observed(self._add_holiday(tr("Nunavut Day"), dt), rule=SUN_TO_NEXT_MON) + if self._year >= 1900: + # Civic Holiday. + self._add_holiday_1st_mon_of_aug(tr("Civic Holiday")) - self._add_thanksgiving() + if self._year >= 2022: + # National Day for Truth and Reconciliation. + self._add_holiday_sep_30(tr("National Day for Truth and Reconciliation")) + + self._add_thanksgiving_day() if self._year >= 1931: # Remembrance Day. self._add_remembrance_day(tr("Remembrance Day")) - def _add_subdiv_on_holidays(self): + def _add_subdiv_nu_optional_holidays(self): + if self._year >= 2000: + # Nunavut Day. + name = tr("Nunavut Day") + if self._year == 2000: + self._add_holiday_apr_1(name) + else: + self._add_holiday_jul_9(name) + + def _add_subdiv_on_public_holidays(self): if self._year >= 2008: - self._add_family_day() + # Family Day. + self._add_holiday_3rd_mon_of_feb(tr("Family Day")) if self._year >= 1953: # Victoria Day. self._add_holiday_1st_mon_before_may_24(tr("Victoria Day")) + self._add_thanksgiving_day() + + self._add_observed(self._add_christmas_day_two(tr("Boxing Day")), rule=SUN_TO_NEXT_TUE) + + def _add_subdiv_on_optional_holidays(self): if self._year >= 1900: # Civic Holiday. self._add_holiday_1st_mon_of_aug(tr("Civic Holiday")) - self._add_thanksgiving() - - def _add_subdiv_pe_holidays(self): + def _add_subdiv_pe_public_holidays(self): if self._year >= 2009: # Islander Day. name = tr("Islander Day") @@ -326,15 +423,22 @@ def _add_subdiv_pe_holidays(self): else: self._add_holiday_2nd_mon_of_feb(name) - self._add_queens_funeral() + if self._year >= 1879: + self._add_observed(self._canada_day) + + if self._year == 2022: + # Funeral of Queen Elizabeth II. + self._add_holiday_sep_19(tr("Funeral of Her Majesty the Queen Elizabeth II")) + + if self._year >= 2022: + # National Day for Truth and Reconciliation. + self._add_holiday_sep_30(tr("National Day for Truth and Reconciliation")) if self._year >= 1931: # Remembrance Day. - self._add_observed( - self._add_remembrance_day(tr("Remembrance Day")), rule=SUN_TO_NEXT_MON - ) + self._add_observed(self._add_remembrance_day(tr("Remembrance Day"))) - def _add_subdiv_qc_holidays(self): + def _add_subdiv_qc_public_holidays(self): if self._year >= 2003: # National Patriots' Day. self._add_holiday_1st_mon_before_may_24(tr("National Patriots' Day")) @@ -346,56 +450,72 @@ def _add_subdiv_qc_holidays(self): rule=SUN_TO_NEXT_MON, ) - self._add_thanksgiving() + if self._year >= 1879: + self._add_observed(self._canada_day, rule=SUN_TO_NEXT_MON) + + self._add_thanksgiving_day() - def _add_subdiv_sk_holidays(self): + def _add_subdiv_qc_optional_holidays(self): + # Easter Monday. + self._add_easter_monday(tr("Easter Monday")) + + def _add_subdiv_sk_public_holidays(self): if self._year >= 2007: - self._add_family_day() + # Family Day. + self._add_holiday_3rd_mon_of_feb(tr("Family Day")) if self._year >= 1953: # Victoria Day. self._add_holiday_1st_mon_before_may_24(tr("Victoria Day")) + if self._year >= 1879: + self._add_observed(self._canada_day) + # https://en.wikipedia.org/wiki/Civic_Holiday#Saskatchewan if self._year >= 1900: # Saskatchewan Day. self._add_holiday_1st_mon_of_aug(tr("Saskatchewan Day")) - self._add_thanksgiving() + self._add_thanksgiving_day() if self._year >= 1931: # Remembrance Day. - self._add_observed( - self._add_remembrance_day(tr("Remembrance Day")), rule=SUN_TO_NEXT_MON - ) - - def _add_subdiv_yt_holidays(self): - # start date? - # https://www.britannica.com/topic/Heritage-Day-Canadian-holiday - # Heritage Day was created in 1973 - # by the Heritage Canada Foundation - # therefore, start date is not earlier than 1974 - # http://heritageyukon.ca/programs/heritage-day - # https://en.wikipedia.org/wiki/Family_Day_(Canada)#Yukon_Heritage_Day - # Friday before the last Sunday in February - if self._year >= 1974: - self._add_holiday_2_days_prior_last_sun_of_feb(tr("Heritage Day")) + self._add_observed(self._add_remembrance_day(tr("Remembrance Day"))) + def _add_subdiv_yt_public_holidays(self): if self._year >= 1953: # Victoria Day. self._add_holiday_1st_mon_before_may_24(tr("Victoria Day")) + if self._year >= 2017: + # National Aboriginal Day. + self._add_holiday_jun_21(tr("National Aboriginal Day")) + + if self._year >= 1879: + self._add_observed(self._canada_day) + if self._year >= 1912: # Discovery Day. self._add_holiday_3rd_mon_of_aug(tr("Discovery Day")) - self._add_queens_funeral() + if self._year == 2022: + # Funeral of Queen Elizabeth II. + self._add_holiday_sep_19(tr("Funeral of Her Majesty the Queen Elizabeth II")) + + if self._year >= 2023: + # National Day for Truth and Reconciliation. + self._add_holiday_sep_30(tr("National Day for Truth and Reconciliation")) - self._add_thanksgiving() + self._add_thanksgiving_day() if self._year >= 1931: # Remembrance Day. - self._add_remembrance_day(tr("Remembrance Day")) + self._add_observed(self._add_remembrance_day(tr("Remembrance Day"))) + + def _add_subdiv_yt_optional_holidays(self): + # Friday before the last Sunday in February + if self._year >= 1976: + self._add_holiday_2_days_prior_last_sun_of_feb(tr("Heritage Day")) class CA(Canada): diff --git a/holidays/locale/ar/LC_MESSAGES/CA.po b/holidays/locale/ar/LC_MESSAGES/CA.po index ff41f0769..e8067485d 100644 --- a/holidays/locale/ar/LC_MESSAGES/CA.po +++ b/holidays/locale/ar/LC_MESSAGES/CA.po @@ -3,10 +3,10 @@ # msgid "" msgstr "" -"Project-Id-Version: Python Holidays 0.26\n" +"Project-Id-Version: Python Holidays 0.32\n" "POT-Creation-Date: 2023-05-20 18:16-0700\n" -"PO-Revision-Date: 2023-05-20 18:30-0700\n" -"Last-Translator: Arkadii Yakovets \n" +"PO-Revision-Date: 2023-08-26 18:25+0300\n" +"Last-Translator: ~Jhellico \n" "Language-Team: Python Holidays localization team\n" "Language: ar\n" "MIME-Version: 1.0\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n" "Generated-By: Lingua 4.15.0\n" -"X-Generator: Poedit 3.3.1\n" +"X-Generator: Poedit 3.2.2\n" #. %s (Observed). #, c-format @@ -53,8 +53,8 @@ msgstr "يوم الملاكمة" msgid "Family Day" msgstr "يوم العائلة" -#. Thanksgiving. -msgid "Thanksgiving" +#. Thanksgiving Day. +msgid "Thanksgiving Day" msgstr "عيد الشكر" #. Funeral of Queen Elizabeth II. @@ -140,3 +140,11 @@ msgstr "عيد القديس جان بابتيست" #. Saskatchewan Day. msgid "Saskatchewan Day" msgstr "يوم ساسكاتشوان" + +#. Orangemen's Day. +msgid "Orangemen's Day" +msgstr "يوم رجال البرتقال" + +#. Natal Day. +msgid "Natal Day" +msgstr "يوم التأسيس" diff --git a/holidays/locale/en/LC_MESSAGES/CA.po b/holidays/locale/en/LC_MESSAGES/CA.po index 701a1243c..486136783 100644 --- a/holidays/locale/en/LC_MESSAGES/CA.po +++ b/holidays/locale/en/LC_MESSAGES/CA.po @@ -3,9 +3,9 @@ # msgid "" msgstr "" -"Project-Id-Version: Python Holidays 0.20\n" +"Project-Id-Version: Python Holidays 0.32\n" "POT-Creation-Date: 2023-04-10 14:10+0300\n" -"PO-Revision-Date: 2023-04-10 14:11+0300\n" +"PO-Revision-Date: 2023-08-26 18:22+0300\n" "Last-Translator: ~Jhellico \n" "Language-Team: Python Holidays localization team\n" "Language: en\n" @@ -53,8 +53,8 @@ msgstr "" msgid "Family Day" msgstr "" -#. Thanksgiving. -msgid "Thanksgiving" +#. Thanksgiving Day. +msgid "Thanksgiving Day" msgstr "" #. Funeral of Queen Elizabeth II. @@ -140,3 +140,11 @@ msgstr "" #. Saskatchewan Day. msgid "Saskatchewan Day" msgstr "" + +#. Orangemen's Day. +msgid "Orangemen's Day" +msgstr "" + +#. Natal Day. +msgid "Natal Day" +msgstr "" diff --git a/holidays/locale/fr/LC_MESSAGES/CA.po b/holidays/locale/fr/LC_MESSAGES/CA.po index c68bdd5b7..dcf3eab2c 100644 --- a/holidays/locale/fr/LC_MESSAGES/CA.po +++ b/holidays/locale/fr/LC_MESSAGES/CA.po @@ -3,9 +3,9 @@ # msgid "" msgstr "" -"Project-Id-Version: Python Holidays 0.21\n" +"Project-Id-Version: Python Holidays 0.32\n" "POT-Creation-Date: 2023-04-10 14:10+0300\n" -"PO-Revision-Date: 2023-04-10 14:11+0300\n" +"PO-Revision-Date: 2023-08-26 18:23+0300\n" "Last-Translator: ~Jhellico \n" "Language-Team: Python Holidays localization team\n" "Language: fr\n" @@ -53,8 +53,8 @@ msgstr "Boxing Day" msgid "Family Day" msgstr "Fête de la famille" -#. Thanksgiving. -msgid "Thanksgiving" +#. Thanksgiving Day. +msgid "Thanksgiving Day" msgstr "Action de grâce" #. Funeral of Queen Elizabeth II. @@ -140,3 +140,11 @@ msgstr "Fête nationale du Québec" #. Saskatchewan Day. msgid "Saskatchewan Day" msgstr "Jour du Saskatchewan" + +#. Orangemen's Day. +msgid "Orangemen's Day" +msgstr "Journée des Orangistes" + +#. Natal Day. +msgid "Natal Day" +msgstr "Jour de la Fondation" diff --git a/holidays/locale/th/LC_MESSAGES/CA.po b/holidays/locale/th/LC_MESSAGES/CA.po index 9b8d78700..d0bdfe823 100644 --- a/holidays/locale/th/LC_MESSAGES/CA.po +++ b/holidays/locale/th/LC_MESSAGES/CA.po @@ -3,16 +3,18 @@ # msgid "" msgstr "" -"Project-Id-Version: Python Holidays 0.25\n" +"Project-Id-Version: Python Holidays 0.32\n" "POT-Creation-Date: 2023-02-24 17:37+0700\n" -"PO-Revision-Date: 2023-02-24 17:37+0700\n" -"Last-Translator: PPsyrius \n" +"PO-Revision-Date: 2023-08-26 18:27+0300\n" +"Last-Translator: ~Jhellico \n" "Language-Team: Python Holidays localization team\n" "Language: th\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" "Generated-By: pygettext.py 1.5\n" +"X-Generator: Poedit 3.2.2\n" #. New Year's Day. msgid "New Year's Day" @@ -119,8 +121,8 @@ msgstr "พระราชพิธีพระบรมศพของสมเ msgid "National Day for Truth and Reconciliation" msgstr "วันชาติแห่งความจริงและการปรองดอง" -#. Thanksgiving. -msgid "Thanksgiving" +#. Thanksgiving Day. +msgid "Thanksgiving Day" msgstr "วันขอบคุณพระเจ้า" #. Remembrance Day. @@ -138,3 +140,11 @@ msgstr "วันเปิดกล่องของขวัญ" #. Terry Fox Day. msgid "Terry Fox Day" msgstr "วันเทร์รี ฟอกซ์" + +#. Orangemen's Day. +msgid "Orangemen's Day" +msgstr "วันออเรนจ์เมนส์" + +#. Natal Day. +msgid "Natal Day" +msgstr "วันสถาปนา" diff --git a/tests/countries/test_canada.py b/tests/countries/test_canada.py index 226f929f1..079abc9e5 100644 --- a/tests/countries/test_canada.py +++ b/tests/countries/test_canada.py @@ -9,6 +9,7 @@ # Website: https://github.com/dr-prodigy/python-holidays # License: MIT (see LICENSE file) +from holidays.constants import GOVERNMENT, OPTIONAL from holidays.countries.canada import Canada, CA, CAN from tests.common import TestCase @@ -16,118 +17,49 @@ class TestCanada(TestCase): @classmethod def setUpClass(cls): - years = range(1900, 2050) - super().setUpClass(Canada, years=years) + years = range(1867, 2050) + super().setUpClass(Canada, years=years, years_non_observed=(range(2000, 2024))) cls.prov_hols = {prov: CA(subdiv=prov, years=years) for prov in CA.subdivisions} + cls.gov_hols = CA(years=years, categories=(GOVERNMENT,)) + cls.prov_opt_hols = { + prov: CA(subdiv=prov, years=years, categories=(OPTIONAL,)) for prov in CA.subdivisions + } def test_country_aliases(self): self.assertCountryAliases(Canada, CA, CAN) def test_no_holidays(self): self.assertNoHolidays(Canada(years=1866)) + self.assertNoHolidays(Canada(years=1866, categories=(GOVERNMENT,))) + self.assertNoHolidays(Canada(years=1866, categories=(OPTIONAL,))) - def test_new_years(self): - self.assertHoliday(f"{year}-01-01" for year in range(1900, 2050)) - self.assertHoliday("2011-01-03", "2017-01-02") - self.assertNoNonObservedHoliday("2011-01-03", "2017-01-02") - - def test_islander_day(self): - dt = ( - "2010-02-15", - "2011-02-21", - "2012-02-20", - "2013-02-18", - "2014-02-17", - "2015-02-16", - "2016-02-15", - "2020-02-17", - ) - self.assertHoliday(self.prov_hols["PE"], dt, "2009-02-09") - for d in dt: - self.assertNotEqual(self.holidays[d], "Islander Day") - - def test_yukon_heritage_day(self): - # https://www.timeanddate.com/holidays/canada/heritage-day-yukon - dt = ( - "2017-02-24", - "2018-02-23", - "2019-02-22", - "2020-02-21", - "2021-02-26", - "2022-02-25", - ) - self.assertHoliday(self.prov_hols["YT"], dt) - - def test_family_day(self): - ab_holidays = self.prov_hols["AB"] - bc_holidays = self.prov_hols["BC"] - mb_holidays = self.prov_hols["MB"] - sk_holidays = self.prov_hols["SK"] - nb_holidays = self.prov_hols["NB"] - ns_holidays = self.prov_hols["NS"] - dt = ( - "1990-02-19", - "1999-02-15", - "2000-02-21", - "2006-02-20", + def test_new_years_day(self): + name = "New Year's Day" + name_observed = f"{name} (Observed)" + self.assertHolidayName(name, (f"{year}-01-01" for year in range(1867, 2050))) + self.assertHolidayName( + name, self.gov_hols, (f"{year}-01-01" for year in range(1867, 2050)) ) - self.assertNoHoliday(dt) - self.assertHoliday(ab_holidays, dt) - self.assertNoHoliday(bc_holidays, dt) - self.assertNoHoliday(mb_holidays, dt) - self.assertNoHoliday(sk_holidays, dt) - d = "2007-02-19" - self.assertNoHoliday(d) - self.assertHoliday(ab_holidays, d) - self.assertNoHoliday(bc_holidays, d) - self.assertNoHoliday(mb_holidays, d) - self.assertHoliday(sk_holidays, d) - dt = ( - "2008-02-18", - "2012-02-20", - "2014-02-17", - "2018-02-19", + for _, holidays in self.prov_hols.items(): + self.assertHolidayName(name, holidays, (f"{year}-01-01" for year in range(1867, 2050))) + + dts = ( + "2011-01-03", + "2012-01-02", + "2017-01-02", + "2022-01-03", + "2023-01-02", ) - self.assertHoliday(dt) - self.assertHoliday(ab_holidays, dt) - self.assertNoHoliday(bc_holidays, dt) - self.assertHoliday(mb_holidays, dt) - self.assertHoliday(sk_holidays, dt) - self.assertHoliday(nb_holidays, "2018-02-19") - dt = ("2019-02-18", "2020-02-17") - self.assertHoliday(dt) - self.assertHoliday(ab_holidays, dt) - self.assertHoliday(bc_holidays, dt) - self.assertHoliday(mb_holidays, dt) - self.assertHoliday(sk_holidays, dt) - dt = ("2013-02-11", "2016-02-08") - self.assertNoHoliday(dt) - self.assertNoHoliday(ab_holidays, dt) - self.assertHoliday(bc_holidays, dt) - self.assertNoHoliday(mb_holidays, dt) - self.assertNoHoliday(sk_holidays, dt) - self.assertHolidayName("Louis Riel Day", mb_holidays, "2014-02-17") - self.assertHolidayName("Heritage Day", ns_holidays, "2015-02-16") - - def test_st_patricks_day(self): - nl_holidays = self.prov_hols["NL"] - dt = ( - "1900-03-19", - "1999-03-15", - "2000-03-20", - "2012-03-19", - "2013-03-18", - "2014-03-17", - "2015-03-16", - "2016-03-14", - "2020-03-16", - ) - self.assertNoHoliday(dt) - self.assertHoliday(nl_holidays, dt) - self.assertNoHoliday(nl_holidays, "1899-03-20") + self.assertHolidayName(name_observed, dts) + self.assertHolidayName(name_observed, self.gov_hols, dts) + for prov, holidays in self.prov_hols.items(): + self.assertHolidayName(name_observed, holidays, dts) + self.assertNoNonObservedHoliday(CA(subdiv=prov, observed=False), dts) + self.assertNoNonObservedHoliday(dts) def test_good_friday(self): - self.assertHoliday( + name = "Good Friday" + dts = ( "1900-04-13", "1901-04-05", "1902-03-28", @@ -137,118 +69,436 @@ def test_good_friday(self): "2018-03-30", "2019-04-19", "2020-04-10", + "2021-04-02", + "2022-04-15", + "2023-04-07", ) + self.assertHolidayName(name, dts) + self.assertHolidayName(name, range(1867, 2050)) + self.assertHolidayName(name, self.gov_hols, dts) + self.assertHolidayName(name, self.gov_hols, range(1867, 2050)) + for _, holidays in self.prov_hols.items(): + self.assertHolidayName(name, holidays, dts) + self.assertHolidayName(name, holidays, range(1867, 2050)) - def test_easter_monday(self): - self.assertHoliday( - "1900-04-16", - "1901-04-08", - "1902-03-31", - "1999-04-05", - "2000-04-24", - "2010-04-05", - "2018-04-02", - "2019-04-22", - "2020-04-13", + def test_canada_day(self): + name_1 = "Dominion Day" + name_2 = "Canada Day" + self.assertHolidayName(name_1, (f"{year}-07-01" for year in range(1879, 1983))) + self.assertHolidayName(name_2, (f"{year}-07-01" for year in range(1983, 2050))) + self.assertNoHolidayName(name_1, range(1867, 1879), range(1983, 2050)) + self.assertNoHolidayName(name_2, range(1867, 1983)) + self.assertNoHoliday(f"{year}-07-01" for year in range(1867, 1879)) + + dts_sat = ( + "2000-07-03", + "2006-07-03", + "2017-07-03", + "2023-07-03", + ) + dts_sun = ( + "2001-07-02", + "2007-07-02", + "2012-07-02", + "2018-07-02", + ) + name_observed = f"{name_2} (Observed)" + self.assertNoHoliday(dts_sat, dts_sun) + self.assertHolidayName(name_observed, self.gov_hols, dts_sat, dts_sun) + self.assertNoNonObservedHoliday( + CA(observed=False, categories=(GOVERNMENT,)), dts_sat, dts_sun + ) + for prov, holidays in self.prov_hols.items(): + if prov in {"AB", "BC", "QC"}: + self.assertHolidayName(name_observed, self.prov_hols[prov], dts_sun) + self.assertNoHoliday(self.prov_hols[prov], dts_sat) + elif prov in {"NL", "PE", "SK", "YT"}: + self.assertHoliday(self.prov_hols[prov], dts_sat, dts_sun) + else: + self.assertNoHoliday(self.prov_hols[prov], dts_sat, dts_sun) + self.assertNoNonObservedHoliday(CA(subdiv=prov, observed=False), dts_sat, dts_sun) + + def test_labour_day(self): + name = "Labour Day" + self.assertNoHolidayName(name, range(1867, 1894)) + self.assertHolidayName(name, range(1894, 2050)) + self.assertNoHolidayName(name, self.gov_hols, range(1867, 1894)) + self.assertHolidayName(name, self.gov_hols, range(1894, 2050)) + + dts = ( + "1894-09-03", + "1900-09-03", + "1999-09-06", + "2000-09-04", + "2014-09-01", + "2015-09-07", + "2018-09-03", + "2019-09-02", + "2020-09-07", + "2021-09-06", + "2022-09-05", + "2023-09-04", ) + self.assertHolidayName(name, dts) + self.assertHolidayName(name, self.gov_hols, dts) + for _, holidays in self.prov_hols.items(): + self.assertHolidayName(name, holidays, dts) + self.assertHolidayName(name, holidays, range(1894, 2050)) + self.assertNoHolidayName(name, holidays, range(1867, 1894)) - def test_st_georges_day(self): - dt = ( - "1990-04-23", - "1999-04-26", - "2010-04-19", - "2016-04-25", - "2020-04-20", + def test_christmas_day(self): + name = "Christmas Day" + name_observed = f"{name} (Observed)" + self.assertHolidayName(name, (f"{year}-12-25" for year in range(1867, 2050))) + for _, holidays in self.prov_hols.items(): + self.assertHolidayName(name, holidays, (f"{year}-12-25" for year in range(1867, 2050))) + + dts_sat = ( + "2004-12-27", + "2010-12-27", + "2021-12-27", + ) + dts_sun_without_boxing = ( + "2005-12-26", + "2011-12-26", + "2016-12-26", + "2022-12-26", + ) + dts_sun_with_boxing = ( + "2005-12-27", + "2011-12-27", + "2016-12-27", + "2022-12-27", + ) + self.assertHolidayName(name_observed, dts_sat, dts_sun_without_boxing) + self.assertNoHoliday(dts_sun_with_boxing) + self.assertNoNonObservedHoliday(dts_sat, dts_sun_with_boxing, dts_sun_without_boxing) + self.assertHolidayName(name_observed, self.gov_hols, dts_sat, dts_sun_with_boxing) + self.assertNoNonObservedHoliday( + CA(observed=False, categories=(GOVERNMENT,)), + dts_sat, + dts_sun_with_boxing, + ) + self.assertHolidayName( + name_observed, CA(categories=(OPTIONAL,)), dts_sat, dts_sun_with_boxing + ) + self.assertNoNonObservedHoliday( + CA(observed=False, categories=(OPTIONAL,)), + dts_sat, + dts_sun_with_boxing, ) - self.assertNoHoliday(dt) - self.assertHoliday(self.prov_hols["NL"], dt) + for prov, holidays in self.prov_hols.items(): + self.assertHolidayName(name_observed, holidays, dts_sat, dts_sun_without_boxing) + self.assertNoHoliday(holidays, dts_sun_with_boxing) + self.assertNoNonObservedHoliday( + CA(subdiv=prov, observed=False), + dts_sat, + dts_sun_with_boxing, + ) def test_victoria_day(self): - dt = ("1953-05-18", "1999-05-24", "2000-05-22") - self.assertHoliday(dt) + name = "Victoria Day" + dts = ( + "1953-05-18", + "2000-05-22", + "2010-05-24", + "2018-05-21", + "2019-05-20", + "2020-05-18", + "2021-05-24", + "2022-05-23", + "2023-05-22", + ) + self.assertNoHolidayName(name) + self.assertHolidayName(name, self.gov_hols, dts) + self.assertHolidayName(name, self.gov_hols, range(1953, 2050)) + self.assertNoHolidayName(name, self.gov_hols, range(1867, 1953)) + for prov, holidays in self.prov_hols.items(): - if prov in {"NL", "NS", "PE", "QC"}: - self.assertNoHoliday(holidays, dt) + if prov in {"AB", "BC", "MB", "NT", "NU", "ON", "SK", "YT"}: + self.assertHolidayName(name, holidays, dts) + self.assertHolidayName(name, holidays, range(1953, 2050)) + self.assertNoHolidayName(name, holidays, range(1867, 1953)) else: - self.assertHoliday(holidays, dt) + self.assertNoHolidayName(name, holidays) + + def test_national_day_for_truth_and_reconciliation(self): + name = "National Day for Truth and Reconciliation" + name_observed = f"{name} (Observed)" + self.assertNoHolidayName(name) + self.assertHolidayName( + name, self.gov_hols, (f"{year}-09-30" for year in range(2021, 2050)) + ) + self.assertNoHolidayName(name, self.gov_hols, range(1867, 2021)) - dt = ("2010-05-24", "2015-05-18", "2020-05-18") - self.assertHoliday(dt) + dts = ( + "2023-10-02", + "2028-10-02", + "2029-10-01", + ) + self.assertHolidayName(name_observed, self.gov_hols, dts) + self.assertNoNonObservedHoliday(CA(observed=False, categories=(GOVERNMENT,)), dts) + + start_years = { + "AB": 2021, + "BC": 2023, + "NT": 2022, + "NU": 2022, + "PE": 2022, + "YT": 2023, + } for prov, holidays in self.prov_hols.items(): - if prov in {"NL", "NS", "PE"}: - self.assertNoHoliday(holidays, dt) + if prov in {"BC", "NT", "NU", "PE", "YT"}: + self.assertHolidayName( + name, holidays, (f"{year}-09-30" for year in range(start_years[prov], 2050)) + ) + self.assertNoHolidayName(name, holidays, range(1867, start_years[prov])) else: - self.assertHoliday(holidays, dt) + self.assertNoHolidayName(name, holidays) + self.assertNoNonObservedHoliday(CA(subdiv=prov, observed=False), dts) - def test_national_patriots_day(self): self.assertHolidayName( - "National Patriots' Day", - self.prov_hols["QC"], - "2010-05-24", - "2015-05-18", - "2020-05-18", - "2021-05-24", - "2022-05-23", + name, + CA(subdiv="AB", categories=(OPTIONAL,)), + (f"{year}-09-30" for year in range(2021, 2050)), ) - def test_national_aboriginal_day(self): - nt_holidays = self.prov_hols["NT"] - self.assertNoHoliday(nt_holidays, "1995-06-21") - self.assertNoHoliday(f"{year}-06-21" for year in range(1996, 2050)) - self.assertHoliday(nt_holidays, (f"{year}-06-21" for year in range(1996, 2050))) + def test_thanksgiving_day(self): + name = "Thanksgiving Day" + self.assertNoHolidayName(name) + self.assertHolidayName(name, self.gov_hols, range(1931, 2050)) + self.assertNoHolidayName(name, self.gov_hols, range(1867, 1931)) - def test_st_jean_baptiste_day(self): - qc_holidays = self.prov_hols["QC"] - self.assertNoHoliday(qc_holidays, "1924-06-24") - self.assertNoHoliday(f"{year}-06-24" for year in range(1925, 2050)) - self.assertHoliday(qc_holidays, (f"{year}-06-24" for year in range(1925, 2050))) - self.assertHoliday(qc_holidays, "2001-06-25") - self.assertNoNonObservedHoliday(Canada(subdiv="QC", observed=False), "2001-06-25") + dts = ( + "1931-10-12", + "1935-10-25", + "1990-10-08", + "1999-10-11", + "2000-10-09", + "2013-10-14", + "2018-10-08", + "2019-10-14", + "2020-10-12", + "2021-10-11", + "2022-10-10", + "2023-10-09", + ) + self.assertHolidayName(name, self.gov_hols, dts) + for prov, holidays in self.prov_hols.items(): + if prov in {"AB", "BC", "MB", "NT", "NU", "ON", "QC", "SK", "YT"}: + self.assertHolidayName(name, holidays, dts) + self.assertHolidayName(name, holidays, range(1931, 2050)) + self.assertNoHolidayName(name, holidays, range(1867, 1931)) + else: + self.assertNoHolidayName(name, holidays, dts) - def test_discovery_day(self): - nl_holidays = self.prov_hols["NL"] - yt_holidays = self.prov_hols["YT"] - dt = ( - "1997-06-23", - "1999-06-21", - "2000-06-26", - "2010-06-21", - "2016-06-27", - "2020-06-22", + for prov in ("NB", "NL"): + self.assertHolidayName(name, CA(subdiv=prov, categories=(OPTIONAL,)), dts) + + def test_remembrance_day(self): + name = "Remembrance Day" + name_observed = f"{name} (Observed)" + self.assertNoHolidayName(name) + self.assertHolidayName( + name, self.gov_hols, (f"{year}-11-11" for year in range(1931, 2050)) + ) + self.assertNoHoliday(self.gov_hols, (f"{year}-11-11" for year in range(1900, 1931))) + self.assertNoHolidayName(name, self.gov_hols, range(1900, 1931)) + + dts = ( + "2006-11-13", + "2007-11-12", + "2012-11-12", + "2017-11-13", + "2018-11-12", + "2023-11-13", ) - self.assertNoHoliday(dt) - self.assertHoliday(nl_holidays, dt) - self.assertNoHoliday(yt_holidays, dt) + self.assertHolidayName(name_observed, self.gov_hols, dts) + self.assertNoNonObservedHoliday(CA(observed=False, categories=(GOVERNMENT,)), dts) - dt = ( - "1912-08-19", - "1999-08-16", - "2000-08-21", - "2006-08-21", - "2016-08-15", - "2020-08-17", + for prov, holidays in self.prov_hols.items(): + if prov in {"AB", "BC", "NB", "NL", "NS", "NT", "NU", "PE", "SK", "YT"}: + start_year = 1981 if prov == "NS" else 1931 + self.assertHolidayName( + name, holidays, (f"{year}-11-11" for year in range(start_year, 2050)) + ) + self.assertNoHoliday( + holidays, (f"{year}-11-11" for year in range(1900, start_year)) + ) + self.assertNoHolidayName(name, holidays, range(1900, start_year)) + else: + self.assertNoHolidayName(name, holidays) + + if prov in {"AB", "NL", "NS", "PE", "SK", "YT"}: + self.assertHolidayName(name_observed, self.prov_hols[prov], dts) + self.assertNoNonObservedHoliday(CA(subdiv=prov, observed=False), dts) + else: + self.assertNoHoliday(holidays, dts) + + self.assertHolidayName( + name, + CA(subdiv="MB", categories=(OPTIONAL,)), + (f"{year}-11-11" for year in range(1931, 2050)), ) - self.assertNoHoliday(dt) - self.assertNoHoliday(nl_holidays, dt) - self.assertHoliday(yt_holidays, dt) - def test_canada_day(self): - self.assertHoliday(f"{year}-07-01" for year in range(1900, 2050)) - self.assertHoliday("2006-07-03", "2007-07-02") - self.assertNoNonObservedHoliday("2006-07-03", "2007-07-02") + def test_boxing_day(self): + name = "Boxing Day" + name_observed = f"{name} (Observed)" + self.assertNoHolidayName(name) + self.assertHolidayName( + name, self.gov_hols, (f"{year}-12-26" for year in range(1867, 2050)) + ) - def test_nunavut_day(self): - nu_holidays = self.prov_hols["NU"] - self.assertNoHoliday(nu_holidays, "1999-07-09", "2000-07-09") - self.assertHoliday(nu_holidays, "2000-04-01") - self.assertNoHoliday(f"{year}-07-09" for year in range(2001, 2050)) - self.assertHoliday(nu_holidays, (f"{year}-07-09" for year in range(2001, 2050))) - self.assertHoliday(nu_holidays, "2017-07-10") - self.assertNoNonObservedHoliday(Canada(subdiv="NU", observed=False), "2017-07-10") + opt_holidays = CA(years=range(1867, 2050), categories=(OPTIONAL,)) + self.assertHolidayName(name, opt_holidays, (f"{year}-12-26" for year in range(1867, 2050))) + + dts = ( + "2004-12-28", + "2009-12-28", + "2010-12-28", + "2015-12-28", + "2020-12-28", + "2021-12-28", + ) + self.assertHolidayName(name_observed, opt_holidays, dts) + self.assertNoNonObservedHoliday(CA(observed=False, categories=(OPTIONAL,)), dts) + + dts = ( + "2004-12-28", + "2010-12-28", + "2021-12-28", + ) + self.assertHolidayName(name_observed, self.prov_hols["ON"], dts) + self.assertNoNonObservedHoliday(CA(subdiv="ON", observed=False), dts) + + for prov in ("AB", "NB", "NL"): + self.assertHolidayName( + name, + CA(subdiv=prov, categories=(OPTIONAL,)), + (f"{year}-12-26" for year in range(1867, 2050)), + ) + + def test_family_day(self): + start_years = { + "AB": 1990, + "BC": 2019, + "MB": 2008, + "NB": 2018, + "NS": 2015, + "ON": 2008, + "PE": 2010, + "SK": 2007, + } + dts = ( + "1990-02-19", + "1991-02-18", + "1992-02-17", + "1993-02-15", + "1994-02-21", + "1995-02-20", + "1996-02-19", + "1997-02-17", + "1998-02-16", + "1999-02-15", + "2000-02-21", + "2001-02-19", + "2002-02-18", + "2003-02-17", + "2004-02-16", + "2005-02-21", + "2006-02-20", + "2007-02-19", + "2008-02-18", + "2009-02-16", + "2010-02-15", + "2011-02-21", + "2012-02-20", + "2013-02-18", + "2014-02-17", + "2015-02-16", + "2016-02-15", + "2017-02-20", + "2018-02-19", + "2019-02-18", + "2020-02-17", + "2021-02-15", + "2022-02-21", + "2023-02-20", + ) + prov_names = { + "MB": "Louis Riel Day", + "NS": "Heritage Day", + "PE": "Islander Day", + } + for prov, holidays in self.prov_hols.items(): + name = prov_names.get(prov, "Family Day") + for year, dt in enumerate(dts, 1990): + if prov in start_years and year >= start_years[prov]: + self.assertHolidayName(name, holidays, dt) + else: + self.assertNoHoliday(holidays, dt) + self.assertNoHoliday(dts) + self.assertNoHolidayName("Family Day") + for name in prov_names.values(): + self.assertNoHolidayName(name) + + self.assertHoliday( + self.prov_hols["BC"], + "2013-02-11", + "2014-02-10", + "2015-02-09", + "2016-02-08", + "2017-02-13", + "2018-02-12", + ) + self.assertHoliday(self.prov_hols["PE"], "2009-02-09") + + def test_easter_monday(self): + name = "Easter Monday" + dts = ( + "1900-04-16", + "1901-04-08", + "1902-03-31", + "1999-04-05", + "2000-04-24", + "2010-04-05", + "2018-04-02", + "2019-04-22", + "2020-04-13", + ) + self.assertNoHoliday(dts) + self.assertNoHolidayName(name) + self.assertNoHoliday(self.gov_hols, dts) + self.assertNoHolidayName(name, self.gov_hols) + + for prov, holidays in self.prov_hols.items(): + self.assertNoHoliday(holidays, dts) + self.assertNoHolidayName(name, holidays) + + if prov in {"AB", "QC"}: + self.assertHolidayName(name, CA(subdiv=prov, categories=(OPTIONAL,)), dts) + + def test_civic_holiday_ab(self): + name = "Heritage Day" + self.assertNoHolidayName(name, self.prov_hols["AB"]) + ab_opt_holidays = CA(subdiv="AB", categories=(OPTIONAL,)) + dts = ( + "1974-08-05", + "1999-08-02", + "2000-08-07", + "2010-08-02", + "2015-08-03", + "2020-08-03", + ) + self.assertNoHoliday(dts) + self.assertNoHolidayName(name) + self.assertHoliday(ab_opt_holidays, dts) + self.assertNoHoliday(ab_opt_holidays, "1973-08-06") def test_civic_holiday_bc(self): + name = "British Columbia Day" bc_holidays = self.prov_hols["BC"] - dt = ( + dts = ( "1974-08-05", "1999-08-02", "2000-08-07", @@ -256,12 +506,19 @@ def test_civic_holiday_bc(self): "2015-08-03", "2020-08-03", ) - self.assertHoliday(bc_holidays, dt) + self.assertNoHoliday(dts) + self.assertNoHolidayName(name) + self.assertHolidayName(name, bc_holidays, dts) self.assertNoHoliday(bc_holidays, "1973-08-06") def test_civic_holiday_mb(self): - mb_holidays = self.prov_hols["MB"] - dt = ( + old_name = "Civic Holiday" + new_name = "Terry Fox Day" + self.assertNoHolidayName(old_name, self.prov_hols["MB"]) + self.assertNoHolidayName(new_name, self.prov_hols["MB"]) + + mb_opt_holidays = CA(subdiv="MB", categories=(OPTIONAL,)) + dts = ( "1900-08-06", "1999-08-02", "2000-08-07", @@ -269,20 +526,57 @@ def test_civic_holiday_mb(self): "2015-08-03", "2020-08-03", ) - self.assertHoliday(mb_holidays, dt) - self.assertNoHoliday(mb_holidays, "1899-08-07") - old_name = "Civic Holiday" - new_name = "Terry Fox Day" - self.assertHolidayName(old_name, mb_holidays, "2014-08-04") - self.assertHolidayName(new_name, mb_holidays, "2015-08-03") - self.assertNoHolidayName(old_name, mb_holidays, 2015) - self.assertNoHolidayName(new_name, mb_holidays, 2014) - - def test_civic_holiday_nb_nt_sk(self): + self.assertNoHoliday(dts) + self.assertNoHolidayName(old_name) + self.assertNoHolidayName(new_name) + self.assertHoliday(mb_opt_holidays, dts) + self.assertNoHoliday(mb_opt_holidays, "1899-08-07") + self.assertHolidayName(old_name, mb_opt_holidays, "2014-08-04") + self.assertHolidayName(new_name, mb_opt_holidays, "2015-08-03") + self.assertNoHolidayName(old_name, mb_opt_holidays, 2015) + self.assertNoHolidayName(new_name, mb_opt_holidays, 2014) + + def test_civic_holiday_nb(self): + name = "New Brunswick Day" nb_holidays = self.prov_hols["NB"] + dts = ( + "1975-08-04", + "1999-08-02", + "2000-08-07", + "2010-08-02", + "2015-08-03", + "2020-08-03", + ) + self.assertNoHoliday(dts) + self.assertNoHolidayName(name) + self.assertHolidayName(name, nb_holidays, dts) + self.assertNoHoliday(nb_holidays, "1974-08-05") + self.assertNoHolidayName(name, nb_holidays, range(1867, 1975)) + + def test_civic_holiday_ns(self): + name = "Natal Day" + self.assertNoHolidayName(name, self.prov_hols["NS"]) + ns_opt_holidays = CA(subdiv="NS", categories=(OPTIONAL,)) + dts = ( + "1996-08-05", + "1999-08-02", + "2000-08-07", + "2010-08-02", + "2015-08-03", + "2020-08-03", + ) + self.assertNoHoliday(dts) + self.assertNoHolidayName(name) + self.assertHoliday(ns_opt_holidays, dts) + self.assertNoHoliday(ns_opt_holidays, "1995-08-07") + + def test_civic_holiday_nt_nu_on_sk(self): + name = "Civic Holiday" nt_holidays = self.prov_hols["NT"] + nu_holidays = self.prov_hols["NU"] + on_opt_holidays = CA(subdiv="ON", categories=(OPTIONAL,)) sk_holidays = self.prov_hols["SK"] - dt = ( + dts = ( "1900-08-06", "1999-08-02", "2000-08-07", @@ -290,92 +584,170 @@ def test_civic_holiday_nb_nt_sk(self): "2015-08-03", "2020-08-03", ) - self.assertHoliday(nb_holidays, dt) - self.assertHoliday(nt_holidays, dt) - self.assertHoliday(sk_holidays, dt) - self.assertNoHoliday(nb_holidays, "1899-08-07") + self.assertNoHoliday(dts) + self.assertNoHolidayName(name) + self.assertHolidayName(name, nt_holidays, dts) + self.assertHolidayName(name, nu_holidays, dts) + self.assertHolidayName(name, on_opt_holidays, dts) + self.assertHolidayName("Saskatchewan Day", sk_holidays, dts) self.assertNoHoliday(nt_holidays, "1899-08-07") + self.assertNoHoliday(nu_holidays, "1899-08-07") + self.assertNoHoliday(on_opt_holidays, "1899-08-07") self.assertNoHoliday(sk_holidays, "1899-08-07") - def test_labour_day(self): - self.assertNoHoliday("1893-09-04") - self.assertHoliday( - "1894-09-03", - "1900-09-03", - "1999-09-06", - "2000-09-04", - "2014-09-01", - "2015-09-07", + def test_memorial_day(self): + name = "Memorial Day" + self.assertNoHolidayName(name) + nl_holidays = self.prov_hols["NL"] + self.assertHolidayName(name, nl_holidays, (f"{year}-07-01" for year in range(1917, 2050))) + self.assertNoHolidayName(name, nl_holidays, range(1900, 1917)) + + def test_st_patricks_day(self): + name = "St. Patrick's Day" + self.assertNoHolidayName(name, self.prov_hols["NL"]) + nl_opt_holidays = CA(subdiv="NL", categories=(OPTIONAL,)) + dts = ( + "1900-03-19", + "1999-03-15", + "2000-03-20", + "2012-03-19", + "2013-03-18", + "2014-03-17", + "2015-03-16", + "2016-03-14", + "2020-03-16", ) + self.assertNoHoliday(dts) + self.assertNoHolidayName(name) + self.assertHolidayName(name, nl_opt_holidays, dts) + self.assertNoHoliday(nl_opt_holidays, "1899-03-20") - def test_national_day_for_truth_and_reconciliation(self): - bc_holidays = self.prov_hols["BC"] - mb_holidays = self.prov_hols["MB"] - ns_holidays = self.prov_hols["NS"] - - dt = ("1991-09-30", "2020-09-30") - self.assertNoHoliday(dt) - self.assertNoHoliday(mb_holidays, dt) - self.assertNoHoliday(ns_holidays, dt) - - dt = ("2021-09-30", "2022-09-30") - self.assertHoliday(mb_holidays, dt) - self.assertHoliday(ns_holidays, dt) - self.assertNoHoliday(dt) - - dt = ("2023-09-30", "2024-09-30", "2030-09-30") - self.assertHoliday(mb_holidays, dt) - self.assertHoliday(ns_holidays, dt) - self.assertHoliday(bc_holidays, dt) - self.assertNoHoliday(dt) - - def test_thanksgiving(self): - nb_holidays = self.prov_hols["NB"] - nl_holidays = self.prov_hols["NL"] - ns_holidays = self.prov_hols["NS"] - pe_holidays = self.prov_hols["PE"] + def test_st_georges_day(self): + name = "St. George's Day" + self.assertNoHolidayName(name, self.prov_hols["NL"]) + nl_opt_holidays = CA(subdiv="NL", categories=(OPTIONAL,)) + dts = ( + "1990-04-23", + "1999-04-26", + "2010-04-19", + "2016-04-25", + "2020-04-20", + ) + self.assertNoHoliday(dts) + self.assertNoHolidayName(name) + self.assertHolidayName(name, nl_opt_holidays, dts) + self.assertNoHoliday(nl_opt_holidays, "1989-04-24") + + def test_discovery_day_nl(self): + name = "Discovery Day" + self.assertNoHolidayName(name, self.prov_hols["NL"]) + nl_opt_holidays = CA(subdiv="NL", categories=(OPTIONAL,)) + dts = ( + "1997-06-23", + "1999-06-21", + "2000-06-26", + "2010-06-21", + "2016-06-27", + "2020-06-22", + ) + self.assertNoHoliday(dts) + self.assertNoHolidayName(name) + self.assertHoliday(nl_opt_holidays, dts) + self.assertNoHoliday(nl_opt_holidays, "1996-06-24") + + def test_orangemans_day(self): + name = "Orangemen's Day" + self.assertNoHolidayName(name, self.prov_hols["NL"]) + nl_opt_holidays = CA(subdiv="NL", categories=(OPTIONAL,)) + dts = ( + "1900-07-09", + "1999-07-12", + "2000-07-10", + "2010-07-12", + "2016-07-11", + "2020-07-13", + ) + self.assertNoHoliday(dts) + self.assertNoHolidayName(name) + self.assertHoliday(nl_opt_holidays, dts) + self.assertNoHoliday(nl_opt_holidays, "1899-07-10") - dt = ( - "1931-10-12", - "1935-10-25", - "1990-10-08", - "1999-10-11", - "2000-10-09", - "2013-10-14", - "2020-10-12", + def test_discovery_day_yt(self): + name = "Discovery Day" + yt_holidays = self.prov_hols["YT"] + dts = ( + "1912-08-19", + "1999-08-16", + "2000-08-21", + "2006-08-21", + "2016-08-15", + "2020-08-17", ) - self.assertHoliday(dt) - self.assertNoHoliday(nb_holidays, dt) - self.assertNoHoliday(nl_holidays, dt) - self.assertNoHoliday(ns_holidays, dt) - self.assertNoHoliday(pe_holidays, dt) + self.assertNoHoliday(dts) + self.assertNoHolidayName(name) + self.assertHoliday(yt_holidays, dts) + self.assertNoHoliday(yt_holidays, "1911-08-21") - def test_remembrance_day(self): - ab_holidays = self.prov_hols["AB"] - nl_holidays = self.prov_hols["NL"] - self.assertNoHoliday(nl_holidays, "1930-11-11") - self.assertNoHoliday(ab_holidays, "1930-11-11") + def test_national_aboriginal_day(self): + name = "National Aboriginal Day" + nt_holidays = self.prov_hols["NT"] + yt_holidays = self.prov_hols["YT"] + self.assertHolidayName(name, nt_holidays, (f"{year}-06-21" for year in range(1996, 2050))) + self.assertNoHolidayName(nt_holidays, range(1867, 1996)) + self.assertHolidayName(name, yt_holidays, (f"{year}-06-21" for year in range(2017, 2050))) + self.assertNoHolidayName(yt_holidays, range(1867, 2017)) + self.assertNoHoliday(f"{year}-06-21" for year in range(1996, 2050)) + self.assertNoHolidayName(name) - self.assertNoHoliday(f"{year}-11-11" for year in range(1931, 2050)) - self.assertHoliday(ab_holidays, (f"{year}-11-11" for year in range(1931, 2050))) - self.assertHoliday(nl_holidays, (f"{year}-11-11" for year in range(1931, 2050))) + def test_nunavut_day(self): + name = "Nunavut Day" + self.assertNoHolidayName(name) + self.assertNoHoliday(f"{year}-07-09" for year in range(2001, 2050)) + self.assertNoHolidayName(name, self.prov_hols["NU"]) + nu_opt_holidays = CA(subdiv="NU", categories=(OPTIONAL,)) + self.assertNoHoliday(nu_opt_holidays, "1999-07-09", "2000-07-09") + self.assertHoliday(nu_opt_holidays, "2000-04-01") + self.assertHoliday(nu_opt_holidays, (f"{year}-07-09" for year in range(2001, 2050))) - self.assertNoHoliday(ab_holidays, "2007-11-12") - self.assertHoliday(nl_holidays, "2007-11-12") - self.assertNoNonObservedHoliday(Canada(subdiv="AB", observed=False), "2007-11-12") - self.assertNoNonObservedHoliday(Canada(subdiv="NL", observed=False), "2007-11-12") + def test_national_patriots_day(self): + name = "National Patriots' Day" + self.assertNoHolidayName(name) + qc_holidays = self.prov_hols["QC"] + self.assertHolidayName( + name, + qc_holidays, + "2010-05-24", + "2015-05-18", + "2020-05-18", + "2021-05-24", + "2022-05-23", + ) + self.assertNoHolidayName(name, qc_holidays, range(1867, 2003)) - def test_christmas_day(self): - self.assertHoliday(f"{year}-12-25" for year in range(1900, 2050)) - self.assertHoliday("2010-12-27", "2011-12-27") - self.assertNoNonObservedHoliday("2010-12-27", "2011-12-27") - self.assertNotIn("Christmas Day (Observed)", self.holidays["2011-12-26"]) - self.assertHolidayName("Christmas Day (Observed)", "2011-12-27") + def test_st_jean_baptiste_day(self): + name = "St. Jean Baptiste Day" + self.assertNoHolidayName(name) + qc_holidays = self.prov_hols["QC"] + self.assertHoliday(qc_holidays, (f"{year}-06-24" for year in range(1925, 2050))) + self.assertNoHoliday(qc_holidays, (f"{year}-06-24" for year in range(1867, 1925))) + self.assertNoHoliday(f"{year}-06-24" for year in range(1925, 2050)) + self.assertHoliday(qc_holidays, "2001-06-25") + self.assertNoNonObservedHoliday(Canada(subdiv="QC", observed=False), "2001-06-25") - def test_boxing_day(self): - self.assertHoliday(f"{year}-12-26" for year in range(1900, 2050)) - self.assertHoliday("2009-12-28", "2010-12-27") - self.assertNoNonObservedHoliday("2009-12-28", "2010-12-27") + def test_yukon_heritage_day(self): + name = "Heritage Day" + self.assertNoHolidayName(name) + self.assertNoHolidayName(name, self.prov_hols["YT"]) + yt_opt_holidays = CA(subdiv="YT", categories=(OPTIONAL,)) + dts = ( + "2017-02-24", + "2018-02-23", + "2019-02-22", + "2020-02-21", + "2021-02-26", + "2022-02-25", + ) + self.assertHolidayName(name, yt_opt_holidays, dts) def test_queens_funeral(self): for prov, holidays in self.prov_hols.items(): @@ -384,20 +756,94 @@ def test_queens_funeral(self): else: self.assertNoHoliday(holidays, "2022-09-19") + def test_public_2022(self): + self.assertHolidays( + Canada(years=2022), + ("2022-01-01", "New Year's Day"), + ("2022-01-03", "New Year's Day (Observed)"), + ("2022-04-15", "Good Friday"), + ("2022-07-01", "Canada Day"), + ("2022-09-05", "Labour Day"), + ("2022-12-25", "Christmas Day"), + ("2022-12-26", "Christmas Day (Observed)"), + ) + + def test_government_2022(self): + self.assertHolidays( + Canada(years=2022, categories=(GOVERNMENT,)), + ("2022-01-01", "New Year's Day"), + ("2022-01-03", "New Year's Day (Observed)"), + ("2022-04-15", "Good Friday"), + ("2022-05-23", "Victoria Day"), + ("2022-07-01", "Canada Day"), + ("2022-09-05", "Labour Day"), + ("2022-09-30", "National Day for Truth and Reconciliation"), + ("2022-10-10", "Thanksgiving Day"), + ("2022-11-11", "Remembrance Day"), + ("2022-12-25", "Christmas Day"), + ("2022-12-26", "Boxing Day"), + ("2022-12-27", "Christmas Day (Observed)"), + ) + + def test_optional_2022(self): + self.assertHolidays( + Canada(years=2022, categories=(OPTIONAL,)), + ("2022-12-25", "Christmas Day"), + ("2022-12-26", "Boxing Day"), + ("2022-12-27", "Christmas Day (Observed)"), + ) + + def test_all_holidays_present(self): + y_2022 = set() + for prov in Canada.subdivisions: + y_2022.update(Canada(years=2022, subdiv=prov, observed=False).values()) + all_h = { # Holidays names in their chronological order. + "New Year's Day", + "Family Day", + "Heritage Day", + "Islander Day", + "Louis Riel Day", + "Good Friday", + "National Patriots' Day", + "Victoria Day", + "National Aboriginal Day", + "St. Jean Baptiste Day", + "Canada Day", + "Canada Day; Memorial Day", + "British Columbia Day", + "Civic Holiday", + "New Brunswick Day", + "Saskatchewan Day", + "Discovery Day", + "Labour Day", + "Funeral of Her Majesty the Queen Elizabeth II", + "National Day for Truth and Reconciliation", + "Thanksgiving Day", + "Remembrance Day", + "Christmas Day", + "Boxing Day", + } + + self.assertEqual( + all_h, + y_2022, + f"missing: {all_h - y_2022 if len(all_h - y_2022) > 0 else 'no'}," + f" extra: {y_2022 - all_h if len(y_2022 - all_h) > 0 else 'no'}", + ) + def test_l10n_default(self): self.assertLocalizedHolidays( ("2022-01-01", "New Year's Day"), ("2022-01-03", "New Year's Day (Observed)"), - ("2022-02-21", "Family Day"), ("2022-04-15", "Good Friday"), - ("2022-04-18", "Easter Monday"), ("2022-05-23", "Victoria Day"), ("2022-07-01", "Canada Day"), - ("2022-08-01", "Civic Holiday"), ("2022-09-05", "Labour Day"), - ("2022-10-10", "Thanksgiving"), + ("2022-09-30", "National Day for Truth and Reconciliation"), + ("2022-10-10", "Thanksgiving Day"), + ("2022-11-11", "Remembrance Day"), ("2022-12-25", "Christmas Day"), - ("2022-12-26", "Boxing Day"), + ("2022-12-26", "Boxing Day; Christmas Day (Observed)"), ("2022-12-27", "Christmas Day (Observed)"), ) @@ -406,16 +852,15 @@ def test_l10n_ar(self): "ar", ("2022-01-01", "يوم السنة الجديدة"), ("2022-01-03", "(تمت ملاحظته) يوم السنة الجديدة"), - ("2022-02-21", "يوم العائلة"), ("2022-04-15", "جمعة جيدة"), - ("2022-04-18", "عيد الفصح الاثنين"), ("2022-05-23", "يوم فيكتوريا"), ("2022-07-01", "يوم كندا"), - ("2022-08-01", "عطلة المدنية"), ("2022-09-05", "عيد العمال"), + ("2022-09-30", "اليوم الوطني للحقيقة والمصالحة"), ("2022-10-10", "عيد الشكر"), + ("2022-11-11", "يوم الذكرى"), ("2022-12-25", "عيد الميلاد"), - ("2022-12-26", "يوم الملاكمة"), + ("2022-12-26", "(تمت ملاحظته) عيد الميلاد; يوم الملاكمة"), ("2022-12-27", "(تمت ملاحظته) عيد الميلاد"), ) @@ -424,16 +869,15 @@ def test_l10n_fr(self): "fr", ("2022-01-01", "Jour de l'an"), ("2022-01-03", "Jour de l'an (Observé)"), - ("2022-02-21", "Fête de la famille"), ("2022-04-15", "Vendredi saint"), - ("2022-04-18", "Lundi de Pâques"), ("2022-05-23", "Fête de la Reine"), ("2022-07-01", "Fête du Canada"), - ("2022-08-01", "Premier lundi d'août"), ("2022-09-05", "Fête du Travail"), + ("2022-09-30", "Journée nationale de la vérité et de la réconciliation"), ("2022-10-10", "Action de grâce"), + ("2022-11-11", "Jour du Souvenir"), ("2022-12-25", "Jour de Noël"), - ("2022-12-26", "Boxing Day"), + ("2022-12-26", "Boxing Day; Jour de Noël (Observé)"), ("2022-12-27", "Jour de Noël (Observé)"), ) @@ -442,15 +886,14 @@ def test_l10n_th(self): "th", ("2022-01-01", "วันขึ้นปีใหม่"), ("2022-01-03", "ชดเชยวันขึ้นปีใหม่"), - ("2022-02-21", "วันครอบครัว"), ("2022-04-15", "วันศุกร์ประเสริฐ"), - ("2022-04-18", "วันจันทร์อีสเตอร์"), ("2022-05-23", "วันวิคตอเรีย"), ("2022-07-01", "วันชาติแคนาดา"), - ("2022-08-01", "วันหยุดราชการ"), ("2022-09-05", "วันแรงงาน"), + ("2022-09-30", "วันชาติแห่งความจริงและการปรองดอง"), ("2022-10-10", "วันขอบคุณพระเจ้า"), + ("2022-11-11", "วันรำลึก"), ("2022-12-25", "วันคริสต์มาส"), - ("2022-12-26", "วันเปิดกล่องของขวัญ"), + ("2022-12-26", "ชดเชยวันคริสต์มาส; วันเปิดกล่องของขวัญ"), ("2022-12-27", "ชดเชยวันคริสต์มาส"), )