network_drawer 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/GALLERY.md +14 -0
- data/README.md +10 -10
- data/Rakefile +7 -5
- data/examples/rank.png +0 -0
- data/examples/rank.svg +116 -0
- data/examples/rank.yml +35 -0
- data/examples/rank_style.yml +0 -0
- data/lib/network_drawer/diagram.rb +29 -0
- data/lib/network_drawer/element/node.rb +5 -3
- data/lib/network_drawer/version.rb +1 -1
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b86cbd64c0fcd6709e3be20664cafeccbf3c0ac2
|
4
|
+
data.tar.gz: e67f543a968a926d165a64659ad668866906c558
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: edf53346f68b4e10c776fbe95fdbe99aa2d15f5a4e638c1f07fc3d9f06fc944d110262a4599b4e3f6944bf9bc33fa40e155354bf124f8d0e2b8c79db5a9acd5b
|
7
|
+
data.tar.gz: 0cad7acdcebbac503d91209c7712dc9a5693870981f7ef809747240662c9ab6a661b57e6e2729524b4a255d394394b0c04b378fbdc60ca75163bb70d0c395b23
|
data/GALLERY.md
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# Network Drawer Gallery
|
2
|
+
|
3
|
+
## Simple
|
4
|
+
|
5
|
+
[simple.yml](examples/simple.yml)/[simple_style.yml](examples/simple_style.yml)
|
6
|
+
|
7
|
+
![sample diagram(PNG)](examples/simple.png)
|
8
|
+
|
9
|
+
## Rank
|
10
|
+
|
11
|
+
[rank.yml](examples/rank.yml)
|
12
|
+
|
13
|
+
![rank diagram(PNG)](examples/rank.png)
|
14
|
+
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# NetworkDrawer
|
2
2
|
|
3
|
-
A network diagram drawer with
|
3
|
+
A network diagram drawer with YAML or JSON.
|
4
4
|
|
5
5
|
[![Gem Version](https://badge.fury.io/rb/network_drawer.svg)](http://badge.fury.io/rb/network_drawer)
|
6
6
|
|
@@ -36,27 +36,27 @@ Or install it yourself as:
|
|
36
36
|
|
37
37
|
## Usage
|
38
38
|
|
39
|
-
You can draw a network diagram with a
|
40
|
-
|
41
|
-
$ bundle exec network_drawer draw examples/simple.json
|
39
|
+
You can draw a network diagram with a YAML or JSONfile with SVG format:
|
42
40
|
|
43
41
|
$ bundle exec network_drawer draw examples/simple.yml
|
44
42
|
|
45
|
-
|
43
|
+
$ bundle exec network_drawer draw examples/simple.json
|
46
44
|
|
47
|
-
|
45
|
+
You can draw a network diagram with specified style:
|
48
46
|
|
49
47
|
$ bundle exec network_drawer draw examples/simple.yml -s examples/simple_style.yml
|
50
48
|
|
49
|
+
$ bundle exec network_drawer draw examples/simple.json -s examples/simple_style.json
|
50
|
+
|
51
51
|
You can draw a network diagram with specified layout(dot, fdp..):
|
52
52
|
|
53
|
-
$ bundle exec network_drawer draw examples/simple.
|
53
|
+
$ bundle exec network_drawer draw examples/simple.yml -l fdp
|
54
54
|
|
55
55
|
You can draw a network diagram with png format:
|
56
56
|
|
57
|
-
$ bundle exec network_drawer draw examples/simple.
|
57
|
+
$ bundle exec network_drawer draw examples/simple.yml -f png
|
58
58
|
|
59
|
-
Then You will get a network diagram.
|
59
|
+
Then You will get a network diagram. See more [Gallery](GALLERY.md)
|
60
60
|
|
61
61
|
[sample diagram(SVG)](examples/simple.svg)
|
62
62
|
|
@@ -64,7 +64,7 @@ Then You will get a network diagram.
|
|
64
64
|
|
65
65
|
## How to describe
|
66
66
|
|
67
|
-
You can describe diagram with JSON.
|
67
|
+
You can describe diagram with YAML or JSON.
|
68
68
|
|
69
69
|
### Network diagram
|
70
70
|
|
data/Rakefile
CHANGED
@@ -8,11 +8,13 @@ task :update do
|
|
8
8
|
'GEM_HOME' => nil
|
9
9
|
}
|
10
10
|
|
11
|
-
%w(
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
%w(simple rank).each do |name|
|
12
|
+
%w(png svg).each do |f|
|
13
|
+
command = 'bundle exec bin/network_drawer '
|
14
|
+
command << "draw examples/#{name}.yml "
|
15
|
+
command << "-s examples/#{name}_style.yml -f #{f}"
|
15
16
|
|
16
|
-
|
17
|
+
system(env, command)
|
18
|
+
end
|
17
19
|
end
|
18
20
|
end
|
data/examples/rank.png
ADDED
Binary file
|
data/examples/rank.svg
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
2
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
3
|
+
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
4
|
+
<!-- Generated by graphviz version 2.34.0 (20140129.0153)
|
5
|
+
-->
|
6
|
+
<!-- Title: rank Pages: 1 -->
|
7
|
+
<svg width="292pt" height="292pt"
|
8
|
+
viewBox="0.00 0.00 292.00 292.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
9
|
+
<g id="0" class="graph" transform="scale(1 1) rotate(0) translate(4 288)">
|
10
|
+
<title>rank</title>
|
11
|
+
<polygon fill="white" stroke="white" points="-4,4 -4,-288 288,-288 288,4 -4,4"/>
|
12
|
+
<g id="1" class="cluster"><title>cluster_1</title>
|
13
|
+
<polygon fill="none" stroke="black" points="108,-164 108,-240 194,-240 194,-164 108,-164"/>
|
14
|
+
<text text-anchor="middle" x="151" y="-222" font-family="Helvetica,sans-Serif" font-size="14.00">Web</text>
|
15
|
+
</g>
|
16
|
+
<g id="2" class="cluster"><title>cluster_2</title>
|
17
|
+
<polygon fill="none" stroke="black" points="38,-8 38,-156 219,-156 219,-8 38,-8"/>
|
18
|
+
<text text-anchor="middle" x="128.5" y="-138" font-family="Helvetica,sans-Serif" font-size="14.00">App</text>
|
19
|
+
</g>
|
20
|
+
<!-- 0 -->
|
21
|
+
<g id="0" class="node"><title>0</title>
|
22
|
+
<g id="a_0"><a xlink:title="WebLB">
|
23
|
+
<polygon fill="none" stroke="black" points="186,-208 116,-208 116,-172 186,-172 186,-208"/>
|
24
|
+
<text text-anchor="start" x="128.168" y="-183.9" font-family="Helvetica,sans-Serif" font-size="14.00">WebLB</text>
|
25
|
+
</a>
|
26
|
+
</g>
|
27
|
+
</g>
|
28
|
+
<!-- 1 -->
|
29
|
+
<g id="1" class="node"><title>1</title>
|
30
|
+
<g id="a_1"><a xlink:title="AppLB">
|
31
|
+
<polygon fill="none" stroke="black" points="161.25,-124 94.75,-124 94.75,-88 161.25,-88 161.25,-124"/>
|
32
|
+
<text text-anchor="start" x="107.483" y="-99.9" font-family="Helvetica,sans-Serif" font-size="14.00">AppLB</text>
|
33
|
+
</a>
|
34
|
+
</g>
|
35
|
+
</g>
|
36
|
+
<!-- 0->1 -->
|
37
|
+
<g id="3" class="edge"><title>0->1</title>
|
38
|
+
<path fill="none" stroke="black" d="M146.122,-171.61C143.052,-160.665 139.027,-146.315 135.55,-133.919"/>
|
39
|
+
<polygon fill="black" stroke="black" points="138.862,-132.767 132.792,-124.084 132.123,-134.658 138.862,-132.767"/>
|
40
|
+
</g>
|
41
|
+
<!-- 2 -->
|
42
|
+
<g id="2" class="node"><title>2</title>
|
43
|
+
<g id="a_2"><a xlink:title="App001">
|
44
|
+
<polygon fill="none" stroke="black" points="119.25,-52 46.75,-52 46.75,-16 119.25,-16 119.25,-52"/>
|
45
|
+
<text text-anchor="start" x="59.3657" y="-27.9" font-family="Helvetica,sans-Serif" font-size="14.00">App001</text>
|
46
|
+
</a>
|
47
|
+
</g>
|
48
|
+
</g>
|
49
|
+
<!-- 1->2 -->
|
50
|
+
<g id="4" class="edge"><title>1->2</title>
|
51
|
+
<path fill="none" stroke="black" d="M110.961,-87.6966C104.953,-79.6436 98.4754,-69.8945 93.1562,-60.9824"/>
|
52
|
+
<polygon fill="black" stroke="black" points="96.0905,-59.0622 88.1006,-52.1043 90.0076,-62.5261 96.0905,-59.0622"/>
|
53
|
+
</g>
|
54
|
+
<!-- 1->2 -->
|
55
|
+
<g id="5" class="edge"><title>1->2</title>
|
56
|
+
<path fill="none" stroke="black" d="M122.792,-87.6966C118.354,-79.4741 112.133,-69.4832 105.862,-60.4207"/>
|
57
|
+
<polygon fill="black" stroke="black" points="108.566,-58.186 99.8907,-52.1043 102.88,-62.2687 108.566,-58.186"/>
|
58
|
+
</g>
|
59
|
+
<!-- 3 -->
|
60
|
+
<g id="3" class="node"><title>3</title>
|
61
|
+
<g id="a_3"><a xlink:title="App002">
|
62
|
+
<polygon fill="none" stroke="black" points="210.25,-52 137.75,-52 137.75,-16 210.25,-16 210.25,-52"/>
|
63
|
+
<text text-anchor="start" x="150.366" y="-27.9" font-family="Helvetica,sans-Serif" font-size="14.00">App002</text>
|
64
|
+
</a>
|
65
|
+
</g>
|
66
|
+
</g>
|
67
|
+
<!-- 1->3 -->
|
68
|
+
<g id="6" class="edge"><title>1->3</title>
|
69
|
+
<path fill="none" stroke="black" d="M133.455,-87.6966C138.01,-79.4741 144.374,-69.4832 150.775,-60.4207"/>
|
70
|
+
<polygon fill="black" stroke="black" points="153.781,-62.2403 156.865,-52.1043 148.133,-58.1045 153.781,-62.2403"/>
|
71
|
+
</g>
|
72
|
+
<!-- 1->3 -->
|
73
|
+
<g id="7" class="edge"><title>1->3</title>
|
74
|
+
<path fill="none" stroke="black" d="M145.287,-87.6966C151.409,-79.6436 158.026,-69.8945 163.473,-60.9824"/>
|
75
|
+
<polygon fill="black" stroke="black" points="166.636,-62.5051 168.655,-52.1043 160.591,-58.9762 166.636,-62.5051"/>
|
76
|
+
</g>
|
77
|
+
<!-- 6 -->
|
78
|
+
<!-- 7 -->
|
79
|
+
<!-- 6->7 -->
|
80
|
+
<!-- 8 -->
|
81
|
+
<!-- 7->8 -->
|
82
|
+
<!-- 9 -->
|
83
|
+
<!-- 8->9 -->
|
84
|
+
<!-- 4 -->
|
85
|
+
<g id="4" class="node"><title>4</title>
|
86
|
+
<g id="a_4"><a xlink:title="Browser">
|
87
|
+
<polygon fill="none" stroke="black" points="189,-284 113,-284 113,-248 189,-248 189,-284"/>
|
88
|
+
<text text-anchor="start" x="125.328" y="-259.9" font-family="Helvetica,sans-Serif" font-size="14.00">Browser</text>
|
89
|
+
</a>
|
90
|
+
</g>
|
91
|
+
</g>
|
92
|
+
<!-- 4->0 -->
|
93
|
+
<g id="0" class="edge"><title>4->0</title>
|
94
|
+
<path fill="none" stroke="black" d="M145.199,-247.837C144.267,-239.058 144.022,-228.163 144.462,-218.267"/>
|
95
|
+
<polygon fill="black" stroke="black" points="147.969,-218.299 145.209,-208.07 140.988,-217.787 147.969,-218.299"/>
|
96
|
+
</g>
|
97
|
+
<!-- 4->0 -->
|
98
|
+
<g id="1" class="edge"><title>4->0</title>
|
99
|
+
<path fill="none" stroke="black" d="M156.801,-247.837C157.733,-239.058 157.978,-228.163 157.538,-218.267"/>
|
100
|
+
<polygon fill="black" stroke="black" points="161.012,-217.787 156.791,-208.07 154.031,-218.299 161.012,-217.787"/>
|
101
|
+
</g>
|
102
|
+
<!-- 5 -->
|
103
|
+
<g id="5" class="node"><title>5</title>
|
104
|
+
<g id="a_5"><a xlink:title="Mail Server">
|
105
|
+
<polygon fill="none" stroke="black" points="94.25,-284 -0.25,-284 -0.25,-248 94.25,-248 94.25,-284"/>
|
106
|
+
<text text-anchor="start" x="12.1035" y="-259.9" font-family="Helvetica,sans-Serif" font-size="14.00">Mail Server</text>
|
107
|
+
</a>
|
108
|
+
</g>
|
109
|
+
</g>
|
110
|
+
<!-- 5->1 -->
|
111
|
+
<g id="2" class="edge"><title>5->1</title>
|
112
|
+
<path fill="none" stroke="black" d="M55.8226,-247.79C70.0038,-220.128 97.9612,-165.594 114.612,-133.115"/>
|
113
|
+
<polygon fill="black" stroke="black" points="117.741,-134.684 119.188,-124.188 111.512,-131.49 117.741,-134.684"/>
|
114
|
+
</g>
|
115
|
+
</g>
|
116
|
+
</svg>
|
data/examples/rank.yml
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
layers:
|
2
|
+
- Web:
|
3
|
+
nodes:
|
4
|
+
- WebLB:
|
5
|
+
ranking: 1
|
6
|
+
- App:
|
7
|
+
nodes:
|
8
|
+
- AppLB:
|
9
|
+
ranking: 3
|
10
|
+
- App001:
|
11
|
+
ranking: 4
|
12
|
+
- App002:
|
13
|
+
ranking: 4
|
14
|
+
nodes:
|
15
|
+
- Browser:
|
16
|
+
ranking: 0
|
17
|
+
- Mail Server:
|
18
|
+
ranking: 0
|
19
|
+
connections:
|
20
|
+
- from: Browser
|
21
|
+
to: WebLB
|
22
|
+
- from: Browser
|
23
|
+
to: WebLB
|
24
|
+
- from: Mail Server
|
25
|
+
to: AppLB
|
26
|
+
- from: WebLB
|
27
|
+
to: AppLB
|
28
|
+
- from: AppLB
|
29
|
+
to: App001
|
30
|
+
- from: AppLB
|
31
|
+
to: App001
|
32
|
+
- from: AppLB
|
33
|
+
to: App002
|
34
|
+
- from: AppLB
|
35
|
+
to: App002
|
File without changes
|
@@ -21,6 +21,7 @@ module NetworkDrawer
|
|
21
21
|
@nodes = {}
|
22
22
|
@layers = {}
|
23
23
|
@connections = []
|
24
|
+
@rankings = {}
|
24
25
|
@style = options[:style] ? options[:style] : {}
|
25
26
|
@gv = Gviz.new(@title)
|
26
27
|
end
|
@@ -31,6 +32,7 @@ module NetworkDrawer
|
|
31
32
|
draw_elements
|
32
33
|
|
33
34
|
@gv.global(layout: @options[:layout] ? @options[:layout] : :dot)
|
35
|
+
@gv.global(newrank: true) if @rankings.size > 0
|
34
36
|
@gv.global(@source.dup.delete_if { |k, _| ELELMENT_KEYS.include?(k) })
|
35
37
|
@gv.save @dest_file, @options[:format]
|
36
38
|
end
|
@@ -42,6 +44,9 @@ module NetworkDrawer
|
|
42
44
|
@connections.each do |c|
|
43
45
|
code << c.to_code
|
44
46
|
end if @connections
|
47
|
+
|
48
|
+
rank_nodes
|
49
|
+
|
45
50
|
@gv.graph(&eval("proc {#{code}}"))
|
46
51
|
end
|
47
52
|
|
@@ -75,6 +80,14 @@ module NetworkDrawer
|
|
75
80
|
node = Element::Node.new(n.values.first, @style[:types])
|
76
81
|
node.name = n.keys.first
|
77
82
|
@nodes[node.name] = { id: node.id }
|
83
|
+
ranking = node.ranking.to_i
|
84
|
+
unless node.ranking.nil?
|
85
|
+
if @rankings[ranking]
|
86
|
+
@rankings[ranking] += [node.id]
|
87
|
+
else
|
88
|
+
@rankings[ranking] = [node.id]
|
89
|
+
end
|
90
|
+
end
|
78
91
|
nodes << node
|
79
92
|
end
|
80
93
|
nodes
|
@@ -107,6 +120,22 @@ module NetworkDrawer
|
|
107
120
|
connections
|
108
121
|
end
|
109
122
|
|
123
|
+
def rank_nodes
|
124
|
+
return if @rankings.size == 0
|
125
|
+
sorted_rankings = @rankings.sort
|
126
|
+
rank_ids = []
|
127
|
+
sorted_rankings.each_with_index do |r, i|
|
128
|
+
rank_id = (@nodes.size + i)
|
129
|
+
rank_ids << rank_id
|
130
|
+
@gv.rank(:same, *([rank_id] + r[1]))
|
131
|
+
end
|
132
|
+
rank_ids.each_with_index do |r, i|
|
133
|
+
@gv.node(r.to_s.to_sym, style: :invis)
|
134
|
+
edge_id = "#{rank_ids[i]}_#{rank_ids[i + 1]}".to_sym
|
135
|
+
@gv.edge(edge_id, style: :invis) if i < rank_ids.size - 1
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
110
139
|
def node_exist?(name)
|
111
140
|
return false unless name
|
112
141
|
if @nodes[name] && @nodes[name][:id]
|
@@ -14,8 +14,10 @@ module NetworkDrawer
|
|
14
14
|
def to_code
|
15
15
|
style = style(self.type).dup
|
16
16
|
style.merge!(self.to_hash)
|
17
|
+
self.max_column = style[:max_column]
|
17
18
|
style.merge!(label: build_label, tooltip: self.name, URL: self.url )
|
18
|
-
style.
|
19
|
+
style.delete(:ports)
|
20
|
+
style.delete(:modules)
|
19
21
|
"node(:\"#{self.id}\", #{style})"
|
20
22
|
end
|
21
23
|
|
@@ -41,7 +43,7 @@ module NetworkDrawer
|
|
41
43
|
if num_ports > 0
|
42
44
|
label << "<tr border='1'>"
|
43
45
|
self.ports.each_with_index do |p, i|
|
44
|
-
label << "<td border='1' port=\"p#{p.gsub('/', '')}\">#{p}</td>"
|
46
|
+
label << "<td border='1' port=\"p#{p.to_s.gsub('/', '')}\">#{p}</td>"
|
45
47
|
label << row_separator(i, num_ports)
|
46
48
|
end
|
47
49
|
label << '</tr>'
|
@@ -54,7 +56,7 @@ module NetworkDrawer
|
|
54
56
|
if num_modules > 0
|
55
57
|
label << "<tr border='1'>"
|
56
58
|
self.modules.each_with_index do |p, i|
|
57
|
-
label << "<td border='1' port=\"p#{p.gsub('/', '')}\">#{p}</td>"
|
59
|
+
label << "<td border='1' port=\"p#{p.to_s.gsub('/', '')}\">#{p}</td>"
|
58
60
|
label << row_separator(i, num_modules)
|
59
61
|
end
|
60
62
|
label << '</tr>'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: network_drawer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hiroshi Ota
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gviz
|
@@ -103,11 +103,16 @@ extensions: []
|
|
103
103
|
extra_rdoc_files: []
|
104
104
|
files:
|
105
105
|
- ".gitignore"
|
106
|
+
- GALLERY.md
|
106
107
|
- Gemfile
|
107
108
|
- LICENSE.txt
|
108
109
|
- README.md
|
109
110
|
- Rakefile
|
110
111
|
- bin/network_drawer
|
112
|
+
- examples/rank.png
|
113
|
+
- examples/rank.svg
|
114
|
+
- examples/rank.yml
|
115
|
+
- examples/rank_style.yml
|
111
116
|
- examples/simple.json
|
112
117
|
- examples/simple.png
|
113
118
|
- examples/simple.svg
|