def __generate_holidays(cls, year): empty = Calendar() # New Year's Day yield empty.adjust(date(year, 1, 1), BusinessDayConvention.following) if year >= 2000: # Good Friday and Easter Monday easter_monday = empty.easter(year); yield easter_monday + timedelta(-3) yield easter_monday if year >= 2000: # Labour Day yield date(year, 5, 1) # Christmas yield date(year, 12, 25) if year >= 2000: # Day of Goodwill yield date(year, 12, 26) if year == 1998 or year == 1999 or year == 2001: yield date(year, 12, 31)
def test_is_leap_year(self): self.assertTrue(Calendar.is_leap_year(2008), "Is a leap year.") self.assertFalse(Calendar.is_leap_year(2009), "Isn't a leap year.") self.assertFalse(Calendar.is_leap_year(2010), "Isn't a leap year.") self.assertFalse(Calendar.is_leap_year(2011), "Isn't a leap year.") self.assertTrue(Calendar.is_leap_year(2012), "Is a leap year.") self.assertFalse(Calendar.is_leap_year(2013), "Isn't a leap year.") self.assertFalse(Calendar.is_leap_year(2014), "Isn't a leap year.") self.assertFalse(Calendar.is_leap_year(2015), "Isn't a leap year.") self.assertTrue(Calendar.is_leap_year(2016), "Is a leap year.") self.assertFalse(Calendar.is_leap_year(2100), "Isn't a leap year.")
def __generate_holidays(cls, year): empty = Calendar(); # New Years Days, adjusted to the first non-weekend. yield empty.adjust(date(year, JulianMonth.january, 1), BusinessDayConvention.following) # Good Friday and Easter Monday easter_monday = empty.easter(year) yield easter_monday - timedelta(3) yield easter_monday if year == 2011: # Royal Wedding yield date(2011, JulianMonth.april, 29) # May Day - first Monday in May. yield empty.add_nth_day_of_week(date(year, JulianMonth.may, 1), 1, DayOfWeek.monday, False) if year == 2002: # Golden Jubilee Bank Holiday yield date(2002, JulianMonth.june, 3) # Special Spring Bank Holiday yield date(2002, JulianMonth.june, 4) elif year == 2012: # Diamond Jubilee Bank Holiday yield date(2012, JulianMonth.june, 4) # Special Spring Bank Holiday yield date(2012, JulianMonth.june, 5) else: # Spring Bank Holiday - last Monday in May yield empty.add_nth_day_of_week(empty.end_of_month(year, JulianMonth.may), -1, DayOfWeek.monday, False) # August Bank Holiday - last Monday in August. yield empty.add_nth_day_of_week(empty.end_of_month(year, JulianMonth.august), -1, DayOfWeek.monday, False) # Christmas Day christmas_day = empty.adjust(date(year, JulianMonth.december, 25), BusinessDayConvention.following) yield christmas_day # Boxing Day yield empty.add_business_days(christmas_day, 1) if year == 1999: # Millennium Celebration yield date(1999, JulianMonth.december, 31)
def test_add_nth_day_of_week(self): # June 2015 # Su Mo Tu We Th Fr Sa # 1 2 3 4 5 6 # 7 8 9 10 11 12 13 # 14 15 16 17 18 19 20 # 21 22 23 24 25 26 27 # 28 29 30 self.assertEqual(date(2015, 6, 1), Calendar.add_nth_day_of_week(date(2015, 6, 1), 1, DayOfWeek.monday, False), "The first Monday is the same date.") self.assertEqual(date(2015, 6, 8), Calendar.add_nth_day_of_week(date(2015, 6, 1), 1, DayOfWeek.monday, True), "When strictly different go to the next week.") self.assertEqual(date(2015, 6, 2), Calendar.add_nth_day_of_week(date(2015, 6, 1), 1, DayOfWeek.tuesday, False), "The first Tuesday is the next date.") self.assertEqual(date(2015, 6, 2), Calendar.add_nth_day_of_week(date(2015, 6, 1), 1, DayOfWeek.tuesday, True), "Strictly different should make no difference.") self.assertEqual(date(2015, 6, 17), Calendar.add_nth_day_of_week(date(2015, 6, 1), 3, DayOfWeek.wednesday, False), "Third Wednesday.") self.assertEqual(date(2015, 6, 30), Calendar.add_nth_day_of_week(date(2015, 6, 30), -1, DayOfWeek.tuesday, False), "The last Tuesday is the same date.") self.assertEqual(date(2015, 6, 23), Calendar.add_nth_day_of_week(date(2015, 6, 30), -1, DayOfWeek.tuesday, True), "Skip the start date as it's a Tuesday.") self.assertEqual(date(2015, 6, 10), Calendar.add_nth_day_of_week(date(2015, 6, 30), -3, DayOfWeek.wednesday, True), "Third Wednesday from the end of the month..")
def __generate_holidays(cls, year): empty = Calendar() # New Year's Day (possibly moved to Monday if on Sunday) new_years_day = date(year, JulianMonth.january, 1) yield (new_years_day if new_years_day.weekday() != DayOfWeek.sunday else new_years_day + timedelta(1)) # Memorial Day (last Monday in May) yield Calendar.add_nth_day_of_week(Calendar.end_of_month(year, JulianMonth.may), -1, DayOfWeek.monday, False) # Independence Day (Monday if Sunday or Friday if Saturday) yield empty.nearest_business_day(date(year, JulianMonth.july, 4)) # Labor Day (first Monday in September) yield empty.add_nth_day_of_week(date(year, JulianMonth.september, 1), 1, DayOfWeek.monday, False) # Thanksgiving Day (fourth Thursday in November) yield empty.add_nth_day_of_week(date(year, JulianMonth.november, 1), 4, DayOfWeek.thursday, False) # Christmas (Monday if Sunday or Friday if Saturday) yield empty.nearest_business_day(date(year, JulianMonth.december, 25))
def test_easter(self): self.assertEquals(date(2001, 4, 15), Calendar.easter(2001), "Easter 2001") self.assertEquals(date(2002, 3, 31), Calendar.easter(2002), "Easter 2002") self.assertEquals(date(2003, 4, 20), Calendar.easter(2003), "Easter 2003") self.assertEquals(date(2004, 4, 11), Calendar.easter(2004), "Easter 2004") self.assertEquals(date(2005, 3, 27), Calendar.easter(2005), "Easter 2005") self.assertEquals(date(2006, 4, 16), Calendar.easter(2006), "Easter 2006") self.assertEquals(date(2007, 4, 8), Calendar.easter(2007), "Easter 2007") self.assertEquals(date(2008, 3, 23), Calendar.easter(2008), "Easter 2008") self.assertEquals(date(2009, 4, 12), Calendar.easter(2009), "Easter 2009") self.assertEquals(date(2010, 4, 4), Calendar.easter(2010), "Easter 2010") self.assertEquals(date(2011, 4, 24), Calendar.easter(2011), "Easter 2011") self.assertEquals(date(2012, 4, 8), Calendar.easter(2012), "Easter 2012") self.assertEquals(date(2013, 3, 31), Calendar.easter(2013), "Easter 2013") self.assertEquals(date(2014, 4, 20), Calendar.easter(2014), "Easter 2014") self.assertEquals(date(2015, 4, 5), Calendar.easter(2015), "Easter 2015") self.assertEquals(date(2016, 3, 27), Calendar.easter(2016), "Easter 2016") self.assertEquals(date(2017, 4, 16), Calendar.easter(2017), "Easter 2017") self.assertEquals(date(2018, 4, 1), Calendar.easter(2018), "Easter 2018") self.assertEquals(date(2019, 4, 21), Calendar.easter(2019), "Easter 2019") self.assertEquals(date(2020, 4, 12), Calendar.easter(2020), "Easter 2020") self.assertEquals(date(2021, 4, 4), Calendar.easter(2021), "Easter 2021")
def test_add_months(self): # Forward self.assertEqual(date(2013, 2, 28), Calendar.add_months(date(2012, 11, 30), 3), "Should not roll into March.") self.assertEqual(date(2013, 4, 28), Calendar.add_months(date(2013, 2, 28), 2, False), "Should not go to end of month.") self.assertEqual(date(2013, 4, 30), Calendar.add_months(date(2013, 2, 28), 2, True), "Should go to end of month.") self.assertEqual(date(2013, 1, 30), Calendar.add_months(date(2012, 11, 30), 2, False), "Should not go to end of month.") self.assertEqual(date(2013, 1, 31), Calendar.add_months(date(2012, 11, 30), 2, True), "Should go to end of month.") # Back self.assertEqual(date(2012, 11, 28), Calendar.add_months(date(2013, 2, 28), -3, False), "Should not roll into March.") self.assertEqual(date(2012, 11, 30), Calendar.add_months(date(2013, 2, 28), -3, True), "Should go to end of month.") self.assertEqual(date(2013, 1, 28), Calendar.add_months(date(2013, 4, 28), -3, True), "Should not go to end of month.") self.assertEqual(date(2012, 1, 28), Calendar.add_months(date(2013, 4, 28), -15, True), "Should not go to end of month.") self.assertEqual(date(2013, 4, 30), Calendar.add_months(date(2013, 5, 31), -1, True), "Should not stay in May.") self.assertEqual(date(2013, 4, 30), Calendar.add_months(date(2013, 5, 31), -1, False), "Should not stay in May.")
def test_is_end_of_month(self): self.assertFalse(Calendar.is_end_of_month(date(2008, 1, 30)), "30 January is not the end of the month.") self.assertTrue(Calendar.is_end_of_month(date(2008, 1, 31)), "31 January is the end of the month.") self.assertFalse(Calendar.is_end_of_month(date(2008, 2, 28)), "28 February 2008 is not the end of the month because it's a leap year.") self.assertTrue(Calendar.is_end_of_month(date(2008, 2, 29)), "28 February 2008 is the end of the month because it's a leap year.") self.assertTrue(Calendar.is_end_of_month(date(2009, 2, 28)), "28 February 2009 is the end of the month because it's a not leap year.")
def test_is_weekend(self): self.assertFalse(Calendar.is_weekend(date(2014, 12, 19)), "19 December 2014 was a Friday.") self.assertTrue(Calendar.is_weekend(date(2014, 12, 20)), "20 December 2014 was a Saturday.") self.assertTrue(Calendar.is_weekend(date(2014, 12, 21)), "21 December 2014 was a Sunday.") self.assertFalse(Calendar.is_weekend(date(2014, 12, 22)), "22 December 2014 was a Monday.")
def test_days_in_month(self): self.assertEqual(31, Calendar.days_in_month(2009, 1), "There are 28 days in January.") self.assertEqual(28, Calendar.days_in_month(2009, 2), "There are 28 days in February in a non leap year.") self.assertEqual(31, Calendar.days_in_month(2009, 3), "There are 28 days in March.") self.assertEqual(30, Calendar.days_in_month(2009, 4), "There are 28 days in April.") self.assertEqual(31, Calendar.days_in_month(2009, 5), "There are 28 days in May.") self.assertEqual(30, Calendar.days_in_month(2009, 6), "There are 28 days in June.") self.assertEqual(31, Calendar.days_in_month(2009, 7), "There are 28 days in July.") self.assertEqual(31, Calendar.days_in_month(2009, 8), "There are 28 days in August.") self.assertEqual(30, Calendar.days_in_month(2009, 9), "There are 30 days in September.") self.assertEqual(31, Calendar.days_in_month(2009, 10), "There are 28 days in October.") self.assertEqual(30, Calendar.days_in_month(2009, 11), "There are 28 days in November.") self.assertEqual(31, Calendar.days_in_month(2009, 12), "There are 28 days in December.") self.assertEqual(29, Calendar.days_in_month(2008, 2), "There are 29 days in February in a leap year.")
def __generatte_holidays(cls, year): empty = Calendar() # New Year's Day (possibly moved to Monday if on Sunday) new_years_day = date(year, JulianMonth.january, 1) yield (new_years_day if new_years_day.weekday() != DayOfWeek.sunday else new_years_day + timedelta(1)) # Washington's birthday (third Monday in February) yield empty.add_nth_day_of_week(date(year, JulianMonth.february, 1), 3, DayOfWeek.monday, False) # Good Friday yield empty.easter(year) - timedelta(3) # Memorial Day (last Monday in May) yield empty.add_nth_day_of_week(empty.end_of_month(year, JulianMonth.may), -1, DayOfWeek.monday, False) # Independence Day (Monday if Sunday or Friday if Saturday) yield empty.nearest_business_day(date(year, JulianMonth.july, 4)) # Labor Day (first Monday in September) yield empty.add_nth_day_of_week(date(year, JulianMonth.september, 1), 1, DayOfWeek.monday, False) # Thanksgiving Day (fourth Thursday in November) yield empty.add_nth_day_of_week(date(year, JulianMonth.november, 1), 4, DayOfWeek.thursday, False) # Christmas (Monday if Sunday or Friday if Saturday) yield empty.nearest_business_day(date(year, JulianMonth.december, 25)) if year >= 1998: # Martin Luther King's birthday (third Monday in January) yield Calendar.add_nth_day_of_week(date(year, JulianMonth.january, 1), 3, DayOfWeek.monday, False) if year <= 1968 or (year <= 1980 and year % 4 == 0): # Presidential election days yield Calendar.add_nth_day_of_week(date(year, JulianMonth.november, 1), 1, DayOfWeek.tuesday, True) # Special closings if year == 2012: # Hurricane Sandy yield date(2012, JulianMonth.october, 29) yield date(2012, JulianMonth.october, 30) if year == 2007: # President Ford's funeral yield date(2007, JulianMonth.january, 2) if year == 2004: # President Reagan's funeral yield date(2004, JulianMonth.june, 11) if year == 2001: # September 11-14, 2001 yield date(2001, JulianMonth.september, 11) yield date(2001, JulianMonth.september, 12) yield date(2001, JulianMonth.september, 13) yield date(2001, JulianMonth.september, 14) if year == 1994: # President Nixon's funeral yield date(1994, JulianMonth.april, 27) if year == 1985: # Hurricane Gloria yield date(1985, JulianMonth.september, 27) if year == 1977: # 1977 Blackout yield date(1977, JulianMonth.july, 14) if year == 1973: # Funeral of former President Lyndon B. Johnson. yield date(1973, JulianMonth.january, 25) if year == 1972: # Funeral of former President Harry S. Truman yield date(1972, JulianMonth.december, 28) if year == 1969: # National Day of Participation for the lunar exploration. yield date(1969, JulianMonth.july, 21) # Funeral of former President Eisenhower. yield date(1969, JulianMonth.march, 31) # Closed all day - heavy snow. yield date(1969, JulianMonth.february, 10) if year == 1968: # Day after Independence Day. yield date(1968, JulianMonth.july, 5) # June 12-Dec. 31, 1968 # Four day week (closed on Wednesdays) - Paperwork Crisis d = date(1968, JulianMonth.june, 12) while d.year == 1968: yield d d += timedelta(7) # Day of mourning for Martin Luther King Jr. yield date(1968, JulianMonth.april, 9) if year == 1963: # Funeral of President Kennedy yield date(1963, JulianMonth.november, 25) if year == 1961: # Day before Decoration Day yield date(1961, JulianMonth.may, 29) if year == 1958: # Day after Christmas yield date(1958, JulianMonth.december, 26) if year == 1954 or year == 1956 or year == 1965: # Christmas Eve yield date(year, JulianMonth.december, 24)
def __generate_holidays(cls, year): empty = Calendar() # New Year's Day (possibly moved to Monday if on Sunday) new_years_day = date(year, JulianMonth.january, 1) yield (new_years_day if new_years_day.weekday() != DayOfWeek.sunday else new_years_day + timedelta(1)) # Martin Luther King's birthday (third Monday in January) yield Calendar.add_nth_day_of_week(date(year, JulianMonth.january, 1), 3, DayOfWeek.monday, False) # Washington's birthday (third Monday in February) yield Calendar.add_nth_day_of_week(date(year, JulianMonth.february, 1), 3, DayOfWeek.monday, False) # Good Friday yield empty.easter(year) - timedelta(3) # Memorial Day (last Monday in May) yield Calendar.add_nth_day_of_week(Calendar.end_of_month(year, JulianMonth.may), -1, DayOfWeek.monday, False) # Independence Day (Monday if Sunday or Friday if Saturday) yield empty.nearest_business_day(date(year, JulianMonth.july, 4)) # Labor Day (first Monday in September) yield empty.add_nth_day_of_week(date(year, JulianMonth.september, 1), 1, DayOfWeek.monday, False) # Columbus Day (second Monday in October) yield empty.add_nth_day_of_week(date(year, JulianMonth.october, 1), 2, DayOfWeek.monday, False) # Veteran's Day (Monday if Sunday or Friday if Saturday) yield empty.nearest_business_day(date(year, JulianMonth.november, 11)) # Thanksgiving Day (fourth Thursday in November) yield empty.add_nth_day_of_week(date(year, JulianMonth.november, 1), 4, DayOfWeek.thursday, False) # Christmas (Monday if Sunday or Friday if Saturday) yield empty.nearest_business_day(date(year, JulianMonth.december, 25))