[Zodb-checkins] SVN: ZODB/trunk/s Removed the dependency on zope.proxy.

Jim Fulton jim at zope.com
Thu May 13 07:00:41 EDT 2010


Log message for revision 112270:
  Removed the dependency on zope.proxy.
  

Changed:
  U   ZODB/trunk/setup.py
  U   ZODB/trunk/src/CHANGES.txt
  U   ZODB/trunk/src/ZODB/blob.py

-=-
Modified: ZODB/trunk/setup.py
===================================================================
--- ZODB/trunk/setup.py	2010-05-12 22:24:27 UTC (rev 112269)
+++ ZODB/trunk/setup.py	2010-05-13 11:00:40 UTC (rev 112270)
@@ -194,7 +194,6 @@
         'zdaemon',
         'zope.event',
         'zope.interface',
-        'zope.proxy',
         ],
       zip_safe = False,
       entry_points = """

Modified: ZODB/trunk/src/CHANGES.txt
===================================================================
--- ZODB/trunk/src/CHANGES.txt	2010-05-12 22:24:27 UTC (rev 112269)
+++ ZODB/trunk/src/CHANGES.txt	2010-05-13 11:00:40 UTC (rev 112270)
@@ -14,6 +14,8 @@
 
   https://bugs.launchpad.net/zodb/+bug/118512
 
+- Removed the dependency on zope.proxy.
+
 Bugs Fixed
 ----------
 

Modified: ZODB/trunk/src/ZODB/blob.py
===================================================================
--- ZODB/trunk/src/ZODB/blob.py	2010-05-12 22:24:27 UTC (rev 112269)
+++ ZODB/trunk/src/ZODB/blob.py	2010-05-13 11:00:40 UTC (rev 112270)
@@ -35,9 +35,6 @@
 from ZODB.POSException import POSKeyError
 import persistent
 
-from zope.proxy import getProxiedObject, non_overridable
-from zope.proxy.decorator import SpecificationDecoratorBase
-
 logger = logging.getLogger('ZODB.blob')
 
 BLOB_SUFFIX = ".blob"
@@ -694,23 +691,16 @@
         return self.fshelper.temp_dir
 
 
-class BlobStorage(SpecificationDecoratorBase):
-    """A storage to support blobs."""
+class BlobStorage(BlobStorageMixin):
+    """A wrapper/proxy storage to support blobs.
+    """
 
     zope.interface.implements(ZODB.interfaces.IBlobStorage)
 
-    # Proxies can't have a __dict__ so specifying __slots__ here allows
-    # us to have instance attributes explicitly on the proxy.
-    __slots__ = ('fshelper', 'dirty_oids', '_BlobStorage__supportsUndo',
-                 '_blobs_pack_is_in_progress', )
-
-
-    def __new__(self, base_directory, storage, layout='automatic'):
-        return SpecificationDecoratorBase.__new__(self, storage)
-
     def __init__(self, base_directory, storage, layout='automatic'):
-        # XXX Log warning if storage is ClientStorage
-        SpecificationDecoratorBase.__init__(self, storage)
+        assert not ZODB.interfaces.IBlobStorage.providedBy(storage)
+        self.__storage = storage
+
         self._blob_init(base_directory, layout)
         try:
             supportsUndo = storage.supportsUndo
@@ -722,32 +712,38 @@
         self._blobs_pack_is_in_progress = False
 
         if ZODB.interfaces.IStorageRestoreable.providedBy(storage):
-            zope.interface.alsoProvides(self,
-                                        ZODB.interfaces.IBlobStorageRestoreable)
+            iblob = ZODB.interfaces.IBlobStorageRestoreable
+        else:
+            iblob = ZODB.interfaces.IBlobStorage
 
-    @non_overridable
+        zope.interface.directlyProvides(
+            self, iblob, zope.interface.providedBy(storage))
+
+    def __getattr__(self, name):
+        return getattr(self.__storage, name)
+
+    def __len__(self):
+        return len(self.__storage)
+
     def __repr__(self):
-        normal_storage = getProxiedObject(self)
+        normal_storage = self.__storage
         return '<BlobStorage proxy for %r at %s>' % (normal_storage,
                                                      hex(id(self)))
 
-    @non_overridable
     def tpc_finish(self, *arg, **kw):
         # We need to override the base storage's tpc_finish instead of
         # providing a _finish method because methods found on the proxied
         # object aren't rebound to the proxy
-        getProxiedObject(self).tpc_finish(*arg, **kw)
+        self.__storage.tpc_finish(*arg, **kw)
         self._blob_tpc_finish()
 
-    @non_overridable
     def tpc_abort(self, *arg, **kw):
         # We need to override the base storage's abort instead of
         # providing an _abort method because methods found on the proxied object
         # aren't rebound to the proxy
-        getProxiedObject(self).tpc_abort(*arg, **kw)
+        self.__storage.tpc_abort(*arg, **kw)
         self._blob_tpc_abort()
 
-    @non_overridable
     def _packUndoing(self, packtime, referencesf):
         # Walk over all existing revisions of all blob files and check
         # if they are still needed by attempting to load the revision
@@ -766,7 +762,6 @@
             if not os.listdir(oid_path):
                 shutil.rmtree(oid_path)
 
-    @non_overridable
     def _packNonUndoing(self, packtime, referencesf):
         for oid, oid_path in self.fshelper.listOIDs():
             exists = True
@@ -789,7 +784,6 @@
             if not os.listdir(oid_path):
                 shutil.rmtree(oid_path)
 
-    @non_overridable
     def pack(self, packtime, referencesf):
         """Remove all unused OID/TID combinations."""
         self._lock_acquire()
@@ -803,7 +797,7 @@
         try:
             # Pack the underlying storage, which will allow us to determine
             # which serials are current.
-            unproxied = getProxiedObject(self)
+            unproxied = self.__storage
             result = unproxied.pack(packtime, referencesf)
 
             # Perform a pack on the blob data.
@@ -818,9 +812,8 @@
 
         return result
 
-    @non_overridable
     def undo(self, serial_id, transaction):
-        undo_serial, keys = getProxiedObject(self).undo(serial_id, transaction)
+        undo_serial, keys = self.__storage.undo(serial_id, transaction)
         # serial_id is the transaction id of the txn that we wish to undo.
         # "undo_serial" is the transaction id of txn in which the undo is
         # performed.  "keys" is the list of oids that are involved in the
@@ -870,7 +863,6 @@
             self._lock_release()
         return undo_serial, keys
 
-    @non_overridable
     def new_instance(self):
         """Implementation of IMVCCStorage.new_instance.
 
@@ -878,17 +870,10 @@
         a blob storage wrapper.
         """
         base_dir = self.fshelper.base_dir
-        s = getProxiedObject(self).new_instance()
+        s = self.__storage.new_instance()
         res = BlobStorage(base_dir, s)
         return res
 
-
-for name, v in BlobStorageMixin.__dict__.items():
-    if isinstance(v, type(BlobStorageMixin.__dict__['storeBlob'])):
-        assert name not in BlobStorage.__dict__
-        setattr(BlobStorage, name, non_overridable(v))
-del name, v
-
 copied = logging.getLogger('ZODB.blob.copied').debug
 def rename_or_copy_blob(f1, f2, chmod=True):
     """Try to rename f1 to f2, fallback to copy.



More information about the Zodb-checkins mailing list