From 6c88dc5cde0cd00b85963d285166539063bcf592 Mon Sep 17 00:00:00 2001
From: Jim Fulton <jim@zope.com>
Date: Thu, 30 Oct 2008 18:08:21 +0000
Subject: [PATCH] Updated DemoStorage ZConfig support.

---
 src/ZODB/DemoStorage.test | 49 +++++++++++++++++++++++++++++++++++++++
 src/ZODB/component.xml    |  3 +--
 src/ZODB/config.py        | 18 +++++++-------
 3 files changed, 60 insertions(+), 10 deletions(-)

diff --git a/src/ZODB/DemoStorage.test b/src/ZODB/DemoStorage.test
index b0d7429c..537275b6 100644
--- a/src/ZODB/DemoStorage.test
+++ b/src/ZODB/DemoStorage.test
@@ -278,3 +278,52 @@ storage wrapped around it when necessary:
    >>> import os
    >>> os.path.exists(blobdir)
    False
+
+ZConfig support
+===============
+
+You can configure demo storages using ZConfig, using name, changes,
+and base options:
+
+    >>> import ZODB.config
+    >>> storage = ZODB.config.storageFromString("""
+    ... <demostorage>
+    ... </demostorage>
+    ... """)
+    >>> storage.getName()
+    "DemoStorage('MappingStorage', 'MappingStorage')"
+
+    >>> storage = ZODB.config.storageFromString("""
+    ... <demostorage>
+    ...    <filestorage base>
+    ...       path base.fs
+    ...    </filestorage>
+    ...
+    ...    <filestorage changes>
+    ...       path changes.fs
+    ...    </filestorage>
+    ... </demostorage>
+    ... """)
+    >>> storage.getName()
+    "DemoStorage('base.fs', 'changes.fs')"
+
+    >>> storage.close()
+
+    >>> storage = ZODB.config.storageFromString("""
+    ... <demostorage>
+    ...    name bob
+    ...    <filestorage>
+    ...       path base.fs
+    ...    </filestorage>
+    ...
+    ...    <filestorage changes>
+    ...       path changes.fs
+    ...    </filestorage>
+    ... </demostorage>
+    ... """)
+    >>> storage.getName()
+    'bob'
+    >>> storage.base.getName()
+    'base.fs'
+
+    >>> storage.close()
diff --git a/src/ZODB/component.xml b/src/ZODB/component.xml
index 72b70d28..705d08b7 100644
--- a/src/ZODB/component.xml
+++ b/src/ZODB/component.xml
@@ -175,8 +175,7 @@
   <sectiontype name="demostorage" datatype=".DemoStorage"
                implements="ZODB.storage">
     <key name="name" />
-    <section type="ZODB.storage" name="*" attribute="base" />
-    <section type="ZODB.storage" name="changes" attribute="changes" />
+    <multisection type="ZODB.storage" name="*" attribute="factories" />
   </sectiontype>
 
 
diff --git a/src/ZODB/config.py b/src/ZODB/config.py
index 51c5448e..a0b176f1 100644
--- a/src/ZODB/config.py
+++ b/src/ZODB/config.py
@@ -120,15 +120,17 @@ class MappingStorage(BaseConfig):
 class DemoStorage(BaseConfig):
 
     def open(self):
+        base = changes = None
+        for factory in self.config.factories:
+            if factory.name == 'changes':
+                changes = factory.open()
+            else:
+                if base is None:
+                    base = factory.open()
+                else:
+                    raise ValueError("Too many base storages defined!")
+        
         from ZODB.DemoStorage import DemoStorage
-        if self.config.base:
-            base = self.config.base.open()
-        else:
-            base = None
-        if self.config.changes:
-            changes = self.config.changes.open()
-        else:
-            changes = None
         return DemoStorage(self.config.name, base=base, changes=changes)
 
 class FileStorage(BaseConfig):
-- 
2.30.9