first cut at __view_defaults__ feature
| | |
| | | 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) |
| | |
| | | import inspect |
| | | import operator |
| | | from functools import wraps |
| | | |
| | | from zope.interface import ( |
| | | Interface, |
| | |
| | | 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, |
| | |
| | | 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): |