From d611e66093ab5485018a9b48287a253ec947b9f0 Mon Sep 17 00:00:00 2001 From: iddo Date: Tue, 12 Jan 2016 21:47:41 +0200 Subject: [PATCH] Bug fix: The get_prev API crashed when last day of month token was used. Some essential logic was missing. --- src/croniter/croniter.py | 6 +++- src/croniter/tests/test_croniter.py | 43 +++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) 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)