diff options
author | Pengjie Song (宋鹏捷) <spengjie@sina.com> | 2020-10-08 01:52:28 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-07 20:52:28 +0300 |
commit | a34204e6634f900fae023da8afbc63303fe931ee (patch) | |
tree | 05617f4c2148a7ffb2b9c0791c125b9771514c79 | |
parent | 15477e6d7005b31ae6caf4e141f9f31717382bd0 (diff) | |
download | apscheduler-a34204e6634f900fae023da8afbc63303fe931ee.tar.gz |
Fixed textual referenced bound methods issue on persistent job stores #466 (#467)
-rw-r--r-- | apscheduler/job.py | 5 | ||||
-rw-r--r-- | tests/test_jobstores.py | 21 |
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) |