diff --git a/fixedcal/core/date.py b/fixedcal/core/date.py index b2b9553..a9437a2 100644 --- a/fixedcal/core/date.py +++ b/fixedcal/core/date.py @@ -1,37 +1,49 @@ from datetime import datetime class FixedDate: - def __init__(self, date = None): + def __init__(self, date = None, day_of_year = None, year = None): if date is not None: - self._from_datetime(date) + init_tuple = self._from_datetime(date) + elif day_of_year is not None and year is not None: + init_tuple = self._from_day_of_year(day_of_year, year) else: raise ValueError("Invalid FixedDate initialization") + + self._day_of_year, self._year = init_tuple - def _from_datetime(self, _datetime): - day_of_year = _datetime.timetuple().tm_yday # 1... - self._from_day_of_year(day_of_year, _datetime.year) + def _from_datetime(self, _datetime: datetime) -> tuple: + """Initialize this class with native datetime object. - def _from_day_of_year(self, day_of_year: int, year: int) -> None: + Args: + _datetime (datetime): _description_ + + Returns: + tuple: day of year (1...366) and year (1...9999) in a tuple + """ + day_of_year = _datetime.timetuple().tm_yday + return self._from_day_of_year(day_of_year, _datetime.year) + + def _from_day_of_year(self, day_of_year: int, year: int) -> tuple: """Initialize this class with day of year and year. Args: day_of_year (int): In range 1...366 year (int): In range 1...9999 + + Returns: + tuple: day of year (1...366) and year (1...9999) in a tuple """ - self._month, self._day_of_month = divmod(day_of_year-1, 28) - self._month += 1 - self._day_of_month += 1 - self._year = year + return (day_of_year, year) @property def day_of_month(self): """In range 1...29""" - return self._day_of_month + return ((self._day_of_year-1) % 28) + 1 @property def month(self): """In range 1...13""" - return self._month + return ((self._day_of_year-1) // 28) + 1 @property def year(self): @@ -40,9 +52,12 @@ class FixedDate: @property def is_year_day(self) -> bool: - return self._month == 14 and self._day_of_month == 1 + return self.month == 14 and self.day_of_month == 1 # TODO: week of month # TODO: week of year # TODO: weekday # TODO: year quarter + # TODO: datetime instance + # TODO: plus and minus operations + # TODO: equatable diff --git a/tests/date_test.py b/tests/basic_datetime_test.py similarity index 95% rename from tests/date_test.py rename to tests/basic_datetime_test.py index 03b1783..ca2d2c9 100644 --- a/tests/date_test.py +++ b/tests/basic_datetime_test.py @@ -2,10 +2,7 @@ import unittest from datetime import datetime from fixedcal.core.date import FixedDate -class TestDate(unittest.TestCase): - def setUp(self): - pass - +class TestBasicDatetimeInit(unittest.TestCase): def test_datetime_init_january_first(self): fixed_date = FixedDate(date=datetime(2022, 1, 1)) self.assertEqual(fixed_date.year, 2022) diff --git a/tests/basic_day_of_year_test.py b/tests/basic_day_of_year_test.py new file mode 100644 index 0000000..10e634f --- /dev/null +++ b/tests/basic_day_of_year_test.py @@ -0,0 +1,36 @@ +import unittest +from datetime import datetime +from fixedcal.core.date import FixedDate + +class TestBasicDayOfYearInit(unittest.TestCase): + def test_day_of_year_init_january_first(self): + fixed_date = FixedDate(day_of_year=1, year=2022) + self.assertEqual(fixed_date.year, 2022) + self.assertEqual(fixed_date.month, 1) + self.assertEqual(fixed_date.day_of_month, 1) + + def test_day_of_year_init_february_last(self): + fixed_date = FixedDate(day_of_year=56, year=2022) # 2022-02-25 Gregorian + self.assertEqual(fixed_date.year, 2022) + self.assertEqual(fixed_date.month, 2) + self.assertEqual(fixed_date.day_of_month, 28) + + def test_day_of_year_init_sol_month(self): + fixed_date = FixedDate(day_of_year=171, year=2022) # 2022-06-20 Gregorian + self.assertEqual(fixed_date.year, 2022) + self.assertEqual(fixed_date.month, 7) + self.assertEqual(fixed_date.day_of_month, 3) + + def test_day_of_year_init_december_last(self): + fixed_date = FixedDate(day_of_year=364, year=2022) # 2022-12-30 Gregorian + self.assertEqual(fixed_date.year, 2022) + self.assertEqual(fixed_date.month, 13) + self.assertEqual(fixed_date.day_of_month, 28) + self.assertFalse(fixed_date.is_year_day) + + def test_day_of_year_init_year_day(self): + fixed_date = FixedDate(day_of_year=365, year=2022) # 2022-12-31 Gregorian + self.assertEqual(fixed_date.year, 2022) + self.assertEqual(fixed_date.month, 14) + self.assertEqual(fixed_date.day_of_month, 1) + self.assertTrue(fixed_date.is_year_day)