Class: RailsFlowMap::GraphVizFormatter

Inherits:
Object
  • Object
show all
Defined in:
lib/rails_flow_map/formatters/graphviz_formatter.rb

Instance Method Summary collapse

Instance Method Details

#format(graph) ⇒ Object



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 << ""
  
  # Group nodes by type
  models = graph.nodes_by_type(:model)
  controllers = graph.nodes_by_type(:controller)
  actions = graph.nodes_by_type(:action)
  
  # Add models subgraph
  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
  
  # Add controllers subgraph
  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
  
  # Add actions subgraph
  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
  
  # Add edges
  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