spoom 1.1.11 → 1.1.13
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 +1 -0
- data/README.md +6 -0
- data/Rakefile +1 -0
- data/lib/spoom/cli/bump.rb +17 -12
- data/lib/spoom/cli/coverage.rb +20 -17
- data/lib/spoom/cli/helper.rb +6 -5
- data/lib/spoom/cli/lsp.rb +4 -3
- data/lib/spoom/cli/run.rb +18 -8
- data/lib/spoom/cli.rb +6 -4
- data/lib/spoom/context.rb +219 -0
- data/lib/spoom/coverage/d3/base.rb +12 -8
- data/lib/spoom/coverage/d3/circle_map.rb +40 -37
- data/lib/spoom/coverage/d3/pie.rb +41 -30
- data/lib/spoom/coverage/d3/timeline.rb +95 -88
- data/lib/spoom/coverage/d3.rb +72 -70
- data/lib/spoom/coverage/report.rb +6 -6
- data/lib/spoom/coverage/snapshot.rb +65 -34
- data/lib/spoom/coverage.rb +104 -81
- data/lib/spoom/file_tree.rb +5 -3
- data/lib/spoom/git.rb +102 -96
- data/lib/spoom/printer.rb +4 -0
- data/lib/spoom/sorbet/errors.rb +30 -12
- data/lib/spoom/sorbet/lsp/base.rb +1 -1
- data/lib/spoom/sorbet/lsp/errors.rb +23 -17
- data/lib/spoom/sorbet/lsp/structures.rb +86 -55
- data/lib/spoom/sorbet/lsp.rb +78 -70
- data/lib/spoom/sorbet/metrics.rb +18 -16
- data/lib/spoom/sorbet/sigils.rb +59 -54
- data/lib/spoom/sorbet.rb +17 -14
- data/lib/spoom/timeline.rb +6 -5
- data/lib/spoom/version.rb +1 -1
- data/lib/spoom.rb +43 -25
- metadata +20 -20
- data/lib/spoom/test_helpers/project.rb +0 -138
@@ -7,50 +7,52 @@ module Spoom
|
|
7
7
|
module Coverage
|
8
8
|
module D3
|
9
9
|
class CircleMap < Base
|
10
|
-
|
10
|
+
class << self
|
11
|
+
extend T::Sig
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
13
|
+
sig { returns(String) }
|
14
|
+
def header_style
|
15
|
+
<<~CSS
|
16
|
+
.node {
|
17
|
+
cursor: pointer;
|
18
|
+
}
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
.node:hover {
|
21
|
+
stroke: #333;
|
22
|
+
stroke-width: 1px;
|
23
|
+
}
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
25
|
+
.label.dir {
|
26
|
+
fill: #333;
|
27
|
+
}
|
27
28
|
|
28
|
-
|
29
|
-
|
30
|
-
|
29
|
+
.label.file {
|
30
|
+
font: 12px Arial, sans-serif;
|
31
|
+
}
|
31
32
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
33
|
+
.node.root, .node.file {
|
34
|
+
pointer-events: none;
|
35
|
+
}
|
36
|
+
CSS
|
37
|
+
end
|
37
38
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
39
|
+
sig { returns(String) }
|
40
|
+
def header_script
|
41
|
+
<<~JS
|
42
|
+
function treeHeight(root, height = 0) {
|
43
|
+
height += 1;
|
44
|
+
if (root.children && root.children.length > 0)
|
45
|
+
return Math.max(...root.children.map(child => treeHeight(child, height)));
|
46
|
+
else
|
47
|
+
return height;
|
48
|
+
}
|
48
49
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
50
|
+
function tooltipMap(d) {
|
51
|
+
moveTooltip(d)
|
52
|
+
.html("<b>" + d.data.name + "</b>")
|
53
|
+
}
|
54
|
+
JS
|
55
|
+
end
|
54
56
|
end
|
55
57
|
|
56
58
|
sig { override.returns(String) }
|
@@ -159,6 +161,7 @@ module Spoom
|
|
159
161
|
if node.children.empty?
|
160
162
|
return { name: node.name, strictness: tree_node_strictness(node) }
|
161
163
|
end
|
164
|
+
|
162
165
|
{
|
163
166
|
name: node.name,
|
164
167
|
children: node.children.values.map { |n| tree_node_to_json(n) },
|
@@ -18,34 +18,38 @@ module Spoom
|
|
18
18
|
@title = title
|
19
19
|
end
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
<<~CSS
|
24
|
-
.pie .title {
|
25
|
-
font: 18px Arial, sans-serif;
|
26
|
-
font-weight: bold;
|
27
|
-
fill: #212529;
|
28
|
-
text-anchor: middle;
|
29
|
-
pointer-events: none;
|
30
|
-
}
|
21
|
+
class << self
|
22
|
+
extend T::Sig
|
31
23
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
24
|
+
sig { returns(String) }
|
25
|
+
def header_style
|
26
|
+
<<~CSS
|
27
|
+
.pie .title {
|
28
|
+
font: 18px Arial, sans-serif;
|
29
|
+
font-weight: bold;
|
30
|
+
fill: #212529;
|
31
|
+
text-anchor: middle;
|
32
|
+
pointer-events: none;
|
33
|
+
}
|
38
34
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
35
|
+
.pie .arc {
|
36
|
+
stroke: #fff;
|
37
|
+
stroke-width: 2px;
|
38
|
+
}
|
39
|
+
CSS
|
40
|
+
end
|
41
|
+
|
42
|
+
sig { returns(String) }
|
43
|
+
def header_script
|
44
|
+
<<~JS
|
45
|
+
function tooltipPie(d, title, kind, sum) {
|
46
|
+
moveTooltip(d)
|
47
|
+
.html("<b>" + title + "</b><br><br>"
|
48
|
+
+ "<b>" + d.data.value + "</b> " + kind + "<br>"
|
49
|
+
+ "<b>" + toPercent(d.data.value, sum) + "</b>%")
|
50
|
+
}
|
51
|
+
JS
|
52
|
+
end
|
49
53
|
end
|
50
54
|
|
51
55
|
sig { override.returns(String) }
|
@@ -121,14 +125,14 @@ module Spoom
|
|
121
125
|
|
122
126
|
sig { params(id: String, title: String, snapshot: Snapshot).void }
|
123
127
|
def initialize(id, title, snapshot)
|
124
|
-
super(id, title, snapshot.
|
128
|
+
super(id, title, snapshot.sigils_excluding_rbis.select { |_k, v| v })
|
125
129
|
end
|
126
130
|
|
127
131
|
sig { override.returns(String) }
|
128
132
|
def tooltip
|
129
133
|
<<~JS
|
130
134
|
function tooltip_#{id}(d) {
|
131
|
-
tooltipPie(d, "typed: " + d.data.key, "files", sum_#{id});
|
135
|
+
tooltipPie(d, "typed: " + d.data.key, "files excluding RBIs", sum_#{id});
|
132
136
|
}
|
133
137
|
JS
|
134
138
|
end
|
@@ -157,14 +161,21 @@ module Spoom
|
|
157
161
|
|
158
162
|
sig { params(id: String, title: String, snapshot: Snapshot).void }
|
159
163
|
def initialize(id, title, snapshot)
|
160
|
-
super(
|
164
|
+
super(
|
165
|
+
id,
|
166
|
+
title,
|
167
|
+
{ true: snapshot.methods_with_sig_excluding_rbis, false: snapshot.methods_without_sig_excluding_rbis }
|
168
|
+
)
|
161
169
|
end
|
162
170
|
|
163
171
|
sig { override.returns(String) }
|
164
172
|
def tooltip
|
165
173
|
<<~JS
|
166
174
|
function tooltip_#{id}(d) {
|
167
|
-
tooltipPie(
|
175
|
+
tooltipPie(
|
176
|
+
d,
|
177
|
+
(d.data.key == "true" ? " with" : " without") + " a signature", "methods excluding RBIs", sum_#{id}
|
178
|
+
)
|
168
179
|
}
|
169
180
|
JS
|
170
181
|
end
|
@@ -18,79 +18,83 @@ module Spoom
|
|
18
18
|
@keys = keys
|
19
19
|
end
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
<<~CSS
|
24
|
-
.domain {
|
25
|
-
stroke: transparent;
|
26
|
-
}
|
21
|
+
class << self
|
22
|
+
extend T::Sig
|
27
23
|
|
28
|
-
|
29
|
-
|
30
|
-
|
24
|
+
sig { returns(String) }
|
25
|
+
def header_style
|
26
|
+
<<~CSS
|
27
|
+
.domain {
|
28
|
+
stroke: transparent;
|
29
|
+
}
|
31
30
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
text-anchor: right;
|
36
|
-
pointer-events: none;
|
37
|
-
}
|
31
|
+
.grid line {
|
32
|
+
stroke: #ccc;
|
33
|
+
}
|
38
34
|
|
39
|
-
|
40
|
-
|
41
|
-
|
35
|
+
.axis text {
|
36
|
+
font: 12px Arial, sans-serif;
|
37
|
+
fill: #333;
|
38
|
+
text-anchor: right;
|
39
|
+
pointer-events: none;
|
40
|
+
}
|
42
41
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
}
|
42
|
+
.area {
|
43
|
+
fill-opacity: 0.5;
|
44
|
+
}
|
47
45
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
46
|
+
.line {
|
47
|
+
stroke-width: 2;
|
48
|
+
fill: transparent;
|
49
|
+
}
|
52
50
|
|
53
|
-
|
54
|
-
|
55
|
-
|
51
|
+
.dot {
|
52
|
+
r: 2;
|
53
|
+
fill: #888;
|
54
|
+
}
|
56
55
|
|
57
|
-
|
58
|
-
|
59
|
-
|
56
|
+
.inverted .grid line {
|
57
|
+
stroke: #777;
|
58
|
+
}
|
60
59
|
|
61
|
-
|
62
|
-
|
63
|
-
|
60
|
+
.inverted .area {
|
61
|
+
fill-opacity: 0.9;
|
62
|
+
}
|
64
63
|
|
65
|
-
|
66
|
-
|
67
|
-
|
64
|
+
.inverted .axis text {
|
65
|
+
fill: #fff;
|
66
|
+
}
|
68
67
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
CSS
|
73
|
-
end
|
68
|
+
.inverted .axis line {
|
69
|
+
stroke: #fff;
|
70
|
+
}
|
74
71
|
|
75
|
-
|
76
|
-
|
77
|
-
<<~JS
|
78
|
-
var parseVersion = function(version) {
|
79
|
-
if (!version) {
|
80
|
-
return null;
|
72
|
+
.inverted .dot {
|
73
|
+
fill: #fff;
|
81
74
|
}
|
82
|
-
|
83
|
-
|
75
|
+
CSS
|
76
|
+
end
|
84
77
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
78
|
+
sig { returns(String) }
|
79
|
+
def header_script
|
80
|
+
<<~JS
|
81
|
+
var parseVersion = function(version) {
|
82
|
+
if (!version) {
|
83
|
+
return null;
|
84
|
+
}
|
85
|
+
return parseFloat(version.replaceAll("0.", ""));
|
86
|
+
}
|
87
|
+
|
88
|
+
function tooltipTimeline(d, kind) {
|
89
|
+
moveTooltip(d)
|
90
|
+
.html("commit <b>" + d.data.commit + "</b><br>"
|
91
|
+
+ d3.timeFormat("%y/%m/%d")(parseDate(d.data.timestamp)) + "<br><br>"
|
92
|
+
+ "<b>typed: " + d.key + "</b><br><br>"
|
93
|
+
+ "<b>" + (d.data.values[d.key] ? d.data.values[d.key] : 0) + "</b> " + kind +"<br>"
|
94
|
+
+ "<b>" + toPercent(d.data.values[d.key] ? d.data.values[d.key] : 0, d.data.total) + "%")
|
95
|
+
}
|
96
|
+
JS
|
97
|
+
end
|
94
98
|
end
|
95
99
|
|
96
100
|
sig { override.returns(String) }
|
@@ -264,13 +268,13 @@ module Spoom
|
|
264
268
|
d3.min(data_#{id}, (d) => parseVersion(d.runtime))]) - 0.01",
|
265
269
|
max: "d3.max([d3.max(data_#{id}, (d) => parseVersion(d.static)),
|
266
270
|
d3.max(data_#{id}, (d) => parseVersion(d.runtime))]) + 0.01",
|
267
|
-
ticks:
|
271
|
+
ticks: "ticks(8)",
|
268
272
|
)}
|
269
|
-
#{line(y:
|
270
|
-
#{line(y:
|
271
|
-
#{points(y:
|
273
|
+
#{line(y: "parseVersion(d.runtime)", color: "#e83e8c", curve: "curveStepAfter")}
|
274
|
+
#{line(y: "parseVersion(d.static)", color: "#007bff", curve: "curveStepAfter")}
|
275
|
+
#{points(y: "parseVersion(d.static)")}
|
272
276
|
#{x_ticks}
|
273
|
-
#{y_ticks(ticks:
|
277
|
+
#{y_ticks(ticks: "ticks(4)", format: "'v0.' + d.toFixed(2)", padding: 50)}
|
274
278
|
JS
|
275
279
|
end
|
276
280
|
end
|
@@ -308,15 +312,15 @@ module Spoom
|
|
308
312
|
<<~JS
|
309
313
|
#{x_scale}
|
310
314
|
#{y_scale(
|
311
|
-
min:
|
315
|
+
min: "0",
|
312
316
|
max: "d3.max(data_#{id}, (d) => d.runtime)",
|
313
|
-
ticks:
|
317
|
+
ticks: "ticks(10)",
|
314
318
|
)}
|
315
|
-
#{area(y:
|
316
|
-
#{line(y:
|
317
|
-
#{points(y:
|
319
|
+
#{area(y: "d.runtime")}
|
320
|
+
#{line(y: "d.runtime")}
|
321
|
+
#{points(y: "d.runtime")}
|
318
322
|
#{x_ticks}
|
319
|
-
#{y_ticks(ticks:
|
323
|
+
#{y_ticks(ticks: "ticks(5)", format: 'd.toFixed(2) + "s"', padding: 40)}
|
320
324
|
.call(g => g.selectAll(".tick:first-of-type text").remove())
|
321
325
|
JS
|
322
326
|
end
|
@@ -373,15 +377,15 @@ module Spoom
|
|
373
377
|
def plot
|
374
378
|
<<~JS
|
375
379
|
#{x_scale}
|
376
|
-
#{y_scale(min:
|
377
|
-
#{line(y:
|
380
|
+
#{y_scale(min: "0", max: "100", ticks: "tickValues([0, 25, 50, 75, 100])")}
|
381
|
+
#{line(y: "d.data.timestamp")}
|
378
382
|
#{x_ticks}
|
379
|
-
#{y_ticks(ticks:
|
383
|
+
#{y_ticks(ticks: "tickValues([25, 50, 75])", format: "d + '%'", padding: 30)}
|
380
384
|
JS
|
381
385
|
end
|
382
386
|
|
383
387
|
sig { override.params(y: String, color: String, curve: String).returns(String) }
|
384
|
-
def line(y:, color:
|
388
|
+
def line(y:, color: "strictnessColor(d.key)", curve: "curveCatmullRom.alpha(1)")
|
385
389
|
<<~JS
|
386
390
|
var area_#{id} = d3.area()
|
387
391
|
.x((d) => xScale_#{id}(parseDate(#{y})))
|
@@ -424,8 +428,8 @@ module Spoom
|
|
424
428
|
{
|
425
429
|
timestamp: snapshot.commit_timestamp,
|
426
430
|
commit: snapshot.commit_sha,
|
427
|
-
total: snapshot.files,
|
428
|
-
values: snapshot.
|
431
|
+
total: snapshot.files - snapshot.rbi_files,
|
432
|
+
values: snapshot.sigils_excluding_rbis,
|
429
433
|
}
|
430
434
|
end
|
431
435
|
super(id, data, keys)
|
@@ -435,7 +439,7 @@ module Spoom
|
|
435
439
|
def tooltip
|
436
440
|
<<~JS
|
437
441
|
function tooltip_#{id}(d) {
|
438
|
-
tooltipTimeline(d, "files");
|
442
|
+
tooltipTimeline(d, "files excluding RBIs");
|
439
443
|
}
|
440
444
|
JS
|
441
445
|
end
|
@@ -446,7 +450,7 @@ module Spoom
|
|
446
450
|
|
447
451
|
sig { params(id: String, snapshots: T::Array[Snapshot]).void }
|
448
452
|
def initialize(id, snapshots)
|
449
|
-
keys = [
|
453
|
+
keys = ["false", "true"]
|
450
454
|
data = snapshots.map do |snapshot|
|
451
455
|
{
|
452
456
|
timestamp: snapshot.commit_timestamp,
|
@@ -473,13 +477,16 @@ module Spoom
|
|
473
477
|
|
474
478
|
sig { params(id: String, snapshots: T::Array[Snapshot]).void }
|
475
479
|
def initialize(id, snapshots)
|
476
|
-
keys = [
|
480
|
+
keys = ["false", "true"]
|
477
481
|
data = snapshots.map do |snapshot|
|
478
482
|
{
|
479
483
|
timestamp: snapshot.commit_timestamp,
|
480
484
|
commit: snapshot.commit_sha,
|
481
|
-
total: snapshot.
|
482
|
-
values: {
|
485
|
+
total: snapshot.methods_with_sig_excluding_rbis + snapshot.methods_without_sig_excluding_rbis,
|
486
|
+
values: {
|
487
|
+
true: snapshot.methods_with_sig_excluding_rbis,
|
488
|
+
false: snapshot.methods_without_sig_excluding_rbis,
|
489
|
+
},
|
483
490
|
}
|
484
491
|
end
|
485
492
|
super(id, data, keys)
|
@@ -489,7 +496,7 @@ module Spoom
|
|
489
496
|
def tooltip
|
490
497
|
<<~JS
|
491
498
|
function tooltip_#{id}(d) {
|
492
|
-
tooltipTimeline(d, "methods");
|
499
|
+
tooltipTimeline(d, "methods excluding RBIs");
|
493
500
|
}
|
494
501
|
JS
|
495
502
|
end
|
@@ -500,7 +507,7 @@ module Spoom
|
|
500
507
|
|
501
508
|
sig { params(id: String, snapshots: T::Array[Snapshot]).void }
|
502
509
|
def initialize(id, snapshots)
|
503
|
-
keys = [
|
510
|
+
keys = ["rbis", "files"]
|
504
511
|
data = snapshots.map do |snapshot|
|
505
512
|
{
|
506
513
|
timestamp: snapshot.commit_timestamp,
|
@@ -567,7 +574,7 @@ module Spoom
|
|
567
574
|
end
|
568
575
|
|
569
576
|
sig { override.params(y: String, color: String, curve: String).returns(String) }
|
570
|
-
def line(y:, color:
|
577
|
+
def line(y:, color: "strictnessColor(d.key)", curve: "curveCatmullRom.alpha(1)")
|
571
578
|
<<~JS
|
572
579
|
var area_#{id} = d3.area()
|
573
580
|
.x((d) => xScale_#{id}(parseDate(#{y})))
|
@@ -610,10 +617,10 @@ module Spoom
|
|
610
617
|
def plot
|
611
618
|
<<~JS
|
612
619
|
#{x_scale}
|
613
|
-
#{y_scale(min:
|
614
|
-
#{line(y:
|
620
|
+
#{y_scale(min: "0", max: "d3.max(data_#{id}, (d) => d.total + 10)", ticks: "tickValues([0, 25, 50, 75, 100])")}
|
621
|
+
#{line(y: "d.data.timestamp", color: "d.key == 'rbis' ? '#8673ff' : '#007bff'")}
|
615
622
|
#{x_ticks}
|
616
|
-
#{y_ticks(ticks:
|
623
|
+
#{y_ticks(ticks: "tickValues([25, 50, 75])", format: "d", padding: 20)}
|
617
624
|
JS
|
618
625
|
end
|
619
626
|
end
|
data/lib/spoom/coverage/d3.rb
CHANGED
@@ -8,94 +8,96 @@ require_relative "d3/timeline"
|
|
8
8
|
module Spoom
|
9
9
|
module Coverage
|
10
10
|
module D3
|
11
|
-
extend T::Sig
|
12
|
-
|
13
11
|
COLOR_IGNORE = "#999"
|
14
12
|
COLOR_FALSE = "#db4437"
|
15
13
|
COLOR_TRUE = "#0f9d58"
|
16
14
|
COLOR_STRICT = "#0a7340"
|
17
15
|
COLOR_STRONG = "#064828"
|
18
16
|
|
19
|
-
|
20
|
-
|
21
|
-
<<~CSS
|
22
|
-
svg {
|
23
|
-
width: 100%;
|
24
|
-
height: 100%;
|
25
|
-
}
|
17
|
+
class << self
|
18
|
+
extend T::Sig
|
26
19
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
border-radius: 4px;
|
35
|
-
position: absolute;
|
36
|
-
top: 0;
|
37
|
-
left: 0;
|
38
|
-
opacity: 0;
|
39
|
-
}
|
20
|
+
sig { returns(String) }
|
21
|
+
def header_style
|
22
|
+
<<~CSS
|
23
|
+
svg {
|
24
|
+
width: 100%;
|
25
|
+
height: 100%;
|
26
|
+
}
|
40
27
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
28
|
+
.tooltip {
|
29
|
+
font: 12px Arial, sans-serif;
|
30
|
+
color: #fff;
|
31
|
+
text-align: center;
|
32
|
+
background: rgba(0, 0, 0, 0.6);
|
33
|
+
padding: 5px;
|
34
|
+
border: 0px;
|
35
|
+
border-radius: 4px;
|
36
|
+
position: absolute;
|
37
|
+
top: 0;
|
38
|
+
left: 0;
|
39
|
+
opacity: 0;
|
40
|
+
}
|
48
41
|
|
49
|
-
|
50
|
-
|
51
|
-
|
42
|
+
.label {
|
43
|
+
font: 14px Arial, sans-serif;
|
44
|
+
font-weight: bold;
|
45
|
+
fill: #fff;
|
46
|
+
text-anchor: middle;
|
47
|
+
pointer-events: none;
|
48
|
+
}
|
52
49
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
50
|
+
.label .small {
|
51
|
+
font-size: 10px;
|
52
|
+
}
|
53
|
+
|
54
|
+
#{Pie.header_style}
|
55
|
+
#{CircleMap.header_style}
|
56
|
+
#{Timeline.header_style}
|
57
|
+
CSS
|
58
|
+
end
|
58
59
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
60
|
+
sig { params(palette: ColorPalette).returns(String) }
|
61
|
+
def header_script(palette)
|
62
|
+
<<~JS
|
63
|
+
var parseDate = d3.timeParse("%s");
|
63
64
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
65
|
+
function strictnessColor(strictness) {
|
66
|
+
switch(strictness) {
|
67
|
+
case "ignore":
|
68
|
+
return "#{palette.ignore}";
|
69
|
+
case "false":
|
70
|
+
return "#{palette.false}";
|
71
|
+
case "true":
|
72
|
+
return "#{palette.true}";
|
73
|
+
case "strict":
|
74
|
+
return "#{palette.strict}";
|
75
|
+
case "strong":
|
76
|
+
return "#{palette.strong}";
|
77
|
+
}
|
78
|
+
return "#{palette.false}";
|
76
79
|
}
|
77
|
-
return "#{palette.false}";
|
78
|
-
}
|
79
80
|
|
80
|
-
|
81
|
-
|
82
|
-
|
81
|
+
function toPercent(value, sum) {
|
82
|
+
return value ? Math.round(value * 100 / sum) : 0;
|
83
|
+
}
|
83
84
|
|
84
|
-
|
85
|
-
.append("div")
|
85
|
+
var tooltip = d3.select("body")
|
86
86
|
.append("div")
|
87
|
-
.
|
87
|
+
.append("div")
|
88
|
+
.attr("class", "tooltip");
|
88
89
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
90
|
+
function moveTooltip(d) {
|
91
|
+
return tooltip
|
92
|
+
.style("left", (d3.event.pageX + 20) + "px")
|
93
|
+
.style("top", (d3.event.pageY) + "px")
|
94
|
+
}
|
94
95
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
96
|
+
#{Pie.header_script}
|
97
|
+
#{CircleMap.header_script}
|
98
|
+
#{Timeline.header_script}
|
99
|
+
JS
|
100
|
+
end
|
99
101
|
end
|
100
102
|
|
101
103
|
class ColorPalette < T::Struct
|