Procházet zdrojové kódy

user_options["preload"] and new signals.user_preload_options can be used to add new global options

Ask Solem před 11 roky
rodič
revize
04c8da60e3
2 změnil soubory, kde provedl 21 přidání a 2 odebrání
  1. 20 2
      celery/bin/base.py
  2. 1 0
      celery/signals.py

+ 20 - 2
celery/bin/base.py

@@ -80,6 +80,7 @@ from pprint import pformat
 from types import ModuleType
 
 from celery import VERSION_BANNER, Celery, maybe_patch_concurrency
+from celery import signals
 from celery.exceptions import CDeprecationWarning, CPendingDeprecationWarning
 from celery.five import items, string, string_t, values
 from celery.platforms import EX_FAILURE, EX_OK, EX_USAGE
@@ -373,6 +374,11 @@ class Command(object):
         return self.parser.parse_args(arguments)
 
     def create_parser(self, prog_name, command=None):
+        option_list = (
+            self.preload_options +
+            self.get_options() +
+            tuple(self.app.user_options['preload'])
+        )
         return self.prepare_parser(self.Parser(
             prog=prog_name,
             usage=self.usage(command),
@@ -380,7 +386,7 @@ class Command(object):
             epilog=self.epilog,
             formatter=HelpFormatter(),
             description=self.description,
-            option_list=(self.preload_options + self.get_options()),
+            option_list=option_list,
         ))
 
     def prepare_parser(self, parser):
@@ -427,6 +433,15 @@ class Command(object):
                 argv = self.process_cmdline_config(argv)
         else:
             self.app = Celery()
+
+        user_preload = tuple(self.app.user_options['preload'] or ())
+        if user_preload:
+            user_options = self.preparse_options(argv, user_preload)
+            for user_option in user_preload:
+                user_options.setdefault(user_option.dest, user_option.default)
+            signals.user_preload_options.send(
+                sender=self, app=self.app, options=user_options,
+            )
         return argv
 
     def find_app(self, app):
@@ -465,9 +480,12 @@ class Command(object):
         return argv
 
     def parse_preload_options(self, args):
+        return self.preparse_options(args, self.preload_options)
+
+    def preparse_options(self, args, options):
         acc = {}
         opts = {}
-        for opt in self.preload_options:
+        for opt in options:
             for t in (opt._long_opts, opt._short_opts):
                 opts.update(dict(zip(t, [opt] * len(t))))
         index = 0

+ 1 - 0
celery/signals.py

@@ -66,3 +66,4 @@ eventlet_pool_started = Signal(providing_args=[])
 eventlet_pool_preshutdown = Signal(providing_args=[])
 eventlet_pool_postshutdown = Signal(providing_args=[])
 eventlet_pool_apply = Signal(providing_args=['target', 'args', 'kwargs'])
+user_preload_options = Signal(providing_args=['app', 'options'])