[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 checkins mailing list