diff options
| author | Chris McDonough <chrism@agendaless.com> | 2010-07-21 01:58:48 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2010-07-21 01:58:48 +0000 |
| commit | b4c212546023e41243ea30886f9afb8625e89c93 (patch) | |
| tree | 3e5bef9d2ee32f41063e9c580da1701b9ac25a29 /repoze/bfg/tests | |
| parent | 70f4859d32d0d4ea56a9ca26364d270e40ff7438 (diff) | |
| download | pyramid-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.py | 17 |
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() |
