diff options
author | Selwin Ong <selwin.ong@gmail.com> | 2017-07-28 14:01:03 +0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-07-28 14:01:03 +0700 |
commit | 7d61bcd76c45dd367f21e3b5fb918fd5c6c296b2 (patch) | |
tree | 1bfdb3c947a4ca4eafffee922ca74024d6f48db9 | |
parent | 29068151c94d94f80db761fdc8bf9c4faa2833c5 (diff) | |
parent | 0efb87a46be08f051399c343f41d292855f783bf (diff) | |
download | rq-7d61bcd76c45dd367f21e3b5fb918fd5c6c296b2.tar.gz |
Merge pull request #861 from nvie/fix-unpickleable-result
Fix unpickleable result
-rw-r--r-- | rq/job.py | 6 | ||||
-rw-r--r-- | tests/test_job.py | 16 |
2 files changed, 19 insertions, 3 deletions
@@ -441,7 +441,6 @@ class Job(object): You can exclude serializing the `meta` dictionary by setting `include_meta=False`. - """ obj = {} obj['created_at'] = utcformat(self.created_at or utcnow()) @@ -458,7 +457,10 @@ class Job(object): if self.ended_at is not None: obj['ended_at'] = utcformat(self.ended_at) if self._result is not None: - obj['result'] = dumps(self._result) + try: + obj['result'] = dumps(self._result) + except: + obj['result'] = 'Unpickleable return value' if self.exc_info is not None: obj['exc_info'] = self.exc_info if self.timeout is not None: diff --git a/tests/test_job.py b/tests/test_job.py index 46d7d39..67b87e2 100644 --- a/tests/test_job.py +++ b/tests/test_job.py @@ -5,10 +5,17 @@ from __future__ import (absolute_import, division, print_function, from datetime import datetime import time +import sys +is_py2 = sys.version[0] == '2' +if is_py2: + import Queue as queue +else: + import queue as queue + from tests import fixtures, RQTestCase from tests.helpers import strip_microseconds -from rq.compat import PY2, as_text +from rq.compat import PY2 from rq.exceptions import NoSuchJobError, UnpickleError from rq.job import Job, get_current_job, JobStatus, cancel_job, requeue_job from rq.queue import Queue, get_failed_queue @@ -292,6 +299,13 @@ class TestJob(RQTestCase): serialized2.pop('meta') self.assertDictEqual(serialized, serialized2) + def test_unpickleable_result(self): + """Unpickleable job result doesn't crash job.to_dict()""" + job = Job.create(func=fixtures.say_hello, args=('Lionel',)) + job._result = queue.Queue() + data = job.to_dict() + self.assertEqual(data['result'], 'Unpickleable return value') + def test_result_ttl_is_persisted(self): """Ensure that job's result_ttl is set properly""" job = Job.create(func=fixtures.say_hello, args=('Lionel',), result_ttl=10) |