From f33ffd659b9367b52096366fec39475c41846cd2 Mon Sep 17 00:00:00 2001 From: PyryL Date: Sun, 11 Dec 2022 18:36:53 +0200 Subject: [PATCH] leap day properties fix --- fixedcal/core/date.py | 19 +++++++++++++++++++ tests/leap_year_test.py | 12 ++++++++++++ 2 files changed, 31 insertions(+) diff --git a/fixedcal/core/date.py b/fixedcal/core/date.py index 2f95c55..d4178fa 100644 --- a/fixedcal/core/date.py +++ b/fixedcal/core/date.py @@ -52,6 +52,15 @@ class FixedDate: # return self._year % 4 == 0 return is_leap_year(self._year) + @property + def is_leap_day(self) -> bool: + """Whether this fixed date is a leap day (June 29th in fixed) of IFC system. + + Returns: + bool: Whether this is a leap day + """ + return self.is_leap_year and self._day_of_year == 169 + @property def datetime(self) -> datetime: """Construct a native datetime object from fixed date. @@ -68,11 +77,15 @@ class FixedDate: @property def day_of_month(self): """In range 1...29""" + if self.is_leap_day: + return 29 return ((self._day_of_year-1) % 28) + 1 @property def month(self): """In range 1...13""" + if self.is_leap_day: + return 6 return ((self._day_of_year-1) // 28) + 1 @property @@ -93,6 +106,8 @@ class FixedDate: """ if self.is_year_day: return 1 + if self.is_leap_day: + return 4 return ((self.day_of_month-1) // 7) + 1 @property @@ -102,6 +117,8 @@ class FixedDate: Returns: int: 1 for Sunday, 2 for Monday, 7 for Saturday """ + if self.is_leap_day: + return None return ((self.day_of_month-1) % 7) + 1 @property @@ -111,6 +128,8 @@ class FixedDate: Returns: int: In range 1...53 """ + if self.is_leap_day: + return 24 return ((self._day_of_year-1) // 7) + 1 @property diff --git a/tests/leap_year_test.py b/tests/leap_year_test.py index bd08169..4f570f0 100644 --- a/tests/leap_year_test.py +++ b/tests/leap_year_test.py @@ -23,6 +23,18 @@ class TestLeapYear(unittest.TestCase): fixed_date = FixedDate(datetime(2000, 5, 4)) self.assertTrue(fixed_date.is_leap_year) + + def test_fixed_leap_day_properties(self): + # June 17th is the leap day of fixed calendar system + fixed_date = FixedDate(datetime(2024, 6, 17)) + self.assertEqual(fixed_date.day_of_month, 29) + self.assertEqual(fixed_date.month, 6) + self.assertIsNone(fixed_date.weekday) + self.assertEqual(fixed_date.week_of_month, 4) + self.assertEqual(fixed_date.week_of_year, 24) + self.assertEqual(fixed_date.year_quarter, 2) + + def test_fixed_date_difference_over_gregorian_leap_day(self): # in Gregorian system there are 7 days between, # but in IFC the leap day is at the end of June