diff options
| author | Chris McDonough <chrism@plope.com> | 2010-11-21 21:48:00 -0500 |
|---|---|---|
| committer | Chris McDonough <chrism@plope.com> | 2010-11-21 21:48:00 -0500 |
| commit | 76e48bbbde9891aa98205d4f9fd8c47d15a7f0eb (patch) | |
| tree | b741814e4ffbb214e2a3eba237a1bcf794a4ed24 | |
| parent | e269038f5328f80edaa7cceb73b8a176204ecc63 (diff) | |
| download | pyramid-76e48bbbde9891aa98205d4f9fd8c47d15a7f0eb.tar.gz pyramid-76e48bbbde9891aa98205d4f9fd8c47d15a7f0eb.tar.bz2 pyramid-76e48bbbde9891aa98205d4f9fd8c47d15a7f0eb.zip | |
- Make default renderer work (renderer factory registered with no name, which
is active for every view unless the view names a specific renderer).
| -rw-r--r-- | CHANGES.txt | 3 | ||||
| -rw-r--r-- | TODO.txt | 3 | ||||
| -rw-r--r-- | pyramid/configuration.py | 18 | ||||
| -rw-r--r-- | pyramid/tests/test_configuration.py | 37 |
4 files changed, 51 insertions, 10 deletions
diff --git a/CHANGES.txt b/CHANGES.txt index 9d9a9ee5a..ee36776c7 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -16,6 +16,9 @@ Bug Fixes - The ``pyramid_routesalchemy`` paster template's unit tests failed (``AssertionError: 'SomeProject' != 'someproject'``). This is fixed. +- Make default renderer work (renderer factory registered with no name, which + is active for every view unless the view names a specific renderer). + Documentation ------------- @@ -11,9 +11,6 @@ Must-Have (before 1.0) - Provide a .flash API on session object. -- Make default renderer work (renderer registered with no name, which is - active for every view unless the view names a specific renderer). - - Use ``@register_view`` instead of ``@view_config`` and change view docs to use "view registration" instead of "view configuration". diff --git a/pyramid/configuration.py b/pyramid/configuration.py index 4c3e8b04b..d6e6b136e 100644 --- a/pyramid/configuration.py +++ b/pyramid/configuration.py @@ -296,12 +296,17 @@ class Configurator(object): attr=None, renderer=None, wrapper_viewname=None, viewname=None, accept=None, order=MAX_ORDER, phash=DEFAULT_PHASH): + if renderer is None: # use default renderer if one exists + default_renderer_factory = self.registry.queryUtility( + IRendererFactory) + if default_renderer_factory is not None: + renderer = {'name':None, 'package':self.package} view = self.maybe_dotted(view) authn_policy = self.registry.queryUtility(IAuthenticationPolicy) authz_policy = self.registry.queryUtility(IAuthorizationPolicy) settings = self.registry.settings logger = self.registry.queryUtility(IDebugLogger) - mapped_view = _map_view(view, attr, renderer, self.registry) + mapped_view = _map_view(view, self.registry, attr, renderer) owrapped_view = _owrap_view(mapped_view, viewname, wrapper_viewname) secured_view = _secure_view(owrapped_view, permission, authn_policy, authz_policy) @@ -1591,7 +1596,9 @@ class Configurator(object): Add a :app:`Pyramid` :term:`renderer` factory to the current configuration state. - The ``name`` argument is the renderer name. + The ``name`` argument is the renderer name. Use ``None`` to + represent the default renderer (a renderer which will be used for all + views unless they name another renderer specifically). The ``factory`` argument is Python reference to an implementation of a :term:`renderer` factory or a @@ -1605,6 +1612,11 @@ class Configurator(object): to use this method. """ factory = self.maybe_dotted(factory) + # if name is None or the empty string, we're trying to register + # a default renderer, but registerUtility is too dumb to accept None + # as a name + if not name: + name = '' self.registry.registerUtility( factory, IRendererFactory, name=name, info=_info) @@ -2426,7 +2438,7 @@ def is_response(ob): return True return False -def _map_view(view, attr=None, renderer=None, registry=None): +def _map_view(view, registry, attr=None, renderer=None): wrapped_view = view helper = None diff --git a/pyramid/tests/test_configuration.py b/pyramid/tests/test_configuration.py index 4c1182eab..5113d1f4e 100644 --- a/pyramid/tests/test_configuration.py +++ b/pyramid/tests/test_configuration.py @@ -2558,6 +2558,36 @@ class ConfiguratorTests(unittest.TestCase): self.failIf(result is view) self.assertEqual(result(None, None).body, 'moo') + def test_derive_view_with_default_renderer_no_explicit_renderer(self): + def view(request): + return 'OK' + config = self._makeOne() + class moo(object): + def __init__(self, *arg, **kw): + pass + def __call__(self, *arg, **kw): + return 'moo' + config.add_renderer(None, moo) + result = config.derive_view(view) + self.failIf(result is view) + self.assertEqual(result(None, None).body, 'moo') + + def test_derive_view_with_default_renderer_with_explicit_renderer(self): + def view(request): + return 'OK' + config = self._makeOne() + class moo(object): pass + class foo(object): + def __init__(self, *arg, **kw): + pass + def __call__(self, *arg, **kw): + return 'foo' + config.add_renderer(None, moo) + config.add_renderer('foo', foo) + result = config.derive_view(view, renderer='foo') + self.failIf(result is view) + self.assertEqual(result(None, None).body, 'foo') + def test_derive_view_class_without_attr(self): class View(object): def __init__(self, request): @@ -3241,9 +3271,9 @@ class Test__map_view(unittest.TestCase): request.registry = self.registry return request - def _callFUT(self, *arg, **kw): + def _callFUT(self, view, **kw): from pyramid.configuration import _map_view - return _map_view(*arg, **kw) + return _map_view(view, self.registry, **kw) def test__map_view_as_function_context_and_request(self): def view(context, request): @@ -3542,8 +3572,7 @@ class Test__map_view(unittest.TestCase): def view(context, request): return {'a':'1'} info = {'name':renderer.spec, 'package':None} - result = self._callFUT(view, renderer=info, - registry=self.registry) + result = self._callFUT(view, renderer=info) self.failIf(result is view) self.assertEqual(view.__module__, result.__module__) self.assertEqual(view.__doc__, result.__doc__) |
