Changeset 191

Show
Ignore:
Timestamp:
01/01/07 23:41:10 (2 years ago)
Author:
akhavr
Message:

ticket:371:

  • completed, ctest passes
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • pybeast/trunk/ctest/py2py.py

    r190 r191  
    2727        original = open('.temp.original','w') 
    2828        print >> original, src 
    29         original.close 
     29        original.close() 
    3030        formatted = open('.temp.formatted','w') 
    3131        print >> formatted, formatter.dump() 
    3232        formatted.close() 
    3333        os.system('diff -uw .temp.original .temp.formatted') 
    34          
    35         msg = 'Failed to reformat \n%s\n correctly.\n AST: %s\nResult: \n%s' 
    36         self.failUnless(formatter.dump()==src
    37                         msg % (src, ast, formatter.dump())) 
     34 
     35        ast2 = compiler.parse(formatter.dump()) 
     36        self.failUnless(repr(ast)==repr(ast2)
     37                        'AST differ, original:\n%s\nNew:\n%s' % (ast, ast2)) 
    3838 
    3939    def test_complete(self): 
  • pybeast/trunk/dtest/py2py.py

    r190 r191  
    9696                        'Tried to put parens as in if(op_stack[-2]) in list') 
    9797 
     98    def test_and_the_or(self): 
     99        'Test parens around and to an or' 
     100        self.failUnless(Styler().need_parens(['And', 'Or']), 
     101                        'Failed to put parens around (a or b) and c') 
     102 
    98103 
    99104class NeedNewline(unittest.TestCase): 
     
    137142        self.failUnless(formatter.dump()==expr, 
    138143                        msg % (expr, ast, formatter.dump())) 
     144        ast2 = compiler.parse(formatter.dump()) 
     145        self.failUnless(repr(ast) == repr(ast2), 
     146                        'AST differ, original:\n%s\nNew:\n%s' % (ast, ast2)) 
    139147 
    140148 
     
    217225        'Test FloorDiv expr' 
    218226        self.reformat_and_test('a // 5') 
     227 
     228    def test_parens(self): 
     229        'Test parens' 
     230        self.reformat_and_test('(a or b) and c') 
    219231 
    220232 
     
    564576 
    565577    def test_parens(self): 
    566         'if len(x) > 1 or n.c.n != y and z:' 
    567         self.reformat_and_test('if len(node.nodes) > 1 ' 
    568                                +'or node.__class__.__name__ != \'Tuple\'
     578        'if ( len(x) > 1 or n.c.n != y ) and z:' 
     579        self.reformat_and_test('if (len(node.nodes) > 1 ' 
     580                               +'or node.__class__.__name__ != \'Tuple\')
    569581                               +'and len(node.nodes):\n    pass\n\n') 
    570582 
     
    745757 
    746758 
     759class Global(Expr): 
     760    'Test \'global\' handling' 
     761 
     762    def test_global(self): 
     763        'global x' 
     764        self.reformat_and_test('global x, y') 
     765 
     766 
     767class Exec(Expr): 
     768    'Test exec' 
     769 
     770    def test_simple(self): 
     771        'exec x + y' 
     772        self.reformat_and_test('exec x + y') 
     773 
     774    def test_locals(self): 
     775        'exec with locals' 
     776        self.reformat_and_test('exec x + y in y') 
     777 
     778    def test_globals(self): 
     779        'exec with locals and globals' 
     780        self.reformat_and_test('exec x + y in y, x') 
     781 
     782 
    747783if __name__ == '__main__': 
    748784    unittest.main() 
  • pybeast/trunk/src/py2py.py

    r190 r191  
    2828        inside_op = op_stack[-1] 
    2929        if inside_op in ('Add', 'Sub') and outside_op in ('Mul', 'Div'): 
     30            return True 
     31        if inside_op == 'Or' and outside_op == 'And': 
    3032            return True 
    3133        if outside_op == 'Compare' and inside_op not in ( 
     
    130132    def visit_generic_list(self, node, walker, code): 
    131133        'visit list join node' 
    132         for subnode in node.getChildNodes(): 
     134        need_parens_now = self.style.need_parens(self.expr_ops_stack) 
     135        self.maybe_add_space() 
     136        if need_parens_now: 
     137            self.code += '(' 
     138             
     139        for subnode in node.nodes: 
    133140            walker.dispatch(subnode) 
    134141            self.code += ' %s' % code 
    135142            continue 
     143         
    136144        self.code = self.code[:-len(' %s' %code)] 
     145        if need_parens_now: 
     146            self.code += ')' 
    137147 
    138148    def visit_function_paramlist(self, node, walker): 
     
    343353        self.code += '}' 
    344354 
     355    def visit_exec(self, node, walker): 
     356        'visit Exec node' 
     357        self.code += 'exec' 
     358        walker.dispatch(node.expr) 
     359        if not node.locals: 
     360            return 
     361        self.code += ' in' 
     362        walker.dispatch(node.locals) 
     363        if not node.globals: 
     364            return 
     365        self.code += ',' 
     366        walker.dispatch(node.globals) 
     367 
    345368    def visit_for(self, node, walker): 
    346369        'visit For statement node' 
     
    403426            for ifs in node.ifs: 
    404427                walker.dispatch(ifs) 
     428 
     429    def visit_global(self, node, walker): 
     430        'visit Global node' 
     431        self.code += 'global' 
     432        for name in node.names: 
     433            self.code += ' %s,' % name 
     434        self.code = self.code[:-1] 
    405435 
    406436    def visit_if(self, node, walker):