graphviz 0.0.1 → 0.0.2
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.
- checksums.yaml +4 -4
- data/README.md +17 -1
- data/lib/graphviz/graph.rb +82 -14
- data/lib/graphviz/version.rb +1 -1
- data/sample.rb +6 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5ecf43f4dc20f7751fdcab695ed60c56c05d2c99
|
4
|
+
data.tar.gz: caa5d9ee7b24714b8804085456ab55f020f069e1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 704db8989d9806ae9846f224272e10c4c80e10179e6da9259798e1cf9c0c7b34330733432de305f1f3e88de56a34812011861ac736d076eed31e35c066fdeba0
|
7
|
+
data.tar.gz: 7c4a946acc7edc8dc0d93e14803e960299ed8d17c57d3684a0ce4d7242fe01b7b079d485a9f57b9a5935d808ea1842f02012d2e3eea1e9427dd66fd4cb80275e
|
data/README.md
CHANGED
@@ -18,7 +18,23 @@ Or install it yourself as:
|
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
|
-
|
21
|
+
Some example code:
|
22
|
+
|
23
|
+
require 'graphviz';
|
24
|
+
|
25
|
+
g = Graphviz::Graph.new
|
26
|
+
|
27
|
+
foo = g.add_node("Foo")
|
28
|
+
foo.add_node("Bar")
|
29
|
+
|
30
|
+
foo.attributes[:shape] = 'box3d'
|
31
|
+
foo.attributes[:color] = 'red'
|
32
|
+
|
33
|
+
# Dup the dot data:
|
34
|
+
puts g.to_dot
|
35
|
+
|
36
|
+
# Process the graph to output:
|
37
|
+
Graphviz::output(g, :path => "test.pdf")
|
22
38
|
|
23
39
|
## Contributing
|
24
40
|
|
data/lib/graphviz/graph.rb
CHANGED
@@ -22,12 +22,12 @@ require 'stringio'
|
|
22
22
|
|
23
23
|
module Graphviz
|
24
24
|
class Node
|
25
|
-
def initialize(graph, name,
|
25
|
+
def initialize(graph, name, attributes = {})
|
26
26
|
@graph = graph
|
27
27
|
@graph.nodes[name] = self
|
28
28
|
|
29
29
|
@name = name
|
30
|
-
@
|
30
|
+
@attributes = attributes
|
31
31
|
|
32
32
|
@edges = []
|
33
33
|
end
|
@@ -36,6 +36,7 @@ module Graphviz
|
|
36
36
|
attr :options
|
37
37
|
|
38
38
|
attr :edges
|
39
|
+
attr_accessor :attributes
|
39
40
|
|
40
41
|
def connect(destination, options = {})
|
41
42
|
edge = Edge.new(@graph, self, destination, options)
|
@@ -45,6 +46,10 @@ module Graphviz
|
|
45
46
|
return edge
|
46
47
|
end
|
47
48
|
|
49
|
+
def connected?(node)
|
50
|
+
return @edges.find{|edge| edge.destination == node}
|
51
|
+
end
|
52
|
+
|
48
53
|
def add_node(name, options = {})
|
49
54
|
node = Node.new(@graph, name, options)
|
50
55
|
|
@@ -55,61 +60,124 @@ module Graphviz
|
|
55
60
|
end
|
56
61
|
|
57
62
|
class Edge
|
58
|
-
def initialize(graph, source, destination,
|
63
|
+
def initialize(graph, source, destination, attributes = {})
|
59
64
|
@graph = graph
|
60
65
|
@graph.edges << self
|
61
66
|
|
62
67
|
@source = source
|
63
68
|
@destination = destination
|
64
69
|
|
65
|
-
@
|
70
|
+
@attributes = attributes
|
66
71
|
end
|
67
72
|
|
68
73
|
attr :source
|
69
74
|
attr :destination
|
70
75
|
|
76
|
+
attr_accessor :attributes
|
77
|
+
|
71
78
|
attr :options
|
79
|
+
attr_accessor :line
|
72
80
|
|
73
81
|
def to_s
|
74
|
-
|
82
|
+
'->'
|
75
83
|
end
|
76
84
|
end
|
77
85
|
|
86
|
+
class EdgeNode < Node
|
87
|
+
end
|
88
|
+
|
78
89
|
class Graph
|
79
|
-
def initialize(name = 'G',
|
90
|
+
def initialize(name = 'G', attributes = {})
|
80
91
|
@name = name
|
81
92
|
|
82
93
|
@nodes = {}
|
83
94
|
@edges = []
|
95
|
+
@graphs = {}
|
96
|
+
|
97
|
+
@parent = nil
|
98
|
+
|
99
|
+
@attributes = attributes
|
84
100
|
end
|
85
101
|
|
86
102
|
attr :nodes
|
87
103
|
attr :edges
|
104
|
+
attr :graphs
|
88
105
|
|
89
|
-
|
90
|
-
|
106
|
+
attr_accessor :attributes
|
107
|
+
|
108
|
+
def add_node(name, attributes = {})
|
109
|
+
Node.new(self, name, attributes)
|
110
|
+
end
|
111
|
+
|
112
|
+
def add_subgraph(name, attributes = {})
|
113
|
+
graph = Graph.new(name, attributes)
|
114
|
+
|
115
|
+
graph.attach(self)
|
116
|
+
@graphs[name] = graph
|
117
|
+
|
118
|
+
return graph
|
119
|
+
end
|
120
|
+
|
121
|
+
def attach(parent)
|
122
|
+
@parent = parent
|
91
123
|
end
|
92
124
|
|
93
125
|
def to_dot(options = {})
|
94
126
|
buffer = StringIO.new
|
95
127
|
|
128
|
+
dump_graph(buffer, "", options)
|
129
|
+
|
130
|
+
return buffer.string
|
131
|
+
end
|
132
|
+
|
133
|
+
protected
|
134
|
+
|
135
|
+
def dump_graph(buffer, indent, options)
|
96
136
|
format = options[:format] || 'digraph'
|
97
137
|
|
98
|
-
buffer.puts "#{format} #{@name} {"
|
138
|
+
buffer.puts "#{indent}#{format} #{dump_value(@name)} {"
|
139
|
+
|
140
|
+
@attributes.each do |(name, value)|
|
141
|
+
buffer.puts "#{indent}\t#{name}=#{dump_value(value)};"
|
142
|
+
end
|
99
143
|
|
100
144
|
@nodes.each do |(name, node)|
|
145
|
+
node_attributes_text = dump_attributes(node.attributes)
|
146
|
+
node_name = dump_value(node.name)
|
147
|
+
buffer.puts "#{indent}\t#{node_name}#{node_attributes_text};"
|
148
|
+
|
101
149
|
if node.edges.size > 0
|
102
150
|
node.edges.each do |edge|
|
103
|
-
|
151
|
+
from_name = dump_value(edge.source.name)
|
152
|
+
to_name = dump_value(edge.destination.name)
|
153
|
+
edge_attributes_text = dump_attributes(edge.attributes)
|
154
|
+
|
155
|
+
buffer.puts "#{indent}\t#{from_name} #{edge} #{to_name}#{edge_attributes_text};"
|
104
156
|
end
|
105
|
-
else
|
106
|
-
buffer.puts "\t#{node.name.dump};"
|
107
157
|
end
|
108
158
|
end
|
109
159
|
|
110
|
-
|
160
|
+
@graphs.each do |(name, graph)|
|
161
|
+
graph.dump_graph(buffer, indent + "\t", options.merge(:format => 'subgraph'))
|
162
|
+
end
|
111
163
|
|
112
|
-
|
164
|
+
buffer.puts "#{indent}}"
|
165
|
+
end
|
166
|
+
|
167
|
+
def dump_value(value)
|
168
|
+
if Symbol === value
|
169
|
+
value.to_s
|
170
|
+
else
|
171
|
+
value.inspect
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def dump_attributes(attributes)
|
176
|
+
if attributes.size > 0
|
177
|
+
"[" + attributes.collect{|(name, value)| "#{name}=#{dump_value(value)}"}.join(", ") + "]"
|
178
|
+
else
|
179
|
+
""
|
180
|
+
end
|
113
181
|
end
|
114
182
|
end
|
115
183
|
end
|
data/lib/graphviz/version.rb
CHANGED
data/sample.rb
CHANGED
@@ -5,6 +5,12 @@ g = Graphviz::Graph.new
|
|
5
5
|
foo = g.add_node("Foo")
|
6
6
|
foo.add_node("Bar")
|
7
7
|
|
8
|
+
foo.attributes[:shape] = 'box3d'
|
9
|
+
foo.attributes[:color] = 'red'
|
10
|
+
|
11
|
+
# Dup the dot data:
|
8
12
|
puts g.to_dot
|
9
13
|
|
14
|
+
# Process the graph to output:
|
10
15
|
Graphviz::output(g, :path => "test.pdf")
|
16
|
+
|