summaryrefslogtreecommitdiff
path: root/repoze/bfg/templating.py
diff options
context:
space:
mode:
Diffstat (limited to 'repoze/bfg/templating.py')
-rw-r--r--repoze/bfg/templating.py30
1 files changed, 30 insertions, 0 deletions
diff --git a/repoze/bfg/templating.py b/repoze/bfg/templating.py
new file mode 100644
index 000000000..225a36358
--- /dev/null
+++ b/repoze/bfg/templating.py
@@ -0,0 +1,30 @@
+from zope.component import queryUtility
+from repoze.bfg.interfaces import ITemplateRenderer
+from repoze.bfg.interfaces import ITestingTemplateRenderer
+from zope.component.interfaces import ComponentLookupError
+from zope.component import getSiteManager
+from repoze.bfg.path import caller_path
+import os
+
+def renderer_from_cache(path, factory, level=3, **kw):
+ # XXX use pkg_resources
+ abspath = caller_path(path, level=level)
+ renderer = queryUtility(ITemplateRenderer, abspath)
+
+ if renderer is None:
+ # service unit tests by trying the relative path
+ renderer = queryUtility(ITestingTemplateRenderer, path)
+
+ if renderer is None:
+ if not os.path.exists(abspath):
+ raise ValueError('Missing template file: %s' % abspath)
+ renderer = factory(abspath, **kw)
+ try:
+ sm = getSiteManager()
+ except ComponentLookupError:
+ pass
+ else:
+ sm.registerUtility(renderer, ITemplateRenderer, name=abspath)
+
+ return renderer
+