Log message for revision 111338: - fixed handling of errors in 'traverseName'
Changed: U Zope/branches/2.12/doc/CHANGES.rst U Zope/branches/2.12/src/ZPublisher/BaseRequest.py U Zope/branches/2.12/src/ZPublisher/tests/testBaseRequest.py -=- Modified: Zope/branches/2.12/doc/CHANGES.rst =================================================================== --- Zope/branches/2.12/doc/CHANGES.rst 2010-04-24 10:36:46 UTC (rev 111337) +++ Zope/branches/2.12/doc/CHANGES.rst 2010-04-24 10:56:28 UTC (rev 111338) @@ -15,6 +15,11 @@ - ZODB3 = 3.9.5 +Bugs Fixed +++++++++++ + +- BaseRequest: Fixed handling of errors in 'traverseName'. + 2.12.5 (2010-04-24) ------------------- Modified: Zope/branches/2.12/src/ZPublisher/BaseRequest.py =================================================================== --- Zope/branches/2.12/src/ZPublisher/BaseRequest.py 2010-04-24 10:36:46 UTC (rev 111337) +++ Zope/branches/2.12/src/ZPublisher/BaseRequest.py 2010-04-24 10:56:28 UTC (rev 111338) @@ -26,6 +26,7 @@ from zope.app.publication.interfaces import EndRequestEvent from zope.publisher.defaultview import queryDefaultViewName from zope.publisher.interfaces import IPublishTraverse +from zope.publisher.interfaces import NotFound as ztkNotFound from zope.publisher.interfaces.browser import IBrowserPublisher from zope.traversing.interfaces import TraversalError from zope.traversing.namespace import nsParse, namespaceLookup @@ -312,7 +313,7 @@ __repr__=__str__ - + # Original version: see zope.traversing.publicationtraverse def traverseName(self, ob, name): if name and name[:1] in '@+': # Process URI segment parameters. @@ -321,7 +322,7 @@ try: ob2 = namespaceLookup(ns, nm, ob, self) except TraversalError: - raise KeyError(ob, name) + raise ztkNotFound(ob, name) if IAcquirer.providedBy(ob2): ob2 = ob2.__of__(ob) @@ -343,7 +344,6 @@ return ob2 - def traverse(self, path, response=None, validated_hook=None): """Traverse the object space @@ -506,7 +506,8 @@ object, check_name, subobject, self.roles) object = subobject - except (KeyError, AttributeError): + # traverseName() might raise ZTK's NotFound + except (KeyError, AttributeError, ztkNotFound): if response.debug_mode: return response.debugError( "Cannot locate object at: %s" % URL) @@ -517,7 +518,6 @@ return response.debugError(e.args) else: return response.forbiddenError(entry_name) - parents.append(object) @@ -711,8 +711,7 @@ # types during publishing, we ensure the same publishing rules in # both versions. The downside is that this needs to be extended as # new built-in types are added and future Python versions are -# supported. That happens rarely enough that hopefully we'll be on -# Zope 3 by then :) +# supported. import types Modified: Zope/branches/2.12/src/ZPublisher/tests/testBaseRequest.py =================================================================== --- Zope/branches/2.12/src/ZPublisher/tests/testBaseRequest.py 2010-04-24 10:36:46 UTC (rev 111337) +++ Zope/branches/2.12/src/ZPublisher/tests/testBaseRequest.py 2010-04-24 10:56:28 UTC (rev 111338) @@ -1,5 +1,20 @@ import unittest +from zope.interface import implements +from zope.publisher.interfaces import IPublishTraverse +from zope.publisher.interfaces import NotFound as ztkNotFound + + +class DummyTraverser(object): + + implements(IPublishTraverse) + + def publishTraverse(self, request, name): + if name == 'dummy': + return 'dummy object' + raise ztkNotFound(self, name) + + class BaseRequest_factory: def _makeOne(self, root): @@ -138,6 +153,7 @@ return 'unpublishable' return DummyObjectWithEmptyDocstring() + class TestBaseRequest(unittest.TestCase, BaseRequest_factory): def _getTargetClass(self): @@ -372,13 +388,19 @@ def test_traverse_unsubscriptable(self): # See https://bugs.launchpad.net/bugs/213311 from ZPublisher import NotFound - class _Object(object): - pass - root = _Object() r = self._makeOne(None) self.assertRaises(NotFound, r.traverse, 'not_found') + def test_traverse_publishTraverse(self): + r = self._makeOne(DummyTraverser()) + self.assertEqual(r.traverse('dummy'), 'dummy object') + def test_traverse_publishTraverse_error(self): + from ZPublisher import NotFound + r = self._makeOne(DummyTraverser()) + self.assertRaises(NotFound, r.traverse, 'not_found') + + class TestBaseRequestZope3Views(unittest.TestCase, BaseRequest_factory): _dummy_interface = None _______________________________________________ Zope-Checkins maillist - Zope-Checkins@zope.org https://mail.zope.org/mailman/listinfo/zope-checkins