Skip to content

Commit

Permalink
added a new makodef renderer to call a def inside a mako template, fi…
Browse files Browse the repository at this point in the history
…xed tests and removed old tuple way of calling def. Based on zzzeek example of client/server templating.
  • Loading branch information
blaflamme committed Jun 19, 2012
1 parent 5b1f04f commit f71ed59
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 19 deletions.
1 change: 1 addition & 0 deletions pyramid/config/rendering.py
Original file line number Diff line number Diff line change
Expand Up @@ -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),
)
Expand Down
19 changes: 11 additions & 8 deletions pyramid/mako_templating.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import os
import re
import sys
import threading

Expand Down Expand Up @@ -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<path>[\w_.:/]+)'
r'(?:\#(?P<defname>[\w_]+))?'
)
path, defname = p.match(info.name).group("path", "defname")
registry = info.registry
settings = info.settings
settings_prefix = self.settings_prefix
Expand Down Expand Up @@ -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.')

Expand All @@ -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):
Expand All @@ -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:
Expand Down
21 changes: 10 additions & 11 deletions pyramid/tests/test_mako_templating.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -324,37 +324,36 @@ 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'))

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:
Expand All @@ -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'))
Expand Down

0 comments on commit f71ed59

Please sign in to comment.