summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Grönholm <alex.gronholm@nextday.fi>2018-08-10 11:20:47 +0300
committerAlex Grönholm <alex.gronholm@nextday.fi>2018-08-10 11:21:21 +0300
commit3923b293e42c4f19dd370f400f077ce44847dc64 (patch)
tree04cc1f0de2c46f1cc01e5290e43788a5eb4d7ca7
parent18b50d9ee9ff14e816b557e34d7d3abc861d57e5 (diff)
downloadapscheduler-3923b293e42c4f19dd370f400f077ce44847dc64.tar.gz
Fixed scheduling of bound methods on persistent job stores
Fixes #326.
-rw-r--r--apscheduler/job.py9
-rw-r--r--docs/versionhistory.rst8
-rw-r--r--tests/test_jobstores.py12
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)