Class: Spoom::Coverage::D3::Timeline
- Inherits:
-
Base
- Object
- Base
- Spoom::Coverage::D3::Timeline
show all
- Extended by:
- T::Helpers, T::Sig
- Defined in:
- lib/spoom/coverage/d3/timeline.rb
Defined Under Namespace
Classes: Calls, RBIs, Runtimes, Sigils, Sigs, Stacked, Versions
Instance Attribute Summary
Attributes inherited from Base
#id
Class Method Summary
collapse
Instance Method Summary
collapse
-
#area(y:, color: "#ccc", curve: "curveCatmullRom.alpha(1)") ⇒ Object
-
#initialize(id, data, keys) ⇒ Timeline
constructor
A new instance of Timeline.
-
#line(y:, color: "#ccc", curve: "curveCatmullRom.alpha(1)") ⇒ Object
-
#plot ⇒ Object
-
#points(y:) ⇒ Object
-
#script ⇒ Object
-
#x_scale ⇒ Object
-
#x_ticks ⇒ Object
-
#y_scale(min:, max:, ticks:) ⇒ Object
-
#y_ticks(ticks:, format:, padding:) ⇒ Object
Methods inherited from Base
#html, #tooltip
Constructor Details
#initialize(id, data, keys) ⇒ Timeline
Returns a new instance of Timeline.
16
17
18
19
|
# File 'lib/spoom/coverage/d3/timeline.rb', line 16
def initialize(id, data, keys)
super(id, data)
@keys = keys
end
|
Class Method Details
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
# File 'lib/spoom/coverage/d3/timeline.rb', line 79
def
<<~JS
var parseVersion = function(version) {
if (!version) {
return null;
}
return parseFloat(version.replaceAll("0.", ""));
}
function tooltipTimeline(d, kind) {
moveTooltip(d)
.html("commit <b>" + d.data.commit + "</b><br>"
+ d3.timeFormat("%y/%m/%d")(parseDate(d.data.timestamp)) + "<br><br>"
+ "<b>typed: " + d.key + "</b><br><br>"
+ "<b>" + (d.data.values[d.key] ? d.data.values[d.key] : 0) + "</b> " + kind +"<br>"
+ "<b>" + toPercent(d.data.values[d.key] ? d.data.values[d.key] : 0, d.data.total) + "%")
}
JS
end
|
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
# File 'lib/spoom/coverage/d3/timeline.rb', line 25
def
<<~CSS
.domain {
stroke: transparent;
}
.grid line {
stroke: #ccc;
}
.axis text {
font: 12px Arial, sans-serif;
fill: #333;
text-anchor: right;
pointer-events: none;
}
.area {
fill-opacity: 0.5;
}
.line {
stroke-width: 2;
fill: transparent;
}
.dot {
r: 2;
fill: #888;
}
.inverted .grid line {
stroke: #777;
}
.inverted .area {
fill-opacity: 0.9;
}
.inverted .axis text {
fill: #fff;
}
.inverted .axis line {
stroke: #fff;
}
.inverted .dot {
fill: #fff;
}
CSS
end
|
Instance Method Details
#area(y:, color: "#ccc", curve: "curveCatmullRom.alpha(1)") ⇒ Object
187
188
189
190
191
192
193
194
195
196
197
198
199
200
|
# File 'lib/spoom/coverage/d3/timeline.rb', line 187
def area(y:, color: "#ccc", curve: "curveCatmullRom.alpha(1)")
<<~HTML
svg_#{id}.append("path")
.datum(data_#{id}.filter((d) => #{y}))
.attr("class", "area")
.attr("d", d3.area()
.defined((d) => #{y})
.x((d) => xScale_#{id}(parseDate(d.timestamp)))
.y0(yScale_#{id}(0))
.y1((d) => yScale_#{id}(#{y}))
.curve(d3.#{curve}))
.attr("fill", "#{color}")
HTML
end
|
#line(y:, color: "#ccc", curve: "curveCatmullRom.alpha(1)") ⇒ Object
203
204
205
206
207
208
209
210
211
212
213
214
|
# File 'lib/spoom/coverage/d3/timeline.rb', line 203
def line(y:, color: "#ccc", curve: "curveCatmullRom.alpha(1)")
<<~HTML
svg_#{id}.append("path")
.datum(data_#{id}.filter((d) => #{y}))
.attr("class", "line")
.attr("d", d3.line()
.x((d) => xScale_#{id}(parseDate(d.timestamp)))
.y((d) => yScale_#{id}(#{y}))
.curve(d3.#{curve}))
.attr("stroke", "#{color}")
HTML
end
|
#plot ⇒ Object
126
|
# File 'lib/spoom/coverage/d3/timeline.rb', line 126
def plot; end
|
#points(y:) ⇒ Object
217
218
219
220
221
222
223
224
225
226
227
228
229
230
|
# File 'lib/spoom/coverage/d3/timeline.rb', line 217
def points(y:)
<<~HTML
svg_#{id}.selectAll("circle")
.data(data_#{id})
.enter()
.append("circle")
.attr("class", "dot")
.attr("cx", (d) => xScale_#{id}(parseDate(d.timestamp)))
.attr("cy", (d, i) => yScale_#{id}(#{y}))
.on("mouseover", (d) => tooltip.style("opacity", 1))
.on("mousemove", tooltip_#{id})
.on("mouseleave", (d) => tooltip.style("opacity", 0));
HTML
end
|
#script ⇒ Object
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
# File 'lib/spoom/coverage/d3/timeline.rb', line 101
def script
<<~HTML
#{tooltip}
var data_#{id} = #{@data.to_json};
function draw_#{id}() {
var width_#{id} = document.getElementById("#{id}").clientWidth;
var height_#{id} = 200;
d3.select("##{id}").selectAll("*").remove()
var svg_#{id} = d3.select("##{id}")
.attr("width", width_#{id})
.attr("height", height_#{id})
#{plot}
}
draw_#{id}();
window.addEventListener("resize", draw_#{id});
HTML
end
|
#x_scale ⇒ Object
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
# File 'lib/spoom/coverage/d3/timeline.rb', line 129
def x_scale
<<~HTML
var xScale_#{id} = d3.scaleTime()
.range([0, width_#{id}])
.domain(d3.extent(data_#{id}, (d) => parseDate(d.timestamp)));
svg_#{id}.append("g")
.attr("class", "grid")
.attr("transform", "translate(0," + height_#{id} + ")")
.call(d3.axisBottom(xScale_#{id})
.tickFormat("")
.tickSize(-height_#{id}))
HTML
end
|
#x_ticks ⇒ Object
145
146
147
148
149
150
151
152
153
154
155
|
# File 'lib/spoom/coverage/d3/timeline.rb', line 145
def x_ticks
<<~HTML
svg_#{id}.append("g")
.attr("class", "axis x")
.attr("transform", "translate(0," + height_#{id} + ")")
.call(d3.axisBottom(xScale_#{id})
.tickFormat(d3.timeFormat("%y/%m/%d"))
.tickPadding(-15)
.tickSize(-3));
HTML
end
|
#y_scale(min:, max:, ticks:) ⇒ Object
158
159
160
161
162
163
164
165
166
167
168
169
170
171
|
# File 'lib/spoom/coverage/d3/timeline.rb', line 158
def y_scale(min:, max:, ticks:)
<<~HTML
var yScale_#{id} = d3.scaleLinear()
.range([height_#{id}, 0])
.domain([#{min}, #{max}]);
svg_#{id}.append("g")
.attr("class", "grid")
.call(d3.axisLeft(yScale_#{id})
.#{ticks}
.tickFormat("")
.tickSize(-width_#{id}))
HTML
end
|
#y_ticks(ticks:, format:, padding:) ⇒ Object
174
175
176
177
178
179
180
181
182
183
184
|
# File 'lib/spoom/coverage/d3/timeline.rb', line 174
def y_ticks(ticks:, format:, padding:)
<<~HTML
svg_#{id}.append("g")
.attr("class", "axis y")
.call(d3.axisLeft(yScale_#{id})
.#{ticks}
.tickSize(-3)
.tickFormat((d) => #{format})
.tickPadding(-#{padding}))
HTML
end
|