3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
# File 'lib/rails_flow_map/formatters/graphviz_formatter.rb', line 3
def format(graph)
lines = ["digraph RailsFlowMap {"]
lines << " rankdir=TB;"
lines << " node [shape=box];"
lines << ""
models = graph.nodes_by_type(:model)
controllers = graph.nodes_by_type(:controller)
actions = graph.nodes_by_type(:action)
unless models.empty?
lines << " subgraph cluster_models {"
lines << " label=\"Models\";"
lines << " style=filled;"
lines << " color=lightgrey;"
lines << " node [style=filled,color=pink];"
models.each do |node|
lines << " #{node.id} [label=\"#{escape_label(node.name)}\"];"
end
lines << " }"
lines << ""
end
unless controllers.empty?
lines << " subgraph cluster_controllers {"
lines << " label=\"Controllers\";"
lines << " style=filled;"
lines << " color=lightblue;"
lines << " node [style=filled,color=lightblue];"
controllers.each do |node|
lines << " #{node.id} [label=\"#{escape_label(node.name)}\",shape=component];"
end
lines << " }"
lines << ""
end
unless actions.empty?
lines << " subgraph cluster_actions {"
lines << " label=\"Actions\";"
lines << " style=filled;"
lines << " color=lightgreen;"
lines << " node [style=filled,color=lightgreen,shape=ellipse];"
actions.each do |node|
controller_name = node.attributes[:controller] || "Unknown"
lines << " #{node.id} [label=\"#{escape_label(controller_name)}##{escape_label(node.name)}\"];"
end
lines << " }"
lines << ""
end
graph.edges.each do |edge|
from_node = graph.find_node(edge.from)
to_node = graph.find_node(edge.to)
next unless from_node && to_node
edge_attrs = format_edge_attributes(edge)
lines << " #{edge.from} -> #{edge.to} [#{edge_attrs}];"
end
lines << "}"
lines.join("\n")
end
|