summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2010-11-21 21:48:00 -0500
committerChris McDonough <chrism@plope.com>2010-11-21 21:48:00 -0500
commit76e48bbbde9891aa98205d4f9fd8c47d15a7f0eb (patch)
treeb741814e4ffbb214e2a3eba237a1bcf794a4ed24
parente269038f5328f80edaa7cceb73b8a176204ecc63 (diff)
downloadpyramid-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.txt3
-rw-r--r--TODO.txt3
-rw-r--r--pyramid/configuration.py18
-rw-r--r--pyramid/tests/test_configuration.py37
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
-------------
diff --git a/TODO.txt b/TODO.txt
index aee7d09da..41ea2c9e4 100644
--- a/TODO.txt
+++ b/TODO.txt
@@ -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__)