summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSelwin Ong <selwin.ong@gmail.com>2017-07-28 15:56:26 +0700
committerSelwin Ong <selwin.ong@gmail.com>2017-07-28 15:56:26 +0700
commit4a9bc6e76a00c85b79deca341e9422f0e7813e97 (patch)
tree314b935b5a055a9bce6e7c4e0fe2e9a801ae656d
parent03c3f66ca70830f867da5f710534a1397e2f19e7 (diff)
parent7d61bcd76c45dd367f21e3b5fb918fd5c6c296b2 (diff)
downloadrq-4a9bc6e76a00c85b79deca341e9422f0e7813e97.tar.gz
Merge branch 'master' of github.com:nvie/rq
-rw-r--r--rq/job.py6
-rw-r--r--tests/test_job.py16
2 files changed, 19 insertions, 3 deletions
diff --git a/rq/job.py b/rq/job.py
index da57e1d..83baacb 100644
--- a/rq/job.py
+++ b/rq/job.py
@@ -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)