diff --git a/docs/CHANGES.rst b/docs/CHANGES.rst index 49548b0..a4e5def 100644 --- a/docs/CHANGES.rst +++ b/docs/CHANGES.rst @@ -1,16 +1,24 @@ Changelog ============== -0.3.11 (unreleased) +0.3.12 (unreleased) ------------------- - Nothing changed yet. +0.3.11 (2016-01-13) +------------------- + +- Bug fix: The get_prev API crashed when last day of month token was used. Some + essential logic was missing. + [Iddo Aviram ] + + 0.3.10 (2015-11-29) ------------------- -- The fuctionality of 'l' as day of month was brokne, since the month variable +- The fuctionality of 'l' as day of month was broken, since the month variable was not properly updated [Iddo Aviram ] diff --git a/setup.py b/setup.py index 6bd595d..1e0e308 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ long_description = "\n\n".join( setup( name='croniter', - version='0.3.11.dev0', + version='0.3.12.dev0', py_modules=['croniter', ], description=( 'croniter provides iteration for datetime ' diff --git a/src/croniter/croniter.py b/src/croniter/croniter.py index eabb241..0f9d468 100644 --- a/src/croniter/croniter.py +++ b/src/croniter/croniter.py @@ -271,6 +271,8 @@ class croniter(object): days = DAYS[month - 1] if month == 2 and self.is_leap(year) is True: days += 1 + if 'l' in expanded[2] and days==d.day: + return False, d if is_prev: days_in_prev_month = DAYS[ @@ -387,8 +389,10 @@ class croniter(object): candidates = to_check[:] candidates.reverse() for d in candidates: - if d <= x: + if d != 'l' and d <= x: return d - x + if 'l' in candidates: + return -x candidate = candidates[0] for c in candidates: if c < range_val: diff --git a/src/croniter/tests/test_croniter.py b/src/croniter/tests/test_croniter.py index f8ac6f6..0baa9c0 100755 --- a/src/croniter/tests/test_croniter.py +++ b/src/croniter/tests/test_croniter.py @@ -180,6 +180,49 @@ class CroniterTest(base.TestCase): self.assertEqual(n4.month, 12) self.assertEqual(n4.day, 31) + def testPrevLastDayOfMonth(self): + base = datetime(2009, 12, 31, hour=20) + itr = croniter('0 0 l * *', base) + n1 = itr.get_prev(datetime) + self.assertEqual(n1.month, 12) + self.assertEqual(n1.day, 31) + + base = datetime(2009, 12, 31) + itr = croniter('0 0 l * *', base) + n1 = itr.get_prev(datetime) + self.assertEqual(n1.month, 11) + self.assertEqual(n1.day, 30) + + base = datetime(2010, 1, 5) + itr = croniter('0 0 l * *', base) + n1 = itr.get_prev(datetime) + self.assertEqual(n1.month, 12) + self.assertEqual(n1.day, 31) + n1 = itr.get_prev(datetime) + self.assertEqual(n1.month, 11) + self.assertEqual(n1.day, 30) + n1 = itr.get_prev(datetime) + self.assertEqual(n1.month, 10) + self.assertEqual(n1.day, 31) + n1 = itr.get_prev(datetime) + self.assertEqual(n1.month, 9) + self.assertEqual(n1.day, 30) + + base = datetime(2010, 1, 31, minute=2) + itr = croniter('* * l * *', base) + n1 = itr.get_prev(datetime) + self.assertEqual(n1.month, 1) + self.assertEqual(n1.day, 31) + n1 = itr.get_prev(datetime) + self.assertEqual(n1.month, 1) + self.assertEqual(n1.day, 31) + n1 = itr.get_prev(datetime) + self.assertEqual(n1.month, 12) + self.assertEqual(n1.day, 31) + n1 = itr.get_prev(datetime) + self.assertEqual(n1.month, 12) + self.assertEqual(n1.day, 31) + def testError(self): itr = croniter('* * * * *') self.assertRaises(TypeError, itr.get_next, str)