From f71ed59edb74e9a13362521918e2660e4e4263ba Mon Sep 17 00:00:00 2001 From: Blaise Laflamme Date: Tue, 19 Jun 2012 16:32:41 -0400 Subject: [PATCH] added a new makodef renderer to call a def inside a mako template, fixed tests and removed old tuple way of calling def. Based on zzzeek example of client/server templating. --- pyramid/config/rendering.py | 1 + pyramid/mako_templating.py | 19 +++++++++++-------- pyramid/tests/test_mako_templating.py | 21 ++++++++++----------- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/pyramid/config/rendering.py b/pyramid/config/rendering.py index 926511b7b6..bfa41ee03f 100644 --- a/pyramid/config/rendering.py +++ b/pyramid/config/rendering.py @@ -21,6 +21,7 @@ ('.pt', chameleon_zpt.renderer_factory), ('.mak', mako_renderer_factory), ('.mako', mako_renderer_factory), + ('.makodef', mako_renderer_factory), ('json', renderers.json_renderer_factory), ('string', renderers.string_renderer_factory), ) diff --git a/pyramid/mako_templating.py b/pyramid/mako_templating.py index 208e54bf56..48288c9301 100644 --- a/pyramid/mako_templating.py +++ b/pyramid/mako_templating.py @@ -1,4 +1,5 @@ import os +import re import sys import threading @@ -76,7 +77,11 @@ def __init__(self, settings_prefix=None): self.settings_prefix = settings_prefix def __call__(self, info): - path = info.name + p = re.compile( + r'(?P[\w_.:/]+)' + r'(?:\#(?P[\w_]+))?' + ) + path, defname = p.match(info.name).group("path", "defname") registry = info.registry settings = info.settings settings_prefix = self.settings_prefix @@ -141,7 +146,7 @@ def sget(name, default=None): finally: registry_lock.release() - return MakoLookupTemplateRenderer(path, lookup) + return MakoLookupTemplateRenderer(path, defname, lookup) renderer_factory = MakoRendererFactoryHelper('mako.') @@ -156,8 +161,9 @@ def __repr__(self): @implementer(ITemplateRenderer) class MakoLookupTemplateRenderer(object): - def __init__(self, path, lookup): + def __init__(self, path, defname, lookup): self.path = path + self.defname = defname self.lookup = lookup def implementation(self): @@ -167,16 +173,13 @@ def __call__(self, value, system): context = system.pop('context', None) if context is not None: system['_context'] = context - def_name = None - if isinstance(value, tuple): - def_name, value = value try: system.update(value) except (TypeError, ValueError): raise ValueError('renderer was passed non-dictionary as value') template = self.implementation() - if def_name is not None: - template = template.get_def(def_name) + if self.defname is not None: + template = template.get_def(self.defname) try: result = template.render_unicode(**system) except: diff --git a/pyramid/tests/test_mako_templating.py b/pyramid/tests/test_mako_templating.py index 8b738c21d8..cd7b140d60 100644 --- a/pyramid/tests/test_mako_templating.py +++ b/pyramid/tests/test_mako_templating.py @@ -315,7 +315,7 @@ def _makeOne(self, *arg, **kw): def test_instance_implements_ITemplate(self): from zope.interface.verify import verifyObject from pyramid.interfaces import ITemplateRenderer - verifyObject(ITemplateRenderer, self._makeOne(None, None)) + verifyObject(ITemplateRenderer, self._makeOne(None, None, None)) def test_class_implements_ITemplate(self): from zope.interface.verify import verifyClass @@ -324,7 +324,7 @@ def test_class_implements_ITemplate(self): def test_call(self): lookup = DummyLookup() - instance = self._makeOne('path', lookup) + instance = self._makeOne('path', None, lookup) result = instance({}, {'system':1}) self.assertTrue(isinstance(result, text_type)) self.assertEqual(result, text_('result')) @@ -332,29 +332,28 @@ def test_call(self): def test_call_with_system_context(self): # lame lookup = DummyLookup() - instance = self._makeOne('path', lookup) + instance = self._makeOne('path', None, lookup) result = instance({}, {'context':1}) self.assertTrue(isinstance(result, text_type)) self.assertEqual(result, text_('result')) self.assertEqual(lookup.values, {'_context':1}) - def test_call_with_tuple_value(self): + def test_call_with_defname(self): lookup = DummyLookup() - instance = self._makeOne('path', lookup) - result = instance(('fub', {}), {'context':1}) - self.assertEqual(lookup.deffed, 'fub') + instance = self._makeOne('path', 'defname', lookup) + result = instance({}, {'system':1}) + self.assertTrue(isinstance(result, text_type)) self.assertEqual(result, text_('result')) - self.assertEqual(lookup.values, {'_context':1}) def test_call_with_nondict_value(self): lookup = DummyLookup() - instance = self._makeOne('path', lookup) + instance = self._makeOne('path', None, lookup) self.assertRaises(ValueError, instance, None, {}) def test_call_render_raises(self): from pyramid.mako_templating import MakoRenderingException lookup = DummyLookup(exc=NotImplementedError) - instance = self._makeOne('path', lookup) + instance = self._makeOne('path', None, lookup) try: instance({}, {}) except MakoRenderingException as e: @@ -364,7 +363,7 @@ def test_call_render_raises(self): def test_implementation(self): lookup = DummyLookup() - instance = self._makeOne('path', lookup) + instance = self._makeOne('path', None, lookup) result = instance.implementation().render_unicode() self.assertTrue(isinstance(result, text_type)) self.assertEqual(result, text_('result'))