浏览代码

ConfigurationView (hence Settings) is a MutableMapping

Aaron Harnly 12 年之前
父节点
当前提交
4f53ec2e10
共有 3 个文件被更改,包括 65 次插入3 次删除
  1. 16 3
      celery/datastructures.py
  2. 25 0
      celery/tests/app/test_utils.py
  3. 24 0
      celery/tests/test_datastructures.py

+ 16 - 3
celery/datastructures.py

@@ -13,8 +13,14 @@ import sys
 import time
 
 from collections import defaultdict
+from collections import defaultdict, MutableMapping
 from itertools import chain
 
+try:
+    from collections import MutableMapping
+except ImportError:        # pragma: no cover
+    MutableMapping = None  # noqa
+
 from billiard.einfo import ExceptionInfo  # noqa
 from kombu.utils.limits import TokenBucket  # noqa
 
@@ -295,11 +301,11 @@ class DictAttribute(object):
 class ConfigurationView(AttributeDictMixin):
     """A view over an applications configuration dicts.
 
-    If the key does not exist in ``changes``, the ``defaults`` dict
-    is consulted.
+    If the key does not exist in ``changes``, the ``defaults`` dicts
+    are consulted.
 
     :param changes:  Dict containing changes to the configuration.
-    :param defaults: Dict containing the default configuration.
+    :param defaults: List of dicts containing the default configuration.
 
     """
     changes = None
@@ -356,6 +362,11 @@ class ConfigurationView(AttributeDictMixin):
     def __iter__(self):
         return self._iterate_keys()
 
+    def __len__(self):
+        # The logic for iterating keys includes uniq(),
+        # so to be safe we count by explicitly iterating
+        return len(self.keys())
+
     def _iter(self, op):
         # defaults must be first in the stream, so values in
         # changes takes precedence.
@@ -381,6 +392,8 @@ class ConfigurationView(AttributeDictMixin):
 
     def values(self):
         return list(self._iterate_values())
+if MutableMapping:
+    MutableMapping.register(ConfigurationView)
 
 
 class LimitedSet(object):

+ 25 - 0
celery/tests/app/test_utils.py

@@ -0,0 +1,25 @@
+"""
+Tests of celery.app.utils
+"""
+
+from __future__ import absolute_import
+
+
+import unittest
+
+
+class TestSettings(unittest.TestCase):
+    """
+    Tests of celery.app.utils.Settings
+    """
+    def test_is_mapping(self):
+        """Settings should be a collections.Mapping"""
+        from celery.app.utils import Settings
+        from collections import Mapping
+        self.assertTrue(issubclass(Settings, Mapping))
+
+    def test_is_mutable_mapping(self):
+        """Settings should be a collections.MutableMapping"""
+        from celery.app.utils import Settings
+        from collections import MutableMapping
+        self.assertTrue(issubclass(Settings, MutableMapping))

+ 24 - 0
celery/tests/test_datastructures.py

@@ -0,0 +1,24 @@
+"""
+Tests of celery.datastructures.
+"""
+from __future__ import absolute_import
+
+
+import unittest
+
+
+class TestConfigurationView(unittest.TestCase):
+    """
+    Tests of celery.datastructures.ConfigurationView
+    """
+    def test_is_mapping(self):
+        """ConfigurationView should be a collections.Mapping"""
+        from celery.datastructures import ConfigurationView
+        from collections import Mapping
+        self.assertTrue(issubclass(ConfigurationView, Mapping))
+
+    def test_is_mutable_mapping(self):
+        """ConfigurationView should be a collections.MutableMapping"""
+        from celery.datastructures import ConfigurationView
+        from collections import MutableMapping
+        self.assertTrue(issubclass(ConfigurationView, MutableMapping))