Edgewall Software

Changeset 1192 for trunk


Ignore:
Timestamp:
Dec 29, 2012, 8:31:41 PM (11 years ago)
Author:
hodgestar
Message:

Update genshi.template AST handling to support Python 3.4 (see #537).

Location:
trunk/genshi/template
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/genshi/template/astutil.py

    r1167 r1192  
    282282
    283283    # With(expr context_expr, expr? optional_vars, stmt* body)
     284    # With(withitem* items, stmt* body) in Python >= 3.3
    284285    def visit_With(self, node):
    285286        self._new_line()
    286287        self._write('with ')
    287         self.visit(node.context_expr)
    288         if getattr(node, 'optional_vars', None):
    289             self._write(' as ')
    290             self.visit(node.optional_vars)
     288        items = getattr(node, 'items', None)
     289        first = True
     290        if items is None:
     291            items = [node]
     292        for item in items:
     293            if not first:
     294                self._write(', ')
     295            first = False
     296            self.visit(item.context_expr)
     297            if getattr(item, 'optional_vars', None):
     298                self._write(' as ')
     299                self.visit(item.optional_vars)
    291300        self._write(':')
    292301        self._change_indent(1)
     
    294303            self.visit(statement)
    295304        self._change_indent(-1)
    296 
    297305
    298306    if IS_PYTHON2:
     
    372380        self._change_indent(-1)
    373381
     382        if getattr(node, 'finalbody', None):
     383            self._new_line()
     384            self._write('finally:')
     385            self._change_indent(1)
     386            for statement in node.finalbody:
     387                self.visit(statement)
     388            self._change_indent(-1)
     389
     390    # New in Py3.3
     391    # Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)
     392    def visit_Try(self, node):
     393        self._new_line()
     394        self._write('try:')
     395        self._change_indent(1)
     396        for statement in node.body:
     397            self.visit(statement)
     398        self._change_indent(-1)
     399        if getattr(node, 'handlers', None):
     400            for handler in node.handlers:
     401                self.visit(handler)
     402        self._new_line()
     403        if getattr(node, 'orelse', None):
     404            self._write('else:')
     405            self._change_indent(1)
     406            for statement in node.orelse:
     407                self.visit(statement)
     408            self._change_indent(-1)
    374409        if getattr(node, 'finalbody', None):
    375410            self._new_line()
     
    767802    visit_TryExcept = _clone
    768803    visit_TryFinally = _clone
     804    visit_Try = _clone
    769805    visit_Assert = _clone
    770806    visit_ExceptHandler = _clone
  • trunk/genshi/template/tests/eval.py

    r1191 r1192  
    860860            self.assertEqual([0, 3, 4], d['results'])
    861861
     862    if sys.version_info >= (3, 3):
     863        def test_with_statement_with_multiple_items(self):
     864            fd, path = mkstemp()
     865            f = os.fdopen(fd, "w")
     866            try:
     867                f.write('foo\n')
     868                f.seek(0)
     869                f.close()
     870
     871                d = {'path': path}
     872                suite = Suite("""from __future__ import with_statement
     873lines = []
     874with open(path) as file1, open(path) as file2:
     875    for line in file1:
     876        lines.append(line)
     877    for line in file2:
     878        lines.append(line)
     879""")
     880                suite.execute(d)
     881                self.assertEqual(['foo\n', 'foo\n'], d['lines'])
     882            finally:
     883                os.remove(path)
     884
    862885
    863886def suite():
Note: See TracChangeset for help on using the changeset viewer.