Browse Source

--app option now 'autodetects'

- If the provided path is a module it tries to get an
attribute named 'celery'.

- If the provided path is a package it tries
  to import a submodule named 'celery',
  and get the celery attribute from that module.

E.g. if you have a project named 'proj' where the
celery app is located in 'from proj.celery import celery',
then the following will be equivalent:

    $ celeryd --app=proj
    $ celeryd --app=proj.celery:
    $ celeryd --app=proj.celery:celery
Ask Solem 13 years ago
parent
commit
274dfb7841
2 changed files with 13 additions and 4 deletions
  1. 10 1
      celery/bin/base.py
  2. 3 3
      celery/utils/imports.py

+ 10 - 1
celery/bin/base.py

@@ -68,6 +68,7 @@ import warnings
 
 from collections import defaultdict
 from optparse import OptionParser, make_option as Option
+from types import ModuleType
 
 from celery import Celery, __version__
 from celery.exceptions import CDeprecationWarning, CPendingDeprecationWarning
@@ -243,13 +244,21 @@ class Command(object):
         if config_module:
             os.environ["CELERY_CONFIG_MODULE"] = config_module
         if app:
-            self.app = self.symbol_by_name(app)
+            self.app = self.find_app(app)
         else:
             self.app = self.get_app(loader=loader)
         if self.enable_config_from_cmdline:
             argv = self.process_cmdline_config(argv)
         return argv
 
+    def find_app(self, app):
+        sym = self.symbol_by_name(app)
+        if isinstance(sym, ModuleType):
+            if getattr(sym, "__path__", None):
+                return self.find_app("%s.celery:" % (app.replace(":", ""), ))
+            return sym.celery
+        return sym
+
     def symbol_by_name(self, name):
         return symbol_by_name(name, imp=import_from_cwd)
     get_cls_by_name = symbol_by_name  # XXX compat

+ 3 - 3
celery/utils/imports.py

@@ -73,15 +73,15 @@ def symbol_by_name(name, aliases={}, imp=None, package=None,
     name = aliases.get(name) or name
     sep = ':' if ':' in name else sep
     module_name, _, cls_name = name.rpartition(sep)
-    if not module_name and package:
-        module_name = package
+    if not module_name:
+        cls_name, module_name = None, package if package else cls_name
     try:
         try:
             module = imp(module_name, package=package, **kwargs)
         except ValueError, exc:
             raise ValueError, ValueError(
                     "Couldn't import %r: %s" % (name, exc)), sys.exc_info()[2]
-        return getattr(module, cls_name)
+        return getattr(module, cls_name) if cls_name else module
     except (ImportError, AttributeError):
         if default is None:
             raise