diff --git a/schedule/__init__.py b/schedule/__init__.py index 7b87e6a5..2dc8271c 100644 --- a/schedule/__init__.py +++ b/schedule/__init__.py @@ -73,6 +73,13 @@ class CancelJob(object): pass +class SkipJob(object): + """ + Can be returned from a job to skip a run. + """ + pass + + class Scheduler(object): """ Objects instantiated by the :class:`Scheduler ` are @@ -483,7 +490,8 @@ def run(self): """ logger.info('Running job %s', self) ret = self.job_func() - self.last_run = datetime.datetime.now() + if not isinstance(ret, SkipJob) and ret is not SkipJob: + self.last_run = datetime.datetime.now() self._schedule_next_run() return ret diff --git a/test_schedule.py b/test_schedule.py index 7df359ae..a9f5134f 100644 --- a/test_schedule.py +++ b/test_schedule.py @@ -444,6 +444,31 @@ def stop_job(): schedule.run_all() assert len(schedule.jobs) == 0 + def test_skip_job(self): + skip = True + + def skip_job(): + if skip: + return schedule.SkipJob + else: + return None + + job = every().second.do(skip_job) + + assert len(schedule.jobs) == 1 + assert job.last_run is None + + schedule.run_all() + + assert len(schedule.jobs) == 1 + assert job.last_run is None + + skip = False + schedule.run_all() + + assert len(schedule.jobs) == 1 + assert job.last_run is not None + def test_tag_type_enforcement(self): job1 = every().second.do(make_mock_job(name='job1')) self.assertRaises(TypeError, job1.tag, {})