__init__.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import os
  2. import warnings
  3. import importlib
  4. from carrot.utils import rpartition
  5. from celery.utils import get_full_cls_name, first
  6. from celery.loaders.default import Loader as DefaultLoader
  7. _DEFAULT_LOADER_CLASS_NAME = "Loader"
  8. LOADER_ALIASES = {"default": "celery.loaders.default.Loader",
  9. "django": "djcelery.loaders.djangoapp.Loader"}
  10. _loader_cache = {}
  11. _loader = None
  12. _settings = None
  13. def resolve_loader(loader):
  14. loader = LOADER_ALIASES.get(loader, loader)
  15. loader_module_name, _, loader_cls_name = rpartition(loader, ".")
  16. # For backward compatibility, try to detect a valid loader name by
  17. # ensuring the first letter in the name is uppercase.
  18. # e.g. both module.Foo and module.__Foo is valid, but not module.foo.
  19. if not first(str.isalpha, loader_cls_name).isupper():
  20. warnings.warn(DeprecationWarning(
  21. "CELERY_LOADER now needs loader class name, e.g. %s.%s" % (
  22. loader, _DEFAULT_LOADER_CLASS_NAME)))
  23. return loader, _DEFAULT_LOADER_CLASS_NAME
  24. return loader_module_name, loader_cls_name
  25. def _get_loader_cls(loader):
  26. loader_module_name, loader_cls_name = resolve_loader(loader)
  27. loader_module = importlib.import_module(loader_module_name)
  28. return getattr(loader_module, loader_cls_name)
  29. def get_loader_cls(loader):
  30. """Get loader class by name/alias"""
  31. if loader not in _loader_cache:
  32. _loader_cache[loader] = _get_loader_cls(loader)
  33. return _loader_cache[loader]
  34. def detect_loader():
  35. loader = os.environ.get("CELERY_LOADER")
  36. if loader:
  37. return get_loader_cls(loader)
  38. os.environ["CELERY_LOADER"] = "default"
  39. return DefaultLoader
  40. def current_loader():
  41. """Detect and return the current loader."""
  42. global _loader
  43. if _loader is None:
  44. _loader = detect_loader()()
  45. return _loader
  46. def load_settings():
  47. """Load the global settings object."""
  48. global _settings
  49. if _settings is None:
  50. _settings = current_loader().conf
  51. return _settings