[CalendarServer-changes] [3368] CalendarServer/trunk/twistedcaldav/config.py

source_changes at macosforge.org source_changes at macosforge.org
Tue Nov 11 13:37:38 PST 2008


Revision: 3368
          http://trac.macosforge.org/projects/calendarserver/changeset/3368
Author:   wsanchez at apple.com
Date:     2008-11-11 13:37:38 -0800 (Tue, 11 Nov 2008)
Log Message:
-----------
Fix ConfigDict and start using it.

Modified Paths:
--------------
    CalendarServer/trunk/twistedcaldav/config.py

Modified: CalendarServer/trunk/twistedcaldav/config.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/config.py	2008-11-11 20:17:31 UTC (rev 3367)
+++ CalendarServer/trunk/twistedcaldav/config.py	2008-11-11 21:37:38 UTC (rev 3368)
@@ -17,6 +17,7 @@
 __all__ = [
     "defaultConfigFile",
     "defaultConfig",
+    "ConfigDict",
     "Config",
     "ConfigurationError",
     "config",
@@ -39,6 +40,33 @@
 
 log = Logger()
 
+class ConfigDict (dict):
+    def __init__(self, mapping=None):
+        if mapping is not None:
+            for key, value in mapping.iteritems():
+                self[key] = value
+
+    def __repr__(self):
+        return "*" + dict.__repr__(self)
+
+    def __setitem__(self, key, value):
+        if isinstance(value, dict) and not isinstance(value, self.__class__):
+            dict.__setitem__(self, key, self.__class__(value))
+        else:
+            dict.__setitem__(self, key, value)
+
+    def __setattr__(self, attr, value):
+        if attr[0] == "_":
+            dict.__setattr__(self, attr, value)
+        else:
+            self[attr] = value
+
+    def __getattr__(self, attr):
+        if attr in self:
+            return self[attr]
+        else:
+            return dict.__getattr__(self, attr)
+
 defaultConfigFile = "/etc/caldavd/caldavd.plist"
 
 serviceDefaultParams = {
@@ -361,33 +389,6 @@
     "EnableKeepAlive": True,
 }
 
-class ConfigDict (dict):
-    def __init__(self, mapping=None):
-        if mapping is not None:
-            for key, value in mapping.iteritems():
-                self[key] = value
-
-    def __repr__(self):
-        return "*" + dict.__repr__(self)
-
-    def __setitem__(self, key, value):
-        if type(value) is dict:
-            dict.__setitem__(self, key, ConfigDict(value))
-        else:
-            dict.__setitem__(self, key, value)
-
-    def __setattr__(self, attr, value):
-        if attr[0] == "_":
-            dict.__setattr__(self, attr, value)
-        else:
-            self[attr] = value
-
-    def __getattr__(self, attr):
-        if attr in self:
-            return self[attr]
-        else:
-            return dict.__getattr__(self, attr)
-
 class Config (object):
     """
     @DynamicAttrs
@@ -397,7 +398,7 @@
             defaults = ConfigDict(defaults)
 
         self.setDefaults(defaults)
-        self._data = copy.deepcopy(self._defaults)
+        self._data = copy.deepcopy(defaults)
         self._configFile = None
         self._hooks = [
             self.updateHostName,
@@ -416,6 +417,9 @@
         self._hooks.append(hook)
 
     def update(self, items):
+        if not isinstance(items, ConfigDict):
+            items = ConfigDict(items)
+
         #
         # Call hooks
         #
@@ -438,17 +442,17 @@
         #
         dsType = items.get("DirectoryService", {}).get("type", None)
         if dsType is None:
-            dsType = self._data["DirectoryService"]["type"]
+            dsType = self._data.DirectoryService.type
         else:
-            if dsType == self._data["DirectoryService"]["type"]:
-                oldParams = self._data["DirectoryService"]["params"]
-                newParams = items["DirectoryService"].get("params", {})
+            if dsType == self._data.DirectoryService.type:
+                oldParams = self._data.DirectoryService.params
+                newParams = items.DirectoryService.get("params", {})
                 _mergeData(oldParams, newParams)
             else:
                 if dsType in serviceDefaultParams:
-                    self._data["DirectoryService"]["params"] = copy.deepcopy(serviceDefaultParams[dsType])
+                    self._data.DirectoryService.params = copy.deepcopy(serviceDefaultParams[dsType])
                 else:
-                    self._data["DirectoryService"]["params"] = {}
+                    self._data.DirectoryService.params = {}
 
         for param in items.get("DirectoryService", {}).get("params", {}):
             if dsType in serviceDefaultParams and param not in serviceDefaultParams[dsType]:
@@ -456,10 +460,10 @@
 
         _mergeData(self._data, items)
 
-        if self._data["DirectoryService"]["type"] in serviceDefaultParams:
-            for param in tuple(self._data["DirectoryService"]["params"]):
-                if param not in serviceDefaultParams[self._data["DirectoryService"]["type"]]:
-                    del self._data["DirectoryService"]["params"][param]
+        if self._data.DirectoryService.type in serviceDefaultParams:
+            for param in tuple(self._data.DirectoryService.params):
+                if param not in serviceDefaultParams[self._data.DirectoryService.type]:
+                    del self._data.DirectoryService.params[param]
 
     @staticmethod
     def updateACLs(self, items):
@@ -576,6 +580,8 @@
         self.update(items)
 
     def setDefaults(self, defaults):
+        if not isinstance(defaults, ConfigDict):
+            defaults = ConfigDict(defaults)
         self._defaults = copy.deepcopy(defaults)
 
     def __setattr__(self, attr, value):
@@ -601,7 +607,7 @@
         if configFile and os.path.exists(configFile):
             configDict = readPlist(configFile)
             configDict = _cleanup(configDict)
-            self.update(configDict)
+            self.update(ConfigDict(configDict))
         elif configFile:
             log.error("Configuration file does not exist or is inaccessible: %s" % (configFile,))
 
@@ -627,12 +633,11 @@
                         raise ConfigurationError("Invalid %s for XMPPNotifierService: %r"
                                                  % (key, value))
 
-
 def _mergeData(oldData, newData):
     for key, value in newData.iteritems():
         if isinstance(value, (dict,)):
             if key in oldData:
-                assert isinstance(oldData[key], (dict,))
+                assert isinstance(oldData[key], ConfigDict), "%r in %r is not a ConfigDict" % (oldData[key], oldData)
             else:
                 oldData[key] = {}
             _mergeData(oldData[key], value)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20081111/23c65224/attachment-0001.html>


More information about the calendarserver-changes mailing list