position_values = [POSITION_ABOVE, POSITION_BELOW, POSITION_SAME_LEFT, POSITION_SAME_RIGHT] direction_values = [EDGE_DIRECTION_CW, EDGE_DIRECTION_COUNTER_CW, EDGE_DIRECTION_DIRECT] if not os.path.isdir("./output"): os.mkdir("./output") for i, c in enumerate(generate_arguments_combinations(position_values, position_values, direction_values, direction_values)): try: node1 = { "name": "True", "position": c[0], "direction": c[2] } node2 = { "name": "True", "position": c[1], "direction": c[3] } commands = if_commands("if something", node1, node2) fp = open("./output/if{}.dot".format(i), "w") fp.write("digraph {\n splines=line; rank=TB;\n") fp.write("node[fillcolor=\"#006699\"; fontcolor=\"white\"; style=filled; shape=rect];\n") fp.write("\n".join(commands)) fp.write("\nlabel = \"" + c[0] + ", " + c[2] + ", secondo " + c[1] + ", " + c[3] + "\"") fp.write("}") fp.close() except ValueError as e: print("Arguments not valid: {}".format(c))
testContent = open("input/function.py").read() tree = ast.parse(testContent) commands = Flowchart() last_nodes = visit("start", tree.body, commands, [], {"print": print_format}) for node in last_nodes: commands.append("\"{}\" -> end;".format(node)) commands.add_node_attributes(fillcolor="#006699") commands.add_node_attributes(style="filled") commands.add_node_attributes(fontcolor="white") commands.add_node_attributes(shape="rect") if not os.path.isdir("./output"): os.mkdir("./output") fp = open("./output/algorithm.dot", "w") fp.write(commands.to_string()) fp.close() exit() commands1 = if_commands("if a", "clean a", "ask for b", edge_path1=EDGE_DIRECTION_CW, edge_path2=EDGE_DIRECTION_COUNTER_CW); commands2 = if_commands("if b", "clean b", "ask for c", edge_path1=EDGE_DIRECTION_CW, edge_path2=EDGE_DIRECTION_COUNTER_CW); fp = open("algorithm.dot", "w") fp.write("digraph {\n splines=line; rank=TB;\n") fp.write("node[fillcolor=\"#006699\"; fontcolor=\"white\"; style=filled; shape=rect];\n") fp.write("\n".join(commands1)) fp.write("\n".join(commands2)) fp.write("\"ask for b\" -> \"if b\"\n") fp.write("}") fp.close()
def visit_stmt(stmt, commands, filters, node_format): if isinstance(stmt, ast.If): expression = expr_to_string(stmt.test) if stmt.body and stmt.orelse: node1 = { "name": stmt_to_string(stmt.body[0]), } node2 = { "name": stmt_to_string(stmt.orelse[0]), } commands += if_commands(stmt_to_string(stmt), node1, node2) last_if_1 = visit(None, stmt.body, commands, filters, node_format) last_if_2 = visit(None, stmt.orelse, commands, filters, node_format) commands.append("\"{}\"[ label=\"{}\" ];".format(stmt_to_string(stmt), expression)) elif stmt.body: node1 = { "name": stmt_to_string(stmt.body[0]), } commands += if_commands(stmt_to_string(stmt), node1) commands.append("\"{}\"[ label=\"{}\" ];".format(stmt_to_string(stmt), expression)) last_if_1 = visit(None, stmt.body, commands, filters, node_format) last_if_2 = [stmt_to_string(stmt)] else: assert False return last_if_1 + last_if_2 elif isinstance(stmt, ast.Assign): name = "{} = {}".format(",".join(map(expr_to_string, stmt.targets)), expr_to_string(stmt.value)) commands.append("\"{}\"[ label=\"{}\" ];".format(stmt_to_string(stmt), name)) return [stmt_to_string(stmt)] elif isinstance(stmt, ast.Print): # stmt.dest # stmt.nl if "print" in node_format: label = node_format["print"](map(expr_to_string, stmt.values)) commands.append("\"{}\"[ label=\"{}\" ];".format(stmt_to_string(stmt), label)) else: label = ", ".join(map(expr_to_string, stmt.values)) commands.append("\"{}\"[ label=\"print({})\" ];".format(stmt_to_string(stmt), label)) return [stmt_to_string(stmt)] elif isinstance(stmt, ast.Import): commands.append("\"{}\"[ label=\"{}\" ];".format( stmt_to_string(stmt), "import {}".format(map(alias_to_string, stmt.names)))) return [stmt_to_string(stmt)] elif isinstance(stmt, ast.ImportFrom): # stmt.level commands.append("\"{}\"[ label=\"{}\" ];".format( stmt_to_string(stmt), "from {} import {}".format(stmt.module, map(alias_to_string, stmt.names)))) return [stmt_to_string(stmt)] elif isinstance(stmt, ast.Expr): commands.append("\"{}\" [ label=\"{}\" ];".format(stmt_to_string(stmt), expr_to_string(stmt.value).replace('"','\\"') )) return [stmt_to_string(stmt)] elif isinstance(stmt, ast.FunctionDef): print(stmt.name) if stmt.args.defaults: _args= stmt.args.args _defaults = stmt.args.defaults args_names = map(expr_to_string, _args) args_defaults = map(expr_to_string, _defaults) _args_without_defaults = ", ".join(args_names[0:len(args_defaults)]) _args_with_defaults = ", ".join("{} = {}".format(*k) for k in zip(args_names[-len(args_defaults):], args_defaults)) else: _args_without_defaults = ",".join(map(expr_to_string, stmt.args.args)) _args_with_defaults = None label = "{}({}, {}, *{}, **{})".format( stmt.name, _args_without_defaults, _args_with_defaults, stmt.args.vararg, stmt.args.kwarg) commands.append("\"{}\" [label=\"{}\"];".format(stmt_to_string(stmt), label)) print(stmt.body) print(stmt.decorator_list) return [stmt_to_string(stmt)] else: raise NotImplementedError() return [stmt_to_string(stmt)]