From 8938e864d8f861a67c57c5aceed91eef95bd7274 Mon Sep 17 00:00:00 2001 From: ~Jhellico Date: Fri, 17 Nov 2023 17:07:08 +0200 Subject: [PATCH 1/2] Add categories support to special observed holidays --- holidays/holiday_base.py | 29 +++++++++++++++-------------- holidays/observed_holiday_base.py | 7 +++++-- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/holidays/holiday_base.py b/holidays/holiday_base.py index 705403038..3019730a1 100644 --- a/holidays/holiday_base.py +++ b/holidays/holiday_base.py @@ -229,7 +229,7 @@ def _populate(self, year): """Country weekend days.""" default_language: Optional[str] = None """The entity language used by default.""" - categories: Optional[Set[str]] = None + categories: Set[str] = set() """Requested holiday categories.""" supported_categories: Set[str] = set() """All holiday categories supported by this entity.""" @@ -750,28 +750,29 @@ def _populate(self, year: int) -> None: # Populate substituted holidays. self._add_substituted_holidays() - def _add_special_holidays(self): + def _get_special_holidays_names(self): # Check for general special holidays. - special_holidays_mapping_names = ["special_holidays"] + mapping_names = ["special_holidays"] # Check subdivision specific special holidays. if self.subdiv is not None: subdiv = self.subdiv.replace("-", "_").replace(" ", "_").lower() - special_holidays_mapping_names.append(f"special_{subdiv}_holidays") + mapping_names.append(f"special_{subdiv}_holidays") # Check category specific special holidays (both general and per subdivision). for category in sorted(self.categories): - special_holidays_mapping_names.append(f"special_{category}_holidays") + mapping_names.append(f"special_{category}_holidays") if self.subdiv is not None: - special_holidays_mapping_names.append(f"special_{subdiv}_{category}_holidays") - - for mapping_name in special_holidays_mapping_names: - special_holidays_mapping = getattr(self, mapping_name, None) - if special_holidays_mapping: - for month, day, name in _normalize_tuple( - special_holidays_mapping.get(self._year, ()) - ): - self._add_holiday(name, date(self._year, month, day)) + mapping_names.append(f"special_{subdiv}_{category}_holidays") + + return mapping_names + + def _add_special_holidays(self): + for mapping_name in self._get_special_holidays_names(): + for month, day, name in _normalize_tuple( + getattr(self, mapping_name, {}).get(self._year, ()) + ): + self._add_holiday(name, date(self._year, month, day)) def _add_category_holidays(self): for category in sorted(self.categories): diff --git a/holidays/observed_holiday_base.py b/holidays/observed_holiday_base.py index 00979ece6..30f9b2148 100644 --- a/holidays/observed_holiday_base.py +++ b/holidays/observed_holiday_base.py @@ -162,9 +162,12 @@ def _populate_observed(self, dts: Set[date], multiple: bool = False) -> None: def _add_special_holidays(self): super()._add_special_holidays() - if self.observed: + if not self.observed: + return None + + for mapping_name in self._get_special_holidays_names(): for month, day, name in _normalize_tuple( - getattr(self, "special_holidays_observed", {}).get(self._year, ()) + getattr(self, f"{mapping_name}_observed", {}).get(self._year, ()) ): self._add_holiday( self.tr(self.observed_label) % self.tr(name), date(self._year, month, day) From e7e32d60051e831018a27e1633f4674a51d21948 Mon Sep 17 00:00:00 2001 From: ~Jhellico Date: Tue, 28 Nov 2023 18:23:24 +0200 Subject: [PATCH 2/2] PR suggestion --- holidays/holiday_base.py | 4 ++-- holidays/observed_holiday_base.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/holidays/holiday_base.py b/holidays/holiday_base.py index 3019730a1..957d1d872 100644 --- a/holidays/holiday_base.py +++ b/holidays/holiday_base.py @@ -750,7 +750,7 @@ def _populate(self, year: int) -> None: # Populate substituted holidays. self._add_substituted_holidays() - def _get_special_holidays_names(self): + def _get_special_holiday_mapping_names(self): # Check for general special holidays. mapping_names = ["special_holidays"] @@ -768,7 +768,7 @@ def _get_special_holidays_names(self): return mapping_names def _add_special_holidays(self): - for mapping_name in self._get_special_holidays_names(): + for mapping_name in self._get_special_holiday_mapping_names(): for month, day, name in _normalize_tuple( getattr(self, mapping_name, {}).get(self._year, ()) ): diff --git a/holidays/observed_holiday_base.py b/holidays/observed_holiday_base.py index 7edfd690f..80cf9ae12 100644 --- a/holidays/observed_holiday_base.py +++ b/holidays/observed_holiday_base.py @@ -169,7 +169,7 @@ def _add_special_holidays(self): if not self.observed: return None - for mapping_name in self._get_special_holidays_names(): + for mapping_name in self._get_special_holiday_mapping_names(): for month, day, name in _normalize_tuple( getattr(self, f"{mapping_name}_observed", {}).get(self._year, ()) ):