Changeset 183

Show
Ignore:
Timestamp:
12/30/06 22:38:12 (2 years ago)
Author:
akhavr
Message:

ticket:370:

Files:

Legend:

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

    r180 r183  
    2020    def test_unary(self): 
    2121        'Test unary op' 
    22         self.failUnless(not Styler().need_space(['Invert', 'Const']), 
     22        self.failUnless(not Styler().need_space(['Invert', 'Const'], ''), 
    2323                        'Trying to put a space after an Invert op') 
    2424 
     
    2626        'Test space after parens' 
    2727        stack = ['Mul', 'Add', 'Name'] 
    28         self.failUnless(not Styler().need_space(stack), 
     28        self.failUnless(not Styler().need_space(stack, ''), 
    2929                        'Trying to put a space after a parens around Add op') 
     30 
     31    def test_after_binop(self): 
     32        'Test space after binop' 
     33        stack = ['Module', 'Stmt', 'Assign', 'Add', 'Const'] 
     34        self.failUnless(Styler().need_space(stack, 'a = a +'), 
     35                        'Failed to put a space after a binop sign') 
     36 
     37    def test_after_boolop(self): 
     38        'Test space after boolean op' 
     39        stack = ['Assign', 'And', 'Const'] 
     40        self.failUnless(Styler().need_space(stack, 'a = 1 and'), 
     41                        'Failed to put a space after boolean op sign') 
    3042         
    3143 
     
    5567        'Should return enough spaces to pad until last carriage return' 
    5668        spaces = Styler().add_spaces('\nm = {') 
    57         self.failUnless(spaces==' '*5
     69        self.failUnless(spaces==' '*6
    5870                        'Returned wrong number of spaces: %d' % len(spaces)) 
    5971 
     
    6173        'This is first line, but we have stil pad correctly' 
    6274        spaces = Styler().add_spaces('m = {') 
    63         self.failUnless(spaces==' '*5
     75        self.failUnless(spaces==' '*6
    6476                        'Returned wrong number of spaces: %d' % len(spaces)) 
    6577 
     
    7385        formatter = Pep8Formatter() 
    7486        walk(ast, formatter) 
    75         msg = 'Failed to reformat "%s" correctly.\n AST: %s\nResult: "%s"
     87        msg = 'Failed to reformat \n%s\n correctly.\n AST: %s\nResult: \n%s
    7688        self.failUnless(formatter.dump()==expr, 
    7789                        msg % (expr, ast, formatter.dump())) 
    78      
     90 
     91 
    7992class Bool(Expr): 
    8093    'Test empty and BoolOp expr handling' 
     
    96109        self.reformat_and_test('a = 1 or 2') 
    97110 
     111 
    98112class BinOp(Expr): 
    99113    'Test BinOp expr handling' 
     
    209223#         'Test simple IfExp' 
    210224#         self.reformat_and_test('x = 1 if y >= 0') 
     225 
    211226 
    212227class Dict(Expr): 
     
    235250    def test_simple(self): 
    236251        'Test simple list comprehension' 
    237         self.reformat_and_test('[ x for x in list ]') 
     252        self.reformat_and_test('[x for x in list]') 
    238253 
    239254    def test_mul(self): 
    240255        'Test multiplication in the list comprehension' 
    241         self.reformat_and_test('[ x * x for x in list ]') 
     256        self.reformat_and_test('[x * x for x in list]') 
    242257 
    243258    def test_method_call(self): 
    244259        'Test method invocation in the list comprehension' 
    245         self.reformat_and_test('[ str.strip() for str in list ]') 
     260        self.reformat_and_test('[str.strip() for str in list]') 
    246261 
    247262    def test_with_if(self): 
    248263        'Test list comprehension with if' 
    249         self.reformat_and_test('[ 3 * x for x in vec if x > 3 ]') 
     264        self.reformat_and_test('[3 * x for x in vec if x > 3]') 
    250265 
    251266    def test_tuples(self): 
    252267        'Test comprehension into tuples' 
    253         self.reformat_and_test('[ [ x, x ** 2 ] for x in vec ]') 
     268        self.reformat_and_test('[[x, x ** 2] for x in vec]') 
    254269 
    255270    def test_two_vectors(self): 
    256271        'Test comprehension for two vectors' 
    257         self.reformat_and_test('[ x * y for x in vec1 for y in vec2 ]') 
     272        self.reformat_and_test('[x * y for x in vec1 for y in vec2]') 
    258273 
    259274    def test_complex(self): 
    260275        'Test complex comprehension (example from Python docs)' 
    261         self.reformat_and_test('[ str(round( 355 / 113.0, i)) ' 
    262                                + 'for i in range(1, 6) ]') 
     276        self.reformat_and_test('[str(round(355 / 113.0, i)) ' 
     277                               + 'for i in range(1, 6)]') 
    263278         
    264279    pass 
    265      
     280 
     281 
     282class Generator(Expr): 
     283    '''Test Generators. 
     284    I put here just the examples from Python Tutorial 
     285    http://docs.python.org/tut/node11.html#SECTION00111100000000000000000 
     286    ''' 
     287 
     288    def test_1(self): 
     289        'Test sum(i*i for i in range(10))' 
     290        self.reformat_and_test('sum(i * i for i in range(10))') 
     291 
     292    def test_1_with_ifs(self): 
     293        'Test sum(i*i for i in range(10) if i%2)' 
     294        self.reformat_and_test('sum(i * i for i in range(10) if i % 2)') 
     295 
     296    def test_2(self): 
     297        'Test sum(x*y for x,y in zip(xvec, yvec))' 
     298        self.reformat_and_test('sum(x * y for x,y in zip(xvec, yvec))') 
     299 
     300    def test_3(self): 
     301        'Test sine_table = dict((x, sin(x*pi/180)) for x in range(0, 91))' 
     302        self.reformat_and_test('sine_table = dict((x, sin(x * pi / 180)) ' 
     303                               +'for x in range(0, 91))') 
     304 
     305    def test_4(self): 
     306        ''' Test 
     307        unique_words = set(word  for line in page  for word in line.split())''' 
     308        self.reformat_and_test('unique_words = set(word for line in page ' 
     309                               +'for word in line.split())') 
     310 
     311    def test_5(self): 
     312        '''Test 
     313        valedictorian = max((student.gpa, student.name) 
     314                            for student in graduates) 
     315                            ''' 
     316        self.reformat_and_test('valedictorian = max((student.gpa, student.name)' 
     317                               +' for student in graduates)') 
     318 
     319    def test_6(self): 
     320        'Test list(data[i] for i in range(len(data)-1,-1,-1))' 
     321        self.reformat_and_test('list(data[i] for i in ' 
     322                               + 'range(len(data) - 1, -1, -1))') 
     323         
    266324     
    267325if __name__ == '__main__': 
  • pybeast/trunk/src/py2py.py

    r180 r183  
    3232        return False 
    3333 
    34     def need_space(self, op_stack): 
     34    def need_space(self, op_stack, code): 
    3535        'Determines if we need to put a space before a current op' 
    3636        if len(op_stack)<2: 
     
    4242 
    4343        if op_stack[-2] == 'ListComp' and op_stack[-1] == 'CallFunc': 
     44            return False 
     45 
     46        if len(op_stack)>2 and op_stack[-3] in ('GenExprInner',) \ 
     47               and len(code) and code[-1] != ',': 
    4448            return False 
    4549 
     
    5155            return self.space_after_parens 
    5256 
     57        if len(code) and code[-1] in ('[', '(', ' ',): 
     58            return False 
     59         
    5360        return True 
    5461 
     
    6471    def add_spaces(self, code): 
    6572        'Returns string of spaces necessary to pad next string' 
    66         num_spaces = len(code) - 1 - code.rfind('\n') 
     73        num_spaces = len(code) - code.rfind('\n') 
    6774        return ' '*num_spaces 
    6875 
     
    8592        walker.dispatch(node.left) 
    8693        self.code += ' %s' % code 
     94        if len(self.expr_ops_stack)>=2 \ 
     95           and self.expr_ops_stack[-2] in ('GenExprInner',): 
     96            self.code += ' ' 
    8797        walker.dispatch(node.right) 
    8898         
     
    98108        self.code = self.code[:-len(' %s' %code)] 
    99109 
     110    def visit_sequence(self, node, walker, braket): 
     111        'visit List node' 
     112        if self.style.need_space(self.expr_ops_stack, self.code): 
     113            self.code += ' ' 
     114        self.code += braket[0] 
     115        for listnode in node.nodes: 
     116            walker.dispatch(listnode) 
     117            self.code += ',' 
     118        self.code = self.code[:-1] 
     119        self.code += braket[1] 
     120 
    100121    def visit_unary(self, node, walker, code): 
    101122        'visit unary op node' 
    102         self.code += ' %s' % code 
     123        if self.style.need_space(self.expr_ops_stack, self.code): 
     124            self.code += ' ' 
     125        self.code += code 
    103126        walker.dispatch(node.expr) 
    104127         
     
    107130        self.code += str(node.name) 
    108131        if node.flags == 'OP_ASSIGN' and \ 
    109                self.expr_ops_stack[-2] != 'ListCompFor': 
     132               self.expr_ops_stack[-2] not in ('AssTuple', 'GenExprFor', 
     133                                               'ListCompFor',): 
    110134            self.code += ' =' 
    111135        return 
    112136 
     137    def visit_asstuple(self, node, walker): 
     138        'visit AssTuple node' 
     139        for assign_node in node.nodes: 
     140            walker.dispatch(assign_node) 
     141            self.code += ',' 
     142        self.code = self.code[:-1] 
     143 
    113144    def visit_callfunc(self, node, walker): 
    114145        'visit CallFunc node' 
    115         def callfunc_in_list_comprehension(): 
    116             '''We need to handle somehow a case, described in 
    117             dtest.py2py.ListComp.test_complex''' 
    118             if len(self.expr_ops_stack)>=2 \ 
    119                    and self.expr_ops_stack[-2] == 'ListComp' \ 
    120                    and node.node.__class__.__name__ == 'Name': 
    121                 return True 
    122             return False 
    123              
    124         if self.style.need_space(self.expr_ops_stack) \ 
    125                or callfunc_in_list_comprehension(): 
     146        if self.style.need_space(self.expr_ops_stack, self.code): 
    126147            self.code += ' ' 
    127148        walker.dispatch(node.node) 
     
    145166    def visit_const(self, node, *args): 
    146167        'visit Const node' 
    147         if self.style.need_space(self.expr_ops_stack): 
     168        if self.style.need_space(self.expr_ops_stack, self.code): 
    148169            self.code += ' ' 
    149170        self.code += str(node.value) 
     
    161182            walker.dispatch( item[1] ) 
    162183            self.code += separator 
    163         self.code = self.code[:-1] 
    164184        if not self.style.need_newline(self.expr_ops_stack, node.items): 
    165             self.code += ' ' 
     185            self.code = self.code[:-1] + ' ' # replace last coma 
     186        else: 
     187            self.code = self.code[:-2] # align back to { 
    166188        self.code += '}' 
    167189 
    168190    def visit_getattr(self, node, walker): 
    169191        'visit Getattr node' 
    170         if self.style.need_space(self.expr_ops_stack): 
    171             self.code += ' ' 
    172         walker.dispatch(node.expr) 
    173         self.code += '.'+node.attrname         
     192        if self.style.need_space(self.expr_ops_stack, self.code): 
     193            self.code += ' ' 
     194        walker.dispatch(node.expr) 
     195        self.code += '.'+node.attrname 
     196 
     197    def visit_genexprfor(self, node, walker): 
     198        'visit GenExprFor node' 
     199        self.code += ' for ' 
     200        walker.dispatch(node.assign) 
     201        self.code += ' in ' 
     202        walker.dispatch(node.iter) 
     203        if len(node.ifs): 
     204            self.code += ' if' 
     205            for ifs in node.ifs: 
     206                walker.dispatch(ifs) 
    174207 
    175208    def visit_lambda(self, node, walker): 
     
    211244        walker.dispatch(node.code) 
    212245 
    213     def visit_list(self, node, walker): 
    214         'visit List node' 
    215         if self.style.need_space(self.expr_ops_stack): 
    216             self.code += ' ' 
    217         self.code += '[' 
    218         for listnode in node.nodes: 
    219             walker.dispatch(listnode) 
    220             self.code += ',' 
    221         self.code = self.code[:-1] 
    222         if self.style.need_space(self.expr_ops_stack): 
    223             self.code += ' ' 
    224         self.code += ']' 
    225  
    226246    def visit_listcomp(self, node, walker): 
    227247        'visit ListComp node' 
     
    230250        for qual in node.quals: 
    231251            walker.dispatch(qual) 
    232         self.code += ' ]' 
     252        self.code += ']' 
    233253 
    234254    def visit_listcompfor(self, node, walker): 
     
    246266    def visit_name(self, node, *args): 
    247267        'visit Name node' 
    248         if self.style.need_space(self.expr_ops_stack): 
     268        if self.style.need_space(self.expr_ops_stack, self.code): 
    249269            self.code += ' ' 
    250270        self.code += str(node.name) 
     271 
     272    def visit_subscript(self, node, walker): 
     273        'visit Subsvript node' 
     274        walker.dispatch(node.expr) 
     275        self.code += '[' 
     276        for sub in node.subs: 
     277            walker.dispatch(sub) 
     278        self.code += ']' 
    251279 
    252280    def dump(self): 
     
    266294            'Invert' : lambda n, w: self.visit_unary(n, w, '~'), 
    267295            'LeftShift' : lambda n, w: self.visit_binop(n, w, '<<'), 
     296            'List' : lambda n, w: self.visit_sequence(n, w, '[]'), 
     297            'Tuple' : lambda n, w: self.visit_sequence(n, w, '()'), 
    268298            'Mod' : lambda n, w: self.visit_binop(n, w, '%'), 
    269299            'Mul' : lambda n, w: self.visit_binop(n, w, '*'),