Mercurial > genshi > genshi-test
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('.') |