Log message for revision 69659:
  - Fix #2155: Wrong parameters being passed to logger's error().
  

Changed:
  U   Zope/branches/2.10/doc/CHANGES.txt
  U   Zope/branches/2.10/lib/python/ZPublisher/BeforeTraverse.py
  A   Zope/branches/2.10/lib/python/ZPublisher/tests/testBeforeTraverse.py

-=-
Modified: Zope/branches/2.10/doc/CHANGES.txt
===================================================================
--- Zope/branches/2.10/doc/CHANGES.txt  2006-08-18 16:34:06 UTC (rev 69658)
+++ Zope/branches/2.10/doc/CHANGES.txt  2006-08-18 16:46:42 UTC (rev 69659)
@@ -8,6 +8,9 @@
 
     Bugs Fixed
 
+      - Collector #2155: Fix wrong parameter being passed to
+        logger's error() method, with tests.
+
       - Updated Five to stable 1.5 release.
 
       - Traversal order changes were causing WebDAV requests which used

Modified: Zope/branches/2.10/lib/python/ZPublisher/BeforeTraverse.py
===================================================================
--- Zope/branches/2.10/lib/python/ZPublisher/BeforeTraverse.py  2006-08-18 
16:34:06 UTC (rev 69658)
+++ Zope/branches/2.10/lib/python/ZPublisher/BeforeTraverse.py  2006-08-18 
16:46:42 UTC (rev 69659)
@@ -16,7 +16,6 @@
 
 from Acquisition import aq_base
 from logging import getLogger
-import sys
 
 # Interface
 
@@ -106,7 +105,7 @@
                 cob(container, request)
             except TypeError:
                 LOG.error('%s call %s failed.' % (
-                    `self._hookname`, `cob`), exc_info=sys.exc_info())
+                    `self._hookname`, `cob`), exc_info=True)
 
     def add(self, cob):
         self._list.append(cob)
@@ -151,6 +150,5 @@
             # Only catch exceptions that are likely to be logic errors.
             # We shouldn't catch Redirects, Unauthorizeds, etc. since
             # the programmer may want to raise them deliberately.
-            
             LOG.error('BeforeTraverse: Error while invoking hook: "%s"' % 
self.name, 
-                      exc_info=sys.exc_info())
+                      exc_info=True)

Copied: Zope/branches/2.10/lib/python/ZPublisher/tests/testBeforeTraverse.py 
(from rev 69658, 
Zope/branches/2.9/lib/python/ZPublisher/tests/testBeforeTraverse.py)
===================================================================
--- Zope/branches/2.9/lib/python/ZPublisher/tests/testBeforeTraverse.py 
2006-08-18 16:34:06 UTC (rev 69658)
+++ Zope/branches/2.10/lib/python/ZPublisher/tests/testBeforeTraverse.py        
2006-08-18 16:46:42 UTC (rev 69659)
@@ -0,0 +1,139 @@
+import sys
+import logging
+
+from Acquisition import Implicit
+from ZPublisher import BeforeTraverse
+from ZPublisher.BaseRequest import BaseRequest
+from ZPublisher.HTTPResponse import HTTPResponse
+
+def makeBaseRequest(root):
+    response = HTTPResponse()
+    environment = { 'URL': '',
+                   'PARENTS': [root],
+                   'steps': [],
+                   '_hacked_path': 0,
+                   '_test_counter': 0,
+                   'response': response }
+    return BaseRequest(environment)
+
+
+class DummyObjectBasic(Implicit):
+    """ Dummy class with docstring.
+    """
+    pass
+
+
+class BrokenHook:
+    
+    def __call__(self, *args):
+       print self.__class__.__name__, 'called'
+       raise TypeError, self.__class__.__name__
+
+def testBeforeTraverse(self):
+    """ 
+    Zope supports a 'before traverse' hook that is used for several
+    features, including 'Site Access Rules'. It is implemented using a
+    special API for registering hooks, and the hooks themselves are
+    called during traversal by ZPublisher.
+
+    >>> root = DummyObjectBasic()
+    >>> request = makeBaseRequest(root)
+
+    >>> container = DummyObjectBasic()
+    >>> root.container = container
+
+    >>> obj = DummyObjectBasic()
+    >>> container.obj = obj
+
+    Setup a broken hook as the before traverse hook for the
+    container. That will create a 'MultiHook' object:
+
+    >>> BeforeTraverse.registerBeforeTraverse(container, BrokenHook(),
+    ...    'broken_hook')
+
+    >>> container.__before_publishing_traverse__
+    <ZPublisher.BeforeTraverse.MultiHook instance at ...>
+
+    >>> container.__before_traverse__
+    {(99, 'broken_hook'): <ZPublisher.tests.testBeforeTraverse.BrokenHook ...>}
+
+    Setup logging so we can see the actual exception being logged:
+    
+    >>> logger = logging.getLogger('ZPublisher')
+    >>> level = logger.level
+    >>> handlers = logger.handlers[:]
+
+    >>> logger.addHandler(logging.StreamHandler(sys.stdout))
+    >>> logger.setLevel(logging.ERROR)
+
+    Now do the actual traversal:
+    
+    >>> _ = request.traverse('container/obj')
+    BrokenHook called
+    '__before_publishing_traverse__' call ... failed.
+    Traceback (most recent call last):
+    ...
+    TypeError: BrokenHook
+
+    Unregister the borken hook:
+
+    >>> _ = BeforeTraverse.unregisterBeforeTraverse(container, 'broken_hook')
+
+    The list of 'before traverse' hooks is empty:
+
+    >>> container.__before_traverse__
+    {}
+
+    But the 'MultiHook' is not removed:
+
+    >>> container.__before_publishing_traverse__
+    <ZPublisher.BeforeTraverse.MultiHook instance at ...>
+
+    If you have an object in the same container that you want to call
+    during traversal you can register a 'NameCaller' as the hook
+    instead, and it will delegate to the callable by looking it up as
+    an attribute of the container:
+    
+    >>> container.broken_callable = BrokenHook()
+    >>> BeforeTraverse.registerBeforeTraverse(container, 
+    ...         BeforeTraverse.NameCaller('broken_callable'),
+    ...         'broken_callable')
+
+    >>> container.__before_traverse__
+    {(99, 'broken_callable'): <ZPublisher.BeforeTraverse.NameCaller ...>}
+
+    Now do the actual traversal:
+    
+    >>> _ = request.traverse('container/obj')
+    BrokenHook called
+    BeforeTraverse: Error while invoking hook: "broken_callable"
+    Traceback (most recent call last):
+    ...
+    TypeError: BrokenHook
+
+    Unregister the borken hook:
+
+    >>> _ = BeforeTraverse.unregisterBeforeTraverse(container, 
'broken_callable')
+
+    The list of 'before traverse' hooks is empty:
+
+    >>> container.__before_traverse__
+    {}
+
+    But the 'MultiHook' is not removed:
+
+    >>> container.__before_publishing_traverse__
+    <ZPublisher.BeforeTraverse.MultiHook instance at ...>
+
+    Finally, restore the logger state:
+
+    >>> logger.setLevel(level)
+    >>> logger.handlers = handlers[:]
+
+    """
+    pass
+
+from zope.testing import doctest
+
+def test_suite():
+    return doctest.DocTestSuite(optionflags=doctest.ELLIPSIS)

_______________________________________________
Zope-Checkins maillist  -  Zope-Checkins@zope.org
http://mail.zope.org/mailman/listinfo/zope-checkins

Reply via email to