Changeset 183
- Timestamp:
- 12/30/06 22:38:12 (2 years ago)
- Files:
-
- pybeast/trunk/dtest/py2py.py (modified) (8 diffs)
- pybeast/trunk/src/py2py.py (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
pybeast/trunk/dtest/py2py.py
r180 r183 20 20 def test_unary(self): 21 21 'Test unary op' 22 self.failUnless(not Styler().need_space(['Invert', 'Const'] ),22 self.failUnless(not Styler().need_space(['Invert', 'Const'], ''), 23 23 'Trying to put a space after an Invert op') 24 24 … … 26 26 'Test space after parens' 27 27 stack = ['Mul', 'Add', 'Name'] 28 self.failUnless(not Styler().need_space(stack ),28 self.failUnless(not Styler().need_space(stack, ''), 29 29 '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') 30 42 31 43 … … 55 67 'Should return enough spaces to pad until last carriage return' 56 68 spaces = Styler().add_spaces('\nm = {') 57 self.failUnless(spaces==' '* 5,69 self.failUnless(spaces==' '*6, 58 70 'Returned wrong number of spaces: %d' % len(spaces)) 59 71 … … 61 73 'This is first line, but we have stil pad correctly' 62 74 spaces = Styler().add_spaces('m = {') 63 self.failUnless(spaces==' '* 5,75 self.failUnless(spaces==' '*6, 64 76 'Returned wrong number of spaces: %d' % len(spaces)) 65 77 … … 73 85 formatter = Pep8Formatter() 74 86 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' 76 88 self.failUnless(formatter.dump()==expr, 77 89 msg % (expr, ast, formatter.dump())) 78 90 91 79 92 class Bool(Expr): 80 93 'Test empty and BoolOp expr handling' … … 96 109 self.reformat_and_test('a = 1 or 2') 97 110 111 98 112 class BinOp(Expr): 99 113 'Test BinOp expr handling' … … 209 223 # 'Test simple IfExp' 210 224 # self.reformat_and_test('x = 1 if y >= 0') 225 211 226 212 227 class Dict(Expr): … … 235 250 def test_simple(self): 236 251 'Test simple list comprehension' 237 self.reformat_and_test('[ x for x in list]')252 self.reformat_and_test('[x for x in list]') 238 253 239 254 def test_mul(self): 240 255 '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]') 242 257 243 258 def test_method_call(self): 244 259 '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]') 246 261 247 262 def test_with_if(self): 248 263 '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]') 250 265 251 266 def test_tuples(self): 252 267 '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]') 254 269 255 270 def test_two_vectors(self): 256 271 '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]') 258 273 259 274 def test_complex(self): 260 275 '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)]') 263 278 264 279 pass 265 280 281 282 class 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 266 324 267 325 if __name__ == '__main__': pybeast/trunk/src/py2py.py
r180 r183 32 32 return False 33 33 34 def need_space(self, op_stack ):34 def need_space(self, op_stack, code): 35 35 'Determines if we need to put a space before a current op' 36 36 if len(op_stack)<2: … … 42 42 43 43 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] != ',': 44 48 return False 45 49 … … 51 55 return self.space_after_parens 52 56 57 if len(code) and code[-1] in ('[', '(', ' ',): 58 return False 59 53 60 return True 54 61 … … 64 71 def add_spaces(self, code): 65 72 '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') 67 74 return ' '*num_spaces 68 75 … … 85 92 walker.dispatch(node.left) 86 93 self.code += ' %s' % code 94 if len(self.expr_ops_stack)>=2 \ 95 and self.expr_ops_stack[-2] in ('GenExprInner',): 96 self.code += ' ' 87 97 walker.dispatch(node.right) 88 98 … … 98 108 self.code = self.code[:-len(' %s' %code)] 99 109 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 100 121 def visit_unary(self, node, walker, code): 101 122 '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 103 126 walker.dispatch(node.expr) 104 127 … … 107 130 self.code += str(node.name) 108 131 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',): 110 134 self.code += ' =' 111 135 return 112 136 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 113 144 def visit_callfunc(self, node, walker): 114 145 '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): 126 147 self.code += ' ' 127 148 walker.dispatch(node.node) … … 145 166 def visit_const(self, node, *args): 146 167 '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): 148 169 self.code += ' ' 149 170 self.code += str(node.value) … … 161 182 walker.dispatch( item[1] ) 162 183 self.code += separator 163 self.code = self.code[:-1]164 184 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 { 166 188 self.code += '}' 167 189 168 190 def visit_getattr(self, node, walker): 169 191 '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) 174 207 175 208 def visit_lambda(self, node, walker): … … 211 244 walker.dispatch(node.code) 212 245 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 226 246 def visit_listcomp(self, node, walker): 227 247 'visit ListComp node' … … 230 250 for qual in node.quals: 231 251 walker.dispatch(qual) 232 self.code += ' ]'252 self.code += ']' 233 253 234 254 def visit_listcompfor(self, node, walker): … … 246 266 def visit_name(self, node, *args): 247 267 '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): 249 269 self.code += ' ' 250 270 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 += ']' 251 279 252 280 def dump(self): … … 266 294 'Invert' : lambda n, w: self.visit_unary(n, w, '~'), 267 295 '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, '()'), 268 298 'Mod' : lambda n, w: self.visit_binop(n, w, '%'), 269 299 'Mul' : lambda n, w: self.visit_binop(n, w, '*'),
