Chris McDonough
2013-08-29 0cc8393e5fedee53088236f9f775a2fa00144882
backport fix for #1013 to 1.4-branch
3 files modified
47 ■■■■ changed files
CHANGES.txt 12 ●●●●● patch | view | raw | blame | history
pyramid/chameleon_zpt.py 23 ●●●●● patch | view | raw | blame | history
pyramid/tests/test_chameleon_zpt.py 12 ●●●●● patch | view | raw | blame | history
CHANGES.txt
@@ -1,3 +1,13 @@
Next release
============
- When the ``pyramid.reload_templates`` setting was true, and a Chameleon
  template was reloaded, and the renderer specification named a macro
  (e.g. ``foo#macroname.pt``), renderings of the template after the template
  was reloaded due to a file change would produce the entire template body
  instead of just a rendering of the macro.  See
  https://github.com/Pylons/pyramid/issues/1013.
1.4.4 (2013-08-27)
==================
@@ -16,7 +26,7 @@
---------
- ``pyramid.testing.DummyResource`` didn't define ``__bool__``, so code under
   Python 3 would use ``__len__`` to find truthiness; this usually caused an
  Python 3 would use ``__len__`` to find truthiness; this usually caused an
   instance of DummyResource to be "falsy" instead of "truthy".  See
   https://github.com/Pylons/pyramid/pull/1032
pyramid/chameleon_zpt.py
@@ -1,13 +1,22 @@
from zope.interface import implementer
from chameleon.zpt.template import PageTemplateFile
from pyramid.interfaces import ITemplateRenderer
from pyramid.decorator import reify
from pyramid import renderers
from chameleon.zpt.template import PageTemplateFile
def renderer_factory(info):
    return renderers.template_renderer_factory(info, ZPTTemplateRenderer)
class PyramidPageTemplateFile(PageTemplateFile):
    def cook(self, body):
        PageTemplateFile.cook(self, body)
        if self.macro:
            # render only the portion of the template included in a
            # define-macro named the value of self.macro
            macro_renderer = self.macros[self.macro].include
            self._render = macro_renderer
@implementer(ITemplateRenderer)
class ZPTTemplateRenderer(object):
@@ -18,17 +27,13 @@
    @reify # avoid looking up reload_templates before manager pushed
    def template(self):
        tf = PageTemplateFile(
        tf = PyramidPageTemplateFile(
            self.path,
            auto_reload=self.lookup.auto_reload,
            debug=self.lookup.debug,
            translate=self.lookup.translate
            translate=self.lookup.translate,
            macro=self.macro,
            )
        if self.macro:
            # render only the portion of the template included in a
            # define-macro named the value of self.macro
            macro_renderer = tf.macros[self.macro].include
            tf._render = macro_renderer
        return tf
    def implementation(self):
pyramid/tests/test_chameleon_zpt.py
@@ -140,6 +140,18 @@
        self.assertEqual(result,
                         '<html>\nOutside macro\n\n  Hello!\n\n</html>\n\n')
    def test_macro_template_reload(self):
        minimal = self._getTemplatePath('withmacro.pt')
        lookup = DummyLookup()
        instance = self._makeOne(minimal, lookup, macro='foo')
        result = instance.implementation()()
        self.assertEqual(result, '\n  Hello!\n')
        instance.template.cook(
            '<html>\nOutside macro\n\n  Hello!\n\n</html>\n\n'
            )
        result = instance.implementation()()
        self.assertEqual(result, '\n  Hello!\n')
class DummyLookup(object):
    auto_reload=True
    debug = True