From f14015312a58fec64b3bd67d35396064afbfaf02 Mon Sep 17 00:00:00 2001 From: ~Jhellico Date: Mon, 23 Dec 2024 23:41:25 +0200 Subject: [PATCH] Refactor --- holidays/calendars/hebrew.py | 35 ++++++++- holidays/countries/israel.py | 64 +++++++++------- holidays/groups/hebrew.py | 143 +++++++++++++++++------------------ 3 files changed, 139 insertions(+), 103 deletions(-) diff --git a/holidays/calendars/hebrew.py b/holidays/calendars/hebrew.py index b7f39cee3..b55811ed2 100644 --- a/holidays/calendars/hebrew.py +++ b/holidays/calendars/hebrew.py @@ -1598,7 +1598,36 @@ class _HebrewLunisolar: 2100: (OCT, 13), } - @staticmethod - def _get_holiday(holiday: str, year: int) -> Optional[date]: - dt = getattr(_HebrewLunisolar, f"{holiday}_DATES", {}).get(year, ()) + def _get_holiday(self, holiday: str, year: int) -> Optional[date]: + dt = getattr(self, f"{holiday}_DATES", {}).get(year, ()) return date(year, *dt) if dt else None + + def hanukkah_date(self, year: int) -> set[Optional[date]]: + return {self._get_holiday(HANUKKAH, y) for y in (year - 1, year)} + + def israel_independence_date(self, year: int) -> Optional[date]: + return self._get_holiday(INDEPENDENCE_DAY, year) + + def lag_baomer_date(self, year: int) -> Optional[date]: + return self._get_holiday(LAG_BAOMER, year) + + def passover_date(self, year: int) -> Optional[date]: + return self._get_holiday(PASSOVER, year) + + def purim_date(self, year: int) -> Optional[date]: + return self._get_holiday(PURIM, year) + + def rosh_hashanah_date(self, year: int) -> Optional[date]: + return self._get_holiday(ROSH_HASHANAH, year) + + def shavuot_date(self, year: int) -> Optional[date]: + return self._get_holiday(SHAVUOT, year) + + def sukkot_date(self, year: int) -> Optional[date]: + return self._get_holiday(SUKKOT, year) + + def tisha_bav_date(self, year: int) -> Optional[date]: + return self._get_holiday(TISHA_BAV, year) + + def yom_kippur_date(self, year: int) -> Optional[date]: + return self._get_holiday(YOM_KIPPUR, year) diff --git a/holidays/countries/israel.py b/holidays/countries/israel.py index d7002c2c4..836e6cc03 100644 --- a/holidays/countries/israel.py +++ b/holidays/countries/israel.py @@ -46,6 +46,7 @@ class Israel(ObservedHolidayBase, HebrewCalendarHolidays): start_year = 1948 def __init__(self, *args, **kwargs): + HebrewCalendarHolidays.__init__(self) kwargs.setdefault("observed_rule", FRI_TO_PREV_THU + SAT_TO_PREV_THU) super().__init__(*args, **kwargs) @@ -56,50 +57,54 @@ def _add_observed(self, dt, name, rule): def _populate_public_holidays(self): # Rosh Hashanah (New Year). - self._add_hebrew_holiday(tr("ראש השנה"), self._rosh_hashanah_date, range(2)) + self._add_rosh_hashanah(tr("ראש השנה"), range(2)) # Yom Kippur (Day of Atonement). - self._add_hebrew_holiday(tr("יום כיפור"), self._yom_kippur_date) + self._add_yom_kippur(tr("יום כיפור")) # Sukkot (Feast of Tabernacles). - self._add_hebrew_holiday(tr("סוכות"), self._sukkot_date) + self._add_sukkot(tr("סוכות")) # Simchat Torah / Shemini Atzeret. - self._add_hebrew_holiday(tr("שמחת תורה/שמיני עצרת"), self._sukkot_date, +7) + self._add_sukkot(tr("שמחת תורה/שמיני עצרת"), +7) # Pesach (Passover). - self._add_hebrew_holiday(tr("פסח"), self._passover_date) + self._add_passover(tr("פסח")) # Shvi'i shel Pesach (Seventh day of Passover) - self._add_hebrew_holiday(tr("שביעי של פסח"), self._passover_date, +6) + self._add_passover(tr("שביעי של פסח"), +6) rule = FRI_TO_PREV_THU + SAT_TO_PREV_THU if self._year >= 2004: rule += MON_TO_NEXT_TUE - # Yom Ha-Atzmaut (Independence Day). - self._add_observed(self._israel_independence_date, tr("יום העצמאות"), rule) + self._add_observed( + self._hebrew_calendar.israel_independence_date(self._year), + # Yom Ha-Atzmaut (Independence Day). + tr("יום העצמאות"), + rule, + ) # Shavuot. - self._add_hebrew_holiday(tr("שבועות"), self._shavuot_date) + self._add_shavuot(tr("שבועות")) def _populate_optional_holidays(self): # Chol HaMoed Sukkot (Feast of Tabernacles holiday). - self._add_hebrew_holiday(tr("חול המועד סוכות"), self._sukkot_date, range(1, 6)) + self._add_sukkot(tr("חול המועד סוכות"), range(1, 6)) if self._year >= 2008: # Sigd. - self._add_hebrew_holiday(tr("סיגד"), self._yom_kippur_date, +49) + self._add_yom_kippur(tr("סיגד"), +49) # Purim. - self._add_hebrew_holiday(tr("פורים"), self._purim_date) + self._add_purim(tr("פורים")) # Chol HaMoed Pesach (Passover holiday). - self._add_hebrew_holiday(tr("חול המועד פסח"), self._passover_date, range(1, 6)) + self._add_passover(tr("חול המועד פסח"), range(1, 6)) if self._year >= 1963: rule = THU_TO_PREV_WED + FRI_TO_PREV_WED if self._year >= 2004: rule += SUN_TO_NEXT_MON self._add_observed( - _timedelta(self._israel_independence_date, -1), + _timedelta(self._hebrew_calendar.israel_independence_date(self._year), -1), # Yom Hazikaron (Fallen Soldiers and Victims of Terrorism Remembrance Day). tr("יום הזיכרון לחללי מערכות ישראל ונפגעי פעולות האיבה"), rule, @@ -107,30 +112,37 @@ def _populate_optional_holidays(self): if self._year >= 1998: # Yom Yerushalayim (Jerusalem Day). - self._add_hebrew_holiday(tr("יום ירושלים"), self._lag_baomer_date, +10) + self._add_lag_baomer(tr("יום ירושלים"), +10) - # Tisha B'Av (Tisha B'Av, fast). - self._add_observed(self._tisha_bav_date, tr("תשעה באב"), SAT_TO_NEXT_SUN) + self._add_observed( + self._hebrew_calendar.tisha_bav_date(self._year), + # Tisha B'Av (Tisha B'Av, fast). + tr("תשעה באב"), + SAT_TO_NEXT_SUN, + ) def _populate_school_holidays(self): # Chol HaMoed Sukkot (Feast of Tabernacles holiday). - self._add_hebrew_holiday(tr("חול המועד סוכות"), self._sukkot_date, range(1, 6)) + self._add_sukkot(tr("חול המועד סוכות"), range(1, 6)) - for hanukkah_dt in self._hanukkah_date: - # Hanukkah. - self._add_hebrew_holiday(tr("חנוכה"), hanukkah_dt, range(8)) + # Hanukkah. + self._add_hanukkah(tr("חנוכה"), range(8)) - # Ta`anit Ester (Fast of Esther). - self._add_observed(_timedelta(self._purim_date, -1), tr("תענית אסתר"), SAT_TO_PREV_THU) + self._add_observed( + _timedelta(self._hebrew_calendar.purim_date(self._year), -1), + # Ta`anit Ester (Fast of Esther). + tr("תענית אסתר"), + SAT_TO_PREV_THU, + ) # Purim. - self._add_hebrew_holiday(tr("פורים"), self._purim_date) + self._add_purim(tr("פורים")) # Chol HaMoed Pesach (Passover holiday). - self._add_hebrew_holiday(tr("חול המועד פסח"), self._passover_date, range(1, 6)) + self._add_passover(tr("חול המועד פסח"), range(1, 6)) # Lag Ba'omer (Lag BaOmer). - self._add_hebrew_holiday(tr('ל"ג בעומר'), self._lag_baomer_date) + self._add_lag_baomer(tr('ל"ג בעומר')) class IL(Israel): diff --git a/holidays/groups/hebrew.py b/holidays/groups/hebrew.py index 28008948a..73170503c 100644 --- a/holidays/groups/hebrew.py +++ b/holidays/groups/hebrew.py @@ -16,18 +16,6 @@ from holidays.calendars import _HebrewLunisolar from holidays.calendars.gregorian import _timedelta -from holidays.calendars.hebrew import ( - HANUKKAH, - INDEPENDENCE_DAY, - LAG_BAOMER, - PASSOVER, - PURIM, - ROSH_HASHANAH, - SHAVUOT, - SUKKOT, - TISHA_BAV, - YOM_KIPPUR, -) class HebrewCalendarHolidays: @@ -35,122 +23,129 @@ class HebrewCalendarHolidays: Hebrew lunisolar calendar holidays. """ - @property - def _hanukkah_date(self) -> set[Optional[date]]: + def __init__(self) -> None: + self._hebrew_calendar = _HebrewLunisolar() + + def _add_hebrew_calendar_holiday( + self, name: str, hol_date: date, days_delta: Union[int, Iterable[int]] = 0 + ) -> set[date]: + added_dates = set() + for delta in (days_delta,) if isinstance(days_delta, int) else days_delta: + if dt := self._add_holiday(name, _timedelta(hol_date, delta)): + added_dates.add(dt) + return added_dates + + def _add_hanukkah( + self, name: str, days_delta: Union[int, Iterable[int]] = 0 + ) -> set[Optional[date]]: """ - Return Hanukkah date. + Add Hanukkah. In some Gregorian years, there may be two Hanukkah dates. Hanukkah is a Jewish festival commemorating the recovery of Jerusalem and subsequent rededication of the Second Temple. https://en.wikipedia.org/wiki/Hanukkah """ - return { - _HebrewLunisolar._get_holiday(HANUKKAH, year) for year in (self._year - 1, self._year) - } - - @property - def _israel_independence_date(self) -> Optional[date]: - """ - Return Israel Independence Day date. - - Yom Ha'atzmaut is Israel's national day, commemorating the Israeli Declaration - of Independence on 14 May 1948. - https://en.wikipedia.org/wiki/Independence_Day_(Israel) - """ - return _HebrewLunisolar._get_holiday(INDEPENDENCE_DAY, self._year) + dts = self._hebrew_calendar.hanukkah_date(self._year) + for dt in dts: + self._add_hebrew_calendar_holiday(name, dt, days_delta) # type: ignore[arg-type] + return dts - @property - def _lag_baomer_date(self) -> Optional[date]: + def _add_lag_baomer(self, name: str, days_delta: Union[int, Iterable[int]] = 0) -> set[date]: """ - Return Lag BaOmer date. + Add Lag BaOmer. Lag BaOmer, also Lag B'Omer or Lag LaOmer, is a Jewish religious holiday celebrated on the 33rd day of the Counting of the Omer, which occurs on the 18th day of the Hebrew month of Iyar. https://en.wikipedia.org/wiki/Lag_BaOmer """ - return _HebrewLunisolar._get_holiday(LAG_BAOMER, self._year) + return self._add_hebrew_calendar_holiday( + name, + self._hebrew_calendar.lag_baomer_date(self._year), # type: ignore[arg-type] + days_delta, + ) - @property - def _passover_date(self) -> Optional[date]: + def _add_passover(self, name: str, days_delta: Union[int, Iterable[int]] = 0) -> set[date]: """ - Return Passover date. + Add Passover. Passover, also called Pesach, is a major Jewish holiday and one of the Three Pilgrimage Festivals. It celebrates the Exodus of the Israelites from slavery in Egypt. https://en.wikipedia.org/wiki/Passover """ - return _HebrewLunisolar._get_holiday(PASSOVER, self._year) + return self._add_hebrew_calendar_holiday( + name, + self._hebrew_calendar.passover_date(self._year), # type: ignore[arg-type] + days_delta, + ) - @property - def _purim_date(self) -> Optional[date]: + def _add_purim(self, name: str) -> set[date]: """ - Return Purim date. + Add Purim. Purim is a Jewish holiday that commemorates the saving of the Jewish people from annihilation at the hands of an official of the Achaemenid Empire named Haman, as it is recounted in the Book of Esther. https://en.wikipedia.org/wiki/Purim """ - return _HebrewLunisolar._get_holiday(PURIM, self._year) + return self._add_hebrew_calendar_holiday( + name, + self._hebrew_calendar.purim_date(self._year), # type: ignore[arg-type] + ) - @property - def _rosh_hashanah_date(self) -> Optional[date]: + def _add_rosh_hashanah( + self, name: str, days_delta: Union[int, Iterable[int]] = 0 + ) -> set[date]: """ - Return Rosh Hashanah date. + Add Rosh Hashanah. Rosh Hashanah is the New Year in Judaism. https://en.wikipedia.org/wiki/Rosh_Hashanah """ - return _HebrewLunisolar._get_holiday(ROSH_HASHANAH, self._year) + return self._add_hebrew_calendar_holiday( + name, + self._hebrew_calendar.rosh_hashanah_date(self._year), # type: ignore[arg-type] + days_delta, + ) - @property - def _shavuot_date(self) -> Optional[date]: + def _add_shavuot(self, name: str) -> set[date]: """ - Return Shavuot date. + Add Shavuot. Shavuot, or Shvues, is a Jewish holiday, one of the biblically ordained Three Pilgrimage Festivals. It occurs on the sixth day of the Hebrew month of Sivan. https://en.wikipedia.org/wiki/Shavuot """ - return _HebrewLunisolar._get_holiday(SHAVUOT, self._year) + return self._add_hebrew_calendar_holiday( + name, + self._hebrew_calendar.shavuot_date(self._year), # type: ignore[arg-type] + ) - @property - def _sukkot_date(self) -> Optional[date]: + def _add_sukkot(self, name: str, days_delta: Union[int, Iterable[int]] = 0) -> set[date]: """ - Return Sukkot date. + Add Sukkot. Sukkot, also known as the Feast of Tabernacles or Feast of Booths, is a Torah-commanded holiday celebrated for seven days, beginning on the 15th day of the month of Tishrei. https://en.wikipedia.org/wiki/Sukkot """ - return _HebrewLunisolar._get_holiday(SUKKOT, self._year) + return self._add_hebrew_calendar_holiday( + name, + self._hebrew_calendar.sukkot_date(self._year), # type: ignore[arg-type] + days_delta, + ) - @property - def _tisha_bav_date(self) -> Optional[date]: + def _add_yom_kippur(self, name: str, days_delta: Union[int, Iterable[int]] = 0) -> set[date]: """ - Return Tisha B'Av date. - - Tisha B'Av is an annual fast day in Judaism. - https://en.wikipedia.org/wiki/Tisha_B%27Av - """ - return _HebrewLunisolar._get_holiday(TISHA_BAV, self._year) - - @property - def _yom_kippur_date(self) -> Optional[date]: - """ - Return Yom Kippur date. + Add Yom Kippur. Yom Kippur (Day of Atonement) is the holiest day of the year in Judaism. It occurs annually on the 10th of Tishrei. https://en.wikipedia.org/wiki/Yom_Kippur """ - return _HebrewLunisolar._get_holiday(YOM_KIPPUR, self._year) - - def _add_hebrew_holiday(self, name: str, dt: date, days_delta: Union[int, Iterable[int]] = 0): - if days_delta: - for delta in (days_delta,) if isinstance(days_delta, int) else days_delta: - self._add_holiday(name, _timedelta(dt, delta)) - else: - self._add_holiday(name, dt) + return self._add_hebrew_calendar_holiday( + name, + self._hebrew_calendar.yom_kippur_date(self._year), # type: ignore[arg-type] + days_delta, + )