comparison 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
comparison
equal deleted inserted replaced
933:feba07fc925b 934:7c9ec79caedc
19 from genshi.template.ast24 import _ast, parse 19 from genshi.template.ast24 import _ast, parse
20 else: 20 else:
21 def parse(source, mode): 21 def parse(source, mode):
22 return compile(source, '', mode, _ast.PyCF_ONLY_AST) 22 return compile(source, '', mode, _ast.PyCF_ONLY_AST)
23 23
24 from genshi.compat import IS_PYTHON2
24 25
25 __docformat__ = 'restructuredtext en' 26 __docformat__ = 'restructuredtext en'
26 27
27 28
28 class ASTCodeGenerator(object): 29 class ASTCodeGenerator(object):
127 self._write(', ') 128 self._write(', ')
128 else: 129 else:
129 first = False 130 first = False
130 self._write('**' + node.kwarg) 131 self._write('**' + node.kwarg)
131 132
133 if not IS_PYTHON2:
134 # In Python 3 arguments get a special node
135 def visit_arg(self, node):
136 self._write(node.arg)
137
132 # FunctionDef(identifier name, arguments args, 138 # FunctionDef(identifier name, arguments args,
133 # stmt* body, expr* decorator_list) 139 # stmt* body, expr* decorator_list)
134 def visit_FunctionDef(self, node): 140 def visit_FunctionDef(self, node):
135 decarators = () 141 decarators = ()
136 if hasattr(node, 'decorator_list'): 142 if hasattr(node, 'decorator_list'):
287 for statement in node.body: 293 for statement in node.body:
288 self.visit(statement) 294 self.visit(statement)
289 self._change_indent(-1) 295 self._change_indent(-1)
290 296
291 297
292 # Raise(expr? type, expr? inst, expr? tback) 298 if IS_PYTHON2:
293 def visit_Raise(self, node): 299 # Raise(expr? type, expr? inst, expr? tback)
294 self._new_line() 300 def visit_Raise(self, node):
295 self._write('raise') 301 self._new_line()
296 if not node.type: 302 self._write('raise')
297 return 303 if not node.type:
298 self._write(' ') 304 return
299 self.visit(node.type) 305 self._write(' ')
300 if not node.inst: 306 self.visit(node.type)
301 return 307 if not node.inst:
302 self._write(', ') 308 return
303 self.visit(node.inst) 309 self._write(', ')
304 if not node.tback: 310 self.visit(node.inst)
305 return 311 if not node.tback:
306 self._write(', ') 312 return
307 self.visit(node.tback) 313 self._write(', ')
314 self.visit(node.tback)
315 else:
316 # Raise(expr? exc from expr? cause)
317 def visit_Raise(self, node):
318 self._new_line()
319 self._write('raise')
320 if not node.exc:
321 return
322 self._write(' ')
323 self.visit(node.exc)
324 if not node.cause:
325 return
326 self._write(' from ')
327 self.visit(node.cause)
308 328
309 # TryExcept(stmt* body, excepthandler* handlers, stmt* orelse) 329 # TryExcept(stmt* body, excepthandler* handlers, stmt* orelse)
310 def visit_TryExcept(self, node): 330 def visit_TryExcept(self, node):
311 self._new_line() 331 self._new_line()
312 self._write('try:') 332 self._write('try:')
623 self._write(repr(node.n)) 643 self._write(repr(node.n))
624 644
625 # Str(string s) 645 # Str(string s)
626 def visit_Str(self, node): 646 def visit_Str(self, node):
627 self._write(repr(node.s)) 647 self._write(repr(node.s))
648
649 if not IS_PYTHON2:
650 # Bytes(bytes s)
651 def visit_Bytes(self, node):
652 self._write(repr(node.s))
628 653
629 # Attribute(expr value, identifier attr, expr_context ctx) 654 # Attribute(expr value, identifier attr, expr_context ctx)
630 def visit_Attribute(self, node): 655 def visit_Attribute(self, node):
631 self.visit(node.value) 656 self.visit(node.value)
632 self._write('.') 657 self._write('.')
Copyright (C) 2012-2017 Edgewall Software