Chris McDonough
2011-07-04 661ea7644a8c725a0f03df01c1618a592e712e1a
partial conversion to eager response resolving
6 files modified
108 ■■■■■ changed files
pyramid/config.py 58 ●●●●● patch | view | raw | blame | history
pyramid/router.py 11 ●●●● patch | view | raw | blame | history
pyramid/tests/test_config.py 18 ●●●●● patch | view | raw | blame | history
pyramid/tests/test_integration.py 2 ●●● patch | view | raw | blame | history
pyramid/tests/test_view.py 13 ●●●●● patch | view | raw | blame | history
pyramid/view.py 6 ●●●●● patch | view | raw | blame | history
pyramid/config.py
@@ -2931,8 +2931,23 @@
                        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
        def wrapper(context, request):
            result = view(context, request)
            response = registry.queryAdapterOrSelf(result, IResponse)
            if response is None:
                if response is None:
                    raise ValueError(
                        'Could not convert view return value "%s" into a '
                        'response object' % (result,))
            return response
        return wrapper
    @wraps_view
    def mapped_view(self, view):
@@ -2970,10 +2985,11 @@
    @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:
@@ -2985,9 +3001,7 @@
        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
@@ -3108,24 +3122,22 @@
        def _rendered_view(context, request):
            renderer = static_renderer
            result = wrapped_view(context, request)
            response = wrapped_view(context, request)
            registry = self.kw['registry']
            response = registry.queryAdapterOrSelf(result, IResponse)
            if response is None:
                attrs = getattr(request, '__dict__', {})
                if 'override_renderer' in attrs:
                    # renderer overridden by newrequest event or other
                    renderer_name = attrs.pop('override_renderer')
                    renderer = RendererHelper(name=renderer_name,
                                              package=self.kw.get('package'),
                                              registry = registry)
                if '__view__' in attrs:
                    view_inst = attrs.pop('__view__')
                else:
                    view_inst = getattr(wrapped_view, '__original_view__',
                                        wrapped_view)
                response = renderer.render_view(request, result, view_inst,
                                                context)
            attrs = getattr(request, '__dict__', {})
            if 'override_renderer' in attrs:
                # renderer overridden by newrequest event or other
                renderer_name = attrs.pop('override_renderer')
                renderer = RendererHelper(name=renderer_name,
                                          package=self.kw.get('package'),
                                          registry = registry)
            if '__view__' in attrs:
                view_inst = attrs.pop('__view__')
            else:
                view_inst = getattr(wrapped_view, '__original_view__',
                                    wrapped_view)
            response = renderer.render_view(request, response, view_inst,
                                            context)
            return response
        return _rendered_view
pyramid/router.py
@@ -159,7 +159,7 @@
                            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 @@
                    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))
pyramid/tests/test_config.py
@@ -3972,7 +3972,7 @@
        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')
@@ -3996,7 +3996,7 @@
        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
@@ -4198,7 +4198,7 @@
    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
@@ -4218,7 +4218,7 @@
        
    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
@@ -4238,7 +4238,7 @@
    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
@@ -4257,7 +4257,7 @@
        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
@@ -4274,8 +4274,10 @@
        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)
@@ -4283,7 +4285,7 @@
        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
pyramid/tests/test_integration.py
@@ -39,7 +39,7 @@
        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'))
pyramid/tests/test_view.py
@@ -121,19 +121,6 @@
                                 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()
pyramid/view.py
@@ -4,7 +4,6 @@
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 @@
    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):