summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPengjie Song (宋鹏捷) <spengjie@sina.com>2020-10-08 01:52:28 +0800
committerGitHub <noreply@github.com>2020-10-07 20:52:28 +0300
commita34204e6634f900fae023da8afbc63303fe931ee (patch)
tree05617f4c2148a7ffb2b9c0791c125b9771514c79
parent15477e6d7005b31ae6caf4e141f9f31717382bd0 (diff)
downloadapscheduler-a34204e6634f900fae023da8afbc63303fe931ee.tar.gz
Fixed textual referenced bound methods issue on persistent job stores #466 (#467)
-rw-r--r--apscheduler/job.py5
-rw-r--r--tests/test_jobstores.py21
2 files changed, 22 insertions, 4 deletions
diff --git a/apscheduler/job.py b/apscheduler/job.py
index d676ca8..5c1b75d 100644
--- a/apscheduler/job.py
+++ b/apscheduler/job.py
@@ -242,8 +242,9 @@ class Job(object):
# Instance methods cannot survive serialization as-is, so store the "self" argument
# explicitly
- if ismethod(self.func) and not isclass(self.func.__self__):
- args = (self.func.__self__,) + tuple(self.args)
+ func = self.func
+ if ismethod(func) and not isclass(func.__self__) and obj_to_ref(func) == self.func_ref:
+ args = (func.__self__,) + tuple(self.args)
else:
args = self.args
diff --git a/tests/test_jobstores.py b/tests/test_jobstores.py
index f913f37..132161b 100644
--- a/tests/test_jobstores.py
+++ b/tests/test_jobstores.py
@@ -27,6 +27,9 @@ class DummyClass:
return a + b
+dummy_instance = DummyClass()
+
+
@pytest.fixture
def memjobstore():
yield MemoryJobStore()
@@ -112,19 +115,33 @@ def create_add_job(timezone, create_job):
return create
-def test_add_instance_method_job(jobstore, create_add_job):
+def test_add_callable_instance_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_add_class_method_job(jobstore, create_add_job):
+def test_add_callable_class_method_job(jobstore, create_add_job):
initial_job = create_add_job(jobstore, DummyClass.dummy_classmethod, kwargs={'a': 1, 'b': 2})
job = jobstore.lookup_job(initial_job.id)
assert job.func(*job.args, **job.kwargs) == 3
+def test_add_textual_instance_method_job(jobstore, create_add_job):
+ initial_job = create_add_job(jobstore, 'tests.test_jobstores:dummy_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_add_textual_class_method_job(jobstore, create_add_job):
+ initial_job = create_add_job(jobstore, 'tests.test_jobstores:DummyClass.dummy_classmethod',
+ 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)