Browse Source

It's no longer allowed to skip the class name in loader names.

(as scheduled by the deprecation timeline:
http://ask.github.com/celery/internals/deprecation.html

Assuming the implicit ``Loader`` class name is no longer supported,
if you use e.g.::

    CELERY_LOADER = "myapp.loaders"

You need to include the loader class name, like this::

        CELERY_LOADER = "myapp.loaders.Loader"
*
Ask Solem 15 years ago
parent
commit
b8bfb0cfce
3 changed files with 10 additions and 44 deletions
  1. 2 2
      celery/conf.py
  2. 5 39
      celery/loaders/__init__.py
  3. 3 3
      celery/tests/test_loaders.py

+ 2 - 2
celery/conf.py

@@ -72,7 +72,7 @@ _DEFAULTS = {
 
 
 _DEPRECATION_FMT = """
-%s is deprecated in favor of %s and is scheduled for removal in celery v1.2.
+%s is deprecated in favor of %s and is scheduled for removal in celery v1.4.
 """.strip()
 
 def _get(name, default=None, compat=None):
@@ -127,7 +127,7 @@ CELERYD_LOG_FORMAT = _get("CELERYD_LOG_FORMAT",
 CELERYD_TASK_LOG_FORMAT = _get("CELERYD_TASK_LOG_FORMAT")
 CELERYD_LOG_FILE = _get("CELERYD_LOG_FILE")
 CELERYD_LOG_LEVEL = _get("CELERYD_LOG_LEVEL",
-                        compat=["CELERYD_DAEMON_LOG_LEVEL"])
+                            compat=["CELERYD_DAEMON_LOG_LEVEL"])
 CELERYD_LOG_LEVEL = LOG_LEVELS[CELERYD_LOG_LEVEL.upper()]
 CELERYD_CONCURRENCY = _get("CELERYD_CONCURRENCY")
 CELERYD_PREFETCH_MULTIPLIER = _get("CELERYD_PREFETCH_MULTIPLIER")

+ 5 - 39
celery/loaders/__init__.py

@@ -1,61 +1,27 @@
 import os
-import warnings
-import importlib
 
-from carrot.utils import rpartition
+from celery.utils import get_cls_by_name
 
-from celery.utils import get_full_cls_name, first
-from celery.loaders.default import Loader as DefaultLoader
-
-_DEFAULT_LOADER_CLASS_NAME = "Loader"
 LOADER_ALIASES = {"default": "celery.loaders.default.Loader",
                   "django": "djcelery.loaders.DjangoLoader"}
-_loader_cache = {}
 _loader = None
 _settings = None
 
 
-def resolve_loader(loader):
-    loader = LOADER_ALIASES.get(loader, loader)
-    loader_module_name, _, loader_cls_name = rpartition(loader, ".")
-
-    # For backward compatibility, try to detect a valid loader name by
-    # ensuring the first letter in the name is uppercase.
-    # e.g. both module.Foo and module.__Foo is valid, but not module.foo.
-    if not first(str.isalpha, loader_cls_name).isupper():
-        warnings.warn(DeprecationWarning(
-            "CELERY_LOADER now needs loader class name, e.g. %s.%s" % (
-                loader, _DEFAULT_LOADER_CLASS_NAME)))
-        return loader, _DEFAULT_LOADER_CLASS_NAME
-    return loader_module_name, loader_cls_name
-
-
-def _get_loader_cls(loader):
-    loader_module_name, loader_cls_name = resolve_loader(loader)
-    loader_module = importlib.import_module(loader_module_name)
-    return getattr(loader_module, loader_cls_name)
-
-
 def get_loader_cls(loader):
     """Get loader class by name/alias"""
-    if loader not in _loader_cache:
-        _loader_cache[loader] = _get_loader_cls(loader)
-    return _loader_cache[loader]
+    return get_cls_by_name(loader, LOADER_ALIASES)
 
 
-def detect_loader():
-    loader = os.environ.get("CELERY_LOADER")
-    if loader:
-        return get_loader_cls(loader)
-    os.environ["CELERY_LOADER"] = "default"
-    return DefaultLoader
+def setup_loader():
+    return get_loader_cls(os.environ.setdefault("CELERY_LOADER", "default"))()
 
 
 def current_loader():
     """Detect and return the current loader."""
     global _loader
     if _loader is None:
-        _loader = detect_loader()()
+        _loader = setup_loader()
     return _loader
 
 

+ 3 - 3
celery/tests/test_loaders.py

@@ -16,14 +16,14 @@ class TestLoaders(unittest.TestCase):
     def test_get_loader_cls(self):
 
         self.assertEqual(loaders.get_loader_cls("default"),
-                          loaders.DefaultLoader)
+                          default.Loader)
         # Execute cached branch.
         self.assertEqual(loaders.get_loader_cls("default"),
-                          loaders.DefaultLoader)
+                          default.Loader)
 
     @with_environ("CELERY_LOADER", "default")
     def test_detect_loader_CELERY_LOADER(self):
-        self.assertEqual(loaders.detect_loader(), loaders.DefaultLoader)
+        self.assertIsInstance(loaders.setup_loader(), default.Loader)
 
 
 class DummyLoader(base.BaseLoader):