summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathieu Le Marec - Pasquet <kiorky@cryptelium.net>2016-01-13 10:21:19 +0100
committerMathieu Le Marec - Pasquet <kiorky@cryptelium.net>2016-01-13 10:21:19 +0100
commit13bde87e718e02f1729fee5a1a637b8311c25e18 (patch)
treef50d6460f9a94f734f2050d8c79e8cbdd8c6676d
parentb1d772dc36284152e0238c7416fe7f82b60e383b (diff)
parent5f7109f31e1d1b759b9e20a3e4ca615aa348e044 (diff)
downloadcroniter-13bde87e718e02f1729fee5a1a637b8311c25e18.tar.gz
Merge pull request #51 from kiorky/master
backport
-rw-r--r--docs/CHANGES.rst12
-rw-r--r--setup.py2
-rw-r--r--src/croniter/croniter.py6
-rwxr-xr-xsrc/croniter/tests/test_croniter.py43
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>]
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)