diff options
| author | Chris McDonough <chrism@agendaless.com> | 2010-04-18 21:54:20 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2010-04-18 21:54:20 +0000 |
| commit | e6fa66bd2c18632ef0608c63fb024b01931a5272 (patch) | |
| tree | 6c1df278eb35dc9dff725b62c2387183d63ba5f5 /repoze/bfg/view.py | |
| parent | c91eff7524189db9152260ff5c8db1c40672ad55 (diff) | |
| download | pyramid-e6fa66bd2c18632ef0608c63fb024b01931a5272.tar.gz pyramid-e6fa66bd2c18632ef0608c63fb024b01931a5272.tar.bz2 pyramid-e6fa66bd2c18632ef0608c63fb024b01931a5272.zip | |
- Use "Venusian" (`http://docs.repoze.org/venusian
<http://docs.repoze.org/venusian>`) to perform ``bfg_view``
decorator scanning rather than relying on a BFG-internal decorator
scanner. (Truth be told, Venusian is really just a generalization
of the BFG-internal decorator scanner).
- A new install-time dependency on the ``venusian`` distribution was
added.
- Remove ``repoze.bfg.compat.pkgutil_26.py`` and import alias
``repoze.bfg.compat.walk_packages``. These were only required by
internal scanning machinery; Venusian replaced the internal scanning
machinery, so these are no longer required.
Diffstat (limited to 'repoze/bfg/view.py')
| -rw-r--r-- | repoze/bfg/view.py | 37 |
1 files changed, 17 insertions, 20 deletions
diff --git a/repoze/bfg/view.py b/repoze/bfg/view.py index 1f83faa5b..2ccc75f5c 100644 --- a/repoze/bfg/view.py +++ b/repoze/bfg/view.py @@ -1,7 +1,6 @@ import cgi import mimetypes import os -import sys # See http://bugs.python.org/issue5853 which is a recursion bug # that seems to effect Python 2.6, Python 2.6.1, and 2.6.2 (a fix @@ -16,11 +15,12 @@ if hasattr(mimetypes, 'init'): from webob import Response from webob.exc import HTTPFound +import venusian + from paste.urlparser import StaticURLParser from zope.deprecation import deprecated from zope.interface import providedBy -from zope.interface.advice import getFrameInfo from repoze.bfg.interfaces import IResponseFactory from repoze.bfg.interfaces import IRoutesMapper @@ -457,6 +457,7 @@ class bfg_view(object): config.scan() """ + venusian = venusian # for testing injection def __init__(self, name='', request_type=None, for_=None, permission=None, route_name=None, request_method=None, request_param=None, containment=None, attr=None, renderer=None, wrapper=None, @@ -480,34 +481,30 @@ class bfg_view(object): self.custom_predicates = custom_predicates def __call__(self, wrapped): - setting = self.__dict__.copy() - frame = sys._getframe(1) - scope, module, f_locals, f_globals = getFrameInfo(frame) - if scope == 'class': - # we're in the midst of a class statement; the setdefault - # below actually adds a __bfg_view_settings__ attr to the - # class __dict__ if one does not already exist - settings = f_locals.setdefault('__bfg_view_settings__', []) - if setting['attr'] is None: - setting['attr'] = wrapped.__name__ - else: - settings = getattr(wrapped, '__bfg_view_settings__', []) - wrapped.__bfg_view_settings__ = settings + settings = self.__dict__.copy() + + def callback(context, name, ob): + context.config.add_view(view=ob, **settings) + + info = self.venusian.attach(wrapped, callback, category='bfg') + + if info.scope == 'class': + if settings['attr'] is None: + settings['attr'] = wrapped.__name__ # try to convert the renderer provided into a fully qualified # resource specification - abspath = setting.get('renderer') + abspath = settings.get('renderer') if abspath is not None and '.' in abspath: isabs = os.path.isabs(abspath) if not (':' in abspath and not isabs): # not already a resource spec if not isabs: - pp = package_path(module) + pp = package_path(info.module) abspath = os.path.join(pp, abspath) - resource = resource_spec_from_abspath(abspath, module) - setting['renderer'] = resource + resource = resource_spec_from_abspath(abspath, info.module) + settings['renderer'] = resource - settings.append(setting) return wrapped def default_view(context, request, status): |
