From 3c9613061499de48d65714d11fe97b19475fb97d Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Sat, 27 Jun 2009 06:17:35 +0000 Subject: - The ``repoze.bfg.templating`` module now uses ``pkg_resources`` to locate and register template files instead of using an absolute path name. --- repoze/bfg/templating.py | 43 +++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 14 deletions(-) (limited to 'repoze/bfg/templating.py') diff --git a/repoze/bfg/templating.py b/repoze/bfg/templating.py index ce2833415..337621eef 100644 --- a/repoze/bfg/templating.py +++ b/repoze/bfg/templating.py @@ -1,24 +1,39 @@ +import pkg_resources from zope.component import queryUtility from repoze.bfg.interfaces import ITemplateRenderer from zope.component import getSiteManager -from repoze.bfg.path import caller_path +from repoze.bfg.path import caller_module import os def renderer_from_cache(path, factory, level=3, **kw): - abspath = caller_path(path, level=level) - renderer = queryUtility(ITemplateRenderer, abspath) + if os.path.isabs(path): + # 'path' is an absolute filename (not common and largely only + # for backwards compatibility) + if not os.path.exists(path): + raise ValueError('Missing template file: %s' % path) + renderer = queryUtility(ITemplateRenderer, name=path) + if renderer is None: + renderer = factory(path, **kw) + sm = getSiteManager() + sm.registerUtility(renderer, ITemplateRenderer, name=path) - if renderer is None: - # service unit tests and explicit registrations by trying the relative - # "path" - renderer = queryUtility(ITemplateRenderer, path) - - if renderer is None: - if not os.path.exists(abspath): - raise ValueError('Missing template file: %s' % abspath) - renderer = factory(abspath, **kw) - sm = getSiteManager() - sm.registerUtility(renderer, ITemplateRenderer, name=abspath) + else: + # 'path' is a relative filename + module = caller_module(level=level) + spec = (module.__name__, path) + utility_name = '%s\t%s' % spec # utility name must be a string :-( + renderer = queryUtility(ITemplateRenderer, name=utility_name) + if renderer is None: + # service unit tests here by trying the relative path + # string as the utility name directly + renderer = queryUtility(ITemplateRenderer, name=path) + if renderer is None: + if not pkg_resources.resource_exists(*spec): + raise ValueError('Missing template resource: %s:%s' % spec) + abspath = pkg_resources.resource_filename(*spec) + renderer = factory(abspath, **kw) + sm = getSiteManager() + sm.registerUtility(renderer, ITemplateRenderer, name=utility_name) return renderer -- cgit v1.2.3