gviz 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,3 @@
1
+ module Gviz
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,395 @@
1
+ # encoding: UTF-8
2
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
3
+
4
+ describe Gviz do
5
+ before(:each) do
6
+ @g = Gviz.new
7
+ end
8
+
9
+ context "node" do
10
+ it "add a node" do
11
+ node = @g.node(:a)
12
+ node.should be_a_instance_of Gviz::Node
13
+ node.id.should eql :a
14
+ node.attrs.should be_empty
15
+ @g.nodeset.map(&:id).should eql [:a]
16
+ end
17
+
18
+ it "add nodes" do
19
+ @g.node(:a)
20
+ @g.node(:b)
21
+ @g.nodeset.map(&:id).should eql [:a, :b]
22
+ end
23
+
24
+ it "add a node with attrs" do
25
+ node = @g.node(:a, color:'blue', label:'hello')
26
+ node.should be_a_instance_of Gviz::Node
27
+ node.id.should eql :a
28
+ node.attrs.should == { color:'blue', label:'hello' }
29
+ @g.nodeset.map(&:attrs).should eql [node.attrs]
30
+ end
31
+
32
+ it "update node attrs" do
33
+ @g.node(:a, color:'red', label:'hello')
34
+ @g.node(:a, color:'blue', shape:'box')
35
+ @g.nodeset.first.attrs.should == { color:'blue', label:'hello', shape:'box' }
36
+ end
37
+
38
+ it "raise an error with a string" do
39
+ ->{ @g.node('a') }.should raise_error(ArgumentError)
40
+ end
41
+
42
+ it "raise an error with a symbol which include underscores" do
43
+ ->{ @g.node(:a_b) }.should raise_error(ArgumentError)
44
+ end
45
+ end
46
+
47
+ context "edge" do
48
+ it "add a edge" do
49
+ edge = @g.edge(:a_b)
50
+ edge.should be_a_instance_of Gviz::Edge
51
+ edge.st.should eql :a
52
+ edge.ed.should eql :b
53
+ edge.attrs.should be_empty
54
+ @g.edgeset.map(&:to_s).should eql ["a -> b"]
55
+ end
56
+
57
+ it "add a edge with attrs" do
58
+ edge = @g.edge(:a_b, color:'red', arrowhead:'none')
59
+ edge.should be_a_instance_of Gviz::Edge
60
+ edge.st.should eql :a
61
+ edge.ed.should eql :b
62
+ edge.attrs.should == { color:'red', arrowhead:'none' }
63
+ @g.edgeset.map(&:to_s).should eql ["a -> b"]
64
+ end
65
+
66
+ it "update edge attrs" do
67
+ @g.edge(:a_b, color:'blue', style:'bold')
68
+ @g.edge(:a_b, color:'red')
69
+ @g.edgeset.map(&:to_s).should eql ["a -> b"]
70
+ @g.edgeset.first.attrs.should == { color:'red', style:'bold' }
71
+ end
72
+
73
+ it "add different edges, but same name" do
74
+ edge1 = @g.edge(:a_b)
75
+ edge2 = @g.edge(:a_b_1)
76
+ edge1.seq.should eql 0
77
+ edge2.seq.should eql 1
78
+ @g.edgeset.map(&:to_s).should eql ["a -> b", "a -> b"]
79
+ end
80
+
81
+ it "can accept a string id" do
82
+ @g.edge('a_b')
83
+ @g.edgeset.first.to_s.should eql "a -> b"
84
+ end
85
+
86
+ it "can take ports with a string id" do
87
+ @g.edge("a:n_b:f")
88
+ edge = @g.edgeset.first
89
+ edge.st.should eql :a
90
+ edge.ed.should eql :b
91
+ edge.st_port.should eql :n
92
+ edge.ed_port.should eql :f
93
+ edge.to_s.should eql "a:n -> b:f"
94
+ end
95
+
96
+ it "can take ports with a string id 2" do
97
+ @g.add(:a => :b)
98
+ @g.edge("a:n_b:f", color:'red')
99
+ @g.edgeset.map(&:id).should eql [:a_b]
100
+
101
+ end
102
+ end
103
+
104
+ context "add" do
105
+ context "edges" do
106
+ it "one to many" do
107
+ @g.add :a => [:b, :c, :d]
108
+ @g.edgeset.map(&:to_s).should eql ['a -> b', 'a -> c', 'a -> d']
109
+ @g.nodeset.map(&:id).should eql [:a, :b, :c, :d]
110
+ end
111
+
112
+ it "many to many" do
113
+ @g.add [:main, :sub] => [:a, :b, :c]
114
+ @g.edgeset.map(&:to_s)
115
+ .should eql ['main -> a', 'main -> b', 'main -> c',
116
+ 'sub -> a', 'sub -> b', 'sub -> c']
117
+ @g.nodeset.map(&:id).should eql [:main, :a, :b, :c, :sub]
118
+ end
119
+
120
+ it "sequence" do
121
+ @g.add :main => :sub, :sub => [:a, :b]
122
+ @g.edgeset.map(&:to_s)
123
+ .should eql ['main -> sub', 'sub -> a', 'sub -> b']
124
+ @g.nodeset.map(&:id).should eql [:main, :sub, :a, :b]
125
+ end
126
+
127
+ it "several sequences" do
128
+ @g.add :main => :a, :a => [:c, :d]
129
+ @g.add :main => :b, :b => [:e, :f]
130
+ @g.edgeset.map(&:to_s)
131
+ .should eql ['main -> a', 'a -> c', 'a -> d',
132
+ 'main -> b', 'b -> e', 'b -> f']
133
+ @g.nodeset.map(&:id).should eql [:main, :a, :c, :d, :b, :e, :f]
134
+ end
135
+ end
136
+
137
+ context "nodes" do
138
+ it "add a node" do
139
+ @g.add :a
140
+ @g.nodeset.map(&:id).should eql [:a]
141
+ end
142
+
143
+ it "add several nodes" do
144
+ @g.add :a, :b, :c
145
+ @g.nodeset.map(&:id).should eql [:a, :b, :c]
146
+ end
147
+
148
+ it "raise error with a string" do
149
+ ->{ @g.add 'a' }.should raise_error(ArgumentError)
150
+ end
151
+ end
152
+ end
153
+
154
+ context "graph" do
155
+ it "add routes" do
156
+ @g.graph do
157
+ add :main => [:a, :b, :c]
158
+ add :a => [:d, :e]
159
+ end
160
+ @g.edgeset.map(&:to_s)
161
+ .should eql ['main -> a', 'main -> b', 'main -> c',
162
+ 'a -> d', 'a -> e']
163
+ @g.nodeset.map(&:id).should eql [:main, :a, :b, :c, :d, :e]
164
+ end
165
+ end
166
+
167
+ context "subgraph" do
168
+ it "add subgraph" do
169
+ sub = @g.subgraph do
170
+ add :main => [:a, :b]
171
+ end
172
+ @g.subgraphs.should eql [sub]
173
+ end
174
+
175
+ it "raise error when name is not start with 'cluster'" do
176
+ ->{ @g.subgraph(:clu) {} }.should raise_error
177
+ end
178
+ end
179
+
180
+ context "nodes" do
181
+ it "set nodes attributes globally" do
182
+ attr = { style:"filled", color:"purple" }
183
+ @g.nodes(attr)
184
+ @g.gnode_attrs.should == attr
185
+ end
186
+
187
+ it "add nodes attributes globally" do
188
+ attr = { style:"filled", color:"purple" }
189
+ attr2 = { color:"red", shape:"box" }
190
+ @g.nodes(attr)
191
+ @g.nodes(attr2)
192
+ @g.gnode_attrs.should == { style:"filled", color:"red", shape:"box" }
193
+ end
194
+ end
195
+
196
+ context "edges" do
197
+ it "set edges attributes globally" do
198
+ attr = { style:"dotted", color:"purple" }
199
+ @g.edges(attr)
200
+ @g.gedge_attrs.should == attr
201
+ end
202
+
203
+ it "add edges attributes globally" do
204
+ attr = { style:"dotted", color:"purple" }
205
+ attr2 = { color:"red", arrowhead:"none" }
206
+ @g.edges(attr)
207
+ @g.edges(attr2)
208
+ @g.gedge_attrs.should == { style:"dotted", color:"red", arrowhead:"none" }
209
+ end
210
+ end
211
+
212
+ context "global" do
213
+ it "set global graph attributes" do
214
+ attrs = { label:"A simple graph", rankdir:"LR" }
215
+ @g.global(attrs)
216
+ @g.graph_attrs.should == attrs
217
+ end
218
+ end
219
+
220
+ context "rank" do
221
+ it "let nodes be same rank" do
222
+ @g.route(:a => [:b, :c], :b => [:d, :e])
223
+ @g.rank(:same, :b, :d, :e)
224
+ @g.ranks.first.should eql [:same, [:b, :d, :e]]
225
+ end
226
+ end
227
+
228
+ context "to_s(output dot data)" do
229
+ it "without attrs" do
230
+ @g.add :main => [:init, :parse]
231
+ @g.add :init => :printf
232
+ @g.to_s.should eql ~<<-EOS
233
+ digraph G {
234
+ main;
235
+ init;
236
+ parse;
237
+ printf;
238
+ main -> init;
239
+ main -> parse;
240
+ init -> printf;
241
+ }
242
+ EOS
243
+ end
244
+
245
+ it "with node attrs" do
246
+ @g.add :a => :b
247
+ @g.node(:a, color:'red', style:'filled')
248
+ @g.to_s.should eql ~<<-EOS
249
+ digraph G {
250
+ a[color="red",style="filled"];
251
+ b;
252
+ a -> b;
253
+ }
254
+ EOS
255
+ end
256
+
257
+ it "with edge attrs" do
258
+ @g.edge(:a_b, color:'red')
259
+ @g.to_s.should eql ~<<-EOS
260
+ digraph G {
261
+ a;
262
+ b;
263
+ a -> b[color="red"];
264
+ }
265
+ EOS
266
+ end
267
+
268
+ it "with 2 edges with different attrs" do
269
+ @g.edge(:a_b, color:'red')
270
+ @g.edge(:a_b_1, color:'blue')
271
+ @g.to_s.should eql ~<<-EOS
272
+ digraph G {
273
+ a;
274
+ b;
275
+ a -> b[color="red"];
276
+ a -> b[color="blue"];
277
+ }
278
+ EOS
279
+ end
280
+
281
+ it "with global node attributes" do
282
+ @g.nodes(shape:'box', style:'filled')
283
+ @g.add(:a => :b)
284
+ @g.to_s.should eql ~<<-EOS
285
+ digraph G {
286
+ node[shape="box",style="filled"];
287
+ a;
288
+ b;
289
+ a -> b;
290
+ }
291
+ EOS
292
+ end
293
+
294
+ it "with global edges attributes" do
295
+ @g.edges(style:'dotted', color:'red')
296
+ @g.add(:a => :b)
297
+ @g.to_s.should eql ~<<-EOS
298
+ digraph G {
299
+ edge[style="dotted",color="red"];
300
+ a;
301
+ b;
302
+ a -> b;
303
+ }
304
+ EOS
305
+ end
306
+
307
+ it "with global attributes" do
308
+ @g.global(label:"A Simple Graph", rankdir:"LR")
309
+ @g.add(:a => :b)
310
+ @g.to_s.should eql ~<<-EOS
311
+ digraph G {
312
+ label="A Simple Graph";
313
+ rankdir="LR";
314
+ a;
315
+ b;
316
+ a -> b;
317
+ }
318
+ EOS
319
+ end
320
+
321
+ it "handle newline in a label nicely" do
322
+ @g.node(:a, label:"hello\nworld")
323
+ @g.to_s.should eql ~<<-EOS
324
+ digraph G {
325
+ a[label="hello\\nworld"];
326
+ }
327
+ EOS
328
+ end
329
+
330
+ it "can handle unicode labels" do
331
+ @g.node(:a, label:"こんにちは、世界!")
332
+ @g.to_s.should eql ~<<-EOS
333
+ digraph G {
334
+ a[label="こんにちは、世界!"];
335
+ }
336
+ EOS
337
+ end
338
+
339
+ it "take port on edges" do
340
+ @g.route(:a => [:b, :c])
341
+ @g.edge("a:n_c:f")
342
+ @g.node(:a, label:"<n> a | b |<p> c")
343
+ @g.node(:c, label:"<o> d | e |<f> f")
344
+ @g.to_s.should eql ~<<-EOS
345
+ digraph G {
346
+ a[label="<n> a | b |<p> c"];
347
+ b;
348
+ c[label="<o> d | e |<f> f"];
349
+ a -> b;
350
+ a:n -> c:f;
351
+ }
352
+ EOS
353
+ end
354
+
355
+ it "with subgraph" do
356
+ @g.route(:a => :b)
357
+ @g.subgraph do
358
+ route :c => :d
359
+ end
360
+ @g.to_s.should eql ~<<-EOS
361
+ digraph G {
362
+ a;
363
+ b;
364
+ a -> b;
365
+ subgraph cluster0 {
366
+ c;
367
+ d;
368
+ c -> d;
369
+ }
370
+ }
371
+ EOS
372
+ end
373
+
374
+ it "with ranks" do
375
+ @g.route(:a => [:b, :c], :b => [:d, :e])
376
+ @g.rank(:same, :b, :d, :e)
377
+ @g.rank(:min, :c)
378
+ @g.to_s.should eql ~<<-EOS
379
+ digraph G {
380
+ a;
381
+ b;
382
+ c;
383
+ d;
384
+ e;
385
+ a -> b;
386
+ a -> c;
387
+ b -> d;
388
+ b -> e;
389
+ { rank=same; b; d; e; }
390
+ { rank=min; c; }
391
+ }
392
+ EOS
393
+ end
394
+ end
395
+ end
@@ -0,0 +1,9 @@
1
+ require "gviz"
2
+ require "rspec"
3
+
4
+ class String
5
+ def ~
6
+ margin = scan(/^ +/).map(&:size).min
7
+ gsub(/^ {#{margin}}/, '')
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,69 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gviz
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - kyoendo
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-09-25 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Ruby's interface of graphviz
15
+ email:
16
+ - postagie@gmail.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - .gitignore
22
+ - Gemfile
23
+ - LICENSE.txt
24
+ - README.md
25
+ - Rakefile
26
+ - examples/arrow.dot
27
+ - examples/arrows.rb
28
+ - examples/color.dot
29
+ - examples/colors.rb
30
+ - examples/examples.rb
31
+ - examples/sample1.png
32
+ - examples/sample2.png
33
+ - examples/sample3.png
34
+ - examples/scraper.rb
35
+ - examples/shape.dot
36
+ - examples/shapes.rb
37
+ - gviz.gemspec
38
+ - lib/gviz.rb
39
+ - lib/gviz/version.rb
40
+ - spec/gviz_spec.rb
41
+ - spec/spec_helper.rb
42
+ homepage: https://github.com/melborne/Gviz
43
+ licenses: []
44
+ post_install_message:
45
+ rdoc_options: []
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ! '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ requirements: []
61
+ rubyforge_project:
62
+ rubygems_version: 1.8.24
63
+ signing_key:
64
+ specification_version: 3
65
+ summary: Ruby's interface of graphviz. It generate a dot file with simple ruby's syntax.
66
+ test_files:
67
+ - spec/gviz_spec.rb
68
+ - spec/spec_helper.rb
69
+ has_rdoc: