Allow retries to be set through decorator (#1319)

Co-authored-by: Didrik Koren <didrik.koren@uninett.no>
main
nerok 4 years ago committed by GitHub
parent c2931b45b6
commit 7bf100ebe7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -17,7 +17,7 @@ class job(object): # noqa
def __init__(self, queue, connection=None, timeout=None, def __init__(self, queue, connection=None, timeout=None,
result_ttl=DEFAULT_RESULT_TTL, ttl=None, result_ttl=DEFAULT_RESULT_TTL, ttl=None,
queue_class=None, depends_on=None, at_front=None, meta=None, queue_class=None, depends_on=None, at_front=None, meta=None,
description=None, failure_ttl=None): description=None, failure_ttl=None, retry=None):
"""A decorator that adds a ``delay`` method to the decorated function, """A decorator that adds a ``delay`` method to the decorated function,
which in turn creates a RQ job when called. Accepts a required which in turn creates a RQ job when called. Accepts a required
``queue`` argument that can be either a ``Queue`` instance or a string ``queue`` argument that can be either a ``Queue`` instance or a string
@ -40,6 +40,7 @@ class job(object): # noqa
self.at_front = at_front self.at_front = at_front
self.description = description self.description = description
self.failure_ttl = failure_ttl self.failure_ttl = failure_ttl
self.retry = retry
def __call__(self, f): def __call__(self, f):
@wraps(f) @wraps(f)
@ -63,6 +64,7 @@ class job(object): # noqa
return queue.enqueue_call(f, args=args, kwargs=kwargs, return queue.enqueue_call(f, args=args, kwargs=kwargs,
timeout=self.timeout, result_ttl=self.result_ttl, timeout=self.timeout, result_ttl=self.result_ttl,
ttl=self.ttl, depends_on=depends_on, job_id=job_id, at_front=at_front, ttl=self.ttl, depends_on=depends_on, job_id=job_id, at_front=at_front,
meta=self.meta, description=self.description, failure_ttl=self.failure_ttl) meta=self.meta, description=self.description, failure_ttl=self.failure_ttl,
retry=self.retry)
f.delay = delay f.delay = delay
return f return f

@ -6,7 +6,7 @@ import mock
from redis import Redis from redis import Redis
from rq.decorators import job from rq.decorators import job
from rq.job import Job from rq.job import Job, Retry
from rq.queue import Queue from rq.queue import Queue
from rq.worker import DEFAULT_RESULT_TTL from rq.worker import DEFAULT_RESULT_TTL
from tests import RQTestCase from tests import RQTestCase
@ -221,3 +221,19 @@ class TestDecorator(RQTestCase):
return 'Why hello' return 'Why hello'
result = hello.delay() result = hello.delay()
self.assertEqual(result.failure_ttl, 10) self.assertEqual(result.failure_ttl, 10)
def test_decorator_custom_retry(self):
""" Ensure that passing in retry to the decorator sets the
retry on the job
"""
# Ensure default
result = decorated_job.delay(1, 2)
self.assertEqual(result.retries_left, None)
self.assertEqual(result.retry_intervals, None)
@job('default', retry=Retry(3, [2]))
def hello():
return 'Why hello'
result = hello.delay()
self.assertEqual(result.retries_left, 3)
self.assertEqual(result.retry_intervals, [2])

Loading…
Cancel
Save