[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