[Zope3-checkins] CVS: Zope3/src/zodb/code - class_.py:1.17 patch.py:1.11
Jeremy Hylton
jeremy@zope.com
Wed, 7 May 2003 14:19:38 -0400
Update of /cvs-repository/Zope3/src/zodb/code
In directory cvs.zope.org:/tmp/cvs-serv26450
Modified Files:
class_.py patch.py
Log Message:
Fix class patch problem reported by Paolo Invernizzi.
A bunch of small, complex fixes are involved.
MethodMixin needs to handle SimpleDescriptor missing value.
Ignore _p_oid and _p_jar in _p_newstate() for classes.
Ignore "empty" descriptors in persistent_id(), where an
empty descr is returned when a class has no value
associated with the descr.
Add test that create instances of persistent classes
from other modules.
=== Zope3/src/zodb/code/class_.py 1.16 => 1.17 ===
--- Zope3/src/zodb/code/class_.py:1.16 Sat May 3 12:29:37 2003
+++ Zope3/src/zodb/code/class_.py Wed May 7 14:19:07 2003
@@ -93,6 +93,10 @@
class MethodMixin:
def __init__(self, name, descr, func):
+ if not hasattr(descr, "__get__"):
+ # If the object defined in the metaclass is not a descriptor,
+ # create one for it.
+ descr = SimpleDescriptor(descr)
super(MethodMixin, self).__init__(name, descr)
self.func = func
@@ -402,12 +406,23 @@
# Update a class's __dict__ in place. Must use setattr and
# delattr because __dict__ is a read-only proxy.
# XXX This doesn't handle __methods__ correctly.
+
+ # XXX I'm not sure how this is supposed to handle the
+ # ExtClassDataDescrs. As a hack, I'm deleting _p_oid
+ # and _p_jar from the keys dict, because I know they
+ # will be descrs and they won't change as a result of
+ # update. It appears that if the new class has a descr
+ # that isn't set on the class, it will stomp on the old
+ # class's value. Not sure if this is a problem in general.
+
def getkeys(cls):
L = [n for n in cls.__dict__.keys()
if not (n.startswith("__") and n.endswith("__"))]
d = {}
for elt in L:
d[elt] = True
+ del d["_p_oid"]
+ del d["_p_jar"]
return d
oldnames = getkeys(cls)
newnames = getkeys(acls)
@@ -416,3 +431,4 @@
delattr(cls, name)
for name in newnames:
setattr(cls, name, acls.__dict__[name])
+
=== Zope3/src/zodb/code/patch.py 1.10 => 1.11 ===
--- Zope3/src/zodb/code/patch.py:1.10 Sat May 3 12:32:21 2003
+++ Zope3/src/zodb/code/patch.py Wed May 7 14:19:07 2003
@@ -217,6 +217,9 @@
elif oid is None:
# It's a persistent object, but it's newly created.
oid = object()
+ descr = getattr(oid, "__get__", None)
+ if descr is not None:
+ return None
self._pmemo[oid] = obj
return oid