diff genshi/template/astutil.py @ 934:7c9ec79caedc

Merge r1142 from py3k: add support for python 3 to genshi.template expression evaluator: * add support for python 3 AST: * AST for raise has changed in Python 3. * Python 3 adds AST nodes for individual arguments and Bytes. * use genshi.compat functions for dealing with code objects. * do not coerce byte strings to unicode in Python 3 ASTTransformer. * replace doctests that reply on exception names with uglier but more compatible try:.. except:.. doctest * handle filename preferences of Python 2 and 3 (2 prefers bytes, 3 prefers unicode). * ifilter is gone from itertools in Python 3 so use repeat for tests instead.
author hodgestar
date Fri, 18 Mar 2011 09:15:29 +0000
parents 85e4678337cf
children
line wrap: on
line diff
--- a/genshi/template/astutil.py
+++ b/genshi/template/astutil.py
@@ -21,6 +21,7 @@
     def parse(source, mode):
         return compile(source, '', mode, _ast.PyCF_ONLY_AST)
 
+from genshi.compat import IS_PYTHON2
 
 __docformat__ = 'restructuredtext en'
 
@@ -129,6 +130,11 @@
                 first = False
             self._write('**' + node.kwarg)
 
+    if not IS_PYTHON2:
+        # In Python 3 arguments get a special node
+        def visit_arg(self, node):
+            self._write(node.arg)
+
     # FunctionDef(identifier name, arguments args,
     #                           stmt* body, expr* decorator_list)
     def visit_FunctionDef(self, node):
@@ -289,22 +295,36 @@
         self._change_indent(-1)
 
 
-    # Raise(expr? type, expr? inst, expr? tback)
-    def visit_Raise(self, node):
-        self._new_line()
-        self._write('raise')
-        if not node.type:
-            return
-        self._write(' ')
-        self.visit(node.type)
-        if not node.inst:
-            return
-        self._write(', ')
-        self.visit(node.inst)
-        if not node.tback:
-            return
-        self._write(', ')
-        self.visit(node.tback)
+    if IS_PYTHON2:
+        # Raise(expr? type, expr? inst, expr? tback)
+        def visit_Raise(self, node):
+            self._new_line()
+            self._write('raise')
+            if not node.type:
+                return
+            self._write(' ')
+            self.visit(node.type)
+            if not node.inst:
+                return
+            self._write(', ')
+            self.visit(node.inst)
+            if not node.tback:
+                return
+            self._write(', ')
+            self.visit(node.tback)
+    else:
+        # Raise(expr? exc from expr? cause)
+        def visit_Raise(self, node):
+            self._new_line()
+            self._write('raise')
+            if not node.exc:
+                return
+            self._write(' ')
+            self.visit(node.exc)
+            if not node.cause:
+                return
+            self._write(' from ')
+            self.visit(node.cause)
 
     # TryExcept(stmt* body, excepthandler* handlers, stmt* orelse)
     def visit_TryExcept(self, node):
@@ -626,6 +646,11 @@
     def visit_Str(self, node):
         self._write(repr(node.s))
 
+    if not IS_PYTHON2:
+        # Bytes(bytes s)
+        def visit_Bytes(self, node):
+            self._write(repr(node.s))
+
     # Attribute(expr value, identifier attr, expr_context ctx)
     def visit_Attribute(self, node):
         self.visit(node.value)
Copyright (C) 2012-2017 Edgewall Software