30
30
from ubuntuone.syncdaemon.fsm import fsm
33
34
'transform a dictionary into a label'
34
35
t = '"%s"' % "\\n".join("%s=%s" % x for x in sorted(d.items()))
37
39
def main(filename, debug=False):
38
40
'draw the state machine that is in $filename'
40
42
print "Parsing file... (%s)" % time.ctime()
41
43
machine = fsm.StateMachine(filename)
43
45
print "Building graph... (%s)" % time.ctime()
45
graph_base = u'digraph G {\n%s [label="despair"]\n%%s\n}' % id(despair)
47
graph_base = u'digraph G {\n%s [label="despair"]\n%%s\n}' % id(despair)
48
50
for state in machine.states.values():
49
51
line = "%s [label=%s]" % (id(state), dict2label(state.values))
50
52
graph_lines.append(line)
52
54
for event in machine.events.values():
53
55
for transition in event.draw_transitions:
54
if all(map(lambda x: x=="*", transition.target.values())):
56
if all(map(lambda x: x == "*", transition.target.values())):
58
60
target = machine.get_state(transition.target)
62
64
l = s2s.setdefault((fsm.hash_dict(transition.source),
63
65
fsm.hash_dict(transition.target)), [])
64
l.append( transition )
67
68
for (source, target), ts in s2s.items():
69
70
source = machine.get_state(dict(source))
70
if all(map(lambda x: x=="*", dict(target).values())):
71
if all(map(lambda x: x == "*", dict(target).values())):
73
74
target = machine.get_state(dict(target))
78
79
ps = " ".join(["%s:%s" % (k, v) for k, v in t.parameters.items()])
79
cases.append( "%s:%s" % (t.event, ps))
80
cases.append("%s:%s" % (t.event, ps))
80
81
line = '%s [label="%s", shape=box, fontsize=7]' % (
81
82
id(ts), "\\n".join(cases))
82
83
graph_lines.append(line)
84
arrow = '%s -> %s' % (
87
graph_lines.append(arrow)
88
arrow = '%s -> %s' % (
91
graph_lines.append(arrow)
85
arrow = '%s -> %s' % (
87
graph_lines.append(arrow)
88
arrow = '%s -> %s' % (
90
graph_lines.append(arrow)
93
92
dotcode = graph_base % "\n".join(graph_lines)
95
94
filename = tempfile.mkstemp(prefix='graph-', suffix='.debug')