aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Volugine <phil.volguine@gmail.com>2013-09-10 23:11:26 -0400
committerPhilipp Volugine <phil.volguine@gmail.com>2013-09-10 23:11:26 -0400
commit34c7b280130da85614bb595ab2bb3c50b2270a75 (patch)
tree70a67f1d4a165c4cad95eb43cd599a60457f63b0
parent951c174da8f2bc22cb539c74fcb37bd850fd8640 (diff)
downloadexternal_python_mako-34c7b280130da85614bb595ab2bb3c50b2270a75.tar.gz
external_python_mako-34c7b280130da85614bb595ab2bb3c50b2270a75.tar.bz2
external_python_mako-34c7b280130da85614bb595ab2bb3c50b2270a75.zip
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
-rw-r--r--mako/_ast_util.py13
-rw-r--r--mako/ast.py5
-rw-r--r--mako/pyparser.py6
3 files changed, 17 insertions, 7 deletions
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(BINOP_SYMBOLS)
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 @@ class SourceGenerator(NodeVisitor):
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 @@ class FunctionDecl(object):
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 @@ module is used.
"""
from mako import exceptions, util, compat
+from mako._ast_util import arg_stringname
from mako.compat import StringIO
import operator
@@ -215,15 +216,14 @@ if _ast:
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):