diff options
| author | Chris McDonough <chrism@plope.com> | 2012-01-19 03:45:47 -0500 |
|---|---|---|
| committer | Chris McDonough <chrism@plope.com> | 2012-01-19 03:45:47 -0500 |
| commit | e168597099f052e1e76aaee826ce7b949ef2f791 (patch) | |
| tree | 4f026f42ea2d8c35533cb8fbaa70a14746cdd347 | |
| parent | 077f3d1d0b28d9f565cc07a3ad11f4a8bb359054 (diff) | |
| parent | f4b7fd8db3c3c729d625f037cd48f1839332519d (diff) | |
| download | pyramid-e168597099f052e1e76aaee826ce7b949ef2f791.tar.gz pyramid-e168597099f052e1e76aaee826ce7b949ef2f791.tar.bz2 pyramid-e168597099f052e1e76aaee826ce7b949ef2f791.zip | |
Merge branch 'dnouri-master'
| -rw-r--r-- | pyramid/config/views.py | 9 | ||||
| -rw-r--r-- | pyramid/tests/test_config/test_views.py | 31 |
2 files changed, 36 insertions, 4 deletions
diff --git a/pyramid/config/views.py b/pyramid/config/views.py index 3cca1c7c5..89a0d77c5 100644 --- a/pyramid/config/views.py +++ b/pyramid/config/views.py @@ -513,8 +513,13 @@ class MultiView(object): self.views.sort(key=operator.itemgetter(0)) else: subset = self.media_views.setdefault(accept, []) - subset.append((order, view, phash)) - subset.sort() + for i, (s, v, h) in enumerate(list(subset)): + if phash == h: + subset[i] = (order, view, phash) + return + else: + subset.append((order, view, phash)) + subset.sort() accepts = set(self.accepts) accepts.add(accept) self.accepts = list(accepts) # dedupe diff --git a/pyramid/tests/test_config/test_views.py b/pyramid/tests/test_config/test_views.py index aa4c03db6..f1fe03c25 100644 --- a/pyramid/tests/test_config/test_views.py +++ b/pyramid/tests/test_config/test_views.py @@ -621,6 +621,25 @@ class TestViewsConfigurationMixin(unittest.TestCase): request.accept = DummyAccept('text/html', 'text/html') self.assertEqual(wrapper(None, request), 'OK2') + def test_add_views_with_accept_multiview_replaces_existing(self): + from pyramid.renderers import null_renderer + def view(context, request): + return 'OK' + def view2(context, request): + return 'OK2' + def view3(context, request): + return 'OK3' + config = self._makeOne(autocommit=True) + config.add_view(view=view, renderer=null_renderer) + config.add_view(view=view2, accept='text/html', renderer=null_renderer) + config.add_view(view=view3, accept='text/html', renderer=null_renderer) + wrapper = self._getViewCallable(config) + self.assertEqual(len(wrapper.media_views['text/html']), 1) + self.assertEqual(wrapper(None, None), 'OK') + request = DummyRequest() + request.accept = DummyAccept('text/html', 'text/html') + self.assertEqual(wrapper(None, request), 'OK3') + def test_add_view_exc_with_accept_multiview_replaces_existing_view(self): from pyramid.renderers import null_renderer from zope.interface import implementedBy @@ -1960,9 +1979,9 @@ class TestMultiView(unittest.TestCase): self.assertEqual(mv.views, [(99, 'view2', None), (100, 'view', None)]) mv.add('view3', 100, 'text/html') self.assertEqual(mv.media_views['text/html'], [(100, 'view3', None)]) - mv.add('view4', 99, 'text/html') + mv.add('view4', 99, 'text/html', 'abc') self.assertEqual(mv.media_views['text/html'], - [(99, 'view4', None), (100, 'view3', None)]) + [(99, 'view4', 'abc'), (100, 'view3', None)]) mv.add('view5', 100, 'text/xml') self.assertEqual(mv.media_views['text/xml'], [(100, 'view5', None)]) self.assertEqual(set(mv.accepts), set(['text/xml', 'text/html'])) @@ -1985,6 +2004,14 @@ class TestMultiView(unittest.TestCase): self.assertEqual(mv.views, [(100, 'view', 'abc'), (100, 'view', 'def')]) + def test_add_with_phash_override_accept(self): + mv = self._makeOne() + mv.add('view2', 100, accept='text/html', phash='abc') + mv.add('view3', 100, accept='text/html', phash='abc') + mv.add('view4', 99, accept='text/html', phash='def') + self.assertEqual(mv.media_views['text/html'], + [(99, 'view4', 'def'), (100, 'view3', 'abc')]) + def test_multiple_with_functions_as_views(self): # this failed on py3 at one point, because functions aren't orderable # and we were sorting the views via a plain sort() rather than |
