Fixes "next" time is actually the next in some cases

* Also swapped to '0.xx' versioning as per github user mgedmin.
This commit is contained in:
Josiah Carlson 2013-06-19 23:40:57 -07:00
parent 662bd8a947
commit 1209496ff7
3 changed files with 23 additions and 18 deletions

View file

@ -321,24 +321,24 @@ class CronTab(object):
else: else:
# we are going forwards # we are going forwards
_test = lambda: self.matchers.year < future.year _test = lambda: self.matchers.year < future.year
to_test = 0
while to_test < 6: # Start from the year and work our way down. Any time we increment a
incr = increments[to_test] # higher-magnitude value, we reset all lower-magnitude values. This
ch = False # gets us performance without sacrificing correctness. Still more
inc = None # complicated than a brute-force approach, but also orders of
while not self._test_match(to_test, future): # magnitude faster in basically all cases.
inc = incr(future, self.matchers) to_test = 5
while to_test >= 0:
if not self._test_match(to_test, future):
inc = increments[to_test](future, self.matchers)
future += inc future += inc
ch = True for i in xrange(0, to_test):
future = increments[6+i](future, inc)
if _test(): if _test():
return None return None
if ch: to_test = 5
for i in xrange(0, to_test-1):
future = increments[6+i](future, inc)
to_test = 0
continue continue
to_test -= 1
to_test += 1
# verify the match # verify the match
match = [self._test_match(i, future) for i in xrange(6)] match = [self._test_match(i, future) for i in xrange(6)]

View file

@ -7,7 +7,7 @@ with open('README') as f:
setup( setup(
name='crontab', name='crontab',
version='.16', version='0.17',
description='Parse and use crontab schedules in Python', description='Parse and use crontab schedules in Python',
author='Josiah Carlson', author='Josiah Carlson',
author_email='josiah.carlson@gmail.com', author_email='josiah.carlson@gmail.com',

View file

@ -38,12 +38,12 @@ class TestCrontab(unittest.TestCase):
n = datetime.datetime.utcfromtimestamp(ce.next(t945, delta=False)) n = datetime.datetime.utcfromtimestamp(ce.next(t945, delta=False))
assert n == datetime.datetime(2013, 1, 1, 10, 0), n assert n == datetime.datetime(2013, 1, 1, 10, 0), n
p = datetime.datetime.utcfromtimestamp(ce.previous(t945, delta=False)) p = datetime.datetime.utcfromtimestamp(ce.previous(t945, delta=False))
assert p == datetime.datetime(2012, 12, 31, 15, 30) assert p == datetime.datetime(2012, 12, 31, 15, 45), p
n = datetime.datetime.utcfromtimestamp(ce.next(s1245, delta=False)) n = datetime.datetime.utcfromtimestamp(ce.next(s1245, delta=False))
assert n == datetime.datetime(2013, 1, 7, 10, 0) assert n == datetime.datetime(2013, 1, 7, 10, 0), n
p = datetime.datetime.utcfromtimestamp(ce.previous(s1245, delta=False)) p = datetime.datetime.utcfromtimestamp(ce.previous(s1245, delta=False))
assert p == datetime.datetime(2013, 1, 4, 15, 45) assert p == datetime.datetime(2013, 1, 4, 15, 45), p
def test_normal(self): def test_normal(self):
self._run_test('* * * * *', 60) self._run_test('* * * * *', 60)
@ -66,6 +66,11 @@ class TestCrontab(unittest.TestCase):
self._run_test('0-6,50-59/2 * * * *', 60, datetime.datetime(2011, 1, 1, 1, 55)) self._run_test('0-6,50-59/2 * * * *', 60, datetime.datetime(2011, 1, 1, 1, 55))
self._run_test('0-6,50/2 * * * *', 60, datetime.datetime(2011, 1, 1, 1, 55)) self._run_test('0-6,50/2 * * * *', 60, datetime.datetime(2011, 1, 1, 1, 55))
self._run_test('10,20 15 * * *', 9*60, datetime.datetime(2011, 1, 1, 15, 1), min_delay=9*60)
self._run_test('10,20 15 * * *', 5*60, datetime.datetime(2011, 1, 1, 15, 15), min_delay=5*60)
self._run_test('10,20 15 * * *', 86400 - 600, datetime.datetime(2011, 1, 1, 15, 20), min_delay=86400 - 600)
self._run_test('* 2-5 * * *', 12525, datetime.datetime(2013, 6, 19, 22, 31, 15), min_delay=12525)
def test_alternate(self): def test_alternate(self):
self._run_test('0 0 1 jan-dec *', 32 * 86400) self._run_test('0 0 1 jan-dec *', 32 * 86400)
self._run_test('0 0 ? * sun-sat', 86400) self._run_test('0 0 ? * sun-sat', 86400)