ruby-graphviz 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +9 -0
- data/examples/sample01.rb +17 -17
- data/examples/sample02.rb +18 -18
- data/examples/sample03.rb +8 -8
- data/examples/sample04.rb +5 -5
- data/examples/sample05.rb +17 -17
- data/examples/sample07.rb +5 -5
- data/examples/sample08.rb +15 -15
- data/examples/sample09.rb +25 -25
- data/examples/sample10.rb +25 -25
- data/examples/sample11.rb +21 -21
- data/examples/sample16.rb +2 -2
- data/examples/sample17.rb +5 -5
- data/examples/sample20.rb +18 -18
- data/examples/sample29.rb +2 -2
- data/examples/sample30.rb +4 -4
- data/examples/sample31.rb +3 -3
- data/examples/sample36.rb +5 -5
- data/examples/sample37.rb +8 -8
- data/examples/sample38.rb +2 -2
- data/examples/sample39.rb +6 -6
- data/examples/sample40.rb +4 -4
- data/examples/sample42.rb +14 -14
- data/examples/sample43.rb +7 -7
- data/examples/sample44.rb +3 -3
- data/examples/sample45.rb +1 -1
- data/examples/sample46.rb +18 -18
- data/examples/sample54.rb +2 -2
- data/examples/sample55.rb +4 -4
- data/examples/sample58.rb +7 -7
- data/examples/sample60.rb +3 -3
- data/examples/sample61.rb +3 -3
- data/examples/sample62.rb +3 -3
- data/examples/sample66.rb +4 -0
- data/examples/sample67.rb +10 -0
- data/examples/sample68.rb +27 -0
- data/lib/ext/gvpr/dot2ruby.g +2 -2
- data/lib/graphviz.rb +91 -27
- data/lib/graphviz/constants.rb +1 -1
- data/lib/graphviz/core_ext.rb +0 -9
- data/lib/graphviz/dsl.rb +3 -3
- data/lib/graphviz/edge.rb +6 -6
- data/lib/graphviz/family_tree/couple.rb +8 -8
- data/lib/graphviz/family_tree/person.rb +10 -10
- data/lib/graphviz/graphml.rb +3 -3
- data/lib/graphviz/node.rb +2 -2
- data/lib/graphviz/theory.rb +37 -2
- data/lib/graphviz/xml.rb +4 -4
- data/ruby-graphviz.gemspec +2 -13
- data/test/test_graph.rb +25 -25
- data/test/test_search.rb +32 -0
- data/test/test_theory.rb +1 -1
- metadata +11 -13
@@ -0,0 +1,10 @@
|
|
1
|
+
$:.unshift("../lib")
|
2
|
+
|
3
|
+
require 'graphviz'
|
4
|
+
graph = GraphViz.graph(:G)
|
5
|
+
graph.add_nodes(["A", "B", "C", "D", "E", "F", "G"])
|
6
|
+
graph.add_edges("A", ["B", "C", "E"])
|
7
|
+
graph.add_edges("B", ["D", "F"])
|
8
|
+
graph.add_edges("C", "G")
|
9
|
+
graph.add_edges("F", "E")
|
10
|
+
graph.output(:png => "#{$0}.png")
|
@@ -0,0 +1,27 @@
|
|
1
|
+
$:.unshift("../lib")
|
2
|
+
|
3
|
+
require 'graphviz'
|
4
|
+
require 'graphviz/theory'
|
5
|
+
g = GraphViz.graph(:G)
|
6
|
+
g.add_nodes(["A", "B", "C", "D", "E", "F", "G"])
|
7
|
+
g.add_edges("A", ["B", "C", "E"])
|
8
|
+
g.add_edges("B", ["D", "F"])
|
9
|
+
g.add_edges("C", "G")
|
10
|
+
g.add_edges("F", "E")
|
11
|
+
g.output(:png => "#{$0}000.png")
|
12
|
+
|
13
|
+
t = GraphViz::Theory.new(g)
|
14
|
+
i = 1
|
15
|
+
t.dfs("A") { |node|
|
16
|
+
name = sprintf("%s%03d.png", $0, i)
|
17
|
+
node[:color => :lightblue, :style => :filled]
|
18
|
+
g.output(:png => name)
|
19
|
+
i = i + 1
|
20
|
+
}
|
21
|
+
|
22
|
+
t.bfs("A") { |node|
|
23
|
+
name = sprintf("%s%03d.png", $0, i)
|
24
|
+
node[:color => :red, :style => :filled]
|
25
|
+
g.output(:png => name)
|
26
|
+
i = i + 1
|
27
|
+
}
|
data/lib/ext/gvpr/dot2ruby.g
CHANGED
@@ -107,7 +107,7 @@ N {
|
|
107
107
|
subgraph = nxtsubg( subgraph );
|
108
108
|
}
|
109
109
|
|
110
|
-
printf( " node_%s = graph_%s.
|
110
|
+
printf( " node_%s = graph_%s.add_nodes( \"%s\"", rubyfy($.name), rubyfy(ofgraph.name), $.name );
|
111
111
|
|
112
112
|
// Attributs of N
|
113
113
|
attr = fstAttr($G, "N");
|
@@ -136,7 +136,7 @@ E {
|
|
136
136
|
subgraph = nxtsubg( subgraph );
|
137
137
|
}
|
138
138
|
|
139
|
-
printf( " graph_%s.
|
139
|
+
printf( " graph_%s.add_edges( \"%s\", \"%s\"", rubyfy(ofgraph.name), $.tail.name, $.head.name );
|
140
140
|
|
141
141
|
// Attributs of E
|
142
142
|
attr = fstAttr($G, "E");
|
data/lib/graphviz.rb
CHANGED
@@ -93,6 +93,9 @@ class GraphViz
|
|
93
93
|
# Return the GraphViz::Node object created
|
94
94
|
#
|
95
95
|
def add_node( xNodeName, hOpts = {} )
|
96
|
+
warn "GraphViz#add_node is deprecated, please use GraphViz#add_nodes"
|
97
|
+
return add_nodes(xNodeName, hOpts)
|
98
|
+
=begin
|
96
99
|
node = @hoNodes[xNodeName]
|
97
100
|
|
98
101
|
if node.nil?
|
@@ -117,6 +120,38 @@ class GraphViz
|
|
117
120
|
end
|
118
121
|
|
119
122
|
return node
|
123
|
+
=end
|
124
|
+
end
|
125
|
+
|
126
|
+
def add_nodes(node_name, options = {})
|
127
|
+
if node_name.kind_of? Array
|
128
|
+
node_name.each { |n| add_nodes(n, options.clone) }
|
129
|
+
else
|
130
|
+
node = @hoNodes[node_name]
|
131
|
+
|
132
|
+
if node.nil?
|
133
|
+
@hoNodes[node_name] = GraphViz::Node::new( node_name, self )
|
134
|
+
@hoNodes[node_name].index = @elements_order.size_of( "node" )
|
135
|
+
|
136
|
+
unless options.keys.include?(:label) or options.keys.include?("label")
|
137
|
+
options[:label] = node_name
|
138
|
+
end
|
139
|
+
|
140
|
+
@elements_order.push( {
|
141
|
+
"type" => "node",
|
142
|
+
"name" => node_name,
|
143
|
+
"value" => @hoNodes[node_name]
|
144
|
+
} )
|
145
|
+
|
146
|
+
node = @hoNodes[node_name]
|
147
|
+
end
|
148
|
+
|
149
|
+
options.each do |xKey, xValue|
|
150
|
+
@hoNodes[node_name][xKey.to_s] = xValue
|
151
|
+
end
|
152
|
+
|
153
|
+
return node
|
154
|
+
end
|
120
155
|
end
|
121
156
|
|
122
157
|
# Return the node object for the given name (or nil) in the current graph
|
@@ -166,47 +201,49 @@ class GraphViz
|
|
166
201
|
end
|
167
202
|
end
|
168
203
|
|
169
|
-
#
|
170
204
|
# Get the number of nodes
|
171
|
-
#
|
172
205
|
def node_count
|
173
206
|
@hoNodes.size
|
174
207
|
end
|
175
208
|
|
176
|
-
|
209
|
+
#<b>DEPRECATED</b>
|
210
|
+
def add_edge( oNodeOne, oNodeTwo, hOpts = {} )
|
211
|
+
warn "GraphViz#add_edge is deprecated, please use GraphViz#add_edges"
|
212
|
+
add_edges(oNodeOne, oNodeTwo, hOpts)
|
213
|
+
end
|
214
|
+
|
177
215
|
# Create a new edge
|
178
216
|
#
|
179
217
|
# In:
|
180
|
-
# *
|
181
|
-
# *
|
182
|
-
# *
|
183
|
-
|
184
|
-
def add_edge( oNodeOne, oNodeTwo, hOpts = {} )
|
218
|
+
# * node_one : First node (or node list)
|
219
|
+
# * node_two : Second Node (or node list)
|
220
|
+
# * options : Edge attributs
|
221
|
+
def add_edges( node_one, node_two, options = {} )
|
185
222
|
|
186
|
-
if(
|
187
|
-
|
188
|
-
|
223
|
+
if( node_one.class == Array )
|
224
|
+
node_one.each do |no|
|
225
|
+
add_edges( no, node_two, options )
|
189
226
|
end
|
190
227
|
else
|
191
|
-
if(
|
192
|
-
|
193
|
-
|
228
|
+
if( node_two.class == Array )
|
229
|
+
node_two.each do |nt|
|
230
|
+
add_edges( node_one, nt, options )
|
194
231
|
end
|
195
232
|
else
|
196
|
-
|
197
|
-
|
233
|
+
edge = GraphViz::Edge::new( node_one, node_two, self )
|
234
|
+
edge.index = @elements_order.size_of( "edge" )
|
198
235
|
|
199
|
-
|
200
|
-
|
236
|
+
options.each do |xKey, xValue|
|
237
|
+
edge[xKey.to_s] = xValue
|
201
238
|
end
|
202
239
|
|
203
240
|
@elements_order.push( {
|
204
241
|
"type" => "edge",
|
205
|
-
"value" =>
|
242
|
+
"value" => edge
|
206
243
|
} )
|
207
|
-
@loEdges.push(
|
244
|
+
@loEdges.push( edge )
|
208
245
|
|
209
|
-
return(
|
246
|
+
return( edge )
|
210
247
|
end
|
211
248
|
end
|
212
249
|
end
|
@@ -349,7 +386,7 @@ class GraphViz
|
|
349
386
|
end
|
350
387
|
return( @hoGraphs[xName] ) if @hoGraphs.keys.include?( xName )
|
351
388
|
|
352
|
-
rCod =
|
389
|
+
rCod = add_nodes( xName, args[0]||{} )
|
353
390
|
end
|
354
391
|
|
355
392
|
return rCod
|
@@ -678,7 +715,7 @@ class GraphViz
|
|
678
715
|
self << no
|
679
716
|
end
|
680
717
|
else
|
681
|
-
return GraphViz::commonGraph( oNode, self ).
|
718
|
+
return GraphViz::commonGraph( oNode, self ).add_edges( self, oNode )
|
682
719
|
end
|
683
720
|
end
|
684
721
|
alias :> :<<
|
@@ -888,11 +925,11 @@ class GraphViz
|
|
888
925
|
def add_hash_edge(node, hash)
|
889
926
|
if hash.kind_of? Hash
|
890
927
|
hash.each do |nt, data|
|
891
|
-
|
928
|
+
add_edges(node, nt)
|
892
929
|
add_hash_edge(nt, data)
|
893
930
|
end
|
894
931
|
else
|
895
|
-
|
932
|
+
add_edges(node, hash)
|
896
933
|
end
|
897
934
|
end
|
898
935
|
|
@@ -914,15 +951,42 @@ class GraphViz
|
|
914
951
|
new( xGraphName, hOpts.symbolize_keys.merge( {:type => "digraph"} ), &block )
|
915
952
|
end
|
916
953
|
|
917
|
-
#
|
918
954
|
# Create a new strict directed graph
|
919
955
|
#
|
920
956
|
# See also GraphViz::new
|
921
|
-
#
|
922
957
|
def self.strict_digraph( xGraphName, hOpts = {}, &block )
|
923
958
|
new( xGraphName, hOpts.symbolize_keys.merge( {:type => "digraph", :strict => true} ), &block )
|
924
959
|
end
|
925
960
|
|
961
|
+
# Create a random graph.
|
962
|
+
def self.generate(num_nodes, num_edges, directed = false, weight_range = (1..1))
|
963
|
+
g = nil
|
964
|
+
if directed
|
965
|
+
g = GraphViz.digraph(:G)
|
966
|
+
else
|
967
|
+
g = GraphViz.graph(:G)
|
968
|
+
end
|
969
|
+
|
970
|
+
nodes = (1..num_nodes).map{ |e| e.to_s }
|
971
|
+
x = g.add_nodes(nodes)
|
972
|
+
|
973
|
+
edges = []
|
974
|
+
nodes.each do |head|
|
975
|
+
nodes.each do |tail|
|
976
|
+
if (directed and head != tail) or (head < tail)
|
977
|
+
edges << {:head => head, :tail => tail, :weight => weight_range.to_a.shuffle[0]}
|
978
|
+
end
|
979
|
+
end
|
980
|
+
end
|
981
|
+
edges.shuffle!
|
982
|
+
|
983
|
+
(num_edges - 1).times do |i|
|
984
|
+
g.add_edges(edges[i][:head], edges[i][:tail], :label => edges[i][:weight].to_s, :weight => edges[i][:weight])
|
985
|
+
end
|
986
|
+
|
987
|
+
return g
|
988
|
+
end
|
989
|
+
|
926
990
|
#
|
927
991
|
# Escape a string to be acceptable as a node name in a graphviz input file
|
928
992
|
#
|
data/lib/graphviz/constants.rb
CHANGED
data/lib/graphviz/core_ext.rb
CHANGED
@@ -23,15 +23,6 @@ class Object
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
class Array
|
27
|
-
def all?(&b)
|
28
|
-
r = self.delete_if { |x|
|
29
|
-
yield x
|
30
|
-
}
|
31
|
-
r.size == 0
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
26
|
# From : http://www.geekmade.co.uk/2008/09/ruby-tip-normalizing-hash-keys-as-symbols/
|
36
27
|
class Hash
|
37
28
|
def symbolize_keys
|
data/lib/graphviz/dsl.rb
CHANGED
@@ -17,14 +17,14 @@ class GraphViz::DSL
|
|
17
17
|
elsif(block)
|
18
18
|
@graph.add_graph(GraphViz::DSL.new(sym, { :parent => @graph, :type => @graph.type }, &block).graph)
|
19
19
|
else
|
20
|
-
@graph.
|
20
|
+
@graph.add_nodes(sym.to_s, *args)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
24
|
# Add a new node
|
25
25
|
def n(name)
|
26
26
|
return @graph.get_node(name) unless @graph.get_node(name.to_s).nil?
|
27
|
-
@graph.
|
27
|
+
@graph.add_nodes(name)
|
28
28
|
end
|
29
29
|
|
30
30
|
# Create edges
|
@@ -32,7 +32,7 @@ class GraphViz::DSL
|
|
32
32
|
e = nil
|
33
33
|
last = args.shift
|
34
34
|
while current = args.shift
|
35
|
-
e = @graph.
|
35
|
+
e = @graph.add_edges(last, current)
|
36
36
|
last = current
|
37
37
|
end
|
38
38
|
return e
|
data/lib/graphviz/edge.rb
CHANGED
@@ -36,11 +36,11 @@ class GraphViz
|
|
36
36
|
@index = nil
|
37
37
|
|
38
38
|
unless @parent_graph.directed?
|
39
|
-
(@parent_graph.find_node(@node_one_id) || @parent_graph.
|
40
|
-
(@parent_graph.find_node(@node_two_id) || @parent_graph.
|
39
|
+
(@parent_graph.find_node(@node_one_id) || @parent_graph.add_nodes(@node_one_id)).incidents << (@parent_graph.find_node(@node_two_id) || @parent_graph.add_nodes(@node_two_id))
|
40
|
+
(@parent_graph.find_node(@node_two_id) || @parent_graph.add_nodes(@node_two_id)).neighbors << (@parent_graph.find_node(@node_one_id) || @parent_graph.add_nodes(@node_one_id))
|
41
41
|
end
|
42
|
-
(@parent_graph.find_node(@node_one_id) || @parent_graph.
|
43
|
-
(@parent_graph.find_node(@node_two_id) || @parent_graph.
|
42
|
+
(@parent_graph.find_node(@node_one_id) || @parent_graph.add_nodes(@node_one_id)).neighbors << (@parent_graph.find_node(@node_two_id) || @parent_graph.add_nodes(@node_two_id))
|
43
|
+
(@parent_graph.find_node(@node_two_id) || @parent_graph.add_nodes(@node_two_id)).incidents << (@parent_graph.find_node(@node_one_id) || @parent_graph.add_nodes(@node_one_id))
|
44
44
|
end
|
45
45
|
|
46
46
|
# Return the node one as string (so with port if any)
|
@@ -113,7 +113,7 @@ class GraphViz
|
|
113
113
|
def <<( node ) #:nodoc:
|
114
114
|
n = @parent_graph.get_node(@node_two_id)
|
115
115
|
|
116
|
-
GraphViz::commonGraph( node, n ).
|
116
|
+
GraphViz::commonGraph( node, n ).add_edges( n, node )
|
117
117
|
end
|
118
118
|
alias :> :<< #:nodoc:
|
119
119
|
alias :- :<< #:nodoc:
|
@@ -133,7 +133,7 @@ class GraphViz
|
|
133
133
|
# Set edge attributs
|
134
134
|
#
|
135
135
|
# Example :
|
136
|
-
# e = graph.
|
136
|
+
# e = graph.add_edges( ... )
|
137
137
|
# ...
|
138
138
|
# e.set { |_e|
|
139
139
|
# _e.color = "blue"
|
@@ -19,7 +19,7 @@ class GraphViz
|
|
19
19
|
return
|
20
20
|
|
21
21
|
if z.size == 1
|
22
|
-
@graph.
|
22
|
+
@graph.add_edges( @node, z[0].node, "dir" => "none" )
|
23
23
|
else
|
24
24
|
cluster = @graph.add_graph( "#{@node.id}Kids" )
|
25
25
|
cluster["rank"] = "same"
|
@@ -32,23 +32,23 @@ class GraphViz
|
|
32
32
|
z.each do |person|
|
33
33
|
count = count + 1
|
34
34
|
if count == add
|
35
|
-
middle = cluster.
|
36
|
-
@graph.
|
35
|
+
middle = cluster.add_nodes( "#{@node.id}Kids", "shape" => "point" )
|
36
|
+
@graph.add_edges( @node, middle, "dir" => "none" )
|
37
37
|
unless last.nil?
|
38
|
-
cluster.
|
38
|
+
cluster.add_edges( last, middle, "dir" => "none" )
|
39
39
|
end
|
40
40
|
last = middle
|
41
41
|
end
|
42
42
|
|
43
|
-
kid = cluster.
|
44
|
-
@graph.
|
43
|
+
kid = cluster.add_nodes( "#{person.node.id}Kid", "shape" => "point" )
|
44
|
+
@graph.add_edges( kid, person.node, "dir" => "none" )
|
45
45
|
|
46
46
|
if add == 0 and count == link
|
47
|
-
@graph.
|
47
|
+
@graph.add_edges( @node, kid, "dir" => "none" )
|
48
48
|
end
|
49
49
|
|
50
50
|
unless last.nil?
|
51
|
-
cluster.
|
51
|
+
cluster.add_edges( last, kid, "dir" => "none" )
|
52
52
|
end
|
53
53
|
last = kid
|
54
54
|
end
|
@@ -6,7 +6,7 @@ class GraphViz
|
|
6
6
|
class Person
|
7
7
|
def initialize( graph, tree, generation, id ) #:nodoc:
|
8
8
|
@graph = graph
|
9
|
-
@node = @graph.
|
9
|
+
@node = @graph.add_nodes( id )
|
10
10
|
@node["shape"] = "box"
|
11
11
|
@tree = tree
|
12
12
|
@generation = generation
|
@@ -71,10 +71,10 @@ class GraphViz
|
|
71
71
|
#
|
72
72
|
# mu.is_maried_with greg
|
73
73
|
def is_maried_with( x )
|
74
|
-
node = @graph.
|
74
|
+
node = @graph.add_nodes( "#{@node.id}And#{x.node.id}" )
|
75
75
|
node["shape"] = "point"
|
76
|
-
@graph.
|
77
|
-
@graph.
|
76
|
+
@graph.add_edges( @node, node, "dir" => "none" )
|
77
|
+
@graph.add_edges( node, x.node, "dir" => "none" )
|
78
78
|
@tree.add_couple( self, x, node )
|
79
79
|
end
|
80
80
|
|
@@ -82,11 +82,11 @@ class GraphViz
|
|
82
82
|
#
|
83
83
|
# sophie.is_divorced_with john
|
84
84
|
def is_divorced_with( x )
|
85
|
-
node = @graph.
|
85
|
+
node = @graph.add_nodes( "#{@node.id}And#{x.node.id}" )
|
86
86
|
node["shape"] = "point"
|
87
87
|
node["color"] = "red"
|
88
|
-
@graph.
|
89
|
-
@graph.
|
88
|
+
@graph.add_edges( @node, node, "dir" => "none", "color" => "red" )
|
89
|
+
@graph.add_edges( node, x.node, "dir" => "none", "color" => "red" )
|
90
90
|
@tree.add_couple( self, x, node )
|
91
91
|
end
|
92
92
|
|
@@ -94,11 +94,11 @@ class GraphViz
|
|
94
94
|
#
|
95
95
|
# simon.is_widower_of elisa
|
96
96
|
def is_widower_of( x ) #veuf
|
97
|
-
node = @graph.
|
97
|
+
node = @graph.add_nodes( "#{@node.id}And#{x.node.id}" )
|
98
98
|
node["shape"] = "point"
|
99
99
|
node["color"] = "green"
|
100
|
-
@graph.
|
101
|
-
@graph.
|
100
|
+
@graph.add_edges( @node, node, "dir" => "none", "color" => "green" )
|
101
|
+
@graph.add_edges( node, x.node, "dir" => "none", "color" => "green" )
|
102
102
|
@tree.add_couple( self, x, node )
|
103
103
|
end
|
104
104
|
|
data/lib/graphviz/graphml.rb
CHANGED
@@ -152,7 +152,7 @@ class GraphViz
|
|
152
152
|
end
|
153
153
|
|
154
154
|
unless @current_node.nil?
|
155
|
-
node = @current_graph.
|
155
|
+
node = @current_graph.add_nodes( node.attributes['id'] )
|
156
156
|
@current_node.each do |k, v|
|
157
157
|
node[k] = v
|
158
158
|
end
|
@@ -182,7 +182,7 @@ class GraphViz
|
|
182
182
|
target = node.attributes['target']
|
183
183
|
target = {target => node.attributes['targetport']} if node.attributes['targetport']
|
184
184
|
|
185
|
-
@current_edge = @current_graph.
|
185
|
+
@current_edge = @current_graph.add_edges( source, target )
|
186
186
|
|
187
187
|
node.each_element( ) do |child|
|
188
188
|
#begin
|
@@ -214,7 +214,7 @@ class GraphViz
|
|
214
214
|
|
215
215
|
list.each { |s|
|
216
216
|
list.each { |t|
|
217
|
-
@current_graph.
|
217
|
+
@current_graph.add_edges( s, t ) unless s == t
|
218
218
|
}
|
219
219
|
}
|
220
220
|
end
|