Skip to content

Commit

Permalink
Allow passing meta into jobs decorator, move depends_on to decorator
Browse files Browse the repository at this point in the history
  • Loading branch information
jlucas91 committed Oct 25, 2017
1 parent 92c88d3 commit d8f4168
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 6 deletions.
10 changes: 7 additions & 3 deletions rq/decorators.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class job(object): # noqa

def __init__(self, queue, connection=None, timeout=None,
result_ttl=DEFAULT_RESULT_TTL, ttl=None,
queue_class=None):
queue_class=None, depends_on=None, meta=None):
"""A decorator that adds a ``delay`` method to the decorated function,
which in turn creates a RQ job when called. Accepts a required
``queue`` argument that can be either a ``Queue`` instance or a string
Expand All @@ -34,6 +34,8 @@ def simple_add(x, y):
self.timeout = timeout
self.result_ttl = result_ttl
self.ttl = ttl
self.meta = meta
self.depends_on = depends_on

def __call__(self, f):
@wraps(f)
Expand All @@ -43,10 +45,12 @@ def delay(*args, **kwargs):
connection=self.connection)
else:
queue = self.queue
depends_on = kwargs.pop('depends_on', None)
at_front = kwargs.pop('at_front', False)

return queue.enqueue_call(f, args=args, kwargs=kwargs,
timeout=self.timeout, result_ttl=self.result_ttl,
ttl=self.ttl, depends_on=depends_on, at_front=at_front)
ttl=self.ttl, depends_on=self.depends_on, at_front=at_front,
meta=self.meta)

f.delay = delay
return f
29 changes: 26 additions & 3 deletions tests/test_decorator.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,21 +70,44 @@ def hello():
result = hello.delay()
self.assertEqual(result.ttl, 30)

def test_decorator_accepts_meta_as_argument(self):
"""Ensure that passing in meta to the decorator sets the meta on the job
"""
# Ensure default
result = decorated_job.delay(1, 2)
self.assertEqual(result.meta, {})

test_meta = {
'metaKey1': 1,
'metaKey2': 2,
}

@job('default', meta=test_meta)
def hello():
return 'Hello'
result = hello.delay()
self.assertEqual(result.meta, test_meta)

def test_decorator_accepts_result_depends_on_as_argument(self):
"""Ensure that passing in depends_on to the decorator sets the
correct dependency on the job
"""
# Ensure default
result = decorated_job.delay(1, 2)
self.assertEqual(result.dependency, None)
self.assertEqual(result._dependency_id, None)

@job(queue='queue_name')
def foo():
return 'Firstly'

@job(queue='queue_name')
foo_job = foo.delay()

@job(queue='queue_name', depends_on=foo_job)
def bar():
return 'Secondly'

foo_job = foo.delay()
bar_job = bar.delay(depends_on=foo_job)
bar_job = bar.delay()

self.assertIsNone(foo_job._dependency_id)

Expand Down

0 comments on commit d8f4168

Please sign in to comment.