summaryrefslogtreecommitdiff
path: root/repoze
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2010-09-06 00:06:48 +0000
committerChris McDonough <chrism@agendaless.com>2010-09-06 00:06:48 +0000
commiteb7ea411bfce55085449b79ac88aac19af0e232f (patch)
tree6c98b973c746d4c37a5d7f40078aefd9dd1c4d23 /repoze
parent8deae21c801bc05c6464a6eead3df449ed1fe52d (diff)
downloadpyramid-eb7ea411bfce55085449b79ac88aac19af0e232f.tar.gz
pyramid-eb7ea411bfce55085449b79ac88aac19af0e232f.tar.bz2
pyramid-eb7ea411bfce55085449b79ac88aac19af0e232f.zip
- 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).
Diffstat (limited to 'repoze')
-rw-r--r--repoze/bfg/events.py11
-rw-r--r--repoze/bfg/interfaces.py1
-rw-r--r--repoze/bfg/router.py2
-rw-r--r--repoze/bfg/tests/test_events.py11
4 files changed, 17 insertions, 8 deletions
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):