[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