[Zope-Checkins] SVN: Zope/branches/2.12/ - fixed handling of errors in 'traverseName'
Yvo Schubbe
y.2010 at wcm-solutions.de
Sat Apr 24 06:56:28 EDT 2010
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
More information about the Zope-Checkins
mailing list