Changeset 178
- Timestamp:
- 12/29/06 01:36:00 (2 years ago)
- Files:
-
- pybeast/trunk/Makefile (modified) (1 diff, 1 prop)
- pybeast/trunk/ctest/Makefile (modified) (1 diff, 1 prop)
- pybeast/trunk/ctest/__init__.py (modified) (1 diff, 1 prop)
- pybeast/trunk/dtest/Makefile (modified) (1 diff, 1 prop)
- pybeast/trunk/dtest/__init__.py (modified) (1 diff, 1 prop)
- pybeast/trunk/dtest/cov (modified) (1 diff, 1 prop)
- pybeast/trunk/dtest/py2py.py (modified) (3 diffs, 1 prop)
- pybeast/trunk/src/Makefile (modified) (1 diff, 1 prop)
- pybeast/trunk/src/__init__.py (modified) (1 diff, 1 prop)
- pybeast/trunk/src/py2py.py (modified) (7 diffs, 1 prop)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
pybeast/trunk/Makefile
- Property svn:keywords changed from Id to Revision
r176 r178 1 # $Id $1 # $Id: Makefile 176 2006-12-28 11:38:15Z akhavr $ 2 2 # Copyright (C) 2001-2006 KDS Software Group http://www.kds.com.ua/ 3 3 pybeast/trunk/ctest/Makefile
- Property svn:keywords changed from Id to Revision
r173 r178 1 # $Id $1 # $Id: Makefile 173 2006-12-27 18:54:01Z akhavr $ 2 2 # Copyright (C) 2001-2006 KDS Software Group 3 3 pybeast/trunk/ctest/__init__.py
- Property svn:keywords changed from Id to Revision
r175 r178 1 # $Id $1 # $Id: __init__.py 175 2006-12-28 06:37:23Z akhavr $ 2 2 # Copyright (C) 2006 KDS Software Group http://www.kds.com.ua 3 3 pybeast/trunk/dtest/Makefile
- Property svn:keywords changed from Id to Revision
r175 r178 1 # $Id $1 # $Id: Makefile 175 2006-12-28 06:37:23Z akhavr $ 2 2 # Copyright (C) 2001-2006 KDS Software Group 3 3 pybeast/trunk/dtest/__init__.py
- Property svn:keywords changed from Id to Revision
r175 r178 1 # $Id $1 # $Id: __init__.py 175 2006-12-28 06:37:23Z akhavr $ 2 2 # Copyright (C) 2006 KDS Software Group http://www.kds.com.ua 3 3 pybeast/trunk/dtest/cov
- Property svn:keywords changed from Id to Revision
r175 r178 1 1 #!/usr/bin/python 2 # $Id $2 # $Id: cov 175 2006-12-28 06:37:23Z akhavr $ 3 3 # Copyright (C) 2006 KDS Software Group http://www.kds.com.ua 4 4 pybeast/trunk/dtest/py2py.py
- Property svn:keywords changed from Id to Revision
r177 r178 1 # $Id $1 # $Id: py2py.py 177 2006-12-28 12:41:17Z akhavr $ 2 2 # Copyright (C) 2006 KDS Software Group http://www.kds.com.ua 3 3 4 '''Test src.py2py''' 5 6 from src.py2py import Pep8Formatter, walk 4 '''Test src.py2py 5 6 $Id: py2py.py 177 2006-12-28 12:41:17Z akhavr $ 7 Copyright (C) 2006 KDS Software Group http://www.kds.com.ua 8 ''' 9 10 __version__ = '$Revision$' 11 12 from src.py2py import Pep8Formatter, Styler, walk 7 13 8 14 import compiler … … 57 63 def test_add_and_mult_with_subexpr(self): 58 64 'Test combined add and mult expr' 59 self.reformat_and_test('( a + b) * c')65 self.reformat_and_test('(a + b) * c') 60 66 61 67 def test_mult_and_add_with_subexpr(self): … … 133 139 def test_with_varargs(self): 134 140 'Test lambda with varargs' 135 self.reformat_and_test('a = lambda x, y=1, *args: x + y + len( args)')141 self.reformat_and_test('a = lambda x, y=1, *args: x + y + len(args)') 136 142 137 143 def test_with_varargs_and_kw(self): 138 144 'Test lambda with varargs and kw' 139 145 self.reformat_and_test( 140 'lambda x, y=1, *args, **kw: x + y + len( args ) + len( dir( kw ))'146 'lambda x, y=1, *args, **kw: x + y + len(args) + len(dir(kw))' 141 147 ) 142 148 143 149 def test_with_just_kw(self): 144 150 'Test lambda with kw only' 145 self.reformat_and_test('lambda x, y=1, **kw: x + y + len( dir( kw ) )') 146 151 self.reformat_and_test('lambda x, y=1, **kw: x + y + len(dir(kw))') 152 153 154 # New in python 2.5, not implemented now 155 # class IfExp(Expr): 156 # 'Test IfExp reformatting' 157 158 # def test_simple(self): 159 # 'Test simple IfExp' 160 # self.reformat_and_test('x = 1 if y >= 0') 161 162 class Dict(Expr): 163 'Test Dict reformatting' 164 165 def test_simple(self): 166 'Test simple Dict expr' 167 self.reformat_and_test('a = { k : v }') 168 169 def test_twoitem(self): 170 'Test two keys Dict expr' 171 self.reformat_and_test('a = { k1 : v1, k2 : v2 }') 172 173 def test_multiline_dist(self): 174 'Test multiline multikey Dict expr' 175 self.reformat_and_test('''\ 176 m = { k1 : v1, 177 k2 : v2, 178 k3 : v3, 179 }''') 180 181 182 class NeedSpace(unittest.TestCase): 183 'Test need_space before current op function' 184 185 def test_unary(self): 186 'Test unary op' 187 self.failUnless(not Styler().need_space(['Invert', 'Const']), 188 'Trying to put a space after an Invert op') 189 190 def test_parens(self): 191 'Test space after parens' 192 stack = ['Mul', 'Add', 'Name'] 193 self.failUnless(not Styler().need_space(stack), 194 'Trying to put a space after a parens around Add op') 147 195 196 197 class NeedParens(unittest.TestCase): 198 'Test need_parens around current op' 199 200 def test_mul_the_add(self): 201 'Test parens around multiplication to an addition' 202 self.failUnless(Styler().need_parens(['Mul', 'Add']), 203 'Failed to put parens around (a + b) * c') 204 205 206 class NeedNewline(unittest.TestCase): 207 'Test need_newline' 208 209 def test_dict(self): 210 'Test need_newline if so much in the dict' 211 self.failUnless(Styler().need_newline(['Dict'], [1, 2, 3]), 212 'Failed to put newlines in the dict when there are ' 213 + 'three items') 214 215 216 class AddSpaces(unittest.TestCase): 217 'Test add_spaces' 218 219 def test_simple(self): 220 'Should return enough spaces to pad until last carriage return' 221 spaces = Styler().add_spaces('\nm = {') 222 self.failUnless(spaces==' '*5, 223 'Returned wrong number of spaces: %d' % len(spaces)) 224 225 def test_firstline(self): 226 'This is first line, but we have stil pad correctly' 227 spaces = Styler().add_spaces('m = {') 228 self.failUnless(spaces==' '*5, 229 'Returned wrong number of spaces: %d' % len(spaces)) 230 231 148 232 if __name__ == '__main__': 149 233 unittest.main() pybeast/trunk/src/Makefile
- Property svn:keywords changed from Id to Revision
r173 r178 1 # $Id $1 # $Id: Makefile 173 2006-12-27 18:54:01Z akhavr $ 2 2 # Copyright (C) 2001-2006 KDS Software Group 3 3 pybeast/trunk/src/__init__.py
- Property svn:keywords changed from Id to Revision
r175 r178 1 # $Id $1 # $Id: __init__.py 175 2006-12-28 06:37:23Z akhavr $ 2 2 # Copyright (C) 2006 KDS Software Group http://www.kds.com.ua 3 3 pybeast/trunk/src/py2py.py
- Property svn:keywords changed from Id to Revision
r177 r178 1 # $Id $1 # $Id: py2py.py 177 2006-12-28 12:41:17Z akhavr $ 2 2 # Copyright (C) 2006 KDS Software Group http://www.kds.com.ua 3 3 4 4 '''Dump python AST into a source code 5 5 6 $Id $6 $Id: py2py.py 177 2006-12-28 12:41:17Z akhavr $ 7 7 Copyright (C) 2006 KDS Software Group http://www.kds.com.ua 8 8 ''' 9 9 10 __version__ = '$Revision$' 11 10 12 import compiler 11 13 import compiler.consts 12 14 13 def need_parens(inside_op, outside_op): 14 'Determines if we need to put parens around inside_op' 15 if inside_op in ('Add', 'Sub') and outside_op in ('Mul', 'Div'): 16 return 1 17 return 0 15 16 class Styler: 17 'Sets the parens and space style' 18 19 def __init__(self): 20 self.space_after_parens = 1 21 self.space_around_callfunc = 0 22 23 def need_parens(self, op_stack): 24 'Determines if we need to put parens around inside_op' 25 if len(op_stack)<2: 26 return False 27 28 outside_op = op_stack[-2] 29 inside_op = op_stack[-1] 30 if inside_op in ('Add', 'Sub') and outside_op in ('Mul', 'Div'): 31 return True 32 return False 33 34 def need_space(self, op_stack): 35 'Determines if we need to put a space before a current op' 36 if len(op_stack)<2: 37 return True 38 39 if op_stack[-2] in ('Invert', 'Lambda', 'UnaryAdd', 'UnarySub'): 40 return False 41 42 if op_stack[-2] == 'CallFunc': 43 return False 44 45 if self.need_parens(op_stack[:-1]): 46 if self.space_after_parens: 47 self.space_after_parens = False 48 else: 49 self.space_after_parens = True 50 return self.space_after_parens 51 return True 52 53 def need_newline(self, op_stack, items): 54 'Determines if we need to put newline here' 55 if len(op_stack)<1: 56 return False 57 58 if op_stack[-1] == 'Dict' and len(items)>2: 59 return True 60 return False 61 62 def add_spaces(self, code): 63 'Returns string of spaces necessary to pad next string' 64 num_spaces = len(code) - 1 - code.rfind('\n') 65 return ' '*num_spaces 66 18 67 19 68 class Pep8Formatter: … … 23 72 self.code = '' 24 73 self.expr_ops_stack = [] 74 self.style = Styler() 25 75 26 76 def visit_binop(self, node, walker, code): 27 77 'visit BinOp node' 28 78 29 need_parens_now = False 30 31 if len(self.expr_ops_stack)>0: 32 upper_node = self.expr_ops_stack[-1] 33 need_parens_now = need_parens(node.__class__.__name__, 34 upper_node) 79 need_parens_now = self.style.need_parens(self.expr_ops_stack) 35 80 if need_parens_now: 36 81 self.code += ' (' 37 82 38 self.expr_ops_stack.append(node.__class__.__name__)39 83 walker.dispatch(node.left) 40 84 self.code += ' %s' % code 41 85 walker.dispatch(node.right) 42 self.expr_ops_stack.pop()43 86 44 87 if need_parens_now: 45 self.code += ' )'88 self.code += ')' 46 89 47 90 def visit_list(self, node, walker, code): 48 91 'visit list join node' 49 self.expr_ops_stack.append(node.__class__.__name__)50 92 for subnode in node.getChildNodes(): 51 93 walker.dispatch(subnode) … … 53 95 continue 54 96 self.code = self.code[:-len(' %s' %code)] 55 self.expr_ops_stack.pop()56 97 57 98 def visit_unary(self, node, walker, code): 58 99 'visit unary op node' 59 self.expr_ops_stack.append(node.__class__.__name__)60 100 self.code += ' %s' % code 61 101 walker.dispatch(node.expr) 62 self.expr_ops_stack.pop() 63 102 64 103 def visit_assname(self, node, *args): 65 104 'visit AssName node' … … 71 110 def visit_callfunc(self, node, walker): 72 111 'visit CallFunc node' 73 self.expr_ops_stack.append(node.__class__.__name__) 112 if self.style.need_space(self.expr_ops_stack): 113 self.code += ' ' 74 114 walker.dispatch(node.node) 75 115 self.code += '(' … … 80 120 self.code = self.code[:-2] 81 121 82 self.code += ' )' 83 self.expr_ops_stack.pop() 122 self.code += ')' 84 123 85 124 def visit_const(self, node, *args): 86 125 'visit Const node' 87 if self.expr_ops_stack[-1] not in ('Invert', 'Lambda', 'UnaryAdd', 88 'UnarySub'): 126 if self.style.need_space(self.expr_ops_stack): 89 127 self.code += ' ' 90 128 self.code += str(node.value) 129 130 def visit_dict(self, node, walker): 131 'visit Dict node' 132 self.code += ' {' 133 134 separator = ',' 135 if self.style.need_newline(self.expr_ops_stack, node.items): 136 separator += '\n' + self.style.add_spaces(self.code) 137 for item in node.items: 138 walker.dispatch( item[0] ) 139 self.code += ' :' 140 walker.dispatch( item[1] ) 141 self.code += separator 142 self.code = self.code[:-1] 143 if not self.style.need_newline(self.expr_ops_stack, node.items): 144 self.code += ' ' 145 self.code += '}' 91 146 92 147 def visit_lambda(self, node, walker): 93 148 'visit Lambda node' 94 self.expr_ops_stack.append(node.__class__.__name__)95 96 149 len_defaults = len(node.argnames) 97 150 have_varargs = node.flags & compiler.consts.CO_VARARGS … … 130 183 walker.dispatch(node.code) 131 184 132 self.expr_ops_stack.pop()133 134 185 def visit_name(self, node, *args): 135 186 'visit Name node' 136 if self.expr_ops_stack[-1] not in ('Invert', 'Lambda', 'UnaryAdd', 137 'UnarySub'): 187 if self.style.need_space(self.expr_ops_stack): 138 188 self.code += ' ' 139 189 self.code += str(node.name) … … 183 233 meth = self.visitor.map_operation(klass.__name__, self.default) 184 234 self._cache[klass] = meth 185 return meth(node, self) 235 self.visitor.expr_ops_stack.append(node.__class__.__name__) 236 res = meth(node, self) 237 self.visitor.expr_ops_stack.pop() 238 return res 186 239 187 240 def walk(ast, formatter):
