Browse Source

Cosmetics

Ask Solem 13 years ago
parent
commit
749861b13a
2 changed files with 50 additions and 53 deletions
  1. 48 48
      celery/__compat__.py
  2. 2 5
      celery/__init__.py

+ 48 - 48
celery/__compat__.py

@@ -6,60 +6,60 @@ from types import ModuleType
 
 from .local import Proxy
 
-compat_modules = {
-    "messaging": {
-        "TaskPublisher": "amqp.TaskPublisher",
-        "ConsumerSet": "amqp.ConsumerSet",
-        "TaskConsumer": "amqp.TaskConsumer",
-        "establish_connection": "broker_connection",
-        "with_connection": "with_default_connection",
-        "get_consumer_set": "amqp.get_task_consumer"
-    },
-    "log": {
-        "get_default_logger": "log.get_default_logger",
-        "setup_logger": "log.setup_logger",
-        "setup_task_logger": "log.setup_task_logger",
-        "get_task_logger": "log.get_task_logger",
-        "setup_loggig_subsystem": "log.setup_logging_subsystem",
-        "redirect_stdouts_to_logger": "log.redirect_stdouts_to_logger",
-    },
-}
 
-def rgetattr(obj, path):
-    for part in path:
-        obj = getattr(obj, part)
-    return obj
+def _compat_task_decorator(*args, **kwargs):
+    from celery import current_app
+    kwargs.setdefault("accept_magic_kwargs", True)
+    return current_app.task(*args, **kwargs)
 
-def _module(g, name, attrs):
-    attrs = dict((name, Proxy(rgetattr, (g.current_app, attr.split('.'))))
-                    for name, attr in attrs.iteritems())
-    return type(name, (ModuleType, ), attrs)('.'.join(["celery", name]))
 
 
-def install_compat_modules(g):
-    from types import ModuleType
-    mods = sys.modules
+def _compat_periodic_task_decorator(*args, **kwargs):
+    from celery.task import periodic_task
+    kwargs.setdefault("accept_magic_kwargs", True)
+    return periodic_task(*args, **kwargs)
 
-    current_app = g.current_app
 
-    for name, attrs in compat_modules.iteritems():
-        print("CREATE MODULE: %r %r" % (name, attrs))
-        module = _module(g, name, attrs)
-        setattr(g, name, module)
-        sys.modules[module.__name__] = module
+modules = {
+    "celery": {
+        "decorators": {
+            "task": _compat_task_decorator,
+            "periodic_task": _compat_periodic_task_decorator,
+        },
+        "log": {
+            "get_default_logger": "log.get_default_logger",
+            "setup_logger": "log.setup_logger",
+            "setup_task_logger": "log.setup_task_logger",
+            "get_task_logger": "log.get_task_logger",
+            "setup_loggig_subsystem": "log.setup_logging_subsystem",
+            "redirect_stdouts_to_logger": "log.redirect_stdouts_to_logger",
+        },
+        "messaging": {
+            "TaskPublisher": "amqp.TaskPublisher",
+            "ConsumerSet": "amqp.ConsumerSet",
+            "TaskConsumer": "amqp.TaskConsumer",
+            "establish_connection": "broker_connection",
+            "with_connection": "with_default_connection",
+            "get_consumer_set": "amqp.get_task_consumer"
+        },
+        "registry": {
+            "tasks": "tasks",
+        },
+    },
+}
 
-    class registry(ModuleType):
-        tasks = Proxy(lambda: current_app.tasks)
-    g.registry = mods["celery.registry"] = registry("celery.registry")
 
-    class decorators(ModuleType):
-        def task(*args, **kwargs):
-            kwargs.setdefault("accept_magic_kwargs", True)
-            return current_app.task(*args, **kwargs)
+def rgetattr(obj, path):
+    return reduce(lambda a, b: getattr(a, b), [obj] + path)
+
 
-        def periodic_task(*args, **kwargs):
-            from celery.task import periodic_task
-            kwargs.setdefault("accept_magic_kwargs", True)
-            return periodic_task(*args, **kwargs)
-    g.decorators = mods["celery.decorators"] \
-            = decorators("celery.decorators")
+def get_compat(app, pkg, name, bases=(ModuleType, )):
+    fqdn = '.'.join([pkg.__name__, name])
+    def build_attr(attr):
+        if isinstance(attr, basestring):
+            return Proxy(rgetattr, (app, attr.split('.')))
+        return attr
+    attrs = dict((name, build_attr(attr))
+                    for name, attr in modules[pkg.__name__][name].iteritems())
+    sys.modules[fqdn] = module = type(name, bases, attrs)(fqdn)
+    return module

+ 2 - 5
celery/__init__.py

@@ -31,14 +31,11 @@ compat_modules = ("messaging", "log", "registry", "decorators")
 
 class module(ModuleType):
     __all__ = ("Celery", "current_app", "bugreport")
-    __compat_installed__ = False
 
     def __getattr__(self, name):
         if name in compat_modules:
-            if not self.__compat_installed__:
-                self.__compat_installed__ = True
-                from .__compat__ import install_compat_modules
-                install_compat_modules(self)
+            from .__compat__ import get_compat
+            setattr(self, name, get_compat(self.current_app, self, name))
         return ModuleType.__getattribute__(self, name)
 
     def __dir__(self):