Browse Source

New celery.app.utils.find_app + tests passing on PyPy 2.2

Ask Solem 11 years ago
parent
commit
003e04a9cf
3 changed files with 47 additions and 38 deletions
  1. 41 3
      celery/app/utils.py
  2. 5 34
      celery/bin/base.py
  3. 1 1
      celery/tests/bin/test_base.py

+ 41 - 3
celery/app/utils.py

@@ -13,16 +13,18 @@ import platform as _platform
 import re
 
 from collections import Mapping
+from types import ModuleType
 
 from celery.datastructures import ConfigurationView
-from celery.five import items, string_t
+from celery.five import items, string_t, values
 from celery.platforms import pyimplementation
 from celery.utils.text import pretty
-from celery.utils.imports import qualname
+from celery.utils.imports import import_from_cwd, symbol_by_name, qualname
 
 from .defaults import find
 
-__all__ = ['appstr', 'Settings', 'filter_hidden_settings', 'bugreport']
+__all__ = ['Settings', 'appstr', 'bugreport',
+           'filter_hidden_settings', 'find_app']
 
 #: Format used to generate bugreport information.
 BUGREPORT_INFO = """
@@ -211,3 +213,39 @@ def bugreport(app):
         human_settings=app.conf.humanize(),
         loader=qualname(app.loader.__class__),
     )
+
+
+def find_app(app, symbol_by_name=symbol_by_name, imp=import_from_cwd):
+    from .base import Celery
+
+    try:
+        sym = symbol_by_name(app, imp=imp)
+    except AttributeError:
+        # last part was not an attribute, but a module
+        sym = imp(app)
+    if isinstance(sym, ModuleType) and ':' not in app:
+        try:
+            found = sym.app
+            if isinstance(found, ModuleType):
+                raise AttributeError()
+        except AttributeError:
+            try:
+                found = sym.celery
+                if isinstance(found, ModuleType):
+                    raise AttributeError()
+            except AttributeError:
+                if getattr(sym, '__path__', None):
+                    try:
+                        return find_app(
+                            '{0}.celery'.format(app),
+                            symbol_by_name=symbol_by_name, imp=imp,
+                        )
+                    except ImportError:
+                        pass
+                for suspect in values(vars(sym)):
+                    if isinstance(suspect, Celery):
+                        return suspect
+                raise
+        else:
+            return found
+    return sym

+ 5 - 34
celery/bin/base.py

@@ -77,12 +77,11 @@ from heapq import heappush
 from inspect import getargspec
 from optparse import OptionParser, IndentedHelpFormatter, make_option as Option
 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.five import items, string, string_t
 from celery.platforms import EX_FAILURE, EX_OK, EX_USAGE
 from celery.utils import term
 from celery.utils import text
@@ -445,39 +444,11 @@ class Command(object):
         return argv
 
     def find_app(self, app):
-        try:
-            sym = self.symbol_by_name(app)
-        except AttributeError:
-            # last part was not an attribute, but a module
-            sym = import_from_cwd(app)
-        if isinstance(sym, ModuleType):
-            try:
-                found = sym.app
-                if isinstance(found, ModuleType):
-                    raise AttributeError()
-            except AttributeError:
-                try:
-                    found = sym.celery
-                    if isinstance(found, ModuleType):
-                        raise AttributeError()
-                except AttributeError:
-                    if getattr(sym, '__path__', None):
-                        try:
-                            return self.find_app(
-                                '{0}.celery:'.format(app.replace(':', '')),
-                            )
-                        except ImportError:
-                            pass
-                    for suspect in values(vars(sym)):
-                        if isinstance(suspect, Celery):
-                            return suspect
-                    raise
-            else:
-                return found
-        return sym
+        from celery.app.utils import find_app
+        return find_app(app, symbol_by_name=self.symbol_by_name)
 
-    def symbol_by_name(self, name):
-        return symbol_by_name(name, imp=import_from_cwd)
+    def symbol_by_name(self, name, imp=import_from_cwd):
+        return symbol_by_name(name, imp=imp)
     get_cls_by_name = symbol_by_name  # XXX compat
 
     def process_cmdline_config(self, argv):

+ 1 - 1
celery/tests/bin/test_base.py

@@ -300,7 +300,7 @@ class test_Command(AppCase):
             def on_sbn(*args, **kwargs):
 
                 def after(*args, **kwargs):
-                    x.celery = 'quick brown fox'
+                    x.app = 'quick brown fox'
                     x.__path__ = None
                     return x
                 sbn.side_effect = after