diff options
| -rw-r--r-- | pyramid/config.py | 98 | ||||
| -rw-r--r-- | pyramid/router.py | 11 | ||||
| -rw-r--r-- | pyramid/tests/restbugapp/views.py | 2 | ||||
| -rw-r--r-- | pyramid/tests/test_config.py | 222 | ||||
| -rw-r--r-- | pyramid/tests/test_integration.py | 2 | ||||
| -rw-r--r-- | pyramid/tests/test_router.py | 21 | ||||
| -rw-r--r-- | pyramid/tests/test_view.py | 13 | ||||
| -rw-r--r-- | pyramid/view.py | 6 |
8 files changed, 204 insertions, 171 deletions
diff --git a/pyramid/config.py b/pyramid/config.py index dbc68a190..c4f75c39d 100644 --- a/pyramid/config.py +++ b/pyramid/config.py @@ -2882,54 +2882,42 @@ class MultiView(object): continue raise PredicateMismatch(self.name) -def wraps_view(wrapped): +def wraps_view(wrapper): def inner(self, view): - wrapped_view = wrapped(self, view) - return preserve_view_attrs(view, wrapped_view) + wrapper_view = wrapper(self, view) + return preserve_view_attrs(view, wrapper_view) return inner -def preserve_view_attrs(view, wrapped_view): - if wrapped_view is view: +def preserve_view_attrs(view, wrapper): + if wrapper is view: return view + original_view = getattr(view, '__original_view__', None) + if original_view is None: original_view = view - wrapped_view.__original_view__ = original_view - wrapped_view.__module__ = view.__module__ - wrapped_view.__doc__ = view.__doc__ - try: - wrapped_view.__name__ = view.__name__ - except AttributeError: - wrapped_view.__name__ = repr(view) - try: - wrapped_view.__permitted__ = view.__permitted__ - except AttributeError: - pass - try: - wrapped_view.__call_permissive__ = view.__call_permissive__ - except AttributeError: - pass - try: - wrapped_view.__permission__ = view.__permission__ - except AttributeError: - pass - try: - wrapped_view.__predicated__ = view.__predicated__ - except AttributeError: - pass - try: - wrapped_view.__predicates__ = view.__predicates__ - except AttributeError: - pass - try: - wrapped_view.__accept__ = view.__accept__ - except AttributeError: - pass + + wrapper.__wraps__ = view + wrapper.__original_view__ = original_view + wrapper.__module__ = view.__module__ + wrapper.__doc__ = view.__doc__ + try: - wrapped_view.__order__ = view.__order__ + wrapper.__name__ = view.__name__ except AttributeError: - pass - return wrapped_view + wrapper.__name__ = repr(view) + + # attrs that may not exist on "view", but, if so, must be attached to + # "wrapped view" + for attr in ('__permitted__', '__call_permissive__', '__permission__', + '__predicated__', '__predicates__', '__accept__', + '__order__'): + try: + setattr(wrapper, attr, getattr(view, attr)) + except AttributeError: + pass + + return wrapper class ViewDeriver(object): def __init__(self, **kw): @@ -2947,8 +2935,27 @@ class ViewDeriver(object): self.owrapped_view( self.decorated_view( self.http_cached_view( - self.rendered_view( - self.mapped_view(view))))))))) + self.response_resolved_view( + self.rendered_view( + self.mapped_view(view)))))))))) + + @wraps_view + 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) + if response is None: + raise ValueError( + 'Could not convert view return value "%s" into a ' + 'response object' % (result,)) + return response + + return viewresult_to_response @wraps_view def mapped_view(self, view): @@ -2986,11 +2993,12 @@ class ViewDeriver(object): @wraps_view def http_cached_view(self, view): seconds = self.kw.get('http_cache') - options = {} if seconds is None: return view + options = {} + if isinstance(seconds, (tuple, list)): try: seconds, options = seconds @@ -3001,9 +3009,7 @@ class ViewDeriver(object): def wrapper(context, request): response = view(context, request) - cache_expires = getattr(response, 'cache_expires', None) - if cache_expires is not None: - cache_expires(seconds, **options) + response.cache_expires(seconds, **options) return response return wrapper @@ -3126,6 +3132,8 @@ class ViewDeriver(object): renderer = static_renderer result = wrapped_view(context, request) registry = self.kw['registry'] + # this must adapt, it can't do a simple interface check + # (webob responses) response = registry.queryAdapterOrSelf(result, IResponse) if response is None: attrs = getattr(request, '__dict__', {}) diff --git a/pyramid/router.py b/pyramid/router.py index 458237a8c..d011b1245 100644 --- a/pyramid/router.py +++ b/pyramid/router.py @@ -159,7 +159,7 @@ class Router(object): msg = request.path_info raise HTTPNotFound(msg) else: - result = view_callable(context, request) + response = view_callable(context, request) # handle exceptions raised during root finding and view-exec except Exception, why: @@ -173,14 +173,7 @@ class Router(object): if view_callable is None: raise - result = view_callable(why, request) - - # process the response - response = registry.queryAdapterOrSelf(result, IResponse) - if response is None: - raise ValueError( - 'Could not convert view return value "%s" into a ' - 'response object' % (result,)) + response = view_callable(why, request) has_listeners and notify(NewResponse(request, response)) diff --git a/pyramid/tests/restbugapp/views.py b/pyramid/tests/restbugapp/views.py index b94851099..2ace59fa9 100644 --- a/pyramid/tests/restbugapp/views.py +++ b/pyramid/tests/restbugapp/views.py @@ -1,4 +1,4 @@ -from webob import Response +from pyramid.response import Response class BaseRESTView(object): def __init__(self, context, request): diff --git a/pyramid/tests/test_config.py b/pyramid/tests/test_config.py index 45b5b25f1..ad5e5a89a 100644 --- a/pyramid/tests/test_config.py +++ b/pyramid/tests/test_config.py @@ -10,7 +10,9 @@ except: class ConfiguratorTests(unittest.TestCase): def _makeOne(self, *arg, **kw): from pyramid.config import Configurator - return Configurator(*arg, **kw) + config = Configurator(*arg, **kw) + config.registry._dont_resolve_responses = True + return config def _registerRenderer(self, config, name='.txt'): from pyramid.interfaces import IRendererFactory @@ -211,7 +213,7 @@ class ConfiguratorTests(unittest.TestCase): view = self._getViewCallable(config, ctx_iface=IExceptionResponse, request_iface=IRequest) - self.assertTrue(view is default_exceptionresponse_view) + self.assertTrue(view.__wraps__ is default_exceptionresponse_view) def test_ctor_exceptionresponse_view_None(self): from pyramid.interfaces import IExceptionResponse @@ -230,7 +232,7 @@ class ConfiguratorTests(unittest.TestCase): view = self._getViewCallable(config, ctx_iface=IExceptionResponse, request_iface=IRequest) - self.assertTrue(view is exceptionresponse_view) + self.assertTrue(view.__wraps__ is exceptionresponse_view) def test_with_package_module(self): from pyramid.tests import test_configuration @@ -3195,8 +3197,10 @@ class TestConfiguratorDeprecatedFeatures(unittest.TestCase): def _makeOne(self, *arg, **kw): from pyramid.config import Configurator - return Configurator(*arg, **kw) - + config = Configurator(*arg, **kw) + config.registry._dont_resolve_responses = True + return config + def _getRouteRequestIface(self, config, name): from pyramid.interfaces import IRouteRequest iface = config.registry.getUtility(IRouteRequest, name) @@ -3503,29 +3507,31 @@ class TestViewDeriver(unittest.TestCase): self.config.registry.registerUtility(policy, IAuthorizationPolicy) def test_requestonly_function(self): + response = DummyResponse() def view(request): - return 'OK' + return response deriver = self._makeOne() result = deriver(view) self.assertFalse(result is view) - self.assertEqual(result(None, None), 'OK') + self.assertEqual(result(None, None), response) def test_requestonly_function_with_renderer(self): + response = DummyResponse() class moo(object): def render_view(inself, req, resp, view_inst, ctx): self.assertEqual(req, request) self.assertEqual(resp, 'OK') self.assertEqual(view_inst, view) self.assertEqual(ctx, context) - return 'moo' + return response def view(request): return 'OK' deriver = self._makeOne(renderer=moo()) result = deriver(view) - self.assertFalse(result is view) + self.assertFalse(result.__wraps__ is view) request = self._makeRequest() context = testing.DummyResource() - self.assertEqual(result(context, request), 'moo') + self.assertEqual(result(context, request), response) def test_requestonly_function_with_renderer_request_override(self): def moo(info): @@ -3547,46 +3553,50 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(result(context, request).body, 'moo') def test_requestonly_function_with_renderer_request_has_view(self): + response = DummyResponse() class moo(object): def render_view(inself, req, resp, view_inst, ctx): self.assertEqual(req, request) self.assertEqual(resp, 'OK') self.assertEqual(view_inst, 'view') self.assertEqual(ctx, context) - return 'moo' + return response def view(request): return 'OK' deriver = self._makeOne(renderer=moo()) result = deriver(view) - self.assertFalse(result is view) + self.assertFalse(result.__wraps__ is view) request = self._makeRequest() request.__view__ = 'view' context = testing.DummyResource() - self.assertEqual(result(context, request), 'moo') + r = result(context, request) + self.assertEqual(r, response) self.assertFalse(hasattr(request, '__view__')) def test_class_without_attr(self): + response = DummyResponse() class View(object): def __init__(self, request): pass def __call__(self): - return 'OK' + return response deriver = self._makeOne() result = deriver(View) request = self._makeRequest() - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) self.assertEqual(request.__view__.__class__, View) def test_class_with_attr(self): + response = DummyResponse() class View(object): def __init__(self, request): pass def another(self): - return 'OK' + return response deriver = self._makeOne(attr='another') result = deriver(View) request = self._makeRequest() - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) self.assertEqual(request.__view__.__class__, View) def test_as_function_context_and_request(self): @@ -3594,13 +3604,14 @@ class TestViewDeriver(unittest.TestCase): return 'OK' deriver = self._makeOne() result = deriver(view) - self.assertTrue(result is view) + self.assertTrue(result.__wraps__ is view) self.assertFalse(hasattr(result, '__call_permissive__')) self.assertEqual(view(None, None), 'OK') def test_as_function_requestonly(self): + response = DummyResponse() def view(request): - return 'OK' + return response deriver = self._makeOne() result = deriver(view) self.assertFalse(result is view) @@ -3608,14 +3619,15 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(view.__doc__, result.__doc__) self.assertEqual(view.__name__, result.__name__) self.assertFalse(hasattr(result, '__call_permissive__')) - self.assertEqual(result(None, None), 'OK') + self.assertEqual(result(None, None), response) def test_as_newstyle_class_context_and_request(self): + response = DummyResponse() class view(object): def __init__(self, context, request): pass def __call__(self): - return 'OK' + return response deriver = self._makeOne() result = deriver(view) self.assertFalse(result is view) @@ -3624,15 +3636,16 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(view.__name__, result.__name__) self.assertFalse(hasattr(result, '__call_permissive__')) request = self._makeRequest() - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) self.assertEqual(request.__view__.__class__, view) def test_as_newstyle_class_requestonly(self): + response = DummyResponse() class view(object): def __init__(self, context, request): pass def __call__(self): - return 'OK' + return response deriver = self._makeOne() result = deriver(view) self.assertFalse(result is view) @@ -3641,15 +3654,16 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(view.__name__, result.__name__) self.assertFalse(hasattr(result, '__call_permissive__')) request = self._makeRequest() - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) self.assertEqual(request.__view__.__class__, view) def test_as_oldstyle_class_context_and_request(self): + response = DummyResponse() class view: def __init__(self, context, request): pass def __call__(self): - return 'OK' + return response deriver = self._makeOne() result = deriver(view) self.assertFalse(result is view) @@ -3658,15 +3672,16 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(view.__name__, result.__name__) self.assertFalse(hasattr(result, '__call_permissive__')) request = self._makeRequest() - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) self.assertEqual(request.__view__.__class__, view) def test_as_oldstyle_class_requestonly(self): + response = DummyResponse() class view: def __init__(self, context, request): pass def __call__(self): - return 'OK' + return response deriver = self._makeOne() result = deriver(view) self.assertFalse(result is view) @@ -3675,24 +3690,26 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(view.__name__, result.__name__) self.assertFalse(hasattr(result, '__call_permissive__')) request = self._makeRequest() - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) self.assertEqual(request.__view__.__class__, view) def test_as_instance_context_and_request(self): + response = DummyResponse() class View: def __call__(self, context, request): - return 'OK' + return response view = View() deriver = self._makeOne() result = deriver(view) - self.assertTrue(result is view) + self.assertTrue(result.__wraps__ is view) self.assertFalse(hasattr(result, '__call_permissive__')) - self.assertEqual(result(None, None), 'OK') + self.assertEqual(result(None, None), response) def test_as_instance_requestonly(self): + response = DummyResponse() class View: def __call__(self, request): - return 'OK' + return response view = View() deriver = self._makeOne() result = deriver(view) @@ -3701,10 +3718,11 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(view.__doc__, result.__doc__) self.assertTrue('instance' in result.__name__) self.assertFalse(hasattr(result, '__call_permissive__')) - self.assertEqual(result(None, None), 'OK') + self.assertEqual(result(None, None), response) def test_with_debug_authorization_no_authpol(self): - view = lambda *arg: 'OK' + response = DummyResponse() + view = lambda *arg: response self.config.registry.settings = dict( debug_authorization=True, reload_templates=True) logger = self._registerLogger() @@ -3717,7 +3735,7 @@ class TestViewDeriver(unittest.TestCase): request = self._makeRequest() request.view_name = 'view_name' request.url = 'url' - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) self.assertEqual(len(logger.messages), 1) self.assertEqual(logger.messages[0], "debug_authorization of url url (view name " @@ -3725,7 +3743,8 @@ class TestViewDeriver(unittest.TestCase): "(no authorization policy in use)") def test_with_debug_authorization_authn_policy_no_authz_policy(self): - view = lambda *arg: 'OK' + response = DummyResponse() + view = lambda *arg: response self.config.registry.settings = dict(debug_authorization=True) from pyramid.interfaces import IAuthenticationPolicy policy = DummySecurityPolicy(False) @@ -3740,7 +3759,7 @@ class TestViewDeriver(unittest.TestCase): request = self._makeRequest() request.view_name = 'view_name' request.url = 'url' - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) self.assertEqual(len(logger.messages), 1) self.assertEqual(logger.messages[0], "debug_authorization of url url (view name " @@ -3748,7 +3767,8 @@ class TestViewDeriver(unittest.TestCase): "(no authorization policy in use)") def test_with_debug_authorization_authz_policy_no_authn_policy(self): - view = lambda *arg: 'OK' + response = DummyResponse() + view = lambda *arg: response self.config.registry.settings = dict(debug_authorization=True) from pyramid.interfaces import IAuthorizationPolicy policy = DummySecurityPolicy(False) @@ -3763,7 +3783,7 @@ class TestViewDeriver(unittest.TestCase): request = self._makeRequest() request.view_name = 'view_name' request.url = 'url' - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) self.assertEqual(len(logger.messages), 1) self.assertEqual(logger.messages[0], "debug_authorization of url url (view name " @@ -3771,7 +3791,8 @@ class TestViewDeriver(unittest.TestCase): "(no authorization policy in use)") def test_with_debug_authorization_no_permission(self): - view = lambda *arg: 'OK' + response = DummyResponse() + view = lambda *arg: response self.config.registry.settings = dict( debug_authorization=True, reload_templates=True) self._registerSecurityPolicy(True) @@ -3785,7 +3806,7 @@ class TestViewDeriver(unittest.TestCase): request = self._makeRequest() request.view_name = 'view_name' request.url = 'url' - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) self.assertEqual(len(logger.messages), 1) self.assertEqual(logger.messages[0], "debug_authorization of url url (view name " @@ -3793,7 +3814,8 @@ class TestViewDeriver(unittest.TestCase): "no permission registered)") def test_debug_auth_permission_authpol_permitted(self): - view = lambda *arg: 'OK' + response = DummyResponse() + view = lambda *arg: response self.config.registry.settings = dict( debug_authorization=True, reload_templates=True) logger = self._registerLogger() @@ -3803,18 +3825,19 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(view.__module__, result.__module__) self.assertEqual(view.__doc__, result.__doc__) self.assertEqual(view.__name__, result.__name__) - self.assertEqual(result.__call_permissive__, view) + self.assertEqual(result.__call_permissive__.__wraps__, view) request = self._makeRequest() request.view_name = 'view_name' request.url = 'url' - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) self.assertEqual(len(logger.messages), 1) self.assertEqual(logger.messages[0], "debug_authorization of url url (view name " "'view_name' against context None): True") def test_debug_auth_permission_authpol_permitted_no_request(self): - view = lambda *arg: 'OK' + response = DummyResponse() + view = lambda *arg: response self.config.registry.settings = dict( debug_authorization=True, reload_templates=True) logger = self._registerLogger() @@ -3824,8 +3847,8 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(view.__module__, result.__module__) self.assertEqual(view.__doc__, result.__doc__) self.assertEqual(view.__name__, result.__name__) - self.assertEqual(result.__call_permissive__, view) - self.assertEqual(result(None, None), 'OK') + self.assertEqual(result.__call_permissive__.__wraps__, view) + self.assertEqual(result(None, None), response) self.assertEqual(len(logger.messages), 1) self.assertEqual(logger.messages[0], "debug_authorization of url None (view name " @@ -3833,7 +3856,8 @@ class TestViewDeriver(unittest.TestCase): def test_debug_auth_permission_authpol_denied(self): from pyramid.httpexceptions import HTTPForbidden - view = lambda *arg: 'OK' + response = DummyResponse() + view = lambda *arg: response self.config.registry.settings = dict( debug_authorization=True, reload_templates=True) logger = self._registerLogger() @@ -3843,7 +3867,7 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(view.__module__, result.__module__) self.assertEqual(view.__doc__, result.__doc__) self.assertEqual(view.__name__, result.__name__) - self.assertEqual(result.__call_permissive__, view) + self.assertEqual(result.__call_permissive__.__wraps__, view) request = self._makeRequest() request.view_name = 'view_name' request.url = 'url' @@ -3871,7 +3895,8 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(permitted, False) def test_debug_auth_permission_authpol_overridden(self): - view = lambda *arg: 'OK' + response = DummyResponse() + view = lambda *arg: response self.config.registry.settings = dict( debug_authorization=True, reload_templates=True) logger = self._registerLogger() @@ -3885,14 +3910,15 @@ class TestViewDeriver(unittest.TestCase): request = self._makeRequest() request.view_name = 'view_name' request.url = 'url' - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) self.assertEqual(len(logger.messages), 1) self.assertEqual(logger.messages[0], "debug_authorization of url url (view name " "'view_name' against context None): False") def test_secured_view_authn_policy_no_authz_policy(self): - view = lambda *arg: 'OK' + response = DummyResponse() + view = lambda *arg: response self.config.registry.settings = {} from pyramid.interfaces import IAuthenticationPolicy policy = DummySecurityPolicy(False) @@ -3906,10 +3932,11 @@ class TestViewDeriver(unittest.TestCase): request = self._makeRequest() request.view_name = 'view_name' request.url = 'url' - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) def test_secured_view_authz_policy_no_authn_policy(self): - view = lambda *arg: 'OK' + response = DummyResponse() + view = lambda *arg: response self.config.registry.settings = {} from pyramid.interfaces import IAuthorizationPolicy policy = DummySecurityPolicy(False) @@ -3923,10 +3950,11 @@ class TestViewDeriver(unittest.TestCase): request = self._makeRequest() request.view_name = 'view_name' request.url = 'url' - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) def test_with_predicates_all(self): - view = lambda *arg: 'OK' + response = DummyResponse() + view = lambda *arg: response predicates = [] def predicate1(context, request): predicates.append(True) @@ -3939,7 +3967,7 @@ class TestViewDeriver(unittest.TestCase): request = self._makeRequest() request.method = 'POST' next = result(None, None) - self.assertEqual(next, 'OK') + self.assertEqual(next, response) self.assertEqual(predicates, [True, True]) def test_with_predicates_checker(self): @@ -3977,7 +4005,7 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(predicates, [True, True]) def test_with_wrapper_viewname(self): - from webob import Response + from pyramid.response import Response from pyramid.interfaces import IView from pyramid.interfaces import IViewClassifier inner_response = Response('OK') @@ -3986,7 +4014,8 @@ class TestViewDeriver(unittest.TestCase): def outer_view(context, request): self.assertEqual(request.wrapped_response, inner_response) self.assertEqual(request.wrapped_body, inner_response.body) - self.assertEqual(request.wrapped_view, inner_view) + self.assertEqual(request.wrapped_view.__original_view__, + inner_view) return Response('outer ' + request.wrapped_body) self.config.registry.registerAdapter( outer_view, (IViewClassifier, None, None), IView, 'owrap') @@ -4001,7 +4030,7 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(response.body, 'outer OK') def test_with_wrapper_viewname_notfound(self): - from webob import Response + from pyramid.response import Response inner_response = Response('OK') def inner_view(context, request): return inner_response @@ -4011,13 +4040,14 @@ class TestViewDeriver(unittest.TestCase): self.assertRaises(ValueError, wrapped, None, request) def test_as_newstyle_class_context_and_request_attr_and_renderer(self): + response = DummyResponse() class renderer(object): def render_view(inself, req, resp, view_inst, ctx): self.assertEqual(req, request) self.assertEqual(resp, {'a':'1'}) self.assertEqual(view_inst.__class__, View) self.assertEqual(ctx, context) - return resp + return response class View(object): def __init__(self, context, request): pass @@ -4031,16 +4061,17 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(result.__name__, View.__name__) request = self._makeRequest() context = testing.DummyResource() - self.assertEqual(result(context, request), {'a':'1'}) + self.assertEqual(result(context, request), response) def test_as_newstyle_class_requestonly_attr_and_renderer(self): + response = DummyResponse() class renderer(object): def render_view(inself, req, resp, view_inst, ctx): self.assertEqual(req, request) self.assertEqual(resp, {'a':'1'}) self.assertEqual(view_inst.__class__, View) self.assertEqual(ctx, context) - return resp + return response class View(object): def __init__(self, request): pass @@ -4054,16 +4085,17 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(result.__name__, View.__name__) request = self._makeRequest() context = testing.DummyResource() - self.assertEqual(result(context, request), {'a':'1'}) + self.assertEqual(result(context, request), response) def test_as_oldstyle_cls_context_request_attr_and_renderer(self): + response = DummyResponse() class renderer(object): def render_view(inself, req, resp, view_inst, ctx): self.assertEqual(req, request) self.assertEqual(resp, {'a':'1'}) self.assertEqual(view_inst.__class__, View) self.assertEqual(ctx, context) - return resp + return response class View: def __init__(self, context, request): pass @@ -4077,16 +4109,17 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(result.__name__, View.__name__) request = self._makeRequest() context = testing.DummyResource() - self.assertEqual(result(context, request), {'a':'1'}) + self.assertEqual(result(context, request), response) def test_as_oldstyle_cls_requestonly_attr_and_renderer(self): + response = DummyResponse() class renderer(object): def render_view(inself, req, resp, view_inst, ctx): self.assertEqual(req, request) self.assertEqual(resp, {'a':'1'}) self.assertEqual(view_inst.__class__, View) self.assertEqual(ctx, context) - return resp + return response class View: def __init__(self, request): pass @@ -4100,16 +4133,17 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(result.__name__, View.__name__) request = self._makeRequest() context = testing.DummyResource() - self.assertEqual(result(context, request), {'a':'1'}) + self.assertEqual(result(context, request), response) def test_as_instance_context_and_request_attr_and_renderer(self): + response = DummyResponse() class renderer(object): def render_view(inself, req, resp, view_inst, ctx): self.assertEqual(req, request) self.assertEqual(resp, {'a':'1'}) self.assertEqual(view_inst, view) self.assertEqual(ctx, context) - return resp + return response class View: def index(self, context, request): return {'a':'1'} @@ -4121,16 +4155,17 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(result.__doc__, view.__doc__) request = self._makeRequest() context = testing.DummyResource() - self.assertEqual(result(context, request), {'a':'1'}) + self.assertEqual(result(context, request), response) def test_as_instance_requestonly_attr_and_renderer(self): + response = DummyResponse() class renderer(object): def render_view(inself, req, resp, view_inst, ctx): self.assertEqual(req, request) self.assertEqual(resp, {'a':'1'}) self.assertEqual(view_inst, view) self.assertEqual(ctx, context) - return resp + return response class View: def index(self, request): return {'a':'1'} @@ -4142,58 +4177,63 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(result.__doc__, view.__doc__) request = self._makeRequest() context = testing.DummyResource() - self.assertEqual(result(context, request), {'a':'1'}) + self.assertEqual(result(context, request), response) def test_with_view_mapper_config_specified(self): + response = DummyResponse() class mapper(object): def __init__(self, **kw): self.kw = kw def __call__(self, view): def wrapped(context, request): - return 'OK' + return response return wrapped def view(context, request): return 'NOTOK' deriver = self._makeOne(mapper=mapper) result = deriver(view) - self.assertFalse(result is view) - self.assertEqual(result(None, None), 'OK') + self.assertFalse(result.__wraps__ is view) + self.assertEqual(result(None, None), response) def test_with_view_mapper_view_specified(self): + from pyramid.response import Response + response = Response() def mapper(**kw): def inner(view): def superinner(context, request): self.assertEqual(request, None) - return 'OK' + return response return superinner return inner def view(context, request): return 'NOTOK' view.__view_mapper__ = mapper deriver = self._makeOne() result = deriver(view) - self.assertFalse(result is view) - self.assertEqual(result(None, None), 'OK') + self.assertFalse(result.__wraps__ is view) + self.assertEqual(result(None, None), response) def test_with_view_mapper_default_mapper_specified(self): + from pyramid.response import Response + response = Response() def mapper(**kw): def inner(view): def superinner(context, request): self.assertEqual(request, None) - return 'OK' + return response return superinner return inner self.config.set_view_mapper(mapper) def view(context, request): return 'NOTOK' deriver = self._makeOne() result = deriver(view) - self.assertFalse(result is view) - self.assertEqual(result(None, None), 'OK') + self.assertFalse(result.__wraps__ is view) + self.assertEqual(result(None, None), response) def test_attr_wrapped_view_branching_default_phash(self): from pyramid.config import DEFAULT_PHASH def view(context, request): pass deriver = self._makeOne(phash=DEFAULT_PHASH) result = deriver(view) - self.assertEqual(result, view) + self.assertEqual(result.__wraps__, view) def test_attr_wrapped_view_branching_nondefault_phash(self): def view(context, request): pass @@ -4203,7 +4243,7 @@ class TestViewDeriver(unittest.TestCase): def test_http_cached_view_integer(self): import datetime - from webob import Response + from pyramid.response import Response response = Response('OK') def inner_view(context, request): return response @@ -4223,7 +4263,7 @@ class TestViewDeriver(unittest.TestCase): def test_http_cached_view_timedelta(self): import datetime - from webob import Response + from pyramid.response import Response response = Response('OK') def inner_view(context, request): return response @@ -4243,7 +4283,7 @@ class TestViewDeriver(unittest.TestCase): def test_http_cached_view_tuple(self): import datetime - from webob import Response + from pyramid.response import Response response = Response('OK') def inner_view(context, request): return response @@ -4262,7 +4302,7 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(headers['Cache-Control'], 'max-age=3600, public') def test_http_cached_view_tuple_seconds_None(self): - from webob import Response + from pyramid.response import Response response = Response('OK') def inner_view(context, request): return response @@ -4279,8 +4319,10 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(headers['Cache-Control'], 'public') def test_http_cached_view_nonresponse_object_returned_downstream(self): + from pyramid.response import Response + response = Response() def inner_view(context, request): - return None + return response deriver = self._makeOne(http_cache=3600) result = deriver(inner_view) self.assertFalse(result is inner_view) @@ -4288,7 +4330,7 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(inner_view.__doc__, result.__doc__) request = self._makeRequest() result = result(None, request) - self.assertEqual(result, None) # doesn't blow up + self.assertEqual(result, response) # doesn't blow up def test_http_cached_view_bad_tuple(self): from pyramid.exceptions import ConfigurationError @@ -5407,4 +5449,8 @@ def parse_httpdate(s): def assert_similar_datetime(one, two): for attr in ('year', 'month', 'day', 'hour', 'minute'): assert(getattr(one, attr) == getattr(two, attr)) + +from pyramid.interfaces import IResponse +class DummyResponse(object): + implements(IResponse) diff --git a/pyramid/tests/test_integration.py b/pyramid/tests/test_integration.py index dd77d3aec..0ef1e1631 100644 --- a/pyramid/tests/test_integration.py +++ b/pyramid/tests/test_integration.py @@ -39,7 +39,7 @@ class WGSIAppPlusViewConfigTests(unittest.TestCase): reg = config.registry view = reg.adapters.lookup( (IViewClassifier, IRequest, INothing), IView, name='') - self.assertEqual(view, wsgiapptest) + self.assertEqual(view.__original_view__, wsgiapptest) here = os.path.dirname(__file__) staticapp = static(os.path.join(here, 'fixtures')) diff --git a/pyramid/tests/test_router.py b/pyramid/tests/test_router.py index 5fd2cf01e..af311cfc2 100644 --- a/pyramid/tests/test_router.py +++ b/pyramid/tests/test_router.py @@ -4,9 +4,8 @@ from pyramid import testing class TestRouter(unittest.TestCase): def setUp(self): - testing.setUp() - from pyramid.threadlocal import get_current_registry - self.registry = get_current_registry() + self.config = testing.setUp() + self.registry = self.config.registry def tearDown(self): testing.tearDown() @@ -242,7 +241,8 @@ class TestRouter(unittest.TestCase): self._registerTraverserFactory(context) environ = self._makeEnviron() view = DummyView('abc') - self._registerView(view, '', IViewClassifier, None, None) + self._registerView(self.config.derive_view(view), '', IViewClassifier, + None, None) router = self._makeOne() start_response = DummyStartResponse() self.assertRaises(ValueError, router, environ, start_response) @@ -255,7 +255,8 @@ class TestRouter(unittest.TestCase): self._registerTraverserFactory(context) environ = self._makeEnviron() view = DummyView('abc') - self._registerView(view, '', IViewClassifier, None, None) + self._registerView(self.config.derive_view(view), '', + IViewClassifier, None, None) router = self._makeOne() start_response = DummyStartResponse() def make_response(s): @@ -273,7 +274,8 @@ class TestRouter(unittest.TestCase): response.app_iter = ['Hello world'] view = DummyView(response) environ = self._makeEnviron() - self._registerView(view, '', IViewClassifier, None, None) + self._registerView(self.config.derive_view(view), '', + IViewClassifier, None, None) self._registerRootFactory(context) router = self._makeOne() start_response = DummyStartResponse() @@ -856,9 +858,12 @@ class TestRouter(unittest.TestCase): environ = self._makeEnviron() response = DummyResponse() view = DummyView(response, raise_exception=RuntimeError) - self._registerView(view, '', IViewClassifier, IRequest, None) + + self._registerView(self.config.derive_view(view), '', + IViewClassifier, IRequest, None) exception_view = DummyView(None) - self._registerView(exception_view, '', IExceptionViewClassifier, + self._registerView(self.config.derive_view(exception_view), '', + IExceptionViewClassifier, IRequest, RuntimeError) router = self._makeOne() start_response = DummyStartResponse() diff --git a/pyramid/tests/test_view.py b/pyramid/tests/test_view.py index ce00454fc..6bb3b01a0 100644 --- a/pyramid/tests/test_view.py +++ b/pyramid/tests/test_view.py @@ -121,19 +121,6 @@ class RenderViewToIterableTests(BaseTest, unittest.TestCase): secure=True) self.assertEqual(iterable, ()) - def test_call_view_returns_iresponse_adaptable(self): - from pyramid.response import Response - request = self._makeRequest() - context = self._makeContext() - view = make_view('123') - self._registerView(request.registry, view, 'registered') - def str_response(s): - return Response(s) - request.registry.registerAdapter(str_response, (str,), IResponse) - iterable = self._callFUT(context, request, name='registered', - secure=True) - self.assertEqual(iterable, ['123']) - def test_call_view_registered_insecure_no_call_permissive(self): context = self._makeContext() request = self._makeRequest() diff --git a/pyramid/view.py b/pyramid/view.py index ea20a19c2..ef7352301 100644 --- a/pyramid/view.py +++ b/pyramid/view.py @@ -4,7 +4,6 @@ import venusian from zope.interface import providedBy from zope.deprecation import deprecated -from pyramid.interfaces import IResponse from pyramid.interfaces import IRoutesMapper from pyramid.interfaces import IView from pyramid.interfaces import IViewClassifier @@ -101,11 +100,6 @@ def render_view_to_iterable(context, request, name='', secure=True): response = render_view_to_response(context, request, name, secure) if response is None: return None - try: - reg = request.registry - except AttributeError: - reg = get_current_registry() - response = reg.queryAdapterOrSelf(response, IResponse) return response.app_iter def render_view(context, request, name='', secure=True): |
