[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>