Skip to content

Commit

Permalink
Merge 521a6a1 into cd890d0
Browse files Browse the repository at this point in the history
  • Loading branch information
arkhan19 committed Jun 18, 2018
2 parents cd890d0 + 521a6a1 commit 6de5c58
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 8 deletions.
22 changes: 16 additions & 6 deletions schedule/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,14 +117,15 @@ def cancel_job(self, job):
except ValueError:
pass

def every(self, interval=1):
def every(self, interval=1, till=None):
"""
Schedule a new periodic job.
:param till:
:param interval: A quantity of a certain time unit
:return: An unconfigured :class:`Job <Job>`
"""
job = Job(interval, self)
job = Job(interval, till, self)
return job

def _run_job(self, job):
Expand Down Expand Up @@ -169,7 +170,7 @@ class Job(object):
A job is usually created and returned by :meth:`Scheduler.every`
method, which also defines its `interval`.
"""
def __init__(self, interval, scheduler=None):
def __init__(self, interval, till=None, scheduler=None):
self.interval = interval # pause interval * unit between runs
self.latest = None # upper limit to the interval
self.job_func = None # the job job_func to run
Expand All @@ -181,6 +182,8 @@ def __init__(self, interval, scheduler=None):
self.start_day = None # Specific day of the week to start on
self.tags = set() # unique set of tags for the job
self.scheduler = scheduler # scheduler to register with
self.till = till
self.counter = 0

def __lt__(self, other):
"""
Expand Down Expand Up @@ -378,6 +381,8 @@ def do(self, job_func, *args, **kwargs):
:param job_func: The function to be scheduled
:return: The invoked job instance
"""
self.job_func = functools.partial(job_func, *args, **kwargs)
try:
Expand All @@ -396,7 +401,11 @@ def should_run(self):
"""
:return: ``True`` if the job should be run now.
"""
return datetime.datetime.now() >= self.next_run
# return datetime.datetime.now() >= self.next_run
while datetime.datetime.now() >= self.next_run:
if self.counter is self.till: return False
else:
return True

def run(self):
"""
Expand All @@ -408,6 +417,7 @@ def run(self):
ret = self.job_func()
self.last_run = datetime.datetime.now()
self._schedule_next_run()
self.counter += 1
return ret

def _schedule_next_run(self):
Expand Down Expand Up @@ -476,11 +486,11 @@ def _schedule_next_run(self):
jobs = default_scheduler.jobs # todo: should this be a copy, e.g. jobs()?


def every(interval=1):
def every(interval=1, till=None):
"""Calls :meth:`every <Scheduler.every>` on the
:data:`default scheduler instance <default_scheduler>`.
"""
return default_scheduler.every(interval)
return default_scheduler.every(interval, till)


def run_pending():
Expand Down
9 changes: 7 additions & 2 deletions test_schedule.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,14 +120,17 @@ def test_next_run_time(self):
assert every().friday.do(mock_job).next_run.day == 8
assert every().saturday.do(mock_job).next_run.day == 9
assert every().sunday.do(mock_job).next_run.day == 10
assert every(2, 10).minutes.do(mock_job).till == 10
assert every(2, 0).minutes.do(mock_job).till == 0

def test_run_all(self):
mock_job = make_mock_job()
every().minute.do(mock_job)
every().hour.do(mock_job)
every().day.at('11:00').do(mock_job)
every(1, 2).seconds.do(mock_job)
schedule.run_all()
assert mock_job.call_count == 3
assert mock_job.call_count == 4

def test_job_func_args_are_passed_on(self):
mock_job = make_mock_job()
Expand Down Expand Up @@ -327,4 +330,6 @@ def test_misconfigured_job_wont_break_scheduler(self):
scheduler = schedule.Scheduler()
scheduler.every()
scheduler.every(10).seconds
scheduler.run_pending()
scheduler.every(10).seconds
schedule.every(10, 1).seconds
scheduler.run_pending()

0 comments on commit 6de5c58

Please sign in to comment.