def __call__(self, wrapped): 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 the decorator was attached to a method in a class, or # otherwise executed at class scope, we need to set an # 'attr' into the settings if one isn't already in there if settings['attr'] is None: settings['attr'] = wrapped.__name__ # try to convert the renderer provided into a fully qualified # resource specification 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(info.module) abspath = os.path.join(pp, abspath) resource = resource_spec_from_abspath(abspath, info.module) settings['renderer'] = resource return wrapped
def path_spec(context, path): # we prefer registering resource specifications over absolute # paths because these can be overridden by the resource directive. if ':' in path and not os.path.isabs(path): # it's already a resource specification return path abspath = context.path(path) if hasattr(context, 'package') and context.package: return resource_spec_from_abspath(abspath, context.package) return abspath
def get_spec(self, name, package): spec = name isabs = os.path.isabs(name) if (not isabs) and (not ':' in name) and package: # relative resource spec if not isabs: pp = package_path(package) spec = os.path.join(pp, spec) spec = resource_spec_from_abspath(spec, package) return spec
def template_renderer_factory(info, impl, lock=registry_lock): spec = info.name reg = info.registry package = info.package isabs = os.path.isabs(spec) if (not isabs) and (not ':' in spec) and package: # relative resource spec if not isabs: pp = package_path(package) spec = os.path.join(pp, spec) spec = resource_spec_from_abspath(spec, package) if os.path.isabs(spec): # 'spec' is an absolute filename if not os.path.exists(spec): raise ValueError('Missing template file: %s' % spec) renderer = reg.queryUtility(ITemplateRenderer, name=spec) if renderer is None: renderer = impl(spec) # cache the template try: lock.acquire() reg.registerUtility(renderer, ITemplateRenderer, name=spec) finally: lock.release() else: # spec is a package:relpath resource spec renderer = reg.queryUtility(ITemplateRenderer, name=spec) if renderer is None: try: package_name, filename = spec.split(':', 1) except ValueError: # pragma: no cover # somehow we were passed a relative pathname; this # should die package_name = caller_package(4).__name__ filename = spec abspath = pkg_resources.resource_filename(package_name, filename) if not pkg_resources.resource_exists(package_name, filename): raise ValueError( 'Missing template resource: %s (%s)' % (spec, abspath)) renderer = impl(abspath) settings = info.settings if settings and not settings.get('reload_resources'): # cache the template try: lock.acquire() reg.registerUtility(renderer, ITemplateRenderer, name=spec) finally: lock.release() return renderer