#35 closed defect (fixed)
py:match and py:def weirdness
| Reported by: | cboos | Owned by: | cmlenz |
|---|---|---|---|
| Priority: | major | Milestone: | 0.3 |
| Component: | Template processing | Version: | 0.2 |
| Keywords: | Cc: |
Description
When a py:def is present in a element which is being matched, calls to that macro from outside a py: directive will fail, as the function is not yet registered.
The problem is a bit hard to describe, so I'll give an example:
-
markup/tests/template.py
530 530 # </span> 531 531 # </div>""", str(tmpl.generate())) 532 532 533 def test_def_in_matched(self): 534 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> 535 <head py:match="head">${select('*')}</head> 536 <head> 537 <py:def function="maketitle(test)"><b py:replace="test" /></py:def> 538 <title>${maketitle(True)}</title> 539 </head> 540 </doc>""") 541 self.assertEqual("""<doc> 542 <head><title>True</title></head> 543 </doc>""", str(tmpl.generate())) 533 544 534 545 class StripDirectiveTestCase(unittest.TestCase): 535 546 """Tests for the `py:strip` template directive."""
Gives:
...
ERROR: test_def_in_matched (markup.tests.template.MatchDirectiveTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Workspace\src\trac\Markup\trunk\markup\tests\template.py", line 541, in test_def_in_matched
self.assertEqual("""<doc>
File "C:\Workspace\src\trac\Markup\trunk\markup\core.py", line 131, in __str__
return self.render()
File "C:\Workspace\src\trac\Markup\trunk\markup\core.py", line 93, in render
output = u''.join(list(generator))
File "C:\Workspace\src\trac\Markup\trunk\markup\output.py", line 111, in __call__
kind, data, pos = stream.next()
File "C:\Workspace\src\trac\Markup\trunk\markup\output.py", line 497, in next
return self.iterable.next()
File "C:\Workspace\src\trac\Markup\trunk\markup\output.py", line 442, in __call__
for kind, data, pos in chain(stream, [(None, None, None)]):
File "C:\Workspace\src\trac\Markup\trunk\markup\core.py", line 150, in _ensure
for event in stream:
File "C:\Workspace\src\trac\Markup\trunk\markup\template.py", line 952, in _flatten
for kind, data, pos in stream:
File "C:\Workspace\src\trac\Markup\trunk\markup\template.py", line 989, in _match
kind, data, pos = stream.next()
File "C:\Workspace\src\trac\Markup\trunk\markup\template.py", line 924, in _eval
result = data.evaluate(ctxt)
File "c:\workspace\src\trac\markup\trunk\markup\eval.py", line 91, in evaluate
retval = eval(self.code, {'data': data,
File "<string>", line 5, in <Expression u"maketitle(True)">
TypeError: 'NoneType' object is not callable
----------------------------------------------------------------------
Ran 232 tests in 0.531s
FAILED (errors=1)
Note that if the call is done from within a py: directive (e.g. <py:def test="True">${maketitle(content)}</py:def>), then the test succeeds.
P.S: tested with latest r239; you should add the 0.2 and maybe devel versions.
Change History (4)
comment:1 Changed 19 years ago by cboos
- Priority changed from critical to major
comment:2 Changed 19 years ago by anonymous
- Milestone set to 0.3
- Version set to 0.2
comment:3 Changed 19 years ago by cmlenz
- Status changed from new to assigned
comment:4 Changed 19 years ago by cmlenz
- Resolution set to fixed
- Status changed from assigned to closed
Should be fixed in [258]. I've integrated the example above as a unit test. Thanks for the detailed report!

Also, I just figured out that if the <py:def> is defined before the element being matched (e.g. before the <head> in the example above), the test will also succeed.
So I'm lowering the prio, as there are several workarounds to this problem.