From 3e7cc56223359c6d35d15cdc871a4f95245fadde Mon Sep 17 00:00:00 2001 From: Ela Avrahami Date: Wed, 13 May 2020 16:09:48 +0300 Subject: [PATCH] Making the Israel calendar more efficient --- workalendar/asia/israel.py | 100 ++++++++++++++------------------- workalendar/tests/test_asia.py | 14 +++++ 2 files changed, 56 insertions(+), 58 deletions(-) diff --git a/workalendar/asia/israel.py b/workalendar/asia/israel.py index c6c5eb0..6162b35 100644 --- a/workalendar/asia/israel.py +++ b/workalendar/asia/israel.py @@ -1,4 +1,4 @@ -from datetime import date, timedelta +from datetime import date from pyluach.dates import GregorianDate, HebrewDate @@ -15,64 +15,48 @@ class Israel(Calendar): def get_variable_days(self, year): days = super().get_variable_days(year) - delta = timedelta(days=1) current_date = date(year, 1, 1) + hebrew_date = GregorianDate( + year=current_date.year, + month=current_date.month, + day=current_date.day, + ).to_heb() + jewish_year = hebrew_date.year - while current_date.year == year: - hebrew_date = GregorianDate( - year=current_date.year, - month=current_date.month, - day=current_date.day, - ).to_heb() - - jewish_year = hebrew_date.year - month = hebrew_date.month - day = hebrew_date.day - - if month == 7: - if day == 1: - days.append((current_date - delta, "Rosh Hashana Eve")) - days.append((current_date, "Rosh Hashana")) - days.append((current_date + delta, "Rosh Hashana")) - elif day == 10: - days.append((current_date - delta, "Yom Kippur Eve")) - days.append((current_date, "Yom Kippur")) - elif day == 15: - days.append((current_date - delta, "Sukkot Eve")) - days.append((current_date, "Sukkot")) - elif day == 22: - days.append((current_date - delta, "Shmini Atzeres Eve")) - days.append((current_date, "Shmini Atzeres")) - elif month == 1: - if day == 15: - days.append((current_date - delta, "Pesach Eve")) - days.append((current_date, "Pesach")) - elif day == 21: - days.append((current_date - delta, "7th of Pesach Eve")) - days.append((current_date, "7th of Pesach")) - elif month == 2: - if day == 5: - independence_date = current_date - if hebrew_date.weekday() == 6: - independence_date = HebrewDate( - jewish_year, month, 4 - ).to_pydate() - elif hebrew_date.weekday() == 7: - independence_date = HebrewDate( - jewish_year, month, 3 - ).to_pydate() - elif hebrew_date.weekday() == 2: - independence_date = HebrewDate( - jewish_year, month, 6 - ).to_pydate() - days.append( - (independence_date - delta, "Independence Day Eve") - ) - days.append((independence_date, "Independence Day")) - elif month == 3 and day == 6: - days.append((current_date - delta, "Shavout Eve")) - days.append((current_date, "Shavout")) - - current_date += delta + holidays_hebrew_dates = [ + (HebrewDate(jewish_year, 6, 29), "Rosh Hashana Eve"), + (HebrewDate(jewish_year + 1, 7, 1), "Rosh Hashana"), + (HebrewDate(jewish_year + 1, 7, 2), "Rosh Hashana"), + (HebrewDate(jewish_year + 1, 7, 9), "Yom Kippur Eve"), + (HebrewDate(jewish_year + 1, 7, 10), "Yom Kippur"), + (HebrewDate(jewish_year + 1, 7, 14), "Sukkot Eve"), + (HebrewDate(jewish_year + 1, 7, 15), "Sukkot"), + (HebrewDate(jewish_year + 1, 7, 21), "Shmini Atzeres Eve"), + (HebrewDate(jewish_year + 1, 7, 22), "Shmini Atzeres"), + (HebrewDate(jewish_year, 1, 14), "Pesach Eve"), + (HebrewDate(jewish_year, 1, 15), "Pesach"), + (HebrewDate(jewish_year, 1, 20), "7th of Pesach Eve"), + (HebrewDate(jewish_year, 1, 21), "7th of Pesach"), + (HebrewDate(jewish_year, 3, 5), "Shavout Eve"), + (HebrewDate(jewish_year, 3, 6), "Shavout"), + ] + holidays_hebrew_dates += self.get_hebrew_independence_day(jewish_year) + for holiday_hebrew_date, holiday_name in holidays_hebrew_dates: + days.append((holiday_hebrew_date.to_pydate(), holiday_name)) return days + + def get_hebrew_independence_day(self, jewish_year): + month = 2 + day = 5 + original_hebrew_independence_date = HebrewDate(jewish_year, month, day) + if original_hebrew_independence_date.weekday() == 6: + day = 4 + if original_hebrew_independence_date.weekday() == 7: + day = 3 + if original_hebrew_independence_date.weekday() == 2: + day = 6 + return [ + (HebrewDate(jewish_year, month, day - 1), "Independence Day Eve"), + (HebrewDate(jewish_year, month, day), "Independence Day") + ] diff --git a/workalendar/tests/test_asia.py b/workalendar/tests/test_asia.py index 2d967c2..6fb5365 100644 --- a/workalendar/tests/test_asia.py +++ b/workalendar/tests/test_asia.py @@ -1,5 +1,6 @@ from unittest.mock import patch from datetime import date +import time from . import GenericCalendarTest from ..asia import ( @@ -635,3 +636,16 @@ class IsraelTest(GenericCalendarTest): date(2020, 5, 29), # Shavuot } self.assertEqual(calculated_holidays, known_holidays) + + def test_is_holiday_performance(self): + random_date = date(2019, 10, 9) + japan_cal = Japan() + timer = time.time() + for i in range(30): + japan_cal.is_holiday(random_date) + japan_time = time.time() - timer + timer = time.time() + for i in range(30): + self.cal.is_holiday(random_date) + israel_time = time.time() - timer + self.assertGreater(japan_time * 3, israel_time)