Преглед на файлове

Adds celery command as an entrypoint to all other commands

Ask Solem преди 13 години
родител
ревизия
e8e805fd19
променени са 3 файла, в които са добавени 51 реда и са изтрити 11 реда
  1. 16 7
      celery/bin/base.py
  2. 34 4
      celery/bin/celeryctl.py
  3. 1 0
      setup.py

+ 16 - 7
celery/bin/base.py

@@ -9,12 +9,18 @@ from optparse import OptionParser, make_option as Option
 
 from .. import __version__, Celery
 from ..exceptions import CDeprecationWarning, CPendingDeprecationWarning
-
+from ..platforms import EX_FAILURE, EX_USAGE
 
 # always enable DeprecationWarnings, so our users can see them.
 for warning in (CDeprecationWarning, CPendingDeprecationWarning):
     warnings.simplefilter("once", warning, 0)
 
+ARGV_DISABLED = """
+Unrecognized command line arguments: %s
+
+Try --help?
+"""
+
 
 class Command(object):
     """Base class for command line applications.
@@ -116,14 +122,17 @@ class Command(object):
                         for k, v in vars(options).iteritems()
                             if not k.startswith('_'))
         argv = map(self.expanduser, argv)
-        if not self.supports_args and args:
-            sys.stderr.write(
-                "\nUnrecognized command line arguments: %s\n" % (
-                    ", ".join(args), ))
-            sys.stderr.write("\nTry --help?\n")
-            sys.exit(1)
+        self.check_args(args)
         return self.run(*args, **options)
 
+    def check_args(self, args):
+        if not self.supports_args and args:
+            self.die(ARGV_DISABLED % (', '.join(args, )), EX_USAGE)
+
+    def die(self, msg, status=EX_FAILURE):
+        sys.stderr.write(msg + "\n")
+        sys.exit(status)
+
     def parse_options(self, prog_name, arguments):
         """Parse the available options."""
         # Don't want to load configuration to just print the version,

+ 34 - 4
celery/bin/celeryctl.py

@@ -17,7 +17,7 @@ from anyjson import deserialize
 from .. import __version__
 from ..app import app_or_default, current_app
 from ..platforms import EX_OK, EX_FAILURE, EX_UNAVAILABLE, EX_USAGE
-from ..utils import pluralize, term
+from ..utils import get_cls_by_name, pluralize, term
 from ..utils.timeutils import maybe_iso8601
 
 from ..bin.base import Command as CeleryCommand
@@ -91,7 +91,10 @@ class Command(object):
         return OptionParser(prog=prog_name,
                             usage=self.usage(command),
                             version=self.version,
-                            option_list=self.option_list)
+                            option_list=self.get_options())
+
+    def get_options(self):
+        return self.option_list
 
     def run_from_argv(self, prog_name, argv):
         self.prog_name = prog_name
@@ -136,8 +139,35 @@ class Command(object):
         return OK, pformat(n)
 
 
+class Delegate(Command):
+
+    def __init__(self, *args, **kwargs):
+        super(Delegate, self).__init__(*args, **kwargs)
+
+        self.target = get_cls_by_name(self.Command)(app=self.app)
+        self.args = self.target.args
+
+    def get_options(self):
+        return self.option_list + self.target.get_options()
+
+    def run(self, *args, **kwargs):
+        self.target.check_args(args)
+        return self.target.run(*args, **kwargs)
+
+
+def create_delegate(name, Command):
+    return command(type(name, (Delegate, ), {"Command": Command,
+                                             "__module__": __name__}))
+
+
+worker = create_delegate("worker", "celery.bin.celeryd:WorkerCommand")
+events = create_delegate("events", "celery.bin.celeryev:EvCommand")
+beat = create_delegate("beat", "celery.bin.celerybeat:BeatCommand")
+amqp = create_delegate("amqp", "celery.bin.camqadm:AMQPAdminCommand")
+
+
 class list_(Command):
-    args = "<bindings>"
+    args = "[bindings]"
 
     def list_bindings(self, channel):
         try:
@@ -484,7 +514,7 @@ class celeryctl(CeleryCommand):
 
     def remove_options_at_beginning(self, argv, index=0):
         if argv:
-            while index <= len(argv):
+            while index < len(argv):
                 value = argv[index]
                 if value.startswith("--"):
                     pass

+ 1 - 0
setup.py

@@ -152,6 +152,7 @@ else:
 # -*- Entry Points -*- #
 
 console_scripts = entrypoints["console_scripts"] = [
+        'celery = celery.bin.celeryctl:main',
         'celeryd = celery.bin.celeryd:main',
         'celerybeat = celery.bin.celerybeat:main',
         'camqadm = celery.bin.camqadm:main',