Migrated issue, originally created by Anonymous
Very strange behavior, but:
base.htm
test.htm
<%inherit file="base.htm" />
## should throw exception
${undefined_var}
Test1.htm stuff
test.py
import os
from mako.lookup import TemplateLookup
from mako.template import Template
l = TemplateLookup(directories=[os.getcwd(),])
t = Template(filename='test1.htm', lookup=l, format_exceptions=True)
print t.render()
As a result there will be 3 blank lines :). Expected: formatted error message.
Representable with 0.1.10 and latest trunk.
Problem is in your way of copying context. After Context._copy() copied instance will share all buffers and even buffer list with source Context. This can make a lot of hard-to-find errors. As this :).
mako.runtime, _exec_template(), 332 line:
context._buffer_stack = [util.StringIO()]
Here you overwrite buffer stack, but only for current context instance. And expect changes on all Contexts :).
c1 = Context()
c2 = Context()
c1._buffer_stack => list #1
c2._buffer_stack => list #1 (!)
c1._buffer_stack[0] => buff #1
c2._buffer_stack[0] => buff #1
c2._buffer_stack[0].write('asd')
c1._buffer_stack[0].getvalue() => 'asd' as expected
c2._buffer_stack = [StringIO]
c2._buffer_stack[0] => buff #2
c1._buffer_stack[0] => buff #1 (!!!)
In patch I had also changed the way buffers are created. At least this will allow multilingual template errors messages in the future ;). Also - use cStringIO ONLY for unicode (I mean use cStringIO if non-unicode encoding supplied).
If you dont want that much changes - to fix error problem you just need to replace
mako.runtime, _exec_template(), 332 line:
context._buffer_stack = [util.StringIO()]
to
while context._buffer_stack: del context._buffer_stack[0]
context._buffer_stack.append(util.StringIO())
Cheers!
Attachments: runtime_buffers.patch
Migrated issue, originally created by Anonymous
Very strange behavior, but:
base.htm
test.htm
test.py
As a result there will be 3 blank lines :). Expected: formatted error message.
Representable with 0.1.10 and latest trunk.
Problem is in your way of copying context. After Context._copy() copied instance will share all buffers and even buffer list with source Context. This can make a lot of hard-to-find errors. As this :).
mako.runtime, _exec_template(), 332 line:
Here you overwrite buffer stack, but only for current context instance. And expect changes on all Contexts :).
In patch I had also changed the way buffers are created. At least this will allow multilingual template errors messages in the future ;). Also - use cStringIO ONLY for unicode (I mean use cStringIO if non-unicode encoding supplied).
If you dont want that much changes - to fix error problem you just need to replace
mako.runtime, _exec_template(), 332 line:
to
Cheers!
Attachments: runtime_buffers.patch