summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES.txt4
-rw-r--r--pyramid/mako_templating.py44
-rw-r--r--pyramid/tests/test_mako_templating.py32
3 files changed, 75 insertions, 5 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index eca2c7757..663db55fc 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -4,6 +4,10 @@ Next release
Features (delta from BFG 1.3.X)
-------------------------------
+- Mako templating renderer supports resource specification format for
+ template lookups and within Mako templates. Absolute filenames must
+ be used in Pyramid to avoid this lookup process..
+
- Add ``pyramid.httpexceptions`` module, which is a facade for the
``webob.exc`` module.
diff --git a/pyramid/mako_templating.py b/pyramid/mako_templating.py
index 5523583c3..793e56e6a 100644
--- a/pyramid/mako_templating.py
+++ b/pyramid/mako_templating.py
@@ -1,3 +1,7 @@
+import os
+import posixpath
+import re
+
from zope.interface import implements
from zope.interface import Interface
@@ -13,6 +17,37 @@ class IMakoLookup(Interface):
def renderer_factory(path):
from mako.lookup import TemplateLookup
+ from mako import exceptions, util
+ class PkgResourceTemplateLookup(TemplateLookup):
+ def adjust_uri(self, uri, relativeto):
+ # Don't adjust pkg resource spec names
+ if ':' in uri:
+ return uri
+ return TemplateLookup.adjust_uri(self, uri, relativeto)
+
+ def get_template(self, uri):
+ if ':' not in uri:
+ return TemplateLookup.get_template(self, uri)
+ try:
+ if self.filesystem_checks:
+ return self._check(uri, self._collection[uri])
+ else:
+ return self._collection[uri]
+ except KeyError:
+ pname, path = resolve_resource_spec(uri)
+ srcfile = abspath_from_resource_spec(path, pname)
+ if os.path.isfile(srcfile):
+ return self._load(srcfile, uri)
+
+ u = re.sub(r'^\/+', '', path)
+ for dir in self.directories:
+ srcfile = posixpath.normpath(posixpath.join(dir, u))
+ if os.path.isfile(srcfile):
+ return self._load(srcfile, uri)
+ else:
+ raise exceptions.TopLevelLookupException(
+ "Cant locate template for uri %r" % uri)
+
registry = get_current_registry()
lookup = registry.queryUtility(IMakoLookup)
if lookup is None:
@@ -26,12 +61,11 @@ def renderer_factory(path):
'Mako template used without a lookup path')
directories = directories.splitlines()
directories = [ abspath_from_resource_spec(d) for d in directories ]
- lookup = TemplateLookup(directories=directories,
- module_directory=module_directory,
- input_encoding=input_encoding,
- filesystem_checks=reload_templates)
+ lookup = PkgResourceTemplateLookup(directories=directories,
+ module_directory=module_directory,
+ input_encoding=input_encoding,
+ filesystem_checks=reload_templates)
registry.registerUtility(lookup, IMakoLookup)
- _, path = resolve_resource_spec(path)
return MakoLookupTemplateRenderer(path, lookup)
class MakoLookupTemplateRenderer(object):
diff --git a/pyramid/tests/test_mako_templating.py b/pyramid/tests/test_mako_templating.py
index d67bac89c..54df83a79 100644
--- a/pyramid/tests/test_mako_templating.py
+++ b/pyramid/tests/test_mako_templating.py
@@ -123,16 +123,48 @@ class TestIntegration(unittest.TestCase):
result = render('helloworld.mak', {'a':1})
self.assertEqual(result, u'\nHello föö\n')
+ def test_render_from_fs(self):
+ from pyramid.renderers import render
+ self.config.add_settings({'reload_templates': True})
+ result = render('helloworld.mak', {'a':1})
+ self.assertEqual(result, u'\nHello föö\n')
+
+ def test_render_inheritance(self):
+ from pyramid.renderers import render
+ result = render('helloinherit.mak', {})
+ self.assertEqual(result, u'Layout\nHello World!\n')
+
+ def test_render_inheritance_pkg_spec(self):
+ from pyramid.renderers import render
+ result = render('hello_inherit_pkg.mak', {})
+ self.assertEqual(result, u'Layout\nHello World!\n')
+
def test_render_to_response(self):
from pyramid.renderers import render_to_response
result = render_to_response('helloworld.mak', {'a':1})
self.assertEqual(result.ubody, u'\nHello föö\n')
+ def test_render_to_response_pkg_spec(self):
+ from pyramid.renderers import render_to_response
+ result = render_to_response('pyramid.tests:fixtures/helloworld.mak', {'a':1})
+ self.assertEqual(result.ubody, u'\nHello föö\n')
+
+ def test_render_with_abs_path(self):
+ from pyramid.renderers import render
+ result = render('/helloworld.mak', {'a':1})
+ self.assertEqual(result, u'\nHello föö\n')
+
def test_get_renderer(self):
from pyramid.renderers import get_renderer
result = get_renderer('helloworld.mak')
self.assertEqual(result.implementation().render_unicode(),
u'\nHello föö\n')
+
+ def test_template_not_found(self):
+ from pyramid.renderers import render
+ from mako.exceptions import TemplateLookupException
+ self.assertRaises(TemplateLookupException, render, 'helloworld_not_here.mak', {})
+
class DummyLookup(object):
def get_template(self, path):