[Zope-Checkins] CVS: Zope3/lib/python/Zope/App/Traversing - AcquireNamespace.py:1.2 AttrItemNamespaces.py:1.2 CreateNamespace.py:1.2 DefaultTraversable.py:1.2 EtcNamespace.py:1.2 Exceptions.py:1.2 INamespaceHandler.py:1.2 ITraversable.py:1.2 ITraverser.py:1.2 Namespaces.py:1.2 ParameterParsing.py:1.2 PresentationNamespaces.py:1.2 Traverser.py:1.2 __init__.py:1.2 traversing.zcml:1.2

Jim Fulton jim@zope.com
Mon, 10 Jun 2002 19:28:50 -0400


Update of /cvs-repository/Zope3/lib/python/Zope/App/Traversing
In directory cvs.zope.org:/tmp/cvs-serv17445/lib/python/Zope/App/Traversing

Added Files:
	AcquireNamespace.py AttrItemNamespaces.py CreateNamespace.py 
	DefaultTraversable.py EtcNamespace.py Exceptions.py 
	INamespaceHandler.py ITraversable.py ITraverser.py 
	Namespaces.py ParameterParsing.py PresentationNamespaces.py 
	Traverser.py __init__.py traversing.zcml 
Log Message:
Merged Zope-3x-branch into newly forked Zope3 CVS Tree.


=== Zope3/lib/python/Zope/App/Traversing/AcquireNamespace.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+# 
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+# 
+##############################################################################
+"""
+
+$Id$
+"""
+
+from Namespaces import provideNamespaceHandler
+from Exceptions import UnexpectedParameters
+from Zope.Exceptions import NotFoundError
+from Zope.ComponentArchitecture import queryAdapter
+from Zope.Proxy.ContextWrapper import ContextWrapper, getWrapperContext
+from ITraversable import ITraversable
+
+class ExcessiveWrapping(NotFoundError):
+    """Too many levels of acquisition wrapping. We don't believe them."""
+
+def acquire(name, parameters, pname, ob, request):
+    if parameters:
+        raise UnexpectedParameters(parameters)
+
+    i = 0
+    origOb = ob
+    while i < 200:
+        i += 1
+        traversable = queryAdapter(ob, ITraversable, None)
+        if traversable is not None:
+
+            try:
+                # XXX what do we do if the path gets bigger?
+                path = []
+                next = traversable.traverse(name, parameters, pname, path)
+                if path: continue
+            except NotFoundError:
+                pass
+            else:
+                return ContextWrapper(next, ob, name=name)
+
+        ob = getWrapperContext(ob)
+        if ob is None:
+            raise NotFoundError(origOb, pname)
+
+    raise ExcessiveWrapping(origOb, pname)
+
+provideNamespaceHandler('acquire', acquire)
+


=== Zope3/lib/python/Zope/App/Traversing/AttrItemNamespaces.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+# 
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+# 
+##############################################################################
+"""
+
+$Id$
+"""
+
+from Namespaces import provideNamespaceHandler
+from Exceptions import UnexpectedParameters
+
+def attr(name, parameters, pname, ob, request):
+    if parameters:
+        raise UnexpectedParameters(parameters)
+    return getattr(ob, name)
+
+provideNamespaceHandler('attribute', attr)
+
+def item(name, parameters, pname, ob, request):
+    if parameters:
+        raise UnexpectedParameters(parameters)
+    return ob[name]
+
+provideNamespaceHandler('item', item)
+
+
+# YAGNI
+# 
+# def accessor(name, parameters, ob, request):
+#     if parameters:
+#         raise UnexpectedParameters(parameters)
+# 
+#     method = getattr(ob, name, None)
+#     if method is None: 
+#         raise NotFound(ob, name, request)
+# 
+#     return method()
+# 
+# provideNamespaceHandler('accessor', accessor)


=== Zope3/lib/python/Zope/App/Traversing/CreateNamespace.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+# 
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+# 
+##############################################################################
+"""
+
+$Id$
+"""
+
+from Zope.ComponentArchitecture import getService
+from Namespaces import provideNamespaceHandler
+from Exceptions import UnexpectedParameters
+from Zope.Exceptions import NotFoundError
+from Zope.Proxy.ContextWrapper import ContextWrapper
+
+def create(name, parameters, pname, ob, request):
+    if parameters:
+        raise UnexpectedParameters(parameters)
+
+    for addable in getService(ob, 'AddableContent').getAddables(ob):
+        if addable.id == name:
+            return ContextWrapper(addable, ob, name=name)
+        
+    raise NotFoundError(ob, pname)
+
+provideNamespaceHandler('create', create)


=== Zope3/lib/python/Zope/App/Traversing/DefaultTraversable.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+# 
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+# 
+##############################################################################
+from ITraversable import ITraversable
+from Zope.Exceptions import NotFoundError
+from Exceptions import UnexpectedParameters
+
+class DefaultTraversable:
+    """Traverses objects via attribute and item lookup"""
+
+    __implements__ = ITraversable
+
+    def __init__(self, subject):
+        self._subject = subject
+
+    def traverse(self, name, parameters, pname, furtherPath):
+        if parameters:
+            raise UnexpectedParameters(parameters)
+        subject = self._subject
+        r = getattr(subject, name, self) # self used as marker
+        if r is not self:
+            return r
+        
+        if hasattr(subject, '__getitem__'):
+            # Let exceptions propagate.
+            return self._subject[name]
+        else:
+            raise NotFoundError(self._subject, name)
+


=== Zope3/lib/python/Zope/App/Traversing/EtcNamespace.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+# 
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+# 
+##############################################################################
+"""
+
+$Id$
+"""
+from Zope.App.OFS.ApplicationControl.ApplicationControl \
+     import ApplicationController
+from Namespaces import provideNamespaceHandler
+from Exceptions import UnexpectedParameters
+from Zope.Exceptions import NotFoundError
+
+def etc(name, parameters, pname, ob, request):
+    # XXX
+
+    # This is here now to allow us to get service managers from a
+    # separate namespace from the content. We add and etc
+    # namespace to allow us to handle misc objects.  We'll apply
+    # YAGNI for now and hard code this. We'll want something more
+    # general later. We were thinking of just calling "get"
+    # methods, but this is probably too magic. In particular, we
+    # will treat returned objects as sub-objects wrt security and
+    # not all get methods may satisfy this assumption. It might be
+    # best to introduce some sort of etc registry.
+
+    if parameters:
+        raise UnexpectedParameters(parameters)
+
+    if name == 'ApplicationController' and ob is None:
+        return ApplicationController
+
+    if name != 'Services':
+        
+        raise NotFoundError(ob, pname, request)
+
+    method_name = "getServiceManager"
+    method = getattr(ob, method_name, None)
+    if method is None: 
+        raise NotFound(ob, pname, request)
+
+    return method()
+
+provideNamespaceHandler('etc', etc)


=== Zope3/lib/python/Zope/App/Traversing/Exceptions.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+# 
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+# 
+##############################################################################
+"""
+
+$Id$
+"""
+from Zope.Exceptions import NotFoundError
+
+class UnexpectedParameters(NotFoundError):
+    """Unexpected namespace parameters were provided.
+    """


=== Zope3/lib/python/Zope/App/Traversing/INamespaceHandler.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+# 
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+# 
+##############################################################################
+"""
+
+$Id$
+"""
+
+from Interface import Interface
+
+class INamespaceHandler(Interface):
+
+    def __call__(name, parameters, pname, object, request):
+        """Access a name in a namespace
+
+        The name lookup usually depends on an object and/or a
+        request. If an object or request is unavailable, None will be passed.
+
+        The parameters provided, are passed as a sequence of
+        name, value items.  The 'pname' argument has the original name
+        before parameters were removed. 
+
+        It is not the respoonsibility of the handler to wrap the return value.
+        """


=== Zope3/lib/python/Zope/App/Traversing/ITraversable.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+# 
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+# 
+##############################################################################
+import Interface
+
+class ITraversable(Interface.Base):
+    """To traverse an object, this interface must be provided"""
+
+    def traverse(name, parameters, pname, furtherPath):
+        """Get the next item on the path
+
+        Should return the item corresponding to 'name' or raise
+        Zope.Exceptions.NotFoundError where appropriate.
+
+        The parameters provided, are passed as a sequence of
+        name, value items.  The 'pname' argument has the original name
+        before parameters were removed. 
+
+        furtherPath is a list of names still to be traversed. This method is
+        allowed to change the contents of furtherPath.
+        
+        """


=== Zope3/lib/python/Zope/App/Traversing/ITraverser.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+# 
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+# 
+##############################################################################
+"""
+
+$Id$
+"""
+
+import Interface
+
+_RAISE_KEYERROR=[]
+
+class ITraverser(Interface.Base):
+    """Provide traverse features"""
+
+    def getPhysicalRoot():
+        """
+        Returns the top-level Application object, or the base object if it is
+        unwrapped.
+        """
+
+    def getPhysicalPath():
+        """
+        Returns a path (an immutable sequence of strings) from the root.
+        
+        This path can be used to access this object again later, for example
+        in a copy/paste operation. Returns an empty tuple if the base object
+        is not wrapped.
+        """
+    
+    def traverse(path, default=_RAISE_KEYERROR):
+        """
+        Return an object given a path.
+        
+        Path is either an immutable sequence of strings or a slash ('/')
+        delimited string.
+
+        If the first string in the path sequence is an empty string,
+        or the path begins with a '/', start at the root. Otherwise the path
+        is relative to the current context.
+
+        If the object is not found, return 'default' argument.
+        """


=== Zope3/lib/python/Zope/App/Traversing/Namespaces.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+# 
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+# 
+##############################################################################
+"""
+
+$Id$
+"""
+
+from Zope.Exceptions import NotFoundError
+from Zope.Proxy.ContextWrapper import ContextWrapper
+
+_namespace_handlers = {}
+
+def provideNamespaceHandler(ns, handler):
+    _namespace_handlers[ns] = handler
+
+def namespaceLookup(name, ns, qname, parameters, object, request=None):
+    """Lookup a value from a namespace
+
+    name -- the original name
+    ns -- The namespace
+    qname -- The name without any parameters
+    """
+    
+    handler = _namespace_handlers.get(ns)
+    if handler is None:
+        raise NotFoundError(name)
+    new = ContextWrapper(handler(qname, parameters, name, object, request),
+                         object, name=name)
+    return new
+
+# Register the etc, view, and resource namespaces
+import EtcNamespace, PresentationNamespaces, AttrItemNamespaces
+import CreateNamespace, AcquireNamespace


=== Zope3/lib/python/Zope/App/Traversing/ParameterParsing.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+# 
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE
+# 
+##############################################################################
+"""
+
+Revision information:
+$Id$
+"""
+
+import re
+
+namespace_pattern = re.compile('[+][+]([a-zA-Z0-9_]+)[+][+]')
+
+def parameterizedNameParse(name):
+    """Parse a name with parameters, including namespace parameters.
+    
+    Return:
+    
+    - namespace, or None if there isn't one.
+    
+    - unparameterized name
+    
+    - sequence of parameters, as name-value pairs.
+    """
+
+    ns = ''
+    if name[:2] == '@@':
+        ns = 'view'
+        name = name[2:]
+    else:
+        match = namespace_pattern.match(name)
+        if match:
+            prefix, ns = match.group(0, 1)
+            name = name[len(prefix):]
+
+    return ns, name, ()


=== Zope3/lib/python/Zope/App/Traversing/PresentationNamespaces.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+# 
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+# 
+##############################################################################
+"""
+
+$Id$
+"""
+
+from Zope.ComponentArchitecture import getView, getResource
+from Namespaces import provideNamespaceHandler
+from Exceptions import UnexpectedParameters
+from Zope.Exceptions import NotFoundError
+
+class NoRequest(NotFoundError):
+    """Atempt to access a presentation component outside of a request context
+    """
+
+def view(name, parameters, pname, ob, request):
+    if parameters:
+        raise UnexpectedParameters(parameters)
+    if not request:
+        raise NoRequest(pname)
+    return getView(ob, name, request)
+
+provideNamespaceHandler('view', view)
+
+def resource(name, parameters, pname, ob, request):
+    if parameters:
+        raise UnexpectedParameters(parameters)
+    if not request:
+        raise NoRequest(pname)
+    return getResource(ob, name, request)
+
+provideNamespaceHandler('resource', resource)
+


=== Zope3/lib/python/Zope/App/Traversing/Traverser.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+# 
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+# 
+##############################################################################
+"""Default implementation of ITraverser.
+
+$Id$
+"""
+
+from ITraverser import ITraverser
+from ITraversable import ITraversable
+from Zope.ContextWrapper.IWrapper import IWrapper
+from Zope.Proxy.ContextWrapper import getWrapperContext, getWrapperData
+from Zope.Proxy.ContextWrapper import ContextWrapper
+from Zope.ComponentArchitecture import queryAdapter
+from Zope.Exceptions import NotFoundError, Unauthorized
+from Namespaces import namespaceLookup
+from ParameterParsing import parameterizedNameParse
+from Zope.Security.SecurityManagement import getSecurityManager
+
+from types import StringTypes
+
+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 = getWrapperContext(w)
+
+_marker = object()
+
+class Traverser:
+    """Provide traverse features"""
+
+    __implements__ = ITraverser
+
+    # This adapter can be used for any object.
+
+    def __init__(self, wrapper):
+        self._wrapper = wrapper
+
+    def getPhysicalRoot(self):
+        # 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 = []
+        
+        for w in WrapperChain(self._wrapper):
+            d = getWrapperData(w)
+            if d:
+                path.insert(0, d['name'])
+
+        return tuple(path)
+    
+    def traverse(self, path, default=_marker, request=None):
+        if not path:
+            return self._wrapper
+
+        if isinstance(path, StringTypes):
+            path = path.split('/')
+            if len(path) > 1 and not path[-1]:
+                # Remove trailing slash
+                path.pop()
+        else:
+            path = list(path)
+
+        path.reverse()
+        pop = path.pop
+
+        curr = self._wrapper
+        if not path[-1]:
+            # Start at the root
+            pop()
+            curr = self.getPhysicalRoot()
+        try:
+            while path:
+                name = pop()
+
+                if name == '.':
+                    continue
+
+                if name == '..':
+                    curr = getWrapperContext(curr) or curr
+                    continue
+
+
+                if name and name[:1] in '@+':
+                    ns, nm, parms = parameterizedNameParse(name)
+                    if ns:
+                        curr = namespaceLookup(name, ns, nm, parms,
+                                               curr, request)
+                        continue
+                else:
+                    parms = ()
+                    nm = name
+
+                traversable = queryAdapter(curr, ITraversable, None)
+                if traversable is None:
+                    raise NotFoundError, 'No traversable adapter found'
+
+                next = traversable.traverse(nm, parms, name, path)
+                curr = ContextWrapper(next, curr, name=name)
+
+            return curr
+
+        except:
+            if default == _marker:
+                raise
+            return default
+
+


=== Zope3/lib/python/Zope/App/Traversing/__init__.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+# 
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+# 
+##############################################################################
+"""
+Traversing the object tree.
+"""
+    
+


=== Zope3/lib/python/Zope/App/Traversing/traversing.zcml 1.1 => 1.2 ===
+   xmlns='http://namespaces.zope.org/zope'
+   xmlns:security='http://namespaces.zope.org/security'
+   xmlns:zmi='http://namespaces.zope.org/zmi'
+   xmlns:browser='http://namespaces.zope.org/browser'
+>
+
+<adapter factory="Zope.App.Traversing.Traverser."
+         provides="Zope.App.Traversing.ITraverser."
+         />
+    <!-- Ultimately, this should be registered only for IWrapper, but that
+         won't work like that just now.
+         for="Zope.ContextWrapper.IWrapper." /> -->
+
+<adapter factory="Zope.App.Traversing.DefaultTraversable."
+         provides="Zope.App.Traversing.ITraversable." />
+
+
+</zopeConfigure>