SVN: ZODB/trunk/src/ DemoStorages now accept constructor athuments, close_base_on_close

Jim Fulton <[email protected]>
Newsgroups gmane.comp.python.zope.zodb.cvs
Message-ID <20100507184407.50D85941B8__12540.8673230142$1273257857$gmane$org@cvs.zope.org>
Log message for revision 112159:
  DemoStorages now accept constructor athuments, close_base_on_close
  and close_changes_on_close, to control whether underlying storages
  are closed when the DemoStorage is closed.
  
  https://bugs.launchpad.net/zodb/+bug/118512
  

Changed:
  U   ZODB/trunk/src/CHANGES.txt
  U   ZODB/trunk/src/ZODB/DemoStorage.py
  U   ZODB/trunk/src/ZODB/DemoStorage.test

-=-
Modified: ZODB/trunk/src/CHANGES.txt
===================================================================
--- ZODB/trunk/src/CHANGES.txt	2010-05-07 17:10:36 UTC (rev 112158)
+++ ZODB/trunk/src/CHANGES.txt	2010-05-07 18:44:06 UTC (rev 112159)
@@ -2,6 +2,18 @@
  Change History
 ================
 
+3.10.0b1 (2010-05-??)
+=====================
+
+New Features
+------------
+
+- DemoStorages now accept constructor athuments, close_base_on_close
+  and close_changes_on_close, to control whether underlying storages
+  are closed when the DemoStorage is closed.
+
+  https://bugs.launchpad.net/zodb/+bug/118512
+
 3.10.0a2 (2010-05-04)
 =====================
 

Modified: ZODB/trunk/src/ZODB/DemoStorage.py
===================================================================
--- ZODB/trunk/src/ZODB/DemoStorage.py	2010-05-07 17:10:36 UTC (rev 112158)
+++ ZODB/trunk/src/ZODB/DemoStorage.py	2010-05-07 18:44:06 UTC (rev 112159)
@@ -38,24 +38,34 @@
         ZODB.interfaces.IStorageIteration,
         )
 
-    def __init__(self, name=None, base=None, changes=None):
-        if base is None:
-            base = ZODB.MappingStorage.MappingStorage()
-            self._temporary_base = True
-        else:
-            self._temporary_base = False
+    def __init__(self, name=None, base=None, changes=None,
+                 close_base_on_close=None, close_changes_on_close=None):
+
+        if close_base_on_close is None:
+            if base is None:
+                base = ZODB.MappingStorage.MappingStorage()
+                close_base_on_close = False
+            else:
+                close_base_on_close = True
+
         self.base = base
+        self.close_base_on_close = close_base_on_close
 
+
         if changes is None:
+            self._temporary_changes = True
             changes = ZODB.MappingStorage.MappingStorage()
             zope.interface.alsoProvides(self, ZODB.interfaces.IBlobStorage)
-            self._temporary_changes = True
+            if close_changes_on_close is None:
+                close_changes_on_close = False
         else:
             if ZODB.interfaces.IBlobStorage.providedBy(changes):
                 zope.interface.alsoProvides(self, ZODB.interfaces.IBlobStorage)
-            self._temporary_changes = False
+            if close_changes_on_close is None:
+                close_changes_on_close = True
 
         self.changes = changes
+        self.close_changes_on_close = close_changes_on_close
 
         self._issued_oids = set()
         self._stored_oids = set()
@@ -88,9 +98,9 @@
         self.changes.cleanup()
 
     def close(self):
-        if not self._temporary_base:
+        if self.close_base_on_close:
             self.base.close()
-        if not self._temporary_changes:
+        if self.close_changes_on_close:
             self.changes.close()
 
     def _copy_methods_from_changes(self, changes):
@@ -222,9 +232,9 @@
 
     def pack(self, t, referencesf, gc=None):
         if gc is None:
-            if self._temporary_base:
+            if self._temporary_changes:
                 return self.changes.pack(t, referencesf)
-        elif self._temporary_base:
+        elif self._temporary_changes:
             return self.changes.pack(t, referencesf, gc=gc)
         elif gc:
             raise TypeError(

Modified: ZODB/trunk/src/ZODB/DemoStorage.test
===================================================================
--- ZODB/trunk/src/ZODB/DemoStorage.test	2010-05-07 17:10:36 UTC (rev 112158)
+++ ZODB/trunk/src/ZODB/DemoStorage.test	2010-05-07 18:44:06 UTC (rev 112159)
@@ -133,6 +133,30 @@
 
     >>> db.close()
 
+Closing demo storages
+=====================
+
+Normally, when a demo storage is closed, it's base and changes
+storage are closed:
+
+    >>> from ZODB.MappingStorage import MappingStorage
+    >>> demo = DemoStorage(base=MappingStorage(), changes=MappingStorage())
+    >>> demo.close()
+    >>> demo.base.opened(), demo.changes.opened()
+    (False, False)
+
+You can pass constructor arguments to control whether the base and
+changes storages should be closed when the demo storage is closed:
+
+    >>> demo = DemoStorage(
+    ...     base=MappingStorage(), changes=MappingStorage(),
+    ...     close_base_on_close=False, close_changes_on_close=False,
+    ...     )
+    >>> demo.close()
+    >>> demo.base.opened(), demo.changes.opened()
+    (True, True)
+
+
 Storage Stacking
 ================
 
@@ -147,7 +171,6 @@
 
 We can also supply an explicit changes storage, if we wish:
 
-    >>> from ZODB.MappingStorage import MappingStorage
     >>> changes = MappingStorage()
     >>> demo3 = demo2.push(changes)
     >>> demo3.changes is changes, demo3.base is demo2
@@ -166,13 +189,8 @@
 --------------------------------------
 
 Normally, when a demo storage is closed, it's base and changes
-storage are closed:
+storage are closed.
 
-    >>> demo = DemoStorage(base=MappingStorage(), changes=MappingStorage())
-    >>> demo.close()
-    >>> demo.base.opened(), demo.changes.opened()
-    (False, False)
-
 Older versions of DemoStorage didn't have a separate changes storage
 and didn't close or discard their changes when they were closed.  When
 a stack was built solely of demo storages, the close method
@@ -354,7 +372,7 @@
     >>> storage = DemoStorage.push(storage)
     >>> random.seed(47)
     >>> storage.new_oid()
-    '\x1a,S\xa4\xe9\xbb\x17\xbd'
+    '8\xaa-\tz\x1dP\x07'
 
 Then we'll force the random number generator to use the same seed for the
 subsequent call to "new_oid" and show that we get a different OID.
@@ -362,7 +380,7 @@
     >>> random.seed(47)
     >>> oid = storage.new_oid()
     >>> oid
-    '\x1a,S\xa4\xe9\xbb\x17\xbe'
+    '8\xaa-\tz\x1dP\x08'
 
 DemoStorage keeps up with the issued OIDs to know when not to reissue them...
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.