From eb7ea411bfce55085449b79ac88aac19af0e232f Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Mon, 6 Sep 2010 00:06:48 +0000 Subject: - The ``repoze.bfg.interfaces.INewResponse`` interface now includes a ``request`` attribute; as a result, a handler for INewResponse now has access to the request which caused the response. - The INewResponse event is now not sent to listeners if the response returned by view code (or a renderer) is not a "real" response (e.g. if it does not have ``.status``, ``.headerlist`` and ``.app_iter`` attribtues). --- repoze/bfg/events.py | 11 ++++++++--- repoze/bfg/interfaces.py | 1 + repoze/bfg/router.py | 2 +- repoze/bfg/tests/test_events.py | 11 +++++++---- 4 files changed, 17 insertions(+), 8 deletions(-) (limited to 'repoze') diff --git a/repoze/bfg/events.py b/repoze/bfg/events.py index 22822eeeb..dd4f2eacc 100644 --- a/repoze/bfg/events.py +++ b/repoze/bfg/events.py @@ -82,8 +82,12 @@ class NewRequest(object): class NewResponse(object): """ An instance of this class is emitted as an :term:`event` whenever any :mod:`repoze.bfg` view returns a :term:`response`. - The instance has an attribute, ``response``, which is the response - object returned by the view. This class implements the + + The instance has two attributes:``request``, which is the request + which caused the response, and ``response``, which is the response + object returned by a view or renderer. + + This class implements the :class:`repoze.bfg.interfaces.INewResponse` interface. .. note:: @@ -96,7 +100,8 @@ class NewResponse(object): :class:`repoze.bfg.interfaces.INewRequest` event. """ implements(INewResponse) - def __init__(self, response): + def __init__(self, request, response): + self.request = request self.response = response class AfterTraversal(object): diff --git a/repoze/bfg/interfaces.py b/repoze/bfg/interfaces.py index 086c93f3a..86e2206e3 100644 --- a/repoze/bfg/interfaces.py +++ b/repoze/bfg/interfaces.py @@ -16,6 +16,7 @@ class INewRequest(Interface): class INewResponse(Interface): """ An event type that is emitted whenever any :mod:`repoze.bfg` view returns a response.""" + request = Attribute('The request object') response = Attribute('The response object') class IWSGIApplicationCreatedEvent(Interface): diff --git a/repoze/bfg/router.py b/repoze/bfg/router.py index 8f96bb798..277ee559b 100644 --- a/repoze/bfg/router.py +++ b/repoze/bfg/router.py @@ -157,7 +157,7 @@ class Router(object): request._process_response_callbacks(response) # process the response - has_listeners and registry.notify(NewResponse(response)) + has_listeners and registry.notify(NewResponse(request, response)) start_response(status, headers) return app_iter diff --git a/repoze/bfg/tests/test_events.py b/repoze/bfg/tests/test_events.py index c258c4ad2..c122f4744 100644 --- a/repoze/bfg/tests/test_events.py +++ b/repoze/bfg/tests/test_events.py @@ -31,8 +31,8 @@ class NewResponseEventTests(unittest.TestCase): from repoze.bfg.events import NewResponse return NewResponse - def _makeOne(self, response): - return self._getTargetClass()(response) + def _makeOne(self, request, response): + return self._getTargetClass()(request, response) def test_class_implements(self): from repoze.bfg.interfaces import INewResponse @@ -43,13 +43,16 @@ class NewResponseEventTests(unittest.TestCase): def test_instance_implements(self): from repoze.bfg.interfaces import INewResponse from zope.interface.verify import verifyObject + request = DummyRequest() response = DummyResponse() - inst = self._makeOne(response) + inst = self._makeOne(request, response) verifyObject(INewResponse, inst) def test_ctor(self): + request = DummyRequest() response = DummyResponse() - inst = self._makeOne(response) + inst = self._makeOne(request, response) + self.assertEqual(inst.request, request) self.assertEqual(inst.response, response) class WSGIAppEventTests(unittest.TestCase): -- cgit v1.2.3