diff options
| author | Ben Bangert <ben@groovie.org> | 2010-10-27 12:35:49 -0700 |
|---|---|---|
| committer | Ben Bangert <ben@groovie.org> | 2010-10-27 12:35:49 -0700 |
| commit | 07437c7480421e66a99ed9f2a6577783bbe2c697 (patch) | |
| tree | 7637647f1ad71b50b96c1f80337bb8207c864ff1 | |
| parent | a19db34e7ebd99e75259aa14829b5bddf5148572 (diff) | |
| download | pyramid-07437c7480421e66a99ed9f2a6577783bbe2c697.tar.gz pyramid-07437c7480421e66a99ed9f2a6577783bbe2c697.tar.bz2 pyramid-07437c7480421e66a99ed9f2a6577783bbe2c697.zip | |
Ok, this time, actually include the mako renderer changes.
| -rw-r--r-- | CHANGES.txt | 4 | ||||
| -rw-r--r-- | pyramid/mako_templating.py | 44 | ||||
| -rw-r--r-- | pyramid/tests/test_mako_templating.py | 32 |
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): |
