Skip to content

Commit 34e8aa1

Browse files
authored
Merge pull request #60 from josegonzalez/issue-57
Implement step cron with a variable base
2 parents 2e46619 + 51a1c12 commit 34e8aa1

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

src/croniter/croniter.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from dateutil.relativedelta import relativedelta
99
from dateutil.tz import tzutc
1010

11+
step_search_re = re.compile(r'^([^-]+)-([^-/]+)(/(.*))?$')
1112
search_re = re.compile(r'^([^-]+)-([^-/]+)(/(.*))?$')
1213
only_int_re = re.compile(r'^\d+$')
1314
any_int_re = re.compile(r'^\d+')
@@ -76,12 +77,18 @@ def __init__(self, expr_format, start_time=None, ret_type=float):
7677

7778
while len(e_list) > 0:
7879
e = e_list.pop()
79-
t = re.sub(r'^\*(/.+)$', r'%d-%d\1' % (
80+
t = re.sub(r'^\*(\/.+)$', r'%d-%d\1' % (
8081
self.RANGES[i][0],
8182
self.RANGES[i][1]),
8283
str(e))
8384
m = search_re.search(t)
8485

86+
if not m:
87+
t = re.sub(r'^(.+)\/(.+)$', r'\1-%d/\2' % (
88+
self.RANGES[i][1]),
89+
str(e))
90+
m = step_search_re.search(t)
91+
8592
if m:
8693
(low, high, step) = m.group(1), m.group(2), m.group(4) or 1
8794

src/croniter/tests/test_croniter.py

+29-1
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ def testError(self):
233233
self.assertRaises(ValueError, croniter, '* * * janu-jun *')
234234

235235
def testSundayToThursdayWithAlphaConversion(self):
236-
base = datetime(2010, 8, 25, 15, 56) #wednesday
236+
base = datetime(2010, 8, 25, 15, 56) # wednesday
237237
itr = croniter("30 22 * * sun-thu", base)
238238
next = itr.get_next(datetime)
239239

@@ -395,6 +395,34 @@ def test_bug34(self):
395395
itr = croniter('* * 31 2 *', base)
396396
n1 = itr.get_next(datetime)
397397

398+
def testBug57(self):
399+
base = datetime(2012, 2, 24, 0, 0, 0)
400+
itr = croniter('0 4/6 * * *', base)
401+
n1 = itr.get_next(datetime)
402+
self.assertEqual(n1.hour, 4)
403+
self.assertEqual(n1.minute, 0)
404+
self.assertEqual(n1.month, 2)
405+
self.assertEqual(n1.day, 24)
406+
407+
n1 = itr.get_prev(datetime)
408+
self.assertEqual(n1.hour, 22)
409+
self.assertEqual(n1.minute, 0)
410+
self.assertEqual(n1.month, 2)
411+
self.assertEqual(n1.day, 23)
412+
413+
itr = croniter('0 0/6 * * *', base)
414+
n1 = itr.get_next(datetime)
415+
self.assertEqual(n1.hour, 6)
416+
self.assertEqual(n1.minute, 0)
417+
self.assertEqual(n1.month, 2)
418+
self.assertEqual(n1.day, 24)
419+
420+
n1 = itr.get_prev(datetime)
421+
self.assertEqual(n1.hour, 0)
422+
self.assertEqual(n1.minute, 0)
423+
self.assertEqual(n1.month, 2)
424+
self.assertEqual(n1.day, 24)
425+
398426
def test_rangeGenerator(self):
399427
base = datetime(2013, 3, 4, 0, 0)
400428
itr = croniter('1-9/2 0 1 * *', base)

0 commit comments

Comments
 (0)