diff options
| author | Chris McDonough <chrism@plope.com> | 2011-07-21 22:02:37 -0400 |
|---|---|---|
| committer | Chris McDonough <chrism@plope.com> | 2011-07-21 22:02:37 -0400 |
| commit | aa2fe1b0a02ba4edde4d285ec0a5a6ec545b7fec (patch) | |
| tree | 72511de87df7b6369a073434e1fe2c38c1624a13 | |
| parent | 73c0aee5571bbdd7273033eda3a798d5597a76af (diff) | |
| download | pyramid-aa2fe1b0a02ba4edde4d285ec0a5a6ec545b7fec.tar.gz pyramid-aa2fe1b0a02ba4edde4d285ec0a5a6ec545b7fec.tar.bz2 pyramid-aa2fe1b0a02ba4edde4d285ec0a5a6ec545b7fec.zip | |
- Added the ``pyramid.renderers.null_renderer`` object as an API. The null
renderer is an object that can be used in advanced integration cases as
input to the view configuration ``renderer=`` argument. When the null
renderer is used as a view renderer argument, Pyramid avoids converting the
view callable result into a Response object. This is useful if you want to
reuse the view configuration and lookup machinery outside the context of
its use by the Pyramid router. This feature was added for consumption by
the ``pyramid_rpc`` package, which uses view configuration and lookup
outside the context of a router in exactly this way. ``pyramid_rpc`` has
been broken under 1.1 since 1.1b1; adding it allows us to make it work
again.
| -rw-r--r-- | CHANGES.txt | 15 | ||||
| -rw-r--r-- | docs/api/renderers.rst | 9 | ||||
| -rw-r--r-- | pyramid/config.py | 13 | ||||
| -rw-r--r-- | pyramid/interfaces.py | 1 | ||||
| -rw-r--r-- | pyramid/renderers.py | 19 | ||||
| -rw-r--r-- | pyramid/tests/grokkedapp/__init__.py | 34 | ||||
| -rw-r--r-- | pyramid/tests/grokkedapp/another.py | 24 | ||||
| -rw-r--r-- | pyramid/tests/grokkedapp/pod/notinit.py | 3 | ||||
| -rw-r--r-- | pyramid/tests/grokkedapp/subpackage/__init__.py | 3 | ||||
| -rw-r--r-- | pyramid/tests/grokkedapp/subpackage/notinit.py | 3 | ||||
| -rw-r--r-- | pyramid/tests/grokkedapp/subpackage/subsubpackage/__init__.py | 3 | ||||
| -rw-r--r-- | pyramid/tests/test_config.py | 268 | ||||
| -rw-r--r-- | pyramid/tests/test_renderers.py | 33 |
13 files changed, 309 insertions, 119 deletions
diff --git a/CHANGES.txt b/CHANGES.txt index bb5828811..5e2fb2970 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,6 +1,21 @@ Next release ============ +Features +-------- + +- Added the ``pyramid.renderers.null_renderer`` object as an API. The null + renderer is an object that can be used in advanced integration cases as + input to the view configuration ``renderer=`` argument. When the null + renderer is used as a view renderer argument, Pyramid avoids converting the + view callable result into a Response object. This is useful if you want to + reuse the view configuration and lookup machinery outside the context of + its use by the Pyramid router. This feature was added for consumption by + the ``pyramid_rpc`` package, which uses view configuration and lookup + outside the context of a router in exactly this way. ``pyramid_rpc`` has + been broken under 1.1 since 1.1b1; adding it allows us to make it work + again. + Internals --------- diff --git a/docs/api/renderers.rst b/docs/api/renderers.rst index c13694219..15670c46e 100644 --- a/docs/api/renderers.rst +++ b/docs/api/renderers.rst @@ -13,3 +13,12 @@ .. autoclass:: JSONP +.. attribute:: null_renderer + + An object that can be used in advanced integration cases as input to the + view configuration ``renderer=`` argument. When the null renderer is used + as a view renderer argument, Pyramid avoids converting the view callable + result into a Response object. This is useful if you want to reuse the + view configuration and lookup machinery outside the context of its use by + the Pyramid router (e.g. the package named ``pyramid_rpc`` does this). + diff --git a/pyramid/config.py b/pyramid/config.py index 59ecd5bc8..cad853674 100644 --- a/pyramid/config.py +++ b/pyramid/config.py @@ -2124,7 +2124,7 @@ class Configurator(object): context = getattr(request, 'context', None) return view(context, request) return self.add_view(bwcompat_view, context=HTTPForbidden, - wrapper=wrapper) + wrapper=wrapper, renderer=renderer) @action_method def set_notfound_view(self, view=None, attr=None, renderer=None, @@ -2165,7 +2165,7 @@ class Configurator(object): context = getattr(request, 'context', None) return view(context, request) return self.add_view(bwcompat_view, context=HTTPNotFound, - wrapper=wrapper) + wrapper=wrapper, renderer=renderer) @action_method def set_request_factory(self, factory): @@ -3104,7 +3104,8 @@ class ViewDeriver(object): @wraps_view def rendered_view(self, view): - # one way or another this wrapper must produce a Response + # one way or another this wrapper must produce a Response (unless + # the renderer is a NullRendererHelper) renderer = self.kw.get('renderer') if renderer is None: # register a default renderer if you want super-dynamic @@ -3112,6 +3113,8 @@ class ViewDeriver(object): # override_renderer to work if a renderer is left unspecified for # a view registration. return self._response_resolved_view(view) + if renderer is renderers.null_renderer: + return view return self._rendered_view(view, renderer) def _rendered_view(self, view, view_renderer): @@ -3142,10 +3145,6 @@ class ViewDeriver(object): def _response_resolved_view(self, view): registry = self.registry - if hasattr(registry, '_dont_resolve_responses'): - # for Pyramid unit tests only - return view - def viewresult_to_response(context, request): result = view(context, request) response = registry.queryAdapterOrSelf(result, IResponse) diff --git a/pyramid/interfaces.py b/pyramid/interfaces.py index 4ef58846b..d3a67e1aa 100644 --- a/pyramid/interfaces.py +++ b/pyramid/interfaces.py @@ -866,4 +866,3 @@ class IRendererInfo(Interface): settings = Attribute('The deployment settings dictionary related ' 'to the current application') - diff --git a/pyramid/renderers.py b/pyramid/renderers.py index d7ce1b045..52459ee90 100644 --- a/pyramid/renderers.py +++ b/pyramid/renderers.py @@ -469,3 +469,22 @@ class RendererHelper(object): registry = self.registry return self.__class__(name=name, package=package, registry=registry) +class NullRendererHelper(RendererHelper): + """ Special renderer helper that has render_* methods which simply return + the value they are fed rather than converting them to response objects; + useful for testing purposes and special case view configuration + registrations that want to use the view configuration machinery but do + not want actual rendering to happen .""" + def render_view(self, request, value, view, context): + return value + + def render(self, value, system_values, request=None): + return value + + def render_to_response(self, value, system_values, request=None): + return value + + def clone(self, name=None, package=None, registry=None): + return self + +null_renderer = NullRendererHelper() diff --git a/pyramid/tests/grokkedapp/__init__.py b/pyramid/tests/grokkedapp/__init__.py index 1411e4c49..562413a41 100644 --- a/pyramid/tests/grokkedapp/__init__.py +++ b/pyramid/tests/grokkedapp/__init__.py @@ -1,15 +1,16 @@ from pyramid.view import view_config +from pyramid.renderers import null_renderer -@view_config() +@view_config(renderer=null_renderer) def grokked(context, request): return 'grokked' -@view_config(request_method='POST') +@view_config(request_method='POST', renderer=null_renderer) def grokked_post(context, request): return 'grokked_post' -@view_config(name='stacked2') -@view_config(name='stacked1') +@view_config(name='stacked2', renderer=null_renderer) +@view_config(name='stacked1', renderer=null_renderer) def stacked(context, request): return 'stacked' @@ -21,8 +22,10 @@ class stacked_class(object): def __call__(self): return 'stacked_class' -stacked_class = view_config(name='stacked_class1')(stacked_class) -stacked_class = view_config(name='stacked_class2')(stacked_class) +stacked_class = view_config(name='stacked_class1', + renderer=null_renderer)(stacked_class) +stacked_class = view_config(name='stacked_class2', + renderer=null_renderer)(stacked_class) class oldstyle_grokked_class: def __init__(self, context, request): @@ -32,7 +35,8 @@ class oldstyle_grokked_class: def __call__(self): return 'oldstyle_grokked_class' -oldstyle_grokked_class = view_config(name='oldstyle_grokked_class')( +oldstyle_grokked_class = view_config(name='oldstyle_grokked_class', + renderer=null_renderer)( oldstyle_grokked_class) class grokked_class(object): @@ -43,17 +47,19 @@ class grokked_class(object): def __call__(self): return 'grokked_class' -grokked_class = view_config(name='grokked_class')(grokked_class) +grokked_class = view_config(name='grokked_class', + renderer=null_renderer)(grokked_class) class Foo(object): def __call__(self, context, request): return 'grokked_instance' grokked_instance = Foo() -grokked_instance = view_config(name='grokked_instance')(grokked_instance) +grokked_instance = view_config(name='grokked_instance', + renderer=null_renderer)(grokked_instance) class Base(object): - @view_config(name='basemethod') + @view_config(name='basemethod', renderer=null_renderer) def basemethod(self): """ """ @@ -62,16 +68,16 @@ class MethodViews(Base): self.context = context self.request = request - @view_config(name='method1') + @view_config(name='method1', renderer=null_renderer) def method1(self): return 'method1' - @view_config(name='method2') + @view_config(name='method2', renderer=null_renderer) def method2(self): return 'method2' - @view_config(name='stacked_method2') - @view_config(name='stacked_method1') + @view_config(name='stacked_method2', renderer=null_renderer) + @view_config(name='stacked_method1', renderer=null_renderer) def stacked(self): return 'stacked_method' diff --git a/pyramid/tests/grokkedapp/another.py b/pyramid/tests/grokkedapp/another.py index 48fe81798..529821b5c 100644 --- a/pyramid/tests/grokkedapp/another.py +++ b/pyramid/tests/grokkedapp/another.py @@ -1,15 +1,16 @@ from pyramid.view import view_config +from pyramid.renderers import null_renderer -@view_config(name='another') +@view_config(name='another', renderer=null_renderer) def grokked(context, request): return 'another_grokked' -@view_config(request_method='POST', name='another') +@view_config(request_method='POST', name='another', renderer=null_renderer) def grokked_post(context, request): return 'another_grokked_post' -@view_config(name='another_stacked2') -@view_config(name='another_stacked1') +@view_config(name='another_stacked2', renderer=null_renderer) +@view_config(name='another_stacked1', renderer=null_renderer) def stacked(context, request): return 'another_stacked' @@ -21,8 +22,10 @@ class stacked_class(object): def __call__(self): return 'another_stacked_class' -stacked_class = view_config(name='another_stacked_class1')(stacked_class) -stacked_class = view_config(name='another_stacked_class2')(stacked_class) +stacked_class = view_config(name='another_stacked_class1', + renderer=null_renderer)(stacked_class) +stacked_class = view_config(name='another_stacked_class2', + renderer=null_renderer)(stacked_class) class oldstyle_grokked_class: def __init__(self, context, request): @@ -32,7 +35,8 @@ class oldstyle_grokked_class: def __call__(self): return 'another_oldstyle_grokked_class' -oldstyle_grokked_class = view_config(name='another_oldstyle_grokked_class')( +oldstyle_grokked_class = view_config(name='another_oldstyle_grokked_class', + renderer=null_renderer)( oldstyle_grokked_class) class grokked_class(object): @@ -43,14 +47,16 @@ class grokked_class(object): def __call__(self): return 'another_grokked_class' -grokked_class = view_config(name='another_grokked_class')(grokked_class) +grokked_class = view_config(name='another_grokked_class', + renderer=null_renderer)(grokked_class) class Foo(object): def __call__(self, context, request): return 'another_grokked_instance' grokked_instance = Foo() -grokked_instance = view_config(name='another_grokked_instance')( +grokked_instance = view_config(name='another_grokked_instance', + renderer=null_renderer)( grokked_instance) # ungrokkable diff --git a/pyramid/tests/grokkedapp/pod/notinit.py b/pyramid/tests/grokkedapp/pod/notinit.py index 3d01f92d5..91dcd161b 100644 --- a/pyramid/tests/grokkedapp/pod/notinit.py +++ b/pyramid/tests/grokkedapp/pod/notinit.py @@ -1,5 +1,6 @@ from pyramid.view import view_config +from pyramid.renderers import null_renderer -@view_config(name='pod_notinit') +@view_config(name='pod_notinit', renderer=null_renderer) def subpackage_notinit(context, request): return 'pod_notinit' diff --git a/pyramid/tests/grokkedapp/subpackage/__init__.py b/pyramid/tests/grokkedapp/subpackage/__init__.py index 3e332913a..9e0ddacbd 100644 --- a/pyramid/tests/grokkedapp/subpackage/__init__.py +++ b/pyramid/tests/grokkedapp/subpackage/__init__.py @@ -1,5 +1,6 @@ from pyramid.view import view_config +from pyramid.renderers import null_renderer -@view_config(name='subpackage_init') +@view_config(name='subpackage_init', renderer=null_renderer) def subpackage_init(context, request): return 'subpackage_init' diff --git a/pyramid/tests/grokkedapp/subpackage/notinit.py b/pyramid/tests/grokkedapp/subpackage/notinit.py index 41f0c5ea8..f7edd0c68 100644 --- a/pyramid/tests/grokkedapp/subpackage/notinit.py +++ b/pyramid/tests/grokkedapp/subpackage/notinit.py @@ -1,5 +1,6 @@ from pyramid.view import view_config +from pyramid.renderers import null_renderer -@view_config(name='subpackage_notinit') +@view_config(name='subpackage_notinit', renderer=null_renderer) def subpackage_notinit(context, request): return 'subpackage_notinit' diff --git a/pyramid/tests/grokkedapp/subpackage/subsubpackage/__init__.py b/pyramid/tests/grokkedapp/subpackage/subsubpackage/__init__.py index ade9644ec..fdda0dffe 100644 --- a/pyramid/tests/grokkedapp/subpackage/subsubpackage/__init__.py +++ b/pyramid/tests/grokkedapp/subpackage/subsubpackage/__init__.py @@ -1,5 +1,6 @@ from pyramid.view import view_config +from pyramid.renderers import null_renderer -@view_config(name='subsubpackage_init') +@view_config(name='subsubpackage_init', renderer=null_renderer) def subpackage_init(context, request): return 'subsubpackage_init' diff --git a/pyramid/tests/test_config.py b/pyramid/tests/test_config.py index ff226617e..88c39f36d 100644 --- a/pyramid/tests/test_config.py +++ b/pyramid/tests/test_config.py @@ -11,7 +11,6 @@ class ConfiguratorTests(unittest.TestCase): def _makeOne(self, *arg, **kw): from pyramid.config import Configurator config = Configurator(*arg, **kw) - config.registry._dont_resolve_responses = True return config def _registerRenderer(self, config, name='.txt'): @@ -364,6 +363,7 @@ class ConfiguratorTests(unittest.TestCase): config.registry.queryAdapter(response, IResponse) is response) def test_setup_registry_explicit_notfound_trumps_iexceptionresponse(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.httpexceptions import HTTPNotFound @@ -373,7 +373,7 @@ class ConfiguratorTests(unittest.TestCase): config.setup_registry() # registers IExceptionResponse default view def myview(context, request): return 'OK' - config.add_view(myview, context=HTTPNotFound) + config.add_view(myview, context=HTTPNotFound, renderer=null_renderer) request = self._makeRequest(config) view = self._getViewCallable(config, ctx_iface=implementedBy(HTTPNotFound), @@ -778,12 +778,14 @@ class ConfiguratorTests(unittest.TestCase): None, True, True) def test_add_view_with_request_type(self): + from pyramid.renderers import null_renderer from zope.interface import directlyProvides from pyramid.interfaces import IRequest view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) config.add_view(view=view, - request_type='pyramid.interfaces.IRequest') + request_type='pyramid.interfaces.IRequest', + renderer=null_renderer) wrapper = self._getViewCallable(config) request = DummyRequest() self._assertNotFound(wrapper, None, request) @@ -809,29 +811,34 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper.__doc__, view.__doc__) def test_add_view_view_callable_dottedname(self): + from pyramid.renderers import null_renderer config = self._makeOne(autocommit=True) - config.add_view(view='pyramid.tests.test_config.dummy_view') + config.add_view(view='pyramid.tests.test_config.dummy_view', + renderer=null_renderer) wrapper = self._getViewCallable(config) self.assertEqual(wrapper(None, None), 'OK') def test_add_view_with_function_callable(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view) + config.add_view(view=view, renderer=null_renderer) wrapper = self._getViewCallable(config) result = wrapper(None, None) self.assertEqual(result, 'OK') def test_add_view_with_function_callable_requestonly(self): + from pyramid.renderers import null_renderer def view(request): return 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view) + config.add_view(view=view, renderer=null_renderer) wrapper = self._getViewCallable(config) result = wrapper(None, None) self.assertEqual(result, 'OK') def test_add_view_with_decorator(self): + from pyramid.renderers import null_renderer def view(request): """ ABC """ return 'OK' @@ -840,7 +847,8 @@ class ConfiguratorTests(unittest.TestCase): return fn(context, request) return inner config = self._makeOne(autocommit=True) - config.add_view(view=view, decorator=view_wrapper) + config.add_view(view=view, decorator=view_wrapper, + renderer=null_renderer) wrapper = self._getViewCallable(config) self.assertFalse(wrapper is view) self.assertEqual(wrapper.__doc__, view.__doc__) @@ -869,30 +877,33 @@ class ConfiguratorTests(unittest.TestCase): assert_similar_datetime(expires, when) def test_add_view_as_instance(self): + from pyramid.renderers import null_renderer class AView: def __call__(self, context, request): """ """ return 'OK' view = AView() config = self._makeOne(autocommit=True) - config.add_view(view=view) + config.add_view(view=view, renderer=null_renderer) wrapper = self._getViewCallable(config) result = wrapper(None, None) self.assertEqual(result, 'OK') def test_add_view_as_instance_requestonly(self): + from pyramid.renderers import null_renderer class AView: def __call__(self, request): """ """ return 'OK' view = AView() config = self._makeOne(autocommit=True) - config.add_view(view=view) + config.add_view(view=view, renderer=null_renderer) wrapper = self._getViewCallable(config) result = wrapper(None, None) self.assertEqual(result, 'OK') def test_add_view_as_oldstyle_class(self): + from pyramid.renderers import null_renderer class view: def __init__(self, context, request): self.context = context @@ -901,7 +912,7 @@ class ConfiguratorTests(unittest.TestCase): def __call__(self): return 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view) + config.add_view(view=view, renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) result = wrapper(None, request) @@ -909,6 +920,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(request.__view__.__class__, view) def test_add_view_as_oldstyle_class_requestonly(self): + from pyramid.renderers import null_renderer class view: def __init__(self, request): self.request = request @@ -916,7 +928,7 @@ class ConfiguratorTests(unittest.TestCase): def __call__(self): return 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view) + config.add_view(view=view, renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) @@ -925,70 +937,79 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(request.__view__.__class__, view) def test_add_view_context_as_class(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy view = lambda *arg: 'OK' class Foo: pass config = self._makeOne(autocommit=True) - config.add_view(context=Foo, view=view) + config.add_view(context=Foo, view=view, renderer=null_renderer) foo = implementedBy(Foo) wrapper = self._getViewCallable(config, foo) self.assertEqual(wrapper, view) def test_add_view_context_as_iface(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(context=IDummy, view=view) + config.add_view(context=IDummy, view=view, renderer=null_renderer) wrapper = self._getViewCallable(config, IDummy) self.assertEqual(wrapper, view) def test_add_view_context_as_dottedname(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) config.add_view(context='pyramid.tests.test_config.IDummy', - view=view) + view=view, renderer=null_renderer) wrapper = self._getViewCallable(config, IDummy) self.assertEqual(wrapper, view) def test_add_view_for__as_dottedname(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) config.add_view(for_='pyramid.tests.test_config.IDummy', - view=view) + view=view, renderer=null_renderer) wrapper = self._getViewCallable(config, IDummy) self.assertEqual(wrapper, view) def test_add_view_for_as_class(self): # ``for_`` is older spelling for ``context`` + from pyramid.renderers import null_renderer from zope.interface import implementedBy view = lambda *arg: 'OK' class Foo: pass config = self._makeOne(autocommit=True) - config.add_view(for_=Foo, view=view) + config.add_view(for_=Foo, view=view, renderer=null_renderer) foo = implementedBy(Foo) wrapper = self._getViewCallable(config, foo) self.assertEqual(wrapper, view) def test_add_view_for_as_iface(self): # ``for_`` is older spelling for ``context`` + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(for_=IDummy, view=view) + config.add_view(for_=IDummy, view=view, renderer=null_renderer) wrapper = self._getViewCallable(config, IDummy) self.assertEqual(wrapper, view) def test_add_view_context_trumps_for(self): # ``for_`` is older spelling for ``context`` + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) class Foo: pass - config.add_view(context=IDummy, for_=Foo, view=view) + config.add_view(context=IDummy, for_=Foo, view=view, + renderer=null_renderer) wrapper = self._getViewCallable(config, IDummy) self.assertEqual(wrapper, view) def test_add_view_register_secured_view(self): + from pyramid.renderers import null_renderer from zope.interface import Interface from pyramid.interfaces import IRequest from pyramid.interfaces import ISecuredView @@ -996,13 +1017,14 @@ class ConfiguratorTests(unittest.TestCase): view = lambda *arg: 'OK' view.__call_permissive__ = view config = self._makeOne(autocommit=True) - config.add_view(view=view) + config.add_view(view=view, renderer=null_renderer) wrapper = config.registry.adapters.lookup( (IViewClassifier, IRequest, Interface), ISecuredView, name='', default=None) self.assertEqual(wrapper, view) def test_add_view_exception_register_secured_view(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.interfaces import IView @@ -1010,13 +1032,14 @@ class ConfiguratorTests(unittest.TestCase): view = lambda *arg: 'OK' view.__call_permissive__ = view config = self._makeOne(autocommit=True) - config.add_view(view=view, context=RuntimeError) + config.add_view(view=view, context=RuntimeError, renderer=null_renderer) wrapper = config.registry.adapters.lookup( (IExceptionViewClassifier, IRequest, implementedBy(RuntimeError)), IView, name='', default=None) self.assertEqual(wrapper, view) def test_add_view_same_phash_overrides_existing_single_view(self): + from pyramid.renderers import null_renderer from hashlib import md5 from zope.interface import Interface from pyramid.interfaces import IRequest @@ -1032,7 +1055,7 @@ class ConfiguratorTests(unittest.TestCase): view, (IViewClassifier, IRequest, Interface), IView, name='') def newview(context, request): return 'OK' - config.add_view(view=newview, xhr=True) + config.add_view(view=newview, xhr=True, renderer=null_renderer) wrapper = self._getViewCallable(config) self.assertFalse(IMultiView.providedBy(wrapper)) request = DummyRequest() @@ -1040,6 +1063,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper(None, request), 'OK') def test_add_view_exc_same_phash_overrides_existing_single_view(self): + from pyramid.renderers import null_renderer from hashlib import md5 from zope.interface import implementedBy from pyramid.interfaces import IRequest @@ -1057,7 +1081,8 @@ class ConfiguratorTests(unittest.TestCase): IView, name='') def newview(context, request): return 'OK' - config.add_view(view=newview, xhr=True, context=RuntimeError) + config.add_view(view=newview, xhr=True, context=RuntimeError, + renderer=null_renderer) wrapper = self._getViewCallable( config, ctx_iface=implementedBy(RuntimeError), exception_view=True) self.assertFalse(IMultiView.providedBy(wrapper)) @@ -1066,6 +1091,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper(None, request), 'OK') def test_add_view_default_phash_overrides_no_phash(self): + from pyramid.renderers import null_renderer from zope.interface import Interface from pyramid.interfaces import IRequest from pyramid.interfaces import IView @@ -1077,7 +1103,7 @@ class ConfiguratorTests(unittest.TestCase): view, (IViewClassifier, IRequest, Interface), IView, name='') def newview(context, request): return 'OK' - config.add_view(view=newview) + config.add_view(view=newview, renderer=null_renderer) wrapper = self._getViewCallable(config) self.assertFalse(IMultiView.providedBy(wrapper)) request = DummyRequest() @@ -1085,6 +1111,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper(None, request), 'OK') def test_add_view_exc_default_phash_overrides_no_phash(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.interfaces import IView @@ -1098,7 +1125,8 @@ class ConfiguratorTests(unittest.TestCase): IView, name='') def newview(context, request): return 'OK' - config.add_view(view=newview, context=RuntimeError) + config.add_view(view=newview, context=RuntimeError, + renderer=null_renderer) wrapper = self._getViewCallable( config, ctx_iface=implementedBy(RuntimeError), exception_view=True) self.assertFalse(IMultiView.providedBy(wrapper)) @@ -1107,6 +1135,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper(None, request), 'OK') def test_add_view_default_phash_overrides_default_phash(self): + from pyramid.renderers import null_renderer from pyramid.config import DEFAULT_PHASH from zope.interface import Interface from pyramid.interfaces import IRequest @@ -1120,7 +1149,7 @@ class ConfiguratorTests(unittest.TestCase): view, (IViewClassifier, IRequest, Interface), IView, name='') def newview(context, request): return 'OK' - config.add_view(view=newview) + config.add_view(view=newview, renderer=null_renderer) wrapper = self._getViewCallable(config) self.assertFalse(IMultiView.providedBy(wrapper)) request = DummyRequest() @@ -1128,6 +1157,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper(None, request), 'OK') def test_add_view_exc_default_phash_overrides_default_phash(self): + from pyramid.renderers import null_renderer from pyramid.config import DEFAULT_PHASH from zope.interface import implementedBy from pyramid.interfaces import IRequest @@ -1143,7 +1173,8 @@ class ConfiguratorTests(unittest.TestCase): IView, name='') def newview(context, request): return 'OK' - config.add_view(view=newview, context=RuntimeError) + config.add_view(view=newview, context=RuntimeError, + renderer=null_renderer) wrapper = self._getViewCallable( config, ctx_iface=implementedBy(RuntimeError), exception_view=True) self.assertFalse(IMultiView.providedBy(wrapper)) @@ -1152,6 +1183,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper(None, request), 'OK') def test_add_view_multiview_replaces_existing_view(self): + from pyramid.renderers import null_renderer from zope.interface import Interface from pyramid.interfaces import IRequest from pyramid.interfaces import IView @@ -1162,12 +1194,13 @@ class ConfiguratorTests(unittest.TestCase): config = self._makeOne(autocommit=True) config.registry.registerAdapter( view, (IViewClassifier, IRequest, Interface), IView, name='') - config.add_view(view=view) + config.add_view(view=view, renderer=null_renderer) wrapper = self._getViewCallable(config) self.assertTrue(IMultiView.providedBy(wrapper)) self.assertEqual(wrapper(None, None), 'OK') def test_add_view_exc_multiview_replaces_existing_view(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.interfaces import IView @@ -1185,13 +1218,15 @@ class ConfiguratorTests(unittest.TestCase): view, (IExceptionViewClassifier, IRequest, implementedBy(RuntimeError)), IView, name='') - config.add_view(view=view, context=RuntimeError) + config.add_view(view=view, context=RuntimeError, + renderer=null_renderer) wrapper = self._getViewCallable( config, ctx_iface=implementedBy(RuntimeError), exception_view=True) self.assertTrue(IMultiView.providedBy(wrapper)) self.assertEqual(wrapper(None, None), 'OK') def test_add_view_multiview_replaces_existing_securedview(self): + from pyramid.renderers import null_renderer from zope.interface import Interface from pyramid.interfaces import IRequest from pyramid.interfaces import ISecuredView @@ -1203,12 +1238,13 @@ class ConfiguratorTests(unittest.TestCase): config.registry.registerAdapter( view, (IViewClassifier, IRequest, Interface), ISecuredView, name='') - config.add_view(view=view) + config.add_view(view=view, renderer=null_renderer) wrapper = self._getViewCallable(config) self.assertTrue(IMultiView.providedBy(wrapper)) self.assertEqual(wrapper(None, None), 'OK') def test_add_view_exc_multiview_replaces_existing_securedview(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.interfaces import ISecuredView @@ -1226,13 +1262,14 @@ class ConfiguratorTests(unittest.TestCase): view, (IExceptionViewClassifier, IRequest, implementedBy(RuntimeError)), ISecuredView, name='') - config.add_view(view=view, context=RuntimeError) + config.add_view(view=view, context=RuntimeError, renderer=null_renderer) wrapper = self._getViewCallable( config, ctx_iface=implementedBy(RuntimeError), exception_view=True) self.assertTrue(IMultiView.providedBy(wrapper)) self.assertEqual(wrapper(None, None), 'OK') def test_add_view_with_accept_multiview_replaces_existing_view(self): + from pyramid.renderers import null_renderer from zope.interface import Interface from pyramid.interfaces import IRequest from pyramid.interfaces import IView @@ -1245,7 +1282,7 @@ class ConfiguratorTests(unittest.TestCase): config = self._makeOne(autocommit=True) config.registry.registerAdapter( view, (IViewClassifier, IRequest, Interface), IView, name='') - config.add_view(view=view2, accept='text/html') + config.add_view(view=view2, accept='text/html', renderer=null_renderer) wrapper = self._getViewCallable(config) self.assertTrue(IMultiView.providedBy(wrapper)) self.assertEqual(len(wrapper.views), 1) @@ -1256,6 +1293,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper(None, request), 'OK2') def test_add_view_exc_with_accept_multiview_replaces_existing_view(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.interfaces import IView @@ -1275,7 +1313,8 @@ class ConfiguratorTests(unittest.TestCase): view, (IExceptionViewClassifier, IRequest, implementedBy(RuntimeError)), IView, name='') - config.add_view(view=view2, accept='text/html', context=RuntimeError) + config.add_view(view=view2, accept='text/html', context=RuntimeError, + renderer=null_renderer) wrapper = self._getViewCallable( config, ctx_iface=implementedBy(RuntimeError), exception_view=True) self.assertTrue(IMultiView.providedBy(wrapper)) @@ -1287,6 +1326,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper(None, request), 'OK2') def test_add_view_multiview_replaces_existing_view_with___accept__(self): + from pyramid.renderers import null_renderer from zope.interface import Interface from pyramid.interfaces import IRequest from pyramid.interfaces import IView @@ -1301,7 +1341,7 @@ class ConfiguratorTests(unittest.TestCase): config = self._makeOne(autocommit=True) config.registry.registerAdapter( view, (IViewClassifier, IRequest, Interface), IView, name='') - config.add_view(view=view2) + config.add_view(view=view2, renderer=null_renderer) wrapper = self._getViewCallable(config) self.assertTrue(IMultiView.providedBy(wrapper)) self.assertEqual(len(wrapper.views), 1) @@ -1312,6 +1352,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper(None, request), 'OK') def test_add_view_exc_mulview_replaces_existing_view_with___accept__(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.interfaces import IView @@ -1333,7 +1374,8 @@ class ConfiguratorTests(unittest.TestCase): view, (IExceptionViewClassifier, IRequest, implementedBy(RuntimeError)), IView, name='') - config.add_view(view=view2, context=RuntimeError) + config.add_view(view=view2, context=RuntimeError, + renderer=null_renderer) wrapper = self._getViewCallable( config, ctx_iface=implementedBy(RuntimeError), exception_view=True) self.assertTrue(IMultiView.providedBy(wrapper)) @@ -1345,6 +1387,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper(None, request), 'OK') def test_add_view_multiview_replaces_multiview(self): + from pyramid.renderers import null_renderer from zope.interface import Interface from pyramid.interfaces import IRequest from pyramid.interfaces import IMultiView @@ -1355,13 +1398,14 @@ class ConfiguratorTests(unittest.TestCase): view, (IViewClassifier, IRequest, Interface), IMultiView, name='') view2 = lambda *arg: 'OK2' - config.add_view(view=view2) + config.add_view(view=view2, renderer=null_renderer) wrapper = self._getViewCallable(config) self.assertTrue(IMultiView.providedBy(wrapper)) self.assertEqual([x[:2] for x in wrapper.views], [(view2, None)]) self.assertEqual(wrapper(None, None), 'OK1') def test_add_view_exc_multiview_replaces_multiview(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.interfaces import IMultiView @@ -1378,7 +1422,8 @@ class ConfiguratorTests(unittest.TestCase): (IExceptionViewClassifier, IRequest, implementedBy(RuntimeError)), IMultiView, name='') view2 = lambda *arg: 'OK2' - config.add_view(view=view2, context=RuntimeError) + config.add_view(view=view2, context=RuntimeError, + renderer=null_renderer) wrapper = self._getViewCallable( config, ctx_iface=implementedBy(RuntimeError), exception_view=True) self.assertTrue(IMultiView.providedBy(wrapper)) @@ -1386,6 +1431,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper(None, None), 'OK1') def test_add_view_multiview_context_superclass_then_subclass(self): + from pyramid.renderers import null_renderer from zope.interface import Interface from pyramid.interfaces import IRequest from pyramid.interfaces import IView @@ -1400,7 +1446,7 @@ class ConfiguratorTests(unittest.TestCase): config = self._makeOne(autocommit=True) config.registry.registerAdapter( view, (IViewClassifier, IRequest, ISuper), IView, name='') - config.add_view(view=view2, for_=ISub) + config.add_view(view=view2, for_=ISub, renderer=null_renderer) wrapper = self._getViewCallable(config, ISuper, IRequest) self.assertFalse(IMultiView.providedBy(wrapper)) self.assertEqual(wrapper(None, None), 'OK') @@ -1409,6 +1455,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper(None, None), 'OK2') def test_add_view_multiview_exception_superclass_then_subclass(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.interfaces import IView @@ -1426,7 +1473,7 @@ class ConfiguratorTests(unittest.TestCase): view, (IViewClassifier, IRequest, Super), IView, name='') config.registry.registerAdapter( view, (IExceptionViewClassifier, IRequest, Super), IView, name='') - config.add_view(view=view2, for_=Sub) + config.add_view(view=view2, for_=Sub, renderer=null_renderer) wrapper = self._getViewCallable( config, implementedBy(Super), IRequest) wrapper_exc_view = self._getViewCallable( @@ -1443,6 +1490,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper_exc_view(None, None), 'OK2') def test_add_view_multiview_call_ordering(self): + from pyramid.renderers import null_renderer as nr from zope.interface import directlyProvides def view1(context, request): return 'view1' def view2(context, request): return 'view2' @@ -1453,15 +1501,18 @@ class ConfiguratorTests(unittest.TestCase): def view7(context, request): return 'view7' def view8(context, request): return 'view8' config = self._makeOne(autocommit=True) - config.add_view(view=view1) - config.add_view(view=view2, request_method='POST') - config.add_view(view=view3,request_param='param') - config.add_view(view=view4, containment=IDummy) - config.add_view(view=view5, request_method='POST',request_param='param') - config.add_view(view=view6, request_method='POST', containment=IDummy) - config.add_view(view=view7, request_param='param', containment=IDummy) + config.add_view(view=view1, renderer=nr) + config.add_view(view=view2, request_method='POST', renderer=nr) + config.add_view(view=view3,request_param='param', renderer=nr) + config.add_view(view=view4, containment=IDummy, renderer=nr) + config.add_view(view=view5, request_method='POST', + request_param='param', renderer=nr) + config.add_view(view=view6, request_method='POST', containment=IDummy, + renderer=nr) + config.add_view(view=view7, request_param='param', containment=IDummy, + renderer=nr) config.add_view(view=view8, request_method='POST',request_param='param', - containment=IDummy) + containment=IDummy, renderer=nr) wrapper = self._getViewCallable(config) @@ -1585,11 +1636,12 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(result.settings, settings) def test_add_view_with_request_type_as_iface(self): + from pyramid.renderers import null_renderer from zope.interface import directlyProvides def view(context, request): return 'OK' config = self._makeOne(autocommit=True) - config.add_view(request_type=IDummy, view=view) + config.add_view(request_type=IDummy, view=view, renderer=null_renderer) wrapper = self._getViewCallable(config, None) request = self._makeRequest(config) directlyProvides(request, IDummy) @@ -1604,10 +1656,11 @@ class ConfiguratorTests(unittest.TestCase): config.add_view, view, '', None, None, object) def test_add_view_with_route_name(self): + from pyramid.renderers import null_renderer from zope.component import ComponentLookupError view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view, route_name='foo') + config.add_view(view=view, route_name='foo', renderer=null_renderer) self.assertEqual(len(config.registry.deferred_route_views), 1) infos = config.registry.deferred_route_views['foo'] self.assertEqual(len(infos), 1) @@ -1647,11 +1700,13 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(info['custom_predicates'], ('123',)) def test_add_view_with_route_name_exception(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from zope.component import ComponentLookupError view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view, route_name='foo', context=RuntimeError) + config.add_view(view=view, route_name='foo', context=RuntimeError, + renderer=null_renderer) self.assertEqual(len(config.registry.deferred_route_views), 1) infos = config.registry.deferred_route_views['foo'] self.assertEqual(len(infos), 1) @@ -1678,9 +1733,11 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper_exc_view(None, None), 'OK') def test_add_view_with_request_method_true(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view, request_method='POST') + config.add_view(view=view, request_method='POST', + renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) request.method = 'POST' @@ -1696,9 +1753,10 @@ class ConfiguratorTests(unittest.TestCase): self._assertNotFound(wrapper, None, request) def test_add_view_with_request_param_noval_true(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view, request_param='abc') + config.add_view(view=view, request_param='abc', renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) request.params = {'abc':''} @@ -1714,9 +1772,11 @@ class ConfiguratorTests(unittest.TestCase): self._assertNotFound(wrapper, None, request) def test_add_view_with_request_param_val_true(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view, request_param='abc=123') + config.add_view(view=view, request_param='abc=123', + renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) request.params = {'abc':'123'} @@ -1732,9 +1792,10 @@ class ConfiguratorTests(unittest.TestCase): self._assertNotFound(wrapper, None, request) def test_add_view_with_xhr_true(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view, xhr=True) + config.add_view(view=view, xhr=True, renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) request.is_xhr = True @@ -1757,9 +1818,10 @@ class ConfiguratorTests(unittest.TestCase): config.add_view, view=view, header='Host:a\\') def test_add_view_with_header_noval_match(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view, header='Host') + config.add_view(view=view, header='Host', renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) request.headers = {'Host':'whatever'} @@ -1775,9 +1837,10 @@ class ConfiguratorTests(unittest.TestCase): self._assertNotFound(wrapper, None, request) def test_add_view_with_header_val_match(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view, header=r'Host:\d') + config.add_view(view=view, header=r'Host:\d', renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) request.headers = {'Host':'1'} @@ -1803,9 +1866,10 @@ class ConfiguratorTests(unittest.TestCase): self.assertRaises(HTTPNotFound, wrapper, None, request) def test_add_view_with_accept_match(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view, accept='text/xml') + config.add_view(view=view, accept='text/xml', renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) request.accept = ['text/xml'] @@ -1821,10 +1885,11 @@ class ConfiguratorTests(unittest.TestCase): self._assertNotFound(wrapper, None, request) def test_add_view_with_containment_true(self): + from pyramid.renderers import null_renderer from zope.interface import directlyProvides view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view, containment=IDummy) + config.add_view(view=view, containment=IDummy, renderer=null_renderer) wrapper = self._getViewCallable(config) context = DummyContext() directlyProvides(context, IDummy) @@ -1839,12 +1904,14 @@ class ConfiguratorTests(unittest.TestCase): self._assertNotFound(wrapper, context, None) def test_add_view_with_containment_dottedname(self): + from pyramid.renderers import null_renderer from zope.interface import directlyProvides view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) config.add_view( view=view, - containment='pyramid.tests.test_config.IDummy') + containment='pyramid.tests.test_config.IDummy', + renderer=null_renderer) wrapper = self._getViewCallable(config) context = DummyContext() directlyProvides(context, IDummy) @@ -1858,9 +1925,10 @@ class ConfiguratorTests(unittest.TestCase): config.add_view, view=view, path_info='\\') def test_add_view_with_path_info_match(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view, path_info='/foo') + config.add_view(view=view, path_info='/foo', renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) request.path_info = '/foo' @@ -1876,6 +1944,7 @@ class ConfiguratorTests(unittest.TestCase): self._assertNotFound(wrapper, None, request) def test_add_view_with_custom_predicates_match(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) def pred1(context, request): @@ -1883,7 +1952,8 @@ class ConfiguratorTests(unittest.TestCase): def pred2(context, request): return True predicates = (pred1, pred2) - config.add_view(view=view, custom_predicates=predicates) + config.add_view(view=view, custom_predicates=predicates, + renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) self.assertEqual(wrapper(None, request), 'OK') @@ -1902,24 +1972,30 @@ class ConfiguratorTests(unittest.TestCase): self._assertNotFound(wrapper, None, request) def test_add_view_custom_predicate_bests_standard_predicate(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' view2 = lambda *arg: 'NOT OK' config = self._makeOne(autocommit=True) def pred1(context, request): return True - config.add_view(view=view, custom_predicates=(pred1,)) - config.add_view(view=view2, request_method='GET') + config.add_view(view=view, custom_predicates=(pred1,), + renderer=null_renderer) + config.add_view(view=view2, request_method='GET', + renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) request.method = 'GET' self.assertEqual(wrapper(None, request), 'OK') def test_add_view_custom_more_preds_first_bests_fewer_preds_last(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' view2 = lambda *arg: 'NOT OK' config = self._makeOne(autocommit=True) - config.add_view(view=view, request_method='GET', xhr=True) - config.add_view(view=view2, request_method='GET') + config.add_view(view=view, request_method='GET', xhr=True, + renderer=null_renderer) + config.add_view(view=view2, request_method='GET', + renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) request.method = 'GET' @@ -1936,6 +2012,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertRaises(ConfigurationConflictError, config.commit) def test_add_view_with_permission(self): + from pyramid.renderers import null_renderer view1 = lambda *arg: 'OK' outerself = self class DummyPolicy(object): @@ -1951,12 +2028,13 @@ class ConfiguratorTests(unittest.TestCase): config = self._makeOne(authorization_policy=policy, authentication_policy=policy, autocommit=True) - config.add_view(view=view1, permission='view') + config.add_view(view=view1, permission='view', renderer=null_renderer) view = self._getViewCallable(config) request = self._makeRequest(config) self.assertEqual(view(None, request), 'OK') def test_add_view_with_default_permission_no_explicit_permission(self): + from pyramid.renderers import null_renderer view1 = lambda *arg: 'OK' outerself = self class DummyPolicy(object): @@ -1973,19 +2051,20 @@ class ConfiguratorTests(unittest.TestCase): authentication_policy=policy, default_permission='view', autocommit=True) - config.add_view(view=view1) + config.add_view(view=view1, renderer=null_renderer) view = self._getViewCallable(config) request = self._makeRequest(config) self.assertEqual(view(None, request), 'OK') def test_add_view_with_no_default_permission_no_explicit_permission(self): + from pyramid.renderers import null_renderer view1 = lambda *arg: 'OK' class DummyPolicy(object): pass # wont be called policy = DummyPolicy() config = self._makeOne(authorization_policy=policy, authentication_policy=policy, autocommit=True) - config.add_view(view=view1) + config.add_view(view=view1, renderer=null_renderer) view = self._getViewCallable(config) request = self._makeRequest(config) self.assertEqual(view(None, request), 'OK') @@ -2185,17 +2264,19 @@ class ConfiguratorTests(unittest.TestCase): raise AssertionError def test_derive_view_function(self): + from pyramid.renderers import null_renderer def view(request): return 'OK' config = self._makeOne() - result = config.derive_view(view) + result = config.derive_view(view, renderer=null_renderer) self.assertFalse(result is view) self.assertEqual(result(None, None), 'OK') def test_derive_view_dottedname(self): + from pyramid.renderers import null_renderer config = self._makeOne() result = config.derive_view( - 'pyramid.tests.test_config.dummy_view') + 'pyramid.tests.test_config.dummy_view', renderer=null_renderer) self.assertFalse(result is dummy_view) self.assertEqual(result(None, None), 'OK') @@ -2288,18 +2369,21 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(config._ctx.info, 'abc') def test_add_static_here_no_utility_registered(self): + from pyramid.renderers import null_renderer from zope.interface import Interface from pyramid.static import PackageURLParser from pyramid.interfaces import IView from pyramid.interfaces import IViewClassifier config = self._makeOne(autocommit=True) - config.add_static_view('static', 'fixtures/static') + config.add_static_view('static', 'fixtures/static', + renderer=null_renderer) request_type = self._getRouteRequestIface(config, 'static/') self._assertRoute(config, 'static/', 'static/*subpath') wrapped = config.registry.adapters.lookup( (IViewClassifier, request_type, Interface), IView, name='') request = self._makeRequest(config) - self.assertEqual(wrapped(None, request).__class__, PackageURLParser) + result = wrapped(None, request) + self.assertEqual(result.__class__, PackageURLParser) def test_add_static_view_package_relative(self): from pyramid.interfaces import IStaticURLInfo @@ -2332,12 +2416,13 @@ class ConfiguratorTests(unittest.TestCase): [('static', static_path, {})]) def test_set_notfound_view(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.httpexceptions import HTTPNotFound config = self._makeOne(autocommit=True) view = lambda *arg: arg - config.set_notfound_view(view) + config.set_notfound_view(view, renderer=null_renderer) request = self._makeRequest(config) view = self._getViewCallable(config, ctx_iface=implementedBy(HTTPNotFound), @@ -2346,12 +2431,13 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(result, (None, request)) def test_set_notfound_view_request_has_context(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.httpexceptions import HTTPNotFound config = self._makeOne(autocommit=True) view = lambda *arg: arg - config.set_notfound_view(view) + config.set_notfound_view(view, renderer=null_renderer) request = self._makeRequest(config) request.context = 'abc' view = self._getViewCallable(config, @@ -2381,12 +2467,13 @@ class ConfiguratorTests(unittest.TestCase): self.assertTrue('div' in result.body) def test_set_forbidden_view(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.httpexceptions import HTTPForbidden config = self._makeOne(autocommit=True) view = lambda *arg: 'OK' - config.set_forbidden_view(view) + config.set_forbidden_view(view, renderer=null_renderer) request = self._makeRequest(config) view = self._getViewCallable(config, ctx_iface=implementedBy(HTTPForbidden), @@ -2395,12 +2482,13 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(result, 'OK') def test_set_forbidden_view_request_has_context(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.httpexceptions import HTTPForbidden config = self._makeOne(autocommit=True) view = lambda *arg: arg - config.set_forbidden_view(view) + config.set_forbidden_view(view, renderer=null_renderer) request = self._makeRequest(config) request.context = 'abc' view = self._getViewCallable(config, @@ -3125,13 +3213,14 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(registeredview.__name__, 'view3') def test_autocommit_no_conflicts(self): + from pyramid.renderers import null_renderer config = self._makeOne(autocommit=True) def view1(request): pass def view2(request): pass def view3(request): pass - config.add_view(view1) - config.add_view(view2) - config.add_view(view3) + config.add_view(view1, renderer=null_renderer) + config.add_view(view2, renderer=null_renderer) + config.add_view(view3, renderer=null_renderer) config.commit() registeredview = self._getViewCallable(config) self.assertEqual(registeredview.__name__, 'view3') @@ -3287,18 +3376,21 @@ class TestConfiguratorDeprecatedFeatures(unittest.TestCase): yield confinst[2] def test_add_route_with_view(self): + from pyramid.renderers import null_renderer config = self._makeOne(autocommit=True) view = lambda *arg: 'OK' - config.add_route('name', 'path', view=view) + config.add_route('name', 'path', view=view, view_renderer=null_renderer) request_type = self._getRouteRequestIface(config, 'name') wrapper = self._getViewCallable(config, None, request_type) self.assertEqual(wrapper(None, None), 'OK') self._assertRoute(config, 'name', 'path') def test_add_route_with_view_context(self): + from pyramid.renderers import null_renderer config = self._makeOne(autocommit=True) view = lambda *arg: 'OK' - config.add_route('name', 'path', view=view, view_context=IDummy) + config.add_route('name', 'path', view=view, view_context=IDummy, + view_renderer=null_renderer) request_type = self._getRouteRequestIface(config, 'name') wrapper = self._getViewCallable(config, IDummy, request_type) self.assertEqual(wrapper(None, None), 'OK') @@ -3307,10 +3399,12 @@ class TestConfiguratorDeprecatedFeatures(unittest.TestCase): self.assertEqual(wrapper, None) def test_add_route_with_view_exception(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy config = self._makeOne(autocommit=True) view = lambda *arg: 'OK' - config.add_route('name', 'path', view=view, view_context=RuntimeError) + config.add_route('name', 'path', view=view, view_context=RuntimeError, + view_renderer=null_renderer) request_type = self._getRouteRequestIface(config, 'name') wrapper = self._getViewCallable( config, ctx_iface=implementedBy(RuntimeError), @@ -3323,9 +3417,11 @@ class TestConfiguratorDeprecatedFeatures(unittest.TestCase): self.assertEqual(wrapper, None) def test_add_route_with_view_for(self): + from pyramid.renderers import null_renderer config = self._makeOne(autocommit=True) view = lambda *arg: 'OK' - config.add_route('name', 'path', view=view, view_for=IDummy) + config.add_route('name', 'path', view=view, view_for=IDummy, + view_renderer=null_renderer) request_type = self._getRouteRequestIface(config, 'name') wrapper = self._getViewCallable(config, IDummy, request_type) self.assertEqual(wrapper(None, None), 'OK') @@ -3334,9 +3430,11 @@ class TestConfiguratorDeprecatedFeatures(unittest.TestCase): self.assertEqual(wrapper, None) def test_add_route_with_for_(self): + from pyramid.renderers import null_renderer config = self._makeOne(autocommit=True) view = lambda *arg: 'OK' - config.add_route('name', 'path', view=view, for_=IDummy) + config.add_route('name', 'path', view=view, for_=IDummy, + view_renderer=null_renderer) request_type = self._getRouteRequestIface(config, 'name') wrapper = self._getViewCallable(config, IDummy, request_type) self.assertEqual(wrapper(None, None), 'OK') @@ -3356,6 +3454,7 @@ class TestConfiguratorDeprecatedFeatures(unittest.TestCase): self.assertEqual(wrapper(None, None).body, 'Hello!') def test_add_route_with_view_attr(self): + from pyramid.renderers import null_renderer config = self._makeOne(autocommit=True) self._registerRenderer(config) class View(object): @@ -3363,7 +3462,8 @@ class TestConfiguratorDeprecatedFeatures(unittest.TestCase): pass def alt(self): return 'OK' - config.add_route('name', 'path', view=View, view_attr='alt') + config.add_route('name', 'path', view=View, view_attr='alt', + view_renderer=null_renderer) request_type = self._getRouteRequestIface(config, 'name') wrapper = self._getViewCallable(config, None, request_type) self._assertRoute(config, 'name', 'path') diff --git a/pyramid/tests/test_renderers.py b/pyramid/tests/test_renderers.py index c847c70e2..cc36d69bf 100644 --- a/pyramid/tests/test_renderers.py +++ b/pyramid/tests/test_renderers.py @@ -708,6 +708,39 @@ class TestRendererHelper(unittest.TestCase): self.assertEqual(cloned_helper.registry, 'registry2') self.assertFalse(helper is cloned_helper) +class TestNullRendererHelper(unittest.TestCase): + def setUp(self): + self.config = cleanUp() + + def tearDown(self): + cleanUp() + + def _makeOne(self, *arg, **kw): + from pyramid.renderers import NullRendererHelper + return NullRendererHelper(*arg, **kw) + + def test_instance_conforms(self): + from zope.interface.verify import verifyObject + from pyramid.interfaces import IRendererInfo + helper = self._makeOne() + verifyObject(IRendererInfo, helper) + + def test_render_view(self): + helper = self._makeOne() + self.assertEqual(helper.render_view(None, True, None, None), True) + + def test_render(self): + helper = self._makeOne() + self.assertEqual(helper.render(True, None, None), True) + + def test_render_to_response(self): + helper = self._makeOne() + self.assertEqual(helper.render_to_response(True, None, None), True) + + def test_clone(self): + helper = self._makeOne() + self.assertTrue(helper.clone() is helper) + class Test_render(unittest.TestCase): def setUp(self): self.config = testing.setUp() |
