[Zope-Checkins] CVS: Zope3/lib/python/Zope/App - Traversable.py:1.1.2.2
Martijn Pieters
mj@zope.com
Sun, 2 Dec 2001 23:38:20 -0500
Update of /cvs-repository/Zope3/lib/python/Zope/App
In directory cvs.zope.org:/tmp/cvs-serv7507/lib/python/Zope/App
Modified Files:
Tag: Zope-3x-branch
Traversable.py
Log Message:
Working version of Traversable, with tests. unrestrictedTraverse still a stub.
=== Zope3/lib/python/Zope/App/Traversable.py 1.1.2.1 => 1.1.2.2 ===
from Zope.ContextWrapper import wrapper
+from __future__ import generators
+
+# A chain generator; let's us walk the wrapper chain down to the root
+def WrapperChain(w):
+ while w is not None:
+ yield w
+ w = wrapper.getcontext(w)
+
_marker = []
class Traversable:
@@ -24,21 +32,21 @@
self._wrapper = wrapper
def getPhysicalRoot(self):
- return wrapper.getbaseobject(self._wrapper)
+ # Loop over all wrappers until the last one, which is the root.
+ for w in WrapperChain(self._wrapper): pass
+ return w
def getPhysicalPath(self):
- path = ()
- w = self._wrapper
- while w:
+ path = []
+
+ for w in WrapperChain(self._wrapper):
path.insert(0, wrapper.getdict(w)['name'])
- w = wrapper.getcontext(w)
- path.insert(0, '')
- return path
+ return tuple(path)
def unrestrictedTraverse(self, path, default=_marker, restricted=0):
# stub, never finds.
- if default not is _marker:
+ if default is not _marker:
return default
raise KeyError