Переглянути джерело

Fixes compatibility with old setting names

Ask Solem 8 роки тому
батько
коміт
edaf86c087

+ 4 - 1
celery/app/base.py

@@ -46,7 +46,9 @@ from .defaults import find_deprecated_settings
 from .registry import TaskRegistry
 from .utils import (
     AppPickler, Settings,
-    bugreport, _unpickle_app, _unpickle_app_v2, appstr, detect_settings,
+    bugreport, _unpickle_app, _unpickle_app_v2,
+    _old_key_to_new, _new_key_to_old,
+    appstr, detect_settings,
 )
 
 # Load all builtin tasks
@@ -231,6 +233,7 @@ class Celery(object):
             PendingConfiguration(
                 self._preconf, self._get_from_conf_and_finalize),
             prefix=self.namespace,
+            keys=(_old_key_to_new, _new_key_to_old),
         )
 
         # - Apply fix-ups.

+ 2 - 2
celery/app/defaults.py

@@ -41,9 +41,9 @@ searchresult = namedtuple('searchresult', ('namespace', 'key', 'type'))
 
 def Namespace(__old__=None, **options):
     if __old__ is not None:
-        for opt in values(options):
+        for key, opt in items(options):
             if not opt.old:
-                opt.old = __old__
+                opt.old = {o.format(key) for o in __old__}
     return options
 
 

+ 5 - 1
celery/app/utils.py

@@ -229,7 +229,11 @@ def detect_settings(conf, preconf={}, ignore_keys=set(), prefix=None,
 
     preconf = {info.convert.get(k, k): v for k, v in items(preconf)}
     defaults = dict(deepcopy(info.defaults), **preconf)
-    return Settings(preconf, [conf, defaults], info.key_t, prefix=prefix)
+    return Settings(
+        preconf, [conf, defaults],
+        (_old_key_to_new, _new_key_to_old),
+        prefix=prefix,
+    )
 
 
 class AppPickler(object):

+ 19 - 1
celery/tests/app/test_app.py

@@ -19,8 +19,10 @@ from celery.exceptions import ImproperlyConfigured
 from celery.five import keys
 from celery.loaders.base import unconfigured
 from celery.platforms import pyimplementation
+from celery.utils.collections import DictAttribute
 from celery.utils.serialization import pickle
 from celery.utils.timeutils import timezone
+from celery.utils.objects import Bunch
 
 from celery.tests.case import (
     CELERY_TEST_CONFIG,
@@ -288,6 +290,22 @@ class test_App(AppCase):
             with self.assertRaises(ImproperlyConfigured):
                 self.assertEqual(app.conf.task_always_eager, 4)
 
+    def test_pending_configuration__django_settings(self):
+        with self.Celery(broker='foo://bar', backend='foo') as app:
+            app.config_from_object(DictAttribute(Bunch(
+                CELERY_TASK_ALWAYS_EAGER=4,
+                CELERY_TASK_DEFAULT_DELIVERY_MODE=63,
+                CELERY_WORKER_AGENT='foo:Barz',
+                CELERY_RESULT_SERIALIZER='pickle',
+            )), namespace='CELERY')
+            self.assertEqual(app.conf.result_serializer, 'pickle')
+            self.assertEqual(app.conf.CELERY_RESULT_SERIALIZER, 'pickle')
+            self.assertEqual(app.conf.task_always_eager, 4)
+            self.assertEqual(app.conf.task_default_delivery_mode, 63)
+            self.assertEqual(app.conf.worker_agent, 'foo:Barz')
+            self.assertEqual(app.conf.broker_url, 'foo://bar')
+            self.assertEqual(app.conf.result_backend, 'foo')
+
     def test_pending_configuration__compat_settings_mixing_new(self):
         with self.Celery(broker='foo://bar', backend='foo') as app:
             app.conf.update(
@@ -551,7 +569,7 @@ class test_App(AppCase):
         self.assertEqual(self.app.conf.task_always_eager, 44)
         self.assertEqual(self.app.conf.CELERY_ALWAYS_EAGER, 44)
         self.assertFalse(self.app.conf.task_publish_retry)
-        self.assertEqual(self.app.conf.task_default_routing_key, 'celery')
+        self.assertEqual(self.app.conf.task_default_routing_key, 'testcelery')
 
     def test_config_from_object__supports_old_names(self):
 

+ 5 - 4
celery/utils/collections.py

@@ -350,12 +350,12 @@ class ConfigurationView(ChainMap, AttributeDictMixin):
             the default configuration.
     """
 
-    def __init__(self, changes, defaults=None, key_t=None, prefix=None):
+    def __init__(self, changes, defaults=None, keys=None, prefix=None):
         defaults = [] if defaults is None else defaults
-        super(ConfigurationView, self).__init__(
-            changes, *defaults, **{'key_t': key_t})
+        super(ConfigurationView, self).__init__(changes, *defaults)
         self.__dict__.update(
             prefix=prefix.rstrip('_') + '_' if prefix else prefix,
+            _keys=keys,
         )
 
     def _to_keys(self, key):
@@ -368,7 +368,8 @@ class ConfigurationView(ChainMap, AttributeDictMixin):
     def __getitem__(self, key):
         keys = self._to_keys(key)
         getitem = super(ConfigurationView, self).__getitem__
-        for k in keys:
+        for k in keys + (
+                tuple(f(key) for f in self._keys) if self._keys else ()):
             try:
                 return getitem(k)
             except KeyError: