- Implemented a block ``set`` tag.
- Default cache size was incrased to 400 from a low 50.
- Fixed ``is number`` test to accept long integers in all Python versions.
+- Added a check for default arguments followed by non-default arguments. This
+ change makes ``{% macro m(x, y=1, z) %}...{% endmacro %}`` a syntax error. The
+ previous behavior for this code was broken anyway (resulting in the default
+ value being applied to `y`).
Version 2.7.3
-------------
arg.set_ctx('param')
if self.stream.skip_if('assign'):
defaults.append(self.parse_expression())
+ elif defaults:
+ self.fail('non-default argument follows default argument')
args.append(arg)
self.stream.expect('rparen')
{{ m() }}|{{ m('a') }}|{{ m('a', 'b') }}|{{ m(1, 2, 3) }}''')
assert tmpl.render() == '||c|d|a||c|d|a|b|c|d|1|2|3|d'
+ def test_arguments_defaults_nonsense(self):
+ self.assert_raises(TemplateSyntaxError, self.env.from_string, '''\
+{% macro m(a, b=1, c) %}a={{ a }}, b={{ b }}, c={{ c }}{% endmacro %}''')
+
+ def test_caller_defaults_nonsense(self):
+ self.assert_raises(TemplateSyntaxError, self.env.from_string, '''\
+{% macro a() %}{{ caller() }}{% endmacro %}
+{% call(x, y=1, z) a() %}{% endcall %}''')
+
def test_varargs(self):
tmpl = self.env.from_string('''\
{% macro test() %}{{ varargs|join('|') }}{% endmacro %}\