Chris McDonough
2011-12-12 bb462e7f489bee123f1c5bf37cde06c65cefa5d0
first cut at __view_defaults__ feature
3 files modified
47 ■■■■■ changed files
pyramid/config/util.py 4 ●●● patch | view | raw | blame | history
pyramid/config/views.py 16 ●●●●● patch | view | raw | blame | history
pyramid/tests/test_config/test_views.py 27 ●●●●● patch | view | raw | blame | history
pyramid/config/util.py
@@ -43,13 +43,15 @@
        if self._ainfo is None:
            self._ainfo = []
        info = kw.pop('_info', None)
        # backframes for outer decorators to actionmethods
        backframes = kw.pop('_backframes', 2)
        if is_nonstr_iter(info) and len(info) == 4:
            # _info permitted as extract_stack tuple
            info = ActionInfo(*info)
        if info is None:
            try:
                f = traceback.extract_stack(limit=3)
                info = ActionInfo(*f[-2])
                info = ActionInfo(*f[-backframes])
            except: # pragma: no cover
                info = ActionInfo(None, 0, '', '')
        self._ainfo.append(info)
pyramid/config/views.py
@@ -1,5 +1,6 @@
import inspect
import operator
from functools import wraps
from zope.interface import (
    Interface,
@@ -551,7 +552,22 @@
                continue
        raise PredicateMismatch(self.name)
def viewdefaults(wrapped):
    def wrapper(*arg, **kw):
        defaults = {}
        if len(arg) > 1:
            view = arg[1]
        else:
            view = kw.get('view')
        if inspect.isclass(view):
            defaults = getattr(view, '__view_defaults__', {})
        defaults.update(kw)
        defaults['_backframes'] = 3
        return wrapped(*arg, **defaults)
    return wraps(wrapped)(wrapper)
class ViewsConfiguratorMixin(object):
    @viewdefaults
    @action_method
    def add_view(self, view=None, name="", for_=None, permission=None,
                 request_type=None, route_name=None, request_method=None,
pyramid/tests/test_config/test_views.py
@@ -1376,6 +1376,33 @@
        self.assertEqual(view(None, None), 'OK')
        self.assertEqual(Mapper.kw['mapper'], Mapper)
    def test_add_view_with_view_defaults(self):
        from pyramid.renderers import null_renderer
        from pyramid.exceptions import PredicateMismatch
        from zope.interface import directlyProvides
        class view(object):
            __view_defaults__ = {
                'containment':'pyramid.tests.test_config.IDummy'
                }
            def __init__(self, request):
                pass
            def __call__(self):
                return 'OK'
        config = self._makeOne(autocommit=True)
        config.add_view(
            view=view,
            renderer=null_renderer)
        wrapper = self._getViewCallable(config)
        context = DummyContext()
        directlyProvides(context, IDummy)
        request = self._makeRequest(config)
        self.assertEqual(wrapper(context, request), 'OK')
        context = DummyContext()
        request = self._makeRequest(config)
        self.assertRaises(PredicateMismatch, wrapper, context, request)
    def test_derive_view_function(self):
        from pyramid.renderers import null_renderer
        def view(request):