[CalendarServer-changes] [1391] CalendarServer/trunk/twistedcaldav
source_changes at macosforge.org
source_changes at macosforge.org
Wed Mar 14 18:41:45 PDT 2007
Revision: 1391
http://trac.macosforge.org/projects/calendarserver/changeset/1391
Author: wsanchez at apple.com
Date: 2007-03-14 18:41:44 -0700 (Wed, 14 Mar 2007)
Log Message:
-----------
Better defaults handling and merging.
Modified Paths:
--------------
CalendarServer/trunk/twistedcaldav/config.py
CalendarServer/trunk/twistedcaldav/test/test_config.py
Modified: CalendarServer/trunk/twistedcaldav/config.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/config.py 2007-03-14 22:17:13 UTC (rev 1390)
+++ CalendarServer/trunk/twistedcaldav/config.py 2007-03-15 01:41:44 UTC (rev 1391)
@@ -25,6 +25,16 @@
defaultConfigFile = "/etc/caldavd/caldavd.plist"
+serviceDefaultParams = {
+ "twistedcaldav.directory.xmlfile.XMLDirectoryService": {
+ "xmlFile": "/etc/caldavd/accounts.xml",
+ },
+ "twistedcaldav.directory.appleopendirectory.OpenDirectoryService": {
+ "node": "/Search",
+ "requireComputerRecord": True,
+ },
+}
+
defaultConfig = {
#
# Public network address information
@@ -63,7 +73,10 @@
# A directory service provides information about principals (eg.
# users, groups, locations and resources) to the server.
#
- "DirectoryService": {},
+ "DirectoryService": {
+ "type": "twistedcaldav.directory.xmlfile.XMLDirectoryService",
+ "params": serviceDefaultParams["twistedcaldav.directory.xmlfile.XMLDirectoryService"],
+ },
#
# Special principals
@@ -147,46 +160,6 @@
},
}
-def _dsDefaults(configDict):
- if configDict is None:
- return None
-
- configDict = copy.deepcopy(configDict)
-
- dsDict = configDict.get("DirectoryService", None)
- if dsDict is None:
- return configDict
-
- if "type" in dsDict:
- dsType = dsDict["type"]
- else:
- dsType = "twistedcaldav.directory.xmlfile.XMLDirectoryService"
- dsDict["type"] = dsType
-
- if "params" in dsDict:
- params = dsDict["params"]
- else:
- params = {}
- dsDict["params"] = params
-
- if dsType == "twistedcaldav.directory.xmlfile.XMLDirectoryService":
- if "xmlFile" not in params:
- params["xmlFile"] = "/etc/caldavd/accounts.xml"
-
- elif dsType == "twistedcaldav.directory.appleopendirectory.OpenDirectoryService":
- if "node" not in params:
- params["node"] = "/Search"
-
- if "requireComputerRecord" not in params:
- params["requireComputerRecord"] = True
-
- else:
- raise AssertionError("Unknown directory service type: %r" % (dsType,))
-
- return configDict
-
-defaultConfig = _dsDefaults(defaultConfig)
-
class Config (object):
def __init__(self, defaults):
self.setDefaults(defaults)
@@ -197,14 +170,33 @@
return str(self._data)
def update(self, items):
+ dsType = items.get("DirectoryService", {}).get("type", None)
+ if dsType is None:
+ dsType = self._data["DirectoryService"]["type"]
+ else:
+ if dsType == self._data["DirectoryService"]["type"]:
+ oldParams = self._data["DirectoryService"]["params"]
+ newParams = items["DirectoryService"].get("params", {})
+ _mergeData(oldParams, newParams)
+ else:
+ self._data["DirectoryService"]["params"] = copy.deepcopy(serviceDefaultParams[dsType])
+
+ for param in items.get("DirectoryService", {}).get("params", {}):
+ if param not in serviceDefaultParams[dsType]:
+ raise ConfigurationError("Parameter %s is not supported by service %s" % (param, dsType))
+
_mergeData(self._data, items)
+ for param in tuple(self._data["DirectoryService"]["params"]):
+ if param not in serviceDefaultParams[self._data["DirectoryService"]["type"]]:
+ del self._data["DirectoryService"]["params"][param]
+
def updateDefaults(self, items):
_mergeData(self._defaults, items)
self.update(items)
def setDefaults(self, defaults):
- self._defaults = _dsDefaults(defaults)
+ self._defaults = copy.deepcopy(defaults)
def __setattr__(self, attr, value):
if hasattr(self, '_data') and attr in self._data:
@@ -231,9 +223,8 @@
self.update(configDict)
def _mergeData(oldData, newData):
- newData = _dsDefaults(newData)
for key, value in newData.iteritems():
- if isinstance(value, (dict,)) and key in ("MultiProcess",):
+ if isinstance(value, (dict,)):
if key in oldData:
assert isinstance(oldData[key], (dict,))
else:
Modified: CalendarServer/trunk/twistedcaldav/test/test_config.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_config.py 2007-03-14 22:17:13 UTC (rev 1390)
+++ CalendarServer/trunk/twistedcaldav/test/test_config.py 2007-03-15 01:41:44 UTC (rev 1391)
@@ -20,7 +20,7 @@
from twistedcaldav.py.plistlib import writePlist
-from twistedcaldav.config import config, defaultConfig, parseConfig
+from twistedcaldav.config import config, defaultConfig, parseConfig, ConfigurationError
testConfig = """<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
@@ -45,6 +45,11 @@
self.testConfig = self.mktemp()
open(self.testConfig, 'w').write(testConfig)
+ def tearDown(self):
+ config.setDefaults(defaultConfig)
+ config.loadConfig(None)
+ config.reload()
+
def testDefaults(self):
for key, value in defaultConfig.iteritems():
self.assertEquals(getattr(config, key), value)
@@ -116,7 +121,7 @@
self.assertEquals(config.MultiProcess["LoadBalancer"]["Enabled"], True)
- def testDirectoryService(self):
+ def testDirectoryService_noChange(self):
self.assertEquals(config.DirectoryService["type"], "twistedcaldav.directory.xmlfile.XMLDirectoryService")
self.assertEquals(config.DirectoryService["params"]["xmlFile"], "/etc/caldavd/accounts.xml")
@@ -125,6 +130,19 @@
self.assertEquals(config.DirectoryService["type"], "twistedcaldav.directory.xmlfile.XMLDirectoryService")
self.assertEquals(config.DirectoryService["params"]["xmlFile"], "/etc/caldavd/accounts.xml")
+ def testDirectoryService_sameType(self):
+ self.assertEquals(config.DirectoryService["type"], "twistedcaldav.directory.xmlfile.XMLDirectoryService")
+ self.assertEquals(config.DirectoryService["params"]["xmlFile"], "/etc/caldavd/accounts.xml")
+
+ config.update({"DirectoryService": {"type": "twistedcaldav.directory.xmlfile.XMLDirectoryService"}})
+
+ self.assertEquals(config.DirectoryService["type"], "twistedcaldav.directory.xmlfile.XMLDirectoryService")
+ self.assertEquals(config.DirectoryService["params"]["xmlFile"], "/etc/caldavd/accounts.xml")
+
+ def testDirectoryService_newType(self):
+ self.assertEquals(config.DirectoryService["type"], "twistedcaldav.directory.xmlfile.XMLDirectoryService")
+ self.assertEquals(config.DirectoryService["params"]["xmlFile"], "/etc/caldavd/accounts.xml")
+
config.update({"DirectoryService": {"type": "twistedcaldav.directory.appleopendirectory.OpenDirectoryService"}})
self.assertEquals(config.DirectoryService["type"], "twistedcaldav.directory.appleopendirectory.OpenDirectoryService")
@@ -132,13 +150,36 @@
self.assertEquals(config.DirectoryService["params"]["node"], "/Search")
self.assertEquals(config.DirectoryService["params"]["requireComputerRecord"], True)
- config.update({"DirectoryService": {"params": {"xmlFile": "/tmp/foo"}}})
+ def testDirectoryService_newParam(self):
+ self.assertEquals(config.DirectoryService["type"], "twistedcaldav.directory.xmlfile.XMLDirectoryService")
+ self.assertEquals(config.DirectoryService["params"]["xmlFile"], "/etc/caldavd/accounts.xml")
+ config.update({"DirectoryService": {"type": "twistedcaldav.directory.appleopendirectory.OpenDirectoryService"}})
+ config.update({"DirectoryService": {"params": {"requireComputerRecord": False}}})
+
+ self.assertEquals(config.DirectoryService["type"], "twistedcaldav.directory.appleopendirectory.OpenDirectoryService")
+ self.assertEquals(config.DirectoryService["params"]["node"], "/Search")
+ self.assertEquals(config.DirectoryService["params"]["requireComputerRecord"], False)
+
+ def testDirectoryService_badParam(self):
self.assertEquals(config.DirectoryService["type"], "twistedcaldav.directory.xmlfile.XMLDirectoryService")
- self.assertEquals(config.DirectoryService["params"]["xmlFile"], "/tmp/foo")
- self.assertNotIn("node", config.DirectoryService["params"])
- self.assertNotIn("requireComputerRecord", config.DirectoryService["params"])
+ self.assertEquals(config.DirectoryService["params"]["xmlFile"], "/etc/caldavd/accounts.xml")
+ self.assertRaises(ConfigurationError, config.update, {"DirectoryService": {"params": {"requireComputerRecord": False}}})
+
+ def testDirectoryService_unknownType(self):
+ self.assertEquals(config.DirectoryService["type"], "twistedcaldav.directory.xmlfile.XMLDirectoryService")
+ self.assertEquals(config.DirectoryService["params"]["xmlFile"], "/etc/caldavd/accounts.xml")
+
+ config.update({"DirectoryService": {"type": "twistedcaldav.test.test_config.SuperDuperAwesomeService"}})
+
+ self.assertEquals(
+ config.DirectoryService["params"],
+ SuperDuperAwesomeService.defaultParameters
+ )
+
+ testDirectoryService_unknownType.todo = "unimplemented"
+
def testUpdateDefaults(self):
self.assertEquals(config.SSLPort, -1)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20070314/980cdc8b/attachment.html
More information about the calendarserver-changes
mailing list