added arg_stringname function to _ast_util.py This is to be compatible with python3.4 where kwarg and vararg objects are _ast.arg as opposed to Name objects in earlier versions. The _ast.arg object cannot be implicitly converted to a string. This lead to 4 errors in the test suite. As of this commit all tests pass under python3.4a2
diff --git a/mako/_ast_util.py b/mako/_ast_util.py index 5b1a8e4..2c6cbc7 100644 --- a/mako/_ast_util.py +++ b/mako/_ast_util.py
@@ -78,6 +78,15 @@ ALL_SYMBOLS.update(CMPOP_SYMBOLS) ALL_SYMBOLS.update(UNARYOP_SYMBOLS) +def arg_stringname(func_arg): + """Gets the string name of a kwarg or vararg + In Python3.4 a function's args are + of _ast.arg type not _ast.name + """ + if hasattr(func_arg, 'arg'): + return func_arg.arg + else: + return str(func_arg) def parse(expr, filename='<unknown>', mode='exec'): """Parse an expression into an AST node.""" @@ -403,10 +412,10 @@ self.visit(default) if node.vararg is not None: write_comma() - self.write('*' + node.vararg) + self.write('*' + arg_stringname(node.vararg)) if node.kwarg is not None: write_comma() - self.write('**' + node.kwarg) + self.write('**' + arg_stringname(node.kwarg)) def decorators(self, node): for decorator in node.decorator_list:
diff --git a/mako/ast.py b/mako/ast.py index 0d3f0b1..cd1d14e 100644 --- a/mako/ast.py +++ b/mako/ast.py
@@ -8,6 +8,7 @@ code, as well as generating Python from AST nodes""" from mako import exceptions, pyparser, compat +from mako._ast_util import arg_stringname import re class PythonCode(object): @@ -126,10 +127,10 @@ for arg in argnames: default = None if kwargs: - arg = "**" + arg + arg = "**" + arg_stringname(arg) kwargs = False elif varargs: - arg = "*" + arg + arg = "*" + arg_stringname(arg) varargs = False else: default = len(defaults) and defaults.pop() or None
diff --git a/mako/pyparser.py b/mako/pyparser.py index 5499076..be292a8 100644 --- a/mako/pyparser.py +++ b/mako/pyparser.py
@@ -11,6 +11,7 @@ """ from mako import exceptions, util, compat +from mako._ast_util import arg_stringname from mako.compat import StringIO import operator @@ -215,15 +216,14 @@ self.listener.funcname = node.name argnames = [arg_id(arg) for arg in node.args.args] if node.args.vararg: - argnames.append(node.args.vararg) + argnames.append(arg_stringname(node.args.vararg)) if node.args.kwarg: - argnames.append(node.args.kwarg) + argnames.append(arg_stringname(node.args.kwarg)) self.listener.argnames = argnames self.listener.defaults = node.args.defaults # ast self.listener.varargs = node.args.vararg self.listener.kwargs = node.args.kwarg - class ExpressionGenerator(object): def __init__(self, astnode):