Skip to content

Commit dba299a

Browse files
committed
New signals: app.on_configure, .on_after_configure, .on_after_finalize
1 parent 2dcc8de commit dba299a

File tree

4 files changed

+43
-16
lines changed

4 files changed

+43
-16
lines changed

celery/app/base.py

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
from celery.five import items, values
3535
from celery.loaders import get_loader_cls
3636
from celery.local import PromiseProxy, maybe_evaluate
37+
from celery.utils.dispatch import Signal
3738
from celery.utils.functional import first, maybe_list
3839
from celery.utils.imports import instantiate, symbol_by_name
3940
from celery.utils.objects import mro_lookup
@@ -117,6 +118,15 @@ class Celery(object):
117118
_pool = None
118119
builtin_fixups = BUILTIN_FIXUPS
119120

121+
#: Signal sent when app is loading configuration.
122+
on_configure = None
123+
124+
#: Signal sent after app has prepared the configuration.
125+
on_after_configure = None
126+
127+
#: Signal sent after app has been finalized.
128+
on_after_finalize = None
129+
120130
def __init__(self, main=None, loader=None, backend=None,
121131
amqp=None, events=None, log=None, control=None,
122132
set_as_current=True, accept_magic_kwargs=False,
@@ -171,6 +181,13 @@ def __init__(self, main=None, loader=None, backend=None,
171181
if self.set_as_current:
172182
self.set_current()
173183

184+
# Signals
185+
if self.on_configure is None:
186+
# used to be a method pre 3.2
187+
self.on_configure = Signal()
188+
self.on_after_configure = Signal()
189+
self.on_after_finalize = Signal()
190+
174191
self.on_init()
175192
_register_app(self)
176193

@@ -283,6 +300,8 @@ def finalize(self, auto=False):
283300
for task in values(self._tasks):
284301
task.bind(self)
285302

303+
self.on_after_finalize.send(sender=self)
304+
286305
def add_defaults(self, fun):
287306
if not callable(fun):
288307
d, fun = fun, lambda: d
@@ -455,12 +474,12 @@ def _get_backend(self):
455474
self.loader)
456475
return backend(app=self, url=url)
457476

458-
def on_configure(self):
459-
"""Callback calld when the app loads configuration"""
460-
pass
461-
462477
def _get_config(self):
463-
self.on_configure()
478+
if isinstance(self.on_configure, Signal):
479+
self.on_configure.send(sender=self)
480+
else:
481+
# used to be a method pre 3.2
482+
self.on_configure()
464483
if self._config_source:
465484
self.loader.config_from_object(self._config_source)
466485
self.configured = True
@@ -474,6 +493,7 @@ def _get_config(self):
474493
if self._preconf:
475494
for key, value in items(self._preconf):
476495
setattr(s, key, value)
496+
self.on_after_configure.send(sender=self, source=s)
477497
return s
478498

479499
def _after_fork(self, obj_):

docs/reference/celery.rst

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -382,9 +382,17 @@ and creating Celery applications.
382382
Finalizes the app by loading built-in tasks,
383383
and evaluating pending task decorators
384384

385-
.. method:: Celery.on_configure()
385+
.. signal:: on_configure
386386

387-
Optional callback for when the first time the configured is required.
387+
Signal sent when app is loading configuration.
388+
389+
.. signal:: on_after_configure
390+
391+
Signal sent after app has prepared the configuration.
392+
393+
.. signal:: on_after_finalize
394+
395+
Signal sent after app has been finalized.
388396

389397
.. attribute:: Celery.Pickler
390398

funtests/stress/stress/app.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def __init__(self, *args, **kwargs):
3333
)
3434
)
3535
signals.user_preload_options.connect(self.on_preload_parsed)
36-
self.after_configure = None
36+
self.on_configure.connect(self._maybe_use_default_template)
3737

3838
def on_preload_parsed(self, options=None, **kwargs):
3939
self.use_template(options['template'])
@@ -44,13 +44,7 @@ def use_template(self, name='default'):
4444
use_template(self, name)
4545
self.template_selected = True
4646

47-
def _get_config(self):
48-
ret = super(App, self)._get_config()
49-
if self.after_configure:
50-
self.after_configure(ret)
51-
return ret
52-
53-
def on_configure(self):
47+
def _maybe_use_default_template(self, **kwargs):
5448
if not self.template_selected:
5549
self.use_template('default')
5650

funtests/stress/stress/templates.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,12 @@ def _register(cls):
2323

2424
def use_template(app, template='default'):
2525
template = template.split(',')
26-
app.after_configure = partial(mixin_templates, template[1:])
26+
27+
# mixin the rest of the templates when the config is needed
28+
@app.on_after_configure.connect
29+
def load_template(sender, source, **kwargs):
30+
mixin_templates(template[1:], source)
31+
2732
app.config_from_object(templates[template[0]])
2833

2934

0 commit comments

Comments
 (0)