Bug fix: The get_prev API crashed when last day of month token was used. Some essential logic was missing.

This commit is contained in:
iddo 2016-01-12 21:47:41 +02:00
parent 7cfd1818c1
commit d611e66093
2 changed files with 48 additions and 1 deletions

View File

@ -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:

View File

@ -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)