# HG changeset patch
# User cmlenz
# Date 1160749635 0
# Node ID ebc084d5bcdb966e896cfc73b0358d70f47592f4
# Parent 4a8975768572674129654371e77cf6108dfa13c9
Some changes to usage of absolute vs. relative template paths to ensure that the filenamed-keyed cache employed by the `TemplateLoader` doesn't mix up templates with the same name, but from different subdirectories.
diff --git a/genshi/template.py b/genshi/template.py
--- a/genshi/template.py
+++ b/genshi/template.py
@@ -425,7 +425,7 @@
123
"""
- __slots__ = ['assign']
+ __slots__ = ['assign', 'filename']
ATTRIBUTE = 'each'
@@ -437,6 +437,7 @@
assign, value = value.split(' in ', 1)
ast = compiler.parse(assign, 'exec')
self.assign = _assignment(ast.node.nodes[0].expr)
+ self.filename = filename
Directive.__init__(self, value.strip(), namespaces, filename, lineno,
offset)
@@ -457,7 +458,7 @@
yield event
ctxt.pop()
except TypeError, e:
- raise TemplateRuntimeError(str(e), *stream[0][2])
+ raise TemplateRuntimeError(str(e), self.filename, *stream[0][2][1:])
def __repr__(self):
return '<%s>' % self.__class__.__name__
@@ -663,20 +664,26 @@
See the documentation of `py:choose` for usage.
"""
+ __slots__ = ['filename']
ATTRIBUTE = 'test'
+ def __init__(self, value, namespaces=None, filename=None, lineno=-1,
+ offset=-1):
+ Directive.__init__(self, value, namespaces, filename, lineno, offset)
+ self.filename = filename
+
def __call__(self, stream, ctxt, directives):
matched, frame = ctxt._find('_choose.matched')
if not frame:
raise TemplateRuntimeError('"when" directives can only be used '
'inside a "choose" directive',
- *stream.next()[2])
+ self.filename, *stream.next()[2][1:])
if matched:
return []
if not self.expr:
raise TemplateRuntimeError('"when" directive has no test condition',
- *stream.next()[2])
+ self.filename, *stream.next()[2][1:])
value = self.expr.evaluate(ctxt)
if '_choose.value' in frame:
matched = (value == frame['_choose.value'])
@@ -695,12 +702,19 @@
See the documentation of `py:choose` for usage.
"""
+ __slots__ = ['filename']
+
+ def __init__(self, value, namespaces=None, filename=None, lineno=-1,
+ offset=-1):
+ Directive.__init__(self, None, namespaces, filename, lineno, offset)
+ self.filename = filename
+
def __call__(self, stream, ctxt, directives):
matched, frame = ctxt._find('_choose.matched')
if not frame:
raise TemplateRuntimeError('an "otherwise" directive can only be '
'used inside a "choose" directive',
- *stream.next()[2])
+ self.filename, *stream.next()[2][1:])
if matched:
return []
frame['_choose.matched'] = True
@@ -816,7 +830,8 @@
_FULL_EXPR_RE = re.compile(r'(? offset:
text = source[offset:start]
- for kind, data, pos in self._interpolate(text, self.filepath,
- lineno, 0):
+ for kind, data, pos in self._interpolate(text, self.basedir,
+ self.filename, lineno):
stream.append((kind, data, pos))
lineno += len(text.splitlines())
@@ -1232,8 +1252,8 @@
if offset < len(source):
text = source[offset:].replace('\\#', '#')
- for kind, data, pos in self._interpolate(text, self.filepath,
- lineno, 0):
+ for kind, data, pos in self._interpolate(text, self.basedir,
+ self.filename, lineno):
stream.append((kind, data, pos))
return stream