def test_generate_normal(self): stream = StringIO() printer = PythonPrinter(stream) printer.writeline("import lala") printer.writeline("for x in foo:") printer.writeline("print x") printer.writeline(None) printer.writeline("print y") assert stream.getvalue() == \ """import lala
def test_generate_adjusted(self): block = """ x = 5 +6 if x > 7: for y in range(1,5): print "<td>%s</td>" % y """ stream = StringIO() printer = PythonPrinter(stream) printer.write_indented_block(block) printer.close() #print stream.getvalue() assert stream.getvalue() == \ """
def test_backslash_line(self): block = \ """ # comment if test: if (lala + hoho) + \\ (foobar + blat) == 5: print "hi" print "more indent" """ stream = StringIO() printer = PythonPrinter(stream) printer.write_indented_block(block) printer.close() assert stream.getvalue() == \ """
def test_multi_line(self): block = \ """ if test: print ''' this is a block of stuff. this is more stuff in the block. and more block. ''' do_more_stuff(g) """ stream = StringIO() printer = PythonPrinter(stream) printer.write_indented_block(block) printer.close() #print stream.getvalue() assert stream.getvalue() == \ """
def test_false_unindentor(self): stream = StringIO() printer = PythonPrinter(stream) for line in [ "try:", "elsemyvar = 12", "if True:", "print 'hi'", None, "finally:", "dosomething", None ]: printer.writeline(line) assert stream.getvalue() == \ """try: elsemyvar = 12 if True: print 'hi' finally: dosomething """ , stream.getvalue()
def test_generate_combo(self): block = """ x = 5 +6 if x > 7: for y in range(1,5): print "<td>%s</td>" % y print "hi" print "there" foo(lala) """ stream = StringIO() printer = PythonPrinter(stream) printer.writeline("import lala") printer.writeline("for x in foo:") printer.writeline("print x") printer.write_indented_block(block) printer.writeline(None) printer.writeline("print y") printer.close() # print "->" + stream.getvalue().replace(' ', '#') + "<-" eq_( stream.getvalue(), """import lala for x in foo: print x x = 5 +6 if x > 7: for y in range(1,5): print "<td>%s</td>" % y print "hi" print "there" foo(lala) print y """, )
def test_generate_combo(self): block = \ """ x = 5 +6 if x > 7: for y in range(1,5): print "<td>%s</td>" % y print "hi" print "there" foo(lala) """ stream = StringIO() printer = PythonPrinter(stream) printer.writeline("import lala") printer.writeline("for x in foo:") printer.writeline("print x") printer.write_indented_block(block) printer.writeline(None) printer.writeline("print y") printer.close() #print "->" + stream.getvalue().replace(' ', '#') + "<-" eq_(stream.getvalue(), """import lala for x in foo: print x x = 5 +6 if x > 7: for y in range(1,5): print "<td>%s</td>" % y print "hi" print "there" foo(lala) print y """)
def __init__(self, astnode): self.buf = StringIO() visitor.walk(astnode, self) # , walker=walker())
class ExpressionGenerator(object): """given an AST node, generates an equivalent literal Python expression.""" def __init__(self, astnode): self.buf = StringIO() visitor.walk(astnode, self) # , walker=walker()) def value(self): return self.buf.getvalue() def operator(self, op, node, *args): self.buf.write('(') self.visit(node.left, *args) self.buf.write(' %s ' % op) self.visit(node.right, *args) self.buf.write(')') def booleanop(self, op, node, *args): self.visit(node.nodes[0]) for n in node.nodes[1:]: self.buf.write(' ' + op + ' ') self.visit(n, *args) def visitConst(self, node, *args): self.buf.write(repr(node.value)) def visitAssName(self, node, *args): # TODO: figure out OP_ASSIGN, other OP_s self.buf.write(node.name) def visitName(self, node, *args): self.buf.write(node.name) def visitMul(self, node, *args): self.operator('*', node, *args) def visitAnd(self, node, *args): self.booleanop('and', node, *args) def visitOr(self, node, *args): self.booleanop('or', node, *args) def visitBitand(self, node, *args): self.booleanop('&', node, *args) def visitBitor(self, node, *args): self.booleanop('|', node, *args) def visitBitxor(self, node, *args): self.booleanop('^', node, *args) def visitAdd(self, node, *args): self.operator('+', node, *args) def visitGetattr(self, node, *args): self.visit(node.expr, *args) self.buf.write('.%s' % node.attrname) def visitSub(self, node, *args): self.operator('-', node, *args) def visitNot(self, node, *args): self.buf.write('not ') self.visit(node.expr) def visitDiv(self, node, *args): self.operator('/', node, *args) def visitFloorDiv(self, node, *args): self.operator('//', node, *args) def visitSubscript(self, node, *args): self.visit(node.expr) self.buf.write('[') [self.visit(x) for x in node.subs] self.buf.write(']') def visitUnarySub(self, node, *args): self.buf.write('-') self.visit(node.expr) def visitUnaryAdd(self, node, *args): self.buf.write('-') self.visit(node.expr) def visitSlice(self, node, *args): self.visit(node.expr) self.buf.write('[') if node.lower is not None: self.visit(node.lower) self.buf.write(':') if node.upper is not None: self.visit(node.upper) self.buf.write(']') def visitDict(self, node): self.buf.write('{') c = node.getChildren() for i in range(0, len(c), 2): self.visit(c[i]) self.buf.write(': ') self.visit(c[i + 1]) if i < len(c) - 2: self.buf.write(', ') self.buf.write('}') def visitTuple(self, node): self.buf.write('(') c = node.getChildren() for i in range(0, len(c)): self.visit(c[i]) if i < len(c) - 1: self.buf.write(', ') self.buf.write(')') def visitList(self, node): self.buf.write('[') c = node.getChildren() for i in range(0, len(c)): self.visit(c[i]) if i < len(c) - 1: self.buf.write(', ') self.buf.write(']') def visitListComp(self, node): self.buf.write('[') self.visit(node.expr) self.buf.write(' ') for n in node.quals: self.visit(n) self.buf.write(']') def visitListCompFor(self, node): self.buf.write(' for ') self.visit(node.assign) self.buf.write(' in ') self.visit(node.list) for n in node.ifs: self.visit(n) def visitListCompIf(self, node): self.buf.write(' if ') self.visit(node.test) def visitCompare(self, node): self.visit(node.expr) for tup in node.ops: self.buf.write(tup[0]) self.visit(tup[1]) def visitCallFunc(self, node, *args): self.visit(node.node) self.buf.write('(') if len(node.args): self.visit(node.args[0]) for a in node.args[1:]: self.buf.write(', ') self.visit(a) self.buf.write(')')