summaryrefslogtreecommitdiff
path: root/repoze/bfg/tests
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2010-07-21 01:58:48 +0000
committerChris McDonough <chrism@agendaless.com>2010-07-21 01:58:48 +0000
commitb4c212546023e41243ea30886f9afb8625e89c93 (patch)
tree3e5bef9d2ee32f41063e9c580da1701b9ac25a29 /repoze/bfg/tests
parent70f4859d32d0d4ea56a9ca26364d270e40ff7438 (diff)
downloadpyramid-b4c212546023e41243ea30886f9afb8625e89c93.tar.gz
pyramid-b4c212546023e41243ea30886f9afb8625e89c93.tar.bz2
pyramid-b4c212546023e41243ea30886f9afb8625e89c93.zip
- A new internal exception class (*not* an API) named
``repoze.bfg.exceptions.PredicateMismatch`` now exists. This exception is currently raised when no constituent view of a multiview can be called (due to no predicate match). Previously, in this situation, a ``repoze.bfg.exceptions.NotFound`` was raised. We provide backwards compatibility for code that expected a ``NotFound`` to be raised when no predicates match by causing ``repoze.bfg.exceptions.PredicateMismatch`` to inherit from ``NotFound``. This will cause any exception view registered for ``NotFound`` to be called when a predicate mismatch occurs, as was the previous behavior. There is however, one perverse case that will expose a backwards incompatibility. If 1) you had a view that was registered as a member of a multiview 2) this view explicitly raised a ``NotFound`` exception *in order to* proceed to the next predicate check in the multiview, that code will now behave differently: rather than skipping to the next view match, a NotFound will be raised to the top-level exception handling machinery instead. For code to be depending upon the behavior of a view raising ``NotFound`` to proceed to the next predicate match, would be tragic, but not impossible, given that ``NotFound`` is a public interface. ``repoze.bfg.exceptions.PredicateMismatch`` is not a public API and cannot be depended upon by application code, so you should not change your view code to raise ``PredicateMismatch``. Instead, move the logic which raised the ``NotFound`` exception in the view out into a custom view predicate.
Diffstat (limited to 'repoze/bfg/tests')
-rw-r--r--repoze/bfg/tests/test_configuration.py17
1 files changed, 15 insertions, 2 deletions
diff --git a/repoze/bfg/tests/test_configuration.py b/repoze/bfg/tests/test_configuration.py
index 4df7af1c2..17708bf63 100644
--- a/repoze/bfg/tests/test_configuration.py
+++ b/repoze/bfg/tests/test_configuration.py
@@ -3307,20 +3307,33 @@ class TestMultiView(unittest.TestCase):
self.assertRaises(NotFound, mv, context, request)
def test___call__intermediate_not_found(self):
- from repoze.bfg.exceptions import NotFound
+ from repoze.bfg.exceptions import PredicateMismatch
mv = self._makeOne()
context = DummyContext()
request = DummyRequest()
request.view_name = ''
expected_response = DummyResponse()
def view1(context, request):
- raise NotFound
+ raise PredicateMismatch
def view2(context, request):
return expected_response
mv.views = [(100, view1, None), (99, view2, None)]
response = mv(context, request)
self.assertEqual(response, expected_response)
+ def test___call__raise_not_found_isnt_interpreted_as_pred_mismatch(self):
+ from repoze.bfg.exceptions import NotFound
+ mv = self._makeOne()
+ context = DummyContext()
+ request = DummyRequest()
+ request.view_name = ''
+ def view1(context, request):
+ raise NotFound
+ def view2(context, request):
+ """ """
+ mv.views = [(100, view1, None), (99, view2, None)]
+ self.assertRaises(NotFound, mv, context, request)
+
def test___call__(self):
mv = self._makeOne()
context = DummyContext()