diff options
author | Mathieu Le Marec - Pasquet <kiorky@cryptelium.net> | 2016-01-13 10:21:19 +0100 |
---|---|---|
committer | Mathieu Le Marec - Pasquet <kiorky@cryptelium.net> | 2016-01-13 10:21:19 +0100 |
commit | 13bde87e718e02f1729fee5a1a637b8311c25e18 (patch) | |
tree | f50d6460f9a94f734f2050d8c79e8cbdd8c6676d | |
parent | b1d772dc36284152e0238c7416fe7f82b60e383b (diff) | |
parent | 5f7109f31e1d1b759b9e20a3e4ca615aa348e044 (diff) | |
download | croniter-13bde87e718e02f1729fee5a1a637b8311c25e18.tar.gz |
Merge pull request #51 from kiorky/master
backport
-rw-r--r-- | docs/CHANGES.rst | 12 | ||||
-rw-r--r-- | setup.py | 2 | ||||
-rw-r--r-- | src/croniter/croniter.py | 6 | ||||
-rwxr-xr-x | src/croniter/tests/test_croniter.py | 43 |
4 files changed, 59 insertions, 4 deletions
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 <iddo.aviram@similarweb.com>] + + 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 <iddo.aviram@similarweb.com>] @@ -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) |