Skip to content

Commit

Permalink
Fix up zope.app for new location of zope.traversing.
Browse files Browse the repository at this point in the history
(also sneaked in some minor cosmetics regarding zapi/ztapi)
  • Loading branch information
philikon committed Apr 5, 2006
1 parent 49f1f1b commit b0fdc15
Show file tree
Hide file tree
Showing 3 changed files with 514 additions and 4 deletions.
97 changes: 97 additions & 0 deletions publicationtraverse.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
##############################################################################
#
# 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.1 (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.
#
##############################################################################
"""Publication Traverser
$Id$
"""
__docformat__ = 'restructuredtext'
from types import StringTypes

from zope.component import queryMultiAdapter
from zope.publisher.interfaces import NotFound
from zope.security.checker import ProxyFactory
from zope.traversing.namespace import namespaceLookup
from zope.traversing.namespace import nsParse
from zope.traversing.interfaces import TraversalError
from zope.publisher.interfaces import IPublishTraverse

class DuplicateNamespaces(Exception):
"""More than one namespace was specified in a request"""

class UnknownNamespace(Exception):
"""A parameter specified an unknown namespace"""

class PublicationTraverse(object):

def traverseName(self, request, ob, name):
nm = name # the name to look up the object with

if name and name[:1] in '@+':
# Process URI segment parameters.
ns, nm = nsParse(name)
if ns:
try:
ob2 = namespaceLookup(ns, nm, ob, request)
except TraversalError:
raise NotFound(ob, name)

return ProxyFactory(ob2)

if nm == '.':
return ob

if IPublishTraverse.providedBy(ob):
ob2 = ob.publishTraverse(request, nm)
else:
# self is marker
adapter = queryMultiAdapter((ob, request), IPublishTraverse,
default=self)
if adapter is not self:
ob2 = adapter.publishTraverse(request, nm)
else:
raise NotFound(ob, name, request)

return ProxyFactory(ob2)

class PublicationTraverser(PublicationTraverse):

def traversePath(self, request, ob, path):

if isinstance(path, StringTypes):
path = path.split('/')
if len(path) > 1 and not path[-1]:
# Remove trailing slash
path.pop()
else:
path = list(path)

# Remove single dots
path = [x for x in path if x != '.']

path.reverse()

# Remove double dots
while '..' in path:
l = path.index('..')
if l < 0 or l+2 > len(path):
break
del path[l:l+2]

pop = path.pop

while path:
name = pop()
ob = self.traverseName(request, ob, name)

return ob
8 changes: 4 additions & 4 deletions tests/test_zopepublication.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,14 @@
from zope.security import simplepolicies
from zope.security.management import setSecurityPolicy, queryInteraction
from zope.security.management import endInteraction
from zope.traversing.interfaces import IPhysicallyLocatable

from zope.app import zapi
from zope.app.testing.placelesssetup import PlacelessSetup
from zope.app.testing import setup, ztapi

from zope.app.error.interfaces import IErrorReportingUtility
from zope.app.location.interfaces import ILocation
from zope.app.traversing.interfaces import IPhysicallyLocatable
from zope.app.security.principalregistry import principalRegistry
from zope.app.security.interfaces import IUnauthenticatedPrincipal, IPrincipal
from zope.app.publication.zopepublication import ZopePublication
Expand Down Expand Up @@ -125,7 +125,7 @@ def setUp(self):
connection.close()
self.app = app

from zope.app.traversing.namespace import view, resource, etc
from zope.traversing.namespace import view, resource, etc
ztapi.provideNamespaceHandler('view', view)
ztapi.provideNamespaceHandler('resource', resource)
ztapi.provideNamespaceHandler('etc', etc)
Expand Down Expand Up @@ -469,8 +469,8 @@ def testTransactionAnnotation(self):
from zope.interface import directlyProvides
from zope.app.location.traversing import LocationPhysicallyLocatable
from zope.app.location.interfaces import ILocation
from zope.app.traversing.interfaces import IPhysicallyLocatable
from zope.app.traversing.interfaces import IContainmentRoot
from zope.traversing.interfaces import IPhysicallyLocatable
from zope.traversing.interfaces import IContainmentRoot
ztapi.provideAdapter(ILocation, IPhysicallyLocatable,
LocationPhysicallyLocatable)

Expand Down
Loading

0 comments on commit b0fdc15

Please sign in to comment.