ellington 0.2.0 → 0.2.1
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/Gemfile.lock +1 -1
- data/lib/ellington/version.rb +1 -1
- data/lib/ellington/visualizer.rb +41 -28
- 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: d158926e81d20f91c3db3ae55e8a38731132f403
|
4
|
+
data.tar.gz: fb9bbdf73413c8e5cf970b4a741b51d1bdce8196
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e78d31ba43e27ad2e1c964704801e933453be29fb24de15b3bc97a7604d3c7c521e1d604cec4d6758000f7435bb6b4d8d30fc745bfdbea27aeab676d53452646
|
7
|
+
data.tar.gz: a5f70a00195b58cceaaba01bb20cce09dd7aac282b0b2d96e3614bdaf9be82a6e1ec3cc4b7556ad72559c9076caa1b3e8a5cfa0ef0f47e8792b63e4c49b33d9c
|
data/Gemfile.lock
CHANGED
data/lib/ellington/version.rb
CHANGED
data/lib/ellington/visualizer.rb
CHANGED
@@ -33,11 +33,12 @@ module Ellington
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
attr_reader :route, :format
|
36
|
+
attr_reader :route, :format, :short_names
|
37
37
|
|
38
|
-
def initialize(route, format
|
38
|
+
def initialize(route, format: :svg, short_names: true)
|
39
39
|
@route = route
|
40
40
|
@format = format
|
41
|
+
@short_names = short_names
|
41
42
|
end
|
42
43
|
|
43
44
|
FONTNAME = "Helvetica"
|
@@ -63,19 +64,31 @@ module Ellington
|
|
63
64
|
CLUSTER_FILLCOLOR = "gray70"
|
64
65
|
CLUSTER_PENCOLOR = "gray50"
|
65
66
|
|
67
|
+
def class_label(obj)
|
68
|
+
klass = obj
|
69
|
+
klass = klass.class unless klass.is_a?(Class)
|
70
|
+
return klass.name unless short_names
|
71
|
+
klass.name.split("::").last
|
72
|
+
end
|
73
|
+
|
74
|
+
def state_label(state)
|
75
|
+
return state unless short_names
|
76
|
+
state.split(" ").map { |part| part.split("::").last }.join(" | ")
|
77
|
+
end
|
78
|
+
|
66
79
|
def graph_lines_basic(passenger=nil)
|
67
80
|
g = Node.new(nil, GraphViz.new("GraphLinesBasic"))
|
68
81
|
set_graph_defaults g.viz
|
69
|
-
g.viz[
|
82
|
+
g.viz[:label] = "#{class_label(route)} Lines - basic"
|
70
83
|
|
71
84
|
route.lines.each_with_index do |line, index|
|
72
85
|
line_cluster = g.add(Node.new(line, g.viz.add_graph("cluster#{index}")))
|
73
86
|
set_cluster_defaults line_cluster.viz
|
74
|
-
line_cluster.viz[
|
87
|
+
line_cluster.viz[:label] = class_label(line)
|
75
88
|
|
76
89
|
line.stations.each do |station|
|
77
90
|
states = station.states.keys
|
78
|
-
station_node = line_cluster.add(Node.new(station, line_cluster.viz.add_nodes(station
|
91
|
+
station_node = line_cluster.add(Node.new(station, line_cluster.viz.add_nodes(class_label(station))))
|
79
92
|
style_node_for_line(station_node, line, *states)
|
80
93
|
style_node_for_route(station_node, route, *states)
|
81
94
|
style_node_for_passenger(station_node, passenger, *states)
|
@@ -88,8 +101,8 @@ module Ellington
|
|
88
101
|
#next_station = next_node.base
|
89
102
|
edge = line_cluster.viz.add_edges(node.viz, next_node.viz)
|
90
103
|
if passenger
|
91
|
-
if color_name(node.viz[
|
92
|
-
color_name(next_node.viz[
|
104
|
+
if color_name(node.viz[:color]) == NODE_COLOR_PASSENGER_HIT &&
|
105
|
+
color_name(next_node.viz[:color]) == NODE_COLOR_PASSENGER_HIT
|
93
106
|
edge["color"] = EDGE_COLOR_PASSENGER_HIT
|
94
107
|
edge["penwidth"] = EDGE_PENWIDTH_PASSENGER_HIT
|
95
108
|
else
|
@@ -106,12 +119,12 @@ module Ellington
|
|
106
119
|
def graph_lines(passenger=nil)
|
107
120
|
g = Node.new(nil, GraphViz.new("GraphLines"))
|
108
121
|
set_graph_defaults g.viz
|
109
|
-
g.viz[
|
122
|
+
g.viz[:label] = "#{class_label(route)} Lines"
|
110
123
|
|
111
124
|
route.lines.each_with_index do |line, index|
|
112
125
|
line_cluster = g.add(Node.new(line, g.viz.add_graph("cluster#{index}")))
|
113
126
|
set_cluster_defaults line_cluster.viz
|
114
|
-
line_cluster.viz[
|
127
|
+
line_cluster.viz[:label] = class_label(line)
|
115
128
|
add_state_nodes_for_line line_cluster, line, passenger
|
116
129
|
|
117
130
|
line.states.each do |state, transitions|
|
@@ -137,18 +150,18 @@ module Ellington
|
|
137
150
|
def graph_route_basic(passenger=nil)
|
138
151
|
g = Node.new(nil, GraphViz.new("GraphRouteBasic"))
|
139
152
|
set_graph_defaults g.viz
|
140
|
-
g.viz[
|
141
|
-
g.viz[
|
153
|
+
g.viz[:ranksep] = 1
|
154
|
+
g.viz[:label] = "#{class_label(route)} Route - basic"
|
142
155
|
|
143
156
|
route.lines.each_with_index do |line, index|
|
144
157
|
line_cluster = g.add(Node.new(line, g.viz.add_graph("cluster#{index}")))
|
145
158
|
set_cluster_defaults line_cluster.viz
|
146
|
-
line_cluster.viz[
|
159
|
+
line_cluster.viz[:label] = class_label(line)
|
147
160
|
|
148
161
|
passenger_hit = false
|
149
162
|
%w{PASS FAIL ERROR}.each do |state|
|
150
163
|
state_node = line_cluster.add(Node.new(state, line_cluster.viz.add_nodes("#{line.class.name}#{state}", "label" => state)))
|
151
|
-
states = line.stations.map{ |s| "#{state} #{s
|
164
|
+
states = line.stations.map{ |s| "#{state} #{class_label(s)}" }
|
152
165
|
style_node_for_line(state_node, line, *states)
|
153
166
|
style_node_for_route(state_node, route, *states)
|
154
167
|
passenger_hit ||= style_node_for_passenger(state_node, passenger, *line.send("#{state.downcase}ed"))
|
@@ -183,11 +196,11 @@ module Ellington
|
|
183
196
|
if connection.type == :if_all
|
184
197
|
combos.each do |state, nodes|
|
185
198
|
node_name = nodes.map{ |n| n.base.class.name }.join + state
|
186
|
-
node_label = nodes.map{ |n|
|
187
|
-
viz = g.viz.add_nodes(node_name,
|
188
|
-
viz[
|
189
|
-
viz[
|
190
|
-
viz[
|
199
|
+
node_label = nodes.map{ |n| state_label(state) }.join("\n")
|
200
|
+
viz = g.viz.add_nodes(node_name, :label => node_label)
|
201
|
+
viz[:style] = NODE_STYLE_VIRTUAL
|
202
|
+
viz[:color] = NODE_COLOR_VIRTUAL
|
203
|
+
viz[:fontcolor] = NODE_FONTCOLOR_VIRTUAL
|
191
204
|
|
192
205
|
nodes.each do |node|
|
193
206
|
from_viz = node.viz.get_node("#{node.base.class.name}#{state}")
|
@@ -209,23 +222,23 @@ module Ellington
|
|
209
222
|
def graph_route(passenger=nil)
|
210
223
|
g = Node.new(nil, GraphViz.new("GraphRoute"))
|
211
224
|
set_graph_defaults g.viz
|
212
|
-
g.viz[
|
213
|
-
g.viz[
|
225
|
+
g.viz[:label] = "#{class_label(route)} Lines"
|
226
|
+
g.viz[:ranksep] = 0.8
|
214
227
|
|
215
228
|
route.lines.each_with_index do |line, index|
|
216
229
|
line_cluster = g.add(Node.new(line, g.viz.add_graph("cluster#{index}")))
|
217
230
|
set_cluster_defaults line_cluster.viz
|
218
|
-
line_cluster.viz[
|
231
|
+
line_cluster.viz[:label] = class_label(line)
|
219
232
|
add_state_nodes_for_line line_cluster, line, passenger
|
220
233
|
end
|
221
234
|
|
222
|
-
viz = g.viz.add_nodes(route.initial_state)
|
235
|
+
viz = g.viz.add_nodes(route.initial_state, :label => state_label(route.initial_state))
|
223
236
|
rendered_edges = {}
|
224
237
|
|
225
238
|
if passenger
|
226
239
|
passenger_nodes = g.reduce([]) do |memo, line_cluster|
|
227
240
|
line_cluster.children.each do |node|
|
228
|
-
if node.viz[
|
241
|
+
if node.viz[:color].to_s.gsub(/\W/, "") == NODE_COLOR_PASSENGER_HIT
|
229
242
|
memo << node
|
230
243
|
end
|
231
244
|
end
|
@@ -271,7 +284,7 @@ module Ellington
|
|
271
284
|
|
272
285
|
def add_state_nodes_for_line(cluster, line, passenger)
|
273
286
|
line.states.keys.each do |state|
|
274
|
-
node = cluster.add(Node.new(state, cluster.viz.add_nodes(state)))
|
287
|
+
node = cluster.add(Node.new(state, cluster.viz.add_nodes(state, :label => state_label(state))))
|
275
288
|
style_node_for_line(node, line, state)
|
276
289
|
style_node_for_route(node, route, state)
|
277
290
|
style_node_for_passenger(node, passenger, state)
|
@@ -279,8 +292,8 @@ module Ellington
|
|
279
292
|
end
|
280
293
|
|
281
294
|
def style_node(node, color)
|
282
|
-
node.viz[
|
283
|
-
node.viz[
|
295
|
+
node.viz[:color] = color
|
296
|
+
node.viz[:fillcolor] = color
|
284
297
|
true
|
285
298
|
end
|
286
299
|
|
@@ -297,8 +310,8 @@ module Ellington
|
|
297
310
|
def style_node_for_passenger(node, passenger, *states)
|
298
311
|
return false if passenger.nil?
|
299
312
|
return false if (passenger.state_history & states).empty?
|
300
|
-
node.viz[
|
301
|
-
node.viz[
|
313
|
+
node.viz[:color] = NODE_COLOR_PASSENGER_HIT
|
314
|
+
node.viz[:penwidth] = NODE_PENWIDTH_PASSENGER_HIT
|
302
315
|
true
|
303
316
|
end
|
304
317
|
|