diff options
author | Alex Grönholm <alex.gronholm@nextday.fi> | 2018-08-10 11:20:47 +0300 |
---|---|---|
committer | Alex Grönholm <alex.gronholm@nextday.fi> | 2018-08-10 11:21:21 +0300 |
commit | 3923b293e42c4f19dd370f400f077ce44847dc64 (patch) | |
tree | 04cc1f0de2c46f1cc01e5290e43788a5eb4d7ca7 | |
parent | 18b50d9ee9ff14e816b557e34d7d3abc861d57e5 (diff) | |
download | apscheduler-3923b293e42c4f19dd370f400f077ce44847dc64.tar.gz |
Fixed scheduling of bound methods on persistent job stores
Fixes #326.
-rw-r--r-- | apscheduler/job.py | 9 | ||||
-rw-r--r-- | docs/versionhistory.rst | 8 | ||||
-rw-r--r-- | tests/test_jobstores.py | 12 |
3 files changed, 28 insertions, 1 deletions
diff --git a/apscheduler/job.py b/apscheduler/job.py index b9c305d..33081b2 100644 --- a/apscheduler/job.py +++ b/apscheduler/job.py @@ -1,4 +1,5 @@ from collections import Iterable, Mapping +from inspect import ismethod from uuid import uuid4 import six @@ -235,13 +236,19 @@ class Job(object): 'be determined. Consider giving a textual reference (module:function name) ' 'instead.' % (self.func,)) + # Bound methods cannot survive serialization as-is, so store the "self" argument explicitly + if ismethod(self.func): + args = (self.func.__self__,) + tuple(self.args) + else: + args = self.args + return { 'version': 1, 'id': self.id, 'func': self.func_ref, 'trigger': self.trigger, 'executor': self.executor, - 'args': self.args, + 'args': args, 'kwargs': self.kwargs, 'name': self.name, 'misfire_grace_time': self.misfire_grace_time, diff --git a/docs/versionhistory.rst b/docs/versionhistory.rst index 8911030..b655d01 100644 --- a/docs/versionhistory.rst +++ b/docs/versionhistory.rst @@ -4,6 +4,14 @@ Version history To find out how to migrate your application from a previous version of APScheduler, see the :doc:`migration section <migration>`. +3.5.2 +----- + +* Fixed scheduling of bound methods on persistent job stores (the workaround of scheduling + ``YourClass.methodname`` along with an explicit ``self`` argument is no longer necessary as this + is now done automatically for you) + + 3.5.1 ----- diff --git a/tests/test_jobstores.py b/tests/test_jobstores.py index d97f6ad..4b9aefa 100644 --- a/tests/test_jobstores.py +++ b/tests/test_jobstores.py @@ -18,6 +18,11 @@ def dummy_job3(): pass +class DummyClass: + def dummy_method(self, a, b): + return a + b + + @pytest.yield_fixture def memjobstore(): yield MemoryJobStore() @@ -103,6 +108,13 @@ def create_add_job(timezone, create_job): return create +def test_add_method_job(jobstore, create_add_job): + instance = DummyClass() + initial_job = create_add_job(jobstore, instance.dummy_method, kwargs={'a': 1, 'b': 2}) + job = jobstore.lookup_job(initial_job.id) + assert job.func(*job.args, **job.kwargs) == 3 + + def test_lookup_job(jobstore, create_add_job): initial_job = create_add_job(jobstore) job = jobstore.lookup_job(initial_job.id) |