[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