ruby-graphviz 1.0.7 → 1.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. data/CHANGELOG.rdoc +4 -0
  2. data/bin/dot2ruby +5 -5
  3. data/bin/gem2gv +18 -18
  4. data/bin/git2gv +20 -20
  5. data/bin/ruby2gv +26 -26
  6. data/bin/xml2gv +5 -5
  7. data/examples/sample06.rb +5 -5
  8. data/examples/sample12.rb +3 -3
  9. data/examples/sample13.rb +8 -8
  10. data/examples/sample14.rb +8 -8
  11. data/examples/sample15.rb +1 -1
  12. data/examples/sample17.rb +7 -7
  13. data/examples/sample19.rb +10 -10
  14. data/examples/sample20.rb +2 -2
  15. data/examples/sample21.rb +1 -1
  16. data/examples/sample28.rb +1 -1
  17. data/examples/sample31.rb +1 -1
  18. data/examples/sample33.rb +10 -10
  19. data/examples/sample34.rb +1 -1
  20. data/examples/sample35.rb +7 -7
  21. data/examples/sample36.rb +2 -2
  22. data/examples/sample40.rb +4 -4
  23. data/examples/sample44.rb +72 -72
  24. data/examples/sample45.rb +4 -4
  25. data/examples/sample48.rb +7 -7
  26. data/examples/sample50.rb +1 -1
  27. data/examples/sample52.rb +2 -2
  28. data/examples/sample53.rb +2 -2
  29. data/examples/sample54.rb +3 -3
  30. data/examples/sample60.rb +2 -2
  31. data/examples/sample61.rb +2 -2
  32. data/examples/sample62.rb +2 -2
  33. data/examples/sample99.rb +15 -15
  34. data/examples/theory/pert.rb +2 -2
  35. data/examples/theory/tests.rb +2 -2
  36. data/lib/graphviz.rb +140 -140
  37. data/lib/graphviz/attrs.rb +6 -11
  38. data/lib/graphviz/constants.rb +35 -35
  39. data/lib/graphviz/core_ext.rb +1 -1
  40. data/lib/graphviz/dot2ruby.rb +7 -7
  41. data/lib/graphviz/dsl.rb +5 -5
  42. data/lib/graphviz/edge.rb +13 -13
  43. data/lib/graphviz/elements.rb +5 -5
  44. data/lib/graphviz/ext.rb +1 -1
  45. data/lib/graphviz/family_tree.rb +15 -15
  46. data/lib/graphviz/family_tree/couple.rb +11 -11
  47. data/lib/graphviz/family_tree/generation.rb +6 -6
  48. data/lib/graphviz/family_tree/person.rb +13 -13
  49. data/lib/graphviz/graphml.rb +39 -39
  50. data/lib/graphviz/math/matrix.rb +23 -23
  51. data/lib/graphviz/node.rb +8 -8
  52. data/lib/graphviz/nothugly.rb +3 -3
  53. data/lib/graphviz/theory.rb +8 -8
  54. data/lib/graphviz/types.rb +3 -3
  55. data/lib/graphviz/types/arrow_type.rb +3 -3
  56. data/lib/graphviz/types/color.rb +2 -2
  57. data/lib/graphviz/types/color_list.rb +2 -2
  58. data/lib/graphviz/types/esc_string.rb +2 -2
  59. data/lib/graphviz/types/gv_bool.rb +3 -3
  60. data/lib/graphviz/types/gv_double.rb +3 -3
  61. data/lib/graphviz/types/html_string.rb +2 -2
  62. data/lib/graphviz/types/lbl_string.rb +2 -2
  63. data/lib/graphviz/types/rect.rb +2 -2
  64. data/lib/graphviz/types/spline_type.rb +9 -9
  65. data/lib/graphviz/utils.rb +13 -13
  66. data/lib/graphviz/utils/colors.rb +35 -35
  67. data/lib/graphviz/xml.rb +24 -24
  68. data/setup.rb +4 -4
  69. data/test/test_graph.rb +9 -9
  70. data/test/test_subgraph.rb +1 -1
  71. data/test/test_theory.rb +4 -4
  72. data/test/test_utils_colors.rb +4 -4
  73. metadata +2 -2
data/examples/sample45.rb CHANGED
@@ -12,10 +12,10 @@ end
12
12
 
13
13
  g.node["shape"] = "ellipse"
14
14
 
15
- [ "box", "polygon", "ellipse", "circle", "point",
16
- "egg", "triangle", "plaintext", "diamond", "trapezium",
17
- "parallelogram", "house", "pentagon", "hexagon", "septagon", "octagon", "doublecircle",
18
- "doubleoctagon", "tripleoctagon", "invtriangle", "invtrapezium", "invhouse",
15
+ [ "box", "polygon", "ellipse", "circle", "point",
16
+ "egg", "triangle", "plaintext", "diamond", "trapezium",
17
+ "parallelogram", "house", "pentagon", "hexagon", "septagon", "octagon", "doublecircle",
18
+ "doubleoctagon", "tripleoctagon", "invtriangle", "invtrapezium", "invhouse",
19
19
  "Mdiamond", "Msquare", "Mcircle", "rect", "rectangle", "none", "note", "tab", "folder",
20
20
  "box3d", "component" ].each { |s|
21
21
  g.add_nodes( s, "shape" => s )
data/examples/sample48.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # http://www.graphviz.org/Gallery/directed/cluster.html
2
- #
2
+ #
3
3
  # digraph G {
4
- #
4
+ #
5
5
  # subgraph cluster_0 {
6
6
  # style=filled;
7
7
  # color=lightgrey;
@@ -9,7 +9,7 @@
9
9
  # a0 -> a1 -> a2 -> a3;
10
10
  # label = "process #1";
11
11
  # }
12
- #
12
+ #
13
13
  # subgraph cluster_1 {
14
14
  # node [style=filled];
15
15
  # b0 -> b1 -> b2 -> b3;
@@ -23,7 +23,7 @@
23
23
  # a3 -> a0;
24
24
  # a3 -> end;
25
25
  # b3 -> end;
26
- #
26
+ #
27
27
  # start [shape=Mdiamond];
28
28
  # end [shape=Msquare];
29
29
  # }
@@ -40,14 +40,14 @@ GraphViz.new( :G, :type => :digraph ) { |g|
40
40
  c.a0 << c.a1 << c.a2 << c.a3
41
41
  c[:label] = "process #1"
42
42
  }
43
-
43
+
44
44
  g.cluster_1 { |c|
45
45
  c.node[:style] = :filled
46
46
  c.b0 << c.b1 << c.b2 << c.b3
47
47
  c[:label] = "process #1"
48
48
  c[:color] = :blue
49
49
  }
50
-
50
+
51
51
  g.start << g.cluster_0.a0
52
52
  g.start << g.cluster_1.b0
53
53
  g.cluster_0.a1 << g.cluster_1.b3
@@ -55,7 +55,7 @@ GraphViz.new( :G, :type => :digraph ) { |g|
55
55
  g.cluster_0.a3 << g.cluster_0.a0
56
56
  g.cluster_0.a3 << g._end
57
57
  g.cluster_1.b3 << g._end
58
-
58
+
59
59
  g.start[:shape] = :Mdiamond
60
60
  g._end[:label] = "end"
61
61
  g._end[:shape] = :Mdiamond
data/examples/sample50.rb CHANGED
@@ -5,7 +5,7 @@
5
5
  # ratio = "auto" ;
6
6
  # mincross = 2.0 ;
7
7
  # label = "Pedigree Lion_Share" ;
8
- #
8
+ #
9
9
  # "001" [shape=box , regular=1,style=filled,fillcolor=white ] ;
10
10
  # "002" [shape=box , regular=1,style=filled,fillcolor=white ] ;
11
11
  # "003" [shape=circle , regular=1,style=filled,fillcolor=white ] ;
data/examples/sample52.rb CHANGED
@@ -19,7 +19,7 @@
19
19
  # green1->gy1;
20
20
  # yellow1->yr1;
21
21
  # red1->rg1;
22
- #
22
+ #
23
23
  # overlap=false
24
24
  # label="PetriNet Model TrafficLights\nExtracted from ConceptBase and layed out by Graphviz"
25
25
  # fontsize=12;
@@ -38,7 +38,7 @@ GraphViz::new( "TrafficLights", :type => :digraph ) { |g|
38
38
  g.green1.set { |n| n[:shape] = :circle; n[:fixedsize] = :true; n[:width] = 0.9 }
39
39
  g.yellow1.set { |n| n[:shape] = :circle; n[:fixedsize] = :true; n[:width] = 0.9 }
40
40
  g.red1.set { |n| n[:shape] = :circle; n[:fixedsize] = :true; n[:width] = 0.9 }
41
-
41
+
42
42
  g.gy2 << g.yellow2
43
43
  g.rg2 << g.green2
44
44
  g.yr2 << g.safe1
data/examples/sample53.rb CHANGED
@@ -5,7 +5,7 @@ tree = GraphViz::FamilyTree.new do
5
5
  generation do
6
6
  benoist.is_a_man( "Benoist" )
7
7
  nathalie.is_a_woman( "Nathalie" )
8
-
8
+
9
9
  benoist.is_maried_with nathalie
10
10
  end
11
11
 
@@ -14,7 +14,7 @@ tree = GraphViz::FamilyTree.new do
14
14
  amelie.is_a_woman( "Amelie" )
15
15
  clement.is_a_man( "Clement" )
16
16
  gregoire.is_a_man( "Gregoire" )
17
-
17
+
18
18
  muriel.is_a_woman( "Muriel" )
19
19
 
20
20
  gregoire.is_maried_with muriel
data/examples/sample54.rb CHANGED
@@ -6,10 +6,10 @@ class Array
6
6
  ## Solution #1 by greg
7
7
  # self.push(r = self.shift)
8
8
  # return r
9
-
9
+
10
10
  ## Solution #2 by madx
11
11
  # shift.tap {|e| push e }
12
-
12
+
13
13
  ## Solution #3 by greg
14
14
  push(shift)[-1]
15
15
  end
@@ -22,5 +22,5 @@ GraphViz.graph( :G, :use => :neato ) { |g|
22
22
  (1..5).each do |y|
23
23
  g.add_nodes( "n#{x}x#{y}", :pos => "#{x},#{y}!", :shape => type.rotate )
24
24
  end
25
- end
25
+ end
26
26
  }.output( :png => "#{$0}.png" )
data/examples/sample60.rb CHANGED
@@ -3,10 +3,10 @@
3
3
  $:.unshift( "../lib" );
4
4
  require "graphviz"
5
5
 
6
- asm = GraphViz::new( "My ASM" )
6
+ asm = GraphViz::new( "My ASM" )
7
7
 
8
8
  my = asm.add_nodes("My")
9
9
  asmn = asm.add_nodes("ASM")
10
- asm.add_edges(my, asmn)
10
+ asm.add_edges(my, asmn)
11
11
 
12
12
  asm.output( :png => "#{$0}.png" )
data/examples/sample61.rb CHANGED
@@ -3,10 +3,10 @@
3
3
  $:.unshift( "../lib" );
4
4
  require "graphviz"
5
5
 
6
- asm = GraphViz::new( "" )
6
+ asm = GraphViz::new( "" )
7
7
 
8
8
  my = asm.add_nodes("My")
9
9
  asmn = asm.add_nodes("ASM")
10
- asm.add_edges(my, asmn)
10
+ asm.add_edges(my, asmn)
11
11
 
12
12
  asm.output( :png => "#{$0}.png" )
data/examples/sample62.rb CHANGED
@@ -3,11 +3,11 @@
3
3
  $:.unshift( "../lib" );
4
4
  require "graphviz"
5
5
 
6
- hello_world = GraphViz::new( "" )
6
+ hello_world = GraphViz::new( "" )
7
7
 
8
8
  hello = hello_world.add_nodes("Hello")
9
9
  world = hello_world.add_nodes("World")
10
- hello_world.add_edges(hello, world)
10
+ hello_world.add_edges(hello, world)
11
11
 
12
12
  # final_graph = GraphViz.parse_string( hello_world.output( :dot => String ) )
13
13
  # final_graph.each_node do |_, node|
data/examples/sample99.rb CHANGED
@@ -5,53 +5,53 @@ tree = GraphViz::FamilyTree.new do
5
5
  generation do
6
6
  chantale.is_a_woman( "Chantale" )
7
7
  jacques.is_a_man( "Jacques" )
8
-
8
+
9
9
  jacques.is_dead
10
10
  jacques.is_maried_with chantale
11
-
11
+
12
12
  rose.is_a_woman( "Rose Marie" )
13
13
  andre.is_a_man( "Andre" )
14
-
14
+
15
15
  andre.is_maried_with rose
16
16
  andre.is_dead
17
17
  end
18
-
18
+
19
19
  generation do
20
20
  benoist.is_a_man( "Benoist" )
21
21
  nathalie.is_a_woman( "Nathalie" )
22
-
22
+
23
23
  benoist.is_maried_with nathalie
24
-
24
+
25
25
  michel.is_a_man( "Michel" )
26
26
  brigitte.is_a_woman( "Brigitte" )
27
-
27
+
28
28
  michel.is_maried_with brigitte
29
29
  end
30
-
30
+
31
31
  couple( chantale, jacques ).kids( nathalie )
32
32
  couple( rose, andre ).kids( benoist )
33
-
33
+
34
34
  generation do
35
35
  charlotte.is_a_woman( "Charlotte" )
36
36
  amelie.is_a_woman( "Amelie" )
37
37
  clement.is_a_man( "Clement" )
38
38
  gregoire.is_a_man( "Gregoire" )
39
-
39
+
40
40
  muriel.is_a_woman( "Muriel" )
41
41
  gilles.is_a_man( "Gilles" )
42
-
42
+
43
43
  morgane.is_a_woman( "Morgane" )
44
44
  gregoire.is_divorced_with morgane
45
45
 
46
46
  pascal.is_a_man( "Pascal" )
47
47
  muriel.is_divorced_with pascal
48
48
 
49
- gregoire.is_maried_with muriel
49
+ gregoire.is_maried_with muriel
50
50
  end
51
-
51
+
52
52
  couple( michel, brigitte ).kids( muriel, gilles )
53
53
  couple( benoist, nathalie ).kids( charlotte, amelie, clement, gregoire )
54
-
54
+
55
55
  generation do
56
56
  arthur.is_a_boy( "Arthur" )
57
57
  colyne.is_a_girl( "Colyne" )
@@ -60,7 +60,7 @@ tree = GraphViz::FamilyTree.new do
60
60
  enaitz.is_a_boy( "Enaitz" )
61
61
  milo.is_a_boy( "Milo" )
62
62
  end
63
-
63
+
64
64
  couple( gregoire, morgane ).kids( arthur, colyne, benedict )
65
65
  couple( gregoire, muriel ).kids( maia )
66
66
  couple( muriel, pascal ).kids( milo )
@@ -4,7 +4,7 @@ require 'graphviz/theory'
4
4
 
5
5
  g = GraphViz.digraph( "G", :path => "/usr/local/bin", :use => "fdp" ) do |g|
6
6
  g.node[:shape => "record"]
7
-
7
+
8
8
  g.start[:label => "Start"]
9
9
  g.task_1[:label => "Task #1 - Duration : 4d"]
10
10
  g.task_2[:label => "Task #2 - Duration : 5.25d"]
@@ -14,7 +14,7 @@ g = GraphViz.digraph( "G", :path => "/usr/local/bin", :use => "fdp" ) do |g|
14
14
  g.task_6[:label => "Task #6 - Duration : 4.5d"]
15
15
  g.task_7[:label => "Task #7 - Duration : 5.17d"]
16
16
  g.finish[:label => "End"]
17
-
17
+
18
18
  (g.start << g.task_1)[:weight => 0.0]
19
19
  (g.start << g.task_2)[:weight => 0.0]
20
20
  (g.task_1 << g.task_3)[:weight => 4.0]
@@ -9,7 +9,7 @@ g = GraphViz.digraph( "G", :path => "/usr/local/bin" ) do |g|
9
9
  g.d[:label => "4"]
10
10
  g.e[:label => "5"]
11
11
  g.f[:label => "6"]
12
-
12
+
13
13
  # g.a << g.a
14
14
  g.a << g.b
15
15
  g.a << g.d
@@ -82,6 +82,6 @@ rrr = t.critical_path
82
82
  print "\tPath "; p rrr[:path]
83
83
  puts "\tDistance : #{rrr[:distance]}"
84
84
 
85
- t.pagerank.each { |node, rank|
85
+ t.pagerank.each { |node, rank|
86
86
  puts "Pagerank for node #{node.id} = #{rank}"
87
87
  }
data/lib/graphviz.rb CHANGED
@@ -1,15 +1,15 @@
1
1
  # Copyright (C) 2003 - 2012 Gregoire Lejeune <gregoire.lejeune@free.fr>
2
- #
2
+ #
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
5
5
  # the Free Software Foundation; either version 2 of the License, or
6
6
  # (at your option) any later version.
7
- #
7
+ #
8
8
  # This program is distributed in the hope that it will be useful,
9
9
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
10
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
11
  # GNU General Public License for more details.
12
- #
12
+ #
13
13
  # You should have received a copy of the GNU General Public License
14
14
  # along with this program; if not, write to the Free Software
15
15
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@@ -35,7 +35,7 @@ if /^1.8/.match RUBY_VERSION
35
35
  $KCODE = "UTF8"
36
36
  end
37
37
 
38
- class GraphViz
38
+ class GraphViz
39
39
  include Constants
40
40
  include GVUtils
41
41
 
@@ -60,7 +60,7 @@ class GraphViz
60
60
  ## Var: External libraries
61
61
  @@extlibs = []
62
62
  @extlibs
63
-
63
+
64
64
  ## Var: Graph name
65
65
  @name
66
66
 
@@ -72,7 +72,7 @@ class GraphViz
72
72
  # This accessor allow you to set global graph attributes
73
73
  attr_accessor :graph
74
74
  alias_method :graph_attrs, :graph
75
-
75
+
76
76
  # This accessor allow you to set global nodes attributes
77
77
  attr_accessor :node
78
78
  alias_method :node_attrs, :node
@@ -82,7 +82,7 @@ class GraphViz
82
82
  alias_method :edge_attrs, :edge
83
83
 
84
84
  @elements_order
85
-
85
+
86
86
  #<b>DEPRECATED</b> please use GraphViz#add_nodes
87
87
  def add_node( xNodeName, hOpts = {} )
88
88
  warn "GraphViz#add_node is deprecated, please use GraphViz#add_nodes"
@@ -94,7 +94,7 @@ class GraphViz
94
94
  # In:
95
95
  # * xNodeName : Name of the new node
96
96
  # * hOpts : Node attributes
97
- #
97
+ #
98
98
  # Return the GraphViz::Node object created
99
99
  def add_nodes(node_name, options = {})
100
100
  if node_name.kind_of? Array
@@ -110,10 +110,10 @@ class GraphViz
110
110
  options[:label] = node_name
111
111
  end
112
112
 
113
- @elements_order.push( {
114
- "type" => "node",
113
+ @elements_order.push( {
114
+ "type" => "node",
115
115
  "name" => node_name,
116
- "value" => @hoNodes[node_name]
116
+ "value" => @hoNodes[node_name]
117
117
  } )
118
118
 
119
119
  node = @hoNodes[node_name]
@@ -130,14 +130,14 @@ class GraphViz
130
130
  # Return the node object for the given name (or nil) in the current graph
131
131
  def get_node( xNodeName, &block )
132
132
  node = @hoNodes[xNodeName] || nil
133
-
134
- yield( node ) if( block and node.nil? == false )
135
-
133
+
134
+ yield( node ) if( block and node )
135
+
136
136
  return node
137
137
  end
138
138
 
139
139
  # Returns the first node found in the entire graph, starting from the root graph
140
- def find_node(name)
140
+ def find_node(name)
141
141
  root = root_graph
142
142
  return root.search_node(name)
143
143
  end
@@ -152,7 +152,7 @@ class GraphViz
152
152
  }
153
153
  return nil
154
154
  end
155
-
155
+
156
156
  #
157
157
  # Return the node object for the given index
158
158
  #
@@ -160,7 +160,7 @@ class GraphViz
160
160
  element = @elements_order[index, "node"]
161
161
  (element.nil?) ? nil : element["value"]
162
162
  end
163
-
163
+
164
164
  #
165
165
  # Allow you to traverse nodes
166
166
  #
@@ -173,12 +173,12 @@ class GraphViz
173
173
  return( @hoNodes )
174
174
  end
175
175
  end
176
-
176
+
177
177
  # Get the number of nodes
178
178
  def node_count
179
179
  @hoNodes.size
180
180
  end
181
-
181
+
182
182
  #<b>DEPRECATED</b> please use GraphViz#add_edges
183
183
  def add_edge( oNodeOne, oNodeTwo, hOpts = {} )
184
184
  warn "GraphViz#add_edge is deprecated, please use GraphViz#add_edges"
@@ -186,14 +186,14 @@ class GraphViz
186
186
  end
187
187
 
188
188
  # Create a new edge
189
- #
189
+ #
190
190
  # In:
191
191
  # * node_one : First node (or node list)
192
192
  # * node_two : Second Node (or node list)
193
193
  # * options : Edge attributes
194
194
  def add_edges( node_one, node_two, options = {} )
195
-
196
- if( node_one.class == Array )
195
+
196
+ if( node_one.class == Array )
197
197
  node_one.each do |no|
198
198
  add_edges( no, node_two, options )
199
199
  end
@@ -205,17 +205,17 @@ class GraphViz
205
205
  else
206
206
  edge = GraphViz::Edge::new( node_one, node_two, self )
207
207
  edge.index = @elements_order.size_of( "edge" )
208
-
208
+
209
209
  options.each do |xKey, xValue|
210
210
  edge[xKey.to_s] = xValue
211
211
  end
212
-
213
- @elements_order.push( {
214
- "type" => "edge",
212
+
213
+ @elements_order.push( {
214
+ "type" => "edge",
215
215
  "value" => edge
216
216
  } )
217
217
  @loEdges.push( edge )
218
-
218
+
219
219
  return( edge )
220
220
  end
221
221
  end
@@ -233,14 +233,14 @@ class GraphViz
233
233
  return @loEdges
234
234
  end
235
235
  end
236
-
236
+
237
237
  #
238
238
  # Get the number of edges
239
239
  #
240
240
  def edge_count
241
241
  @loEdges.size
242
242
  end
243
-
243
+
244
244
  #
245
245
  # Return the edge object for the given index
246
246
  #
@@ -248,21 +248,21 @@ class GraphViz
248
248
  element = @elements_order[index, "edge"]
249
249
  (element.nil?) ? nil : element["value"]
250
250
  end
251
-
252
- #
251
+
252
+ #
253
253
  # Create a new graph
254
- #
254
+ #
255
255
  # In:
256
256
  # * xGraphName : Graph name
257
257
  # * hOpts : Graph attributes
258
258
  #
259
259
  def add_graph( xGraphName = nil, hOpts = {}, &block )
260
- if xGraphName.kind_of?(GraphViz)
260
+ if xGraphName.kind_of?(GraphViz)
261
261
  xGraphID = xGraphName.id
262
262
  @hoGraphs[xGraphID] = xGraphName.clone
263
263
  @hoGraphs[xGraphID].type = @oGraphType
264
264
  @hoGraphs[xGraphID].pg = self
265
- xGraphName = xGraphID
265
+ xGraphName = xGraphID
266
266
  else
267
267
  if xGraphName.kind_of?(Hash)
268
268
  hOpts = xGraphName
@@ -283,10 +283,10 @@ class GraphViz
283
283
  end
284
284
  end
285
285
 
286
- @elements_order.push( {
287
- "type" => "graph",
286
+ @elements_order.push( {
287
+ "type" => "graph",
288
288
  "name" => xGraphName,
289
- "value" => @hoGraphs[xGraphID]
289
+ "value" => @hoGraphs[xGraphID]
290
290
  } )
291
291
 
292
292
  return( @hoGraphs[xGraphID] )
@@ -297,12 +297,12 @@ class GraphViz
297
297
  #
298
298
  def get_graph( xGraphName, &block )
299
299
  graph = @hoGraphs[xGraphName] || nil
300
-
301
- yield( graph ) if( block and graph.nil? == false )
302
-
300
+
301
+ yield( graph ) if( block and graph )
302
+
303
303
  return graph
304
304
  end
305
-
305
+
306
306
  #
307
307
  # Allow you to traverse graphs
308
308
  #
@@ -315,7 +315,7 @@ class GraphViz
315
315
  return @hoGraphs
316
316
  end
317
317
  end
318
-
318
+
319
319
  #
320
320
  # Add nodes and edges defined by a Hash
321
321
  #
@@ -324,9 +324,9 @@ class GraphViz
324
324
  h.each do |node, data|
325
325
  add_hash_edge(node, data)
326
326
  end
327
- end
327
+ end
328
328
  end
329
-
329
+
330
330
  #
331
331
  # Return the graph type (graph digraph)
332
332
  #
@@ -336,51 +336,51 @@ class GraphViz
336
336
  def type=(x) #:nodoc:
337
337
  @oGraphType = x
338
338
  end
339
-
339
+
340
340
  #
341
341
  # Get the number of graphs
342
342
  #
343
343
  def graph_count
344
344
  @hoGraphs.size
345
345
  end
346
-
346
+
347
347
  def method_missing( idName, *args, &block ) #:nodoc:
348
348
  xName = idName.id2name
349
-
349
+
350
350
  rCod = nil
351
-
351
+
352
352
  if block
353
353
  # Creating a cluster named '#{xName}'
354
354
  rCod = add_graph( xName, args[0]||{} )
355
355
  yield( rCod )
356
356
  else
357
- # Create a node named '#{xName}' or search for a node, edge or cluster
357
+ # Create a node named '#{xName}' or search for a node, edge or cluster
358
358
  if @hoNodes.keys.include?( xName )
359
359
  if( args[0] )
360
360
  return { xName => args[0] }
361
361
  else
362
- return( @hoNodes[xName] )
362
+ return( @hoNodes[xName] )
363
363
  end
364
364
  end
365
365
  return( @hoGraphs[xName] ) if @hoGraphs.keys.include?( xName )
366
-
366
+
367
367
  rCod = add_nodes( xName, args[0]||{} )
368
368
  end
369
369
 
370
370
  return rCod
371
371
  end
372
-
373
- #
372
+
373
+ #
374
374
  # Set value +xValue+ to the graph attribute +xAttrName+
375
- #
375
+ #
376
376
  def []=( xAttrName, xValue )
377
377
  xValue = xValue.to_s if xValue.class == Symbol
378
378
  @graph[xAttrName] = xValue
379
379
  end
380
380
 
381
- #
381
+ #
382
382
  # Get the value of the graph attribute +xAttrName+
383
- #
383
+ #
384
384
  def []( xAttrName )
385
385
  if Hash === xAttrName
386
386
  xAttrName.each do |key, value|
@@ -390,9 +390,9 @@ class GraphViz
390
390
  return( @graph[xAttrName].clone )
391
391
  end
392
392
  end
393
-
393
+
394
394
  #
395
- # Calls block once for each attribute of the graph, passing the name and value to the
395
+ # Calls block once for each attribute of the graph, passing the name and value to the
396
396
  # block as a two-element array.
397
397
  #
398
398
  def each_attribute(&b)
@@ -404,10 +404,10 @@ class GraphViz
404
404
  warn "`GraphViz#each_attribut` is deprecated, please use `GraphViz#each_attribute`"
405
405
  each_attribute(&b)
406
406
  end
407
-
408
- #
407
+
408
+ #
409
409
  # Generate the graph
410
- #
410
+ #
411
411
  # Options :
412
412
  # * :output : Output format (Constants::FORMATS)
413
413
  # * :file : Output file name
@@ -421,7 +421,7 @@ class GraphViz
421
421
  # * 0 = Error + Warning
422
422
  # * 1 = Error
423
423
  # * 2 = none
424
- #
424
+ #
425
425
  def output( hOpts = {} )
426
426
  xDOTScript = ""
427
427
  xLastType = nil
@@ -430,21 +430,21 @@ class GraphViz
430
430
  lNotHugly = []
431
431
 
432
432
  @elements_order.each { |kElement|
433
- if xLastType.nil? == true or xLastType != kElement["type"]
434
-
435
- if xData.length > 0
433
+ if xLastType.nil? or xLastType != kElement["type"]
434
+
435
+ if xData.length > 0
436
436
  case xLastType
437
437
  when "graph_attr"
438
438
  xDOTScript << " " + xData + ";\n"
439
-
439
+
440
440
  when "node_attr"
441
441
  xDOTScript << " node [" + xData + "];\n"
442
-
442
+
443
443
  when "edge_attr"
444
444
  xDOTScript << " edge [" + xData + "];\n"
445
445
  end
446
446
  end
447
-
447
+
448
448
  xSeparator = ""
449
449
  xData = ""
450
450
  end
@@ -452,7 +452,7 @@ class GraphViz
452
452
  xLastType = kElement["type"]
453
453
 
454
454
  #Modified by
455
- #Brandon Coleman
455
+ #Brandon Coleman
456
456
  #verify value is NOT NULL
457
457
  if kElement["value"] == nil then
458
458
  raise ArgumentError, "#{kElement["name"]} has a nil value!"
@@ -484,33 +484,33 @@ class GraphViz
484
484
  raise ArgumentError, "Don't know what to do with element type '#{kElement['type']}'"
485
485
  end
486
486
  }
487
-
488
- if xData.length > 0
487
+
488
+ if xData.length > 0
489
489
  case xLastType
490
490
  when "graph_attr"
491
491
  xDOTScript << " " + xData + ";\n"
492
492
 
493
493
  when "node_attr"
494
494
  xDOTScript << " node [" + xData + "];\n"
495
-
495
+
496
496
  when "edge_attr"
497
497
  xDOTScript << " edge [" + xData + "];\n"
498
498
  end
499
499
  end
500
500
  xDOTScript << "}"
501
501
 
502
- if @oParentGraph.nil? == false
502
+ if @oParentGraph
503
503
  xDOTScript = "subgraph #{GraphViz.escape(@name, :unquote_empty => true)} {\n" << xDOTScript
504
504
 
505
505
  return( xDOTScript )
506
506
  else
507
507
  hOutput = {}
508
-
508
+
509
509
  hOpts.each do |xKey, xValue|
510
510
  xValue = xValue.to_s unless xValue.nil? or [Class, TrueClass, FalseClass].include?(xValue.class)
511
511
  case xKey.to_s
512
512
  when "use"
513
- if PROGRAMS.index( xValue ).nil? == true
513
+ if PROGRAMS.index( xValue ).nil?
514
514
  raise ArgumentError, "can't use '#{xValue}'"
515
515
  end
516
516
  @prog = xValue
@@ -559,21 +559,21 @@ class GraphViz
559
559
  @nothugly = false
560
560
  end
561
561
  else
562
- if FORMATS.index( xKey.to_s ).nil? == true
562
+ if FORMATS.index( xKey.to_s ).nil?
563
563
  raise ArgumentError, "output format '#{xValue}' invalid"
564
564
  end
565
565
  hOutput[xKey.to_s] = xValue
566
566
  end
567
567
  end
568
-
568
+
569
569
  @output = hOutput if hOutput.size > 0
570
-
570
+
571
571
  xStict = ((@strict && @oGraphType == "digraph") ? "strict " : "")
572
572
  xDOTScript = ("#{xStict}#{@oGraphType} #{GraphViz.escape(@name, :unquote_empty => true)} {\n" << xDOTScript).gsub( "\0", "" )
573
573
 
574
574
  xOutputString = (@filename == String ||
575
575
  @output.any? {|format, file| file == String })
576
-
576
+
577
577
  xOutput = ""
578
578
  if @format.to_s == "none" or @output.any? {|fmt, fn| fmt.to_s == "none"}
579
579
  if xOutputString
@@ -585,13 +585,13 @@ class GraphViz
585
585
  end
586
586
  end
587
587
  end
588
-
588
+
589
589
  if (@format.to_s != "none" and not @format.nil?) or (@output.any? {|format, file| format != "none" } and @output.size > 0)
590
590
  ## Act: Save script and send it to dot
591
591
  t = Tempfile::open( File.basename(__FILE__) )
592
592
  t.print( xDOTScript )
593
593
  t.close
594
-
594
+
595
595
  cmd = find_executable( @prog, @path )
596
596
  if cmd == nil
597
597
  raise StandardError, "GraphViz not installed or #{@prog} not in PATH. Install GraphViz or use the 'path' option"
@@ -617,27 +617,27 @@ class GraphViz
617
617
  xOutputWithFile << "-T#{format} -o#{file} "
618
618
  end
619
619
  end
620
-
620
+
621
621
  xExternalLibraries = ""
622
622
  @extlibs.each do |lib|
623
623
  xExternalLibraries << "-l#{lib} "
624
624
  end
625
-
626
- xOtherOptions = ""
625
+
626
+ xOtherOptions = ""
627
627
  xOtherOptions += " -s#{@scale}" unless @scale.nil?
628
- xOtherOptions += " -y" if @inverty == true
628
+ xOtherOptions += " -y" if @inverty
629
629
  unless @no_layout.nil?
630
630
  xOtherOptions += " -n"
631
631
  xOtherOptions += "2" if @no_layout.to_i == 2
632
632
  end
633
- xOtherOptions += " -x" if @reduce_graph == true
634
- xOtherOptions += " -Lg" if @Lg == true
635
- xOtherOptions += " -LO" if @LO == true
633
+ xOtherOptions += " -x" if @reduce_graph
634
+ xOtherOptions += " -Lg" if @Lg
635
+ xOtherOptions += " -LO" if @LO
636
636
  xOtherOptions += " -Ln#{@Ln}" unless @LN.nil?
637
637
  xOtherOptions += " -LU#{@LU}" unless @LU.nil?
638
638
  xOtherOptions += " -LC#{@LC}" unless @LC.nil?
639
639
  xOtherOptions += " -LT#{@LT}" unless @LT.nil?
640
-
640
+
641
641
  if IS_JRUBY
642
642
  xCmd = "#{cmd} -q#{@errors} #{xExternalLibraries} #{xOtherOptions} #{xOutputWithFile} #{xOutputWithoutFile} #{t.path}"
643
643
  elsif IS_CYGWIN
@@ -654,7 +654,7 @@ class GraphViz
654
654
 
655
655
  xOutput << output_from_command( xCmd )
656
656
  end
657
-
657
+
658
658
  # Not Hugly
659
659
  lNotHugly.each do |f|
660
660
  if f.nil? or f == String
@@ -663,7 +663,7 @@ class GraphViz
663
663
  GraphViz.nothugly( f, true )
664
664
  end
665
665
  end
666
-
666
+
667
667
  if xOutputString
668
668
  xOutput
669
669
  else
@@ -671,28 +671,28 @@ class GraphViz
671
671
  end
672
672
  end
673
673
  end
674
-
674
+
675
675
  alias :save :output
676
-
676
+
677
677
  def to_s
678
678
  self.output(:none => String)
679
679
  end
680
-
681
- #
680
+
681
+ #
682
682
  # Get the graph name
683
683
  #
684
- def name
684
+ def name
685
685
  @name.clone
686
686
  end
687
687
  alias :id :name
688
-
689
- #
688
+
689
+ #
690
690
  # Create an edge between the current cluster and the node or cluster +oNode+
691
- #
691
+ #
692
692
  def <<( oNode )
693
693
  raise( ArgumentError, "Edge between root graph and node or cluster not allowed!" ) if self.pg.nil?
694
694
 
695
- if( oNode.class == Array )
695
+ if( oNode.class == Array )
696
696
  oNode.each do |no|
697
697
  self << no
698
698
  end
@@ -703,46 +703,46 @@ class GraphViz
703
703
  alias :> :<<
704
704
  alias :- :<<
705
705
  alias :>> :<<
706
-
706
+
707
707
  def pg #:nodoc:
708
708
  @oParentGraph
709
709
  end
710
710
  def pg=(x) #:nodoc:
711
711
  @oParentGraph = x
712
712
  end
713
-
713
+
714
714
  #
715
715
  # Return the root graph
716
716
  #
717
717
  def root_graph
718
718
  return( (self.pg.nil?) ? self : self.pg.root_graph )
719
719
  end
720
-
720
+
721
721
  def self.commonGraph( o1, o2 ) #:nodoc:
722
722
  g1 = o1.pg
723
723
  g2 = o2.pg
724
724
 
725
725
  return o1 if g1.nil?
726
726
  return o2 if g2.nil?
727
-
727
+
728
728
  return g1 if g1.object_id == g2.object_id
729
-
729
+
730
730
  return GraphViz::commonGraph( g1, g2 )
731
731
  end
732
-
732
+
733
733
  def set_position( xType, xKey, xValue ) #:nodoc:
734
- @elements_order.push( {
735
- "type" => "#{xType}_attr",
734
+ @elements_order.push( {
735
+ "type" => "#{xType}_attr",
736
736
  "name" => xKey,
737
- "value" => xValue
737
+ "value" => xValue
738
738
  } )
739
739
  end
740
-
740
+
741
741
  ## ----------------------------------------------------------------------------
742
742
 
743
743
  #
744
744
  # Change default options (:use, :path, :errors and :output)
745
- #
745
+ #
746
746
  def self.default( hOpts )
747
747
  hOpts.each do |k, v|
748
748
  case k.to_s
@@ -759,29 +759,29 @@ class GraphViz
759
759
  end
760
760
  end
761
761
  end
762
-
762
+
763
763
  def self.options( hOpts )
764
764
  GraphViz::default( hOpts )
765
765
  end
766
-
766
+
767
767
  ## ----------------------------------------------------------------------------
768
768
 
769
769
  # Create a new graph from a GraphViz File
770
- #
770
+ #
771
771
  # Options :
772
772
  # * :output : Output format (Constants::FORMATS) (default : dot)
773
773
  # * :file : Output file name (default : none)
774
774
  # * :use : Program to use (Constants::PROGRAMS) (default : dot)
775
775
  # * :path : Program PATH
776
776
  #
777
- def self.parse( xFile, hOpts = {}, &block )
777
+ def self.parse( xFile, hOpts = {}, &block )
778
778
  graph = Dot2Ruby::new( hOpts[:path], nil, nil ).eval( xFile )
779
- yield( graph ) if( block and graph.nil? == false )
779
+ yield( graph ) if( block and graph )
780
780
  return graph
781
781
  end
782
782
 
783
783
  # Create a new graph from a GraphViz File
784
- #
784
+ #
785
785
  # Options :
786
786
  # * :output : Output format (Constants::FORMATS) (default : dot)
787
787
  # * :file : Output file name (default : none)
@@ -790,11 +790,11 @@ class GraphViz
790
790
  #
791
791
  def self.parse_string( str, hOpts = {}, &block )
792
792
  graph = Dot2Ruby::new( hOpts[:path], nil, nil ).eval_string( str )
793
- yield( graph ) if( block and graph.nil? == false )
793
+ yield( graph ) if( block and graph )
794
794
  return graph
795
795
  end
796
796
 
797
- # Return a new completed graph
797
+ # Return a new completed graph
798
798
  def complete
799
799
  GraphViz.parse_string( root_graph.output( :dot => String ) )
800
800
  end
@@ -811,7 +811,7 @@ class GraphViz
811
811
  end
812
812
  ## ----------------------------------------------------------------------------
813
813
 
814
- private
814
+ private
815
815
 
816
816
  ## Var: Nodes, Edges and Graphs tables
817
817
  @hoNodes
@@ -823,10 +823,10 @@ class GraphViz
823
823
 
824
824
  ## Var: Type de graphe (orienté ou non)
825
825
  @oGraphType
826
-
827
- #
826
+
827
+ #
828
828
  # Create a new graph object
829
- #
829
+ #
830
830
  # Options :
831
831
  # * :output : Output format (Constants::FORMATS) (default : dot)
832
832
  # * :file : Output file name (default : nil)
@@ -838,7 +838,7 @@ class GraphViz
838
838
  # * 0 = Error + Warning
839
839
  # * 1 = Error
840
840
  # * 2 = none
841
- #
841
+ #
842
842
  def initialize( xGraphName, hOpts = {}, &block )
843
843
  @filename = nil
844
844
  @name = xGraphName.to_s
@@ -850,7 +850,7 @@ class GraphViz
850
850
  @output = {}
851
851
  @nothugly = false
852
852
  @strict = false
853
-
853
+
854
854
  @scale = nil
855
855
  @inverty = nil
856
856
  @no_layout = nil
@@ -861,16 +861,16 @@ class GraphViz
861
861
  @LU = nil
862
862
  @LC = nil
863
863
  @LT = nil
864
-
864
+
865
865
  @elements_order = GraphViz::Elements::new()
866
866
 
867
867
  @oParentGraph = nil
868
868
  @oGraphType = "digraph"
869
-
869
+
870
870
  @hoNodes = Hash::new()
871
871
  @loEdges = Array::new()
872
872
  @hoGraphs = Hash::new()
873
-
873
+
874
874
  @node = GraphViz::Attrs::new( self, "node", NODESATTRS )
875
875
  @edge = GraphViz::Attrs::new( self, "edge", EDGESATTRS )
876
876
  @graph = GraphViz::Attrs::new( self, "graph", GRAPHSATTRS )
@@ -878,14 +878,14 @@ class GraphViz
878
878
  hOpts.each do |xKey, xValue|
879
879
  case xKey.to_s
880
880
  when "use"
881
- if PROGRAMS.index( xValue.to_s ).nil? == true
881
+ if PROGRAMS.index( xValue.to_s ).nil?
882
882
  raise ArgumentError, "can't use '#{xValue}'"
883
883
  end
884
884
  @prog = xValue.to_s
885
885
  when "parent"
886
886
  @oParentGraph = xValue
887
887
  when "type"
888
- if GRAPHTYPE.index( xValue.to_s ).nil? == true
888
+ if GRAPHTYPE.index( xValue.to_s ).nil?
889
889
  raise ArgumentError, "graph type '#{xValue}' unknow"
890
890
  end
891
891
  @oGraphType = xValue.to_s
@@ -901,10 +901,10 @@ class GraphViz
901
901
  self[xKey.to_s] = xValue.to_s
902
902
  end
903
903
  end
904
-
904
+
905
905
  yield( self ) if( block )
906
906
  end
907
-
907
+
908
908
  # Edge between a node and a Hash
909
909
  # Used by GraphViz#add
910
910
  def add_hash_edge(node, hash)
@@ -917,7 +917,7 @@ class GraphViz
917
917
  add_edges(node, hash)
918
918
  end
919
919
  end
920
-
920
+
921
921
  #
922
922
  # Create a new undirected graph
923
923
  #
@@ -935,14 +935,14 @@ class GraphViz
935
935
  def self.digraph( xGraphName, hOpts = {}, &block )
936
936
  new( xGraphName, hOpts.symbolize_keys.merge( {:type => "digraph"} ), &block )
937
937
  end
938
-
938
+
939
939
  # Create a new strict directed graph
940
940
  #
941
941
  # See also GraphViz::new
942
942
  def self.strict_digraph( xGraphName, hOpts = {}, &block )
943
943
  new( xGraphName, hOpts.symbolize_keys.merge( {:type => "digraph", :strict => true} ), &block )
944
944
  end
945
-
945
+
946
946
  # Create a random graph.
947
947
  def self.generate(num_nodes, num_edges, directed = false, weight_range = (1..1))
948
948
  g = nil
@@ -980,13 +980,13 @@ class GraphViz
980
980
  :force => false,
981
981
  :unquote_empty => false,
982
982
  }.merge(opts)
983
-
984
- if (options[:force] or str.match( /\A[a-zA-Z_]+[a-zA-Z0-9_]*\Z/ ).nil?)
985
- unless options[:unquote_empty] == true and str.size == 0
986
- '"' + str.gsub('"', '\\"').gsub("\n", '\\\\n') + '"'
983
+
984
+ if (options[:force] or str.match( /\A[a-zA-Z_]+[a-zA-Z0-9_]*\Z/ ).nil?)
985
+ unless options[:unquote_empty] and str.size == 0
986
+ '"' + str.gsub('"', '\\"').gsub("\n", '\\\\n') + '"'
987
987
  end
988
988
  else
989
989
  str
990
990
  end
991
- end
991
+ end
992
992
  end