spoom 1.1.11 → 1.1.12

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.
@@ -18,34 +18,38 @@ module Spoom
18
18
  @title = title
19
19
  end
20
20
 
21
- sig { returns(String) }
22
- def self.header_style
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
- .pie .arc {
33
- stroke: #fff;
34
- stroke-width: 2px;
35
- }
36
- CSS
37
- end
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
- sig { returns(String) }
40
- def self.header_script
41
- <<~JS
42
- function tooltipPie(d, title, kind, sum) {
43
- moveTooltip(d)
44
- .html("<b>" + title + "</b><br><br>"
45
- + "<b>" + d.data.value + "</b> " + kind + "<br>"
46
- + "<b>" + toPercent(d.data.value, sum) + "</b>%")
47
- }
48
- JS
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) }
@@ -18,79 +18,83 @@ module Spoom
18
18
  @keys = keys
19
19
  end
20
20
 
21
- sig { returns(String) }
22
- def self.header_style
23
- <<~CSS
24
- .domain {
25
- stroke: transparent;
26
- }
21
+ class << self
22
+ extend T::Sig
27
23
 
28
- .grid line {
29
- stroke: #ccc;
30
- }
24
+ sig { returns(String) }
25
+ def header_style
26
+ <<~CSS
27
+ .domain {
28
+ stroke: transparent;
29
+ }
31
30
 
32
- .axis text {
33
- font: 12px Arial, sans-serif;
34
- fill: #333;
35
- text-anchor: right;
36
- pointer-events: none;
37
- }
31
+ .grid line {
32
+ stroke: #ccc;
33
+ }
38
34
 
39
- .area {
40
- fill-opacity: 0.5;
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
- .line {
44
- stroke-width: 2;
45
- fill: transparent;
46
- }
42
+ .area {
43
+ fill-opacity: 0.5;
44
+ }
47
45
 
48
- .dot {
49
- r: 2;
50
- fill: #888;
51
- }
46
+ .line {
47
+ stroke-width: 2;
48
+ fill: transparent;
49
+ }
52
50
 
53
- .inverted .grid line {
54
- stroke: #777;
55
- }
51
+ .dot {
52
+ r: 2;
53
+ fill: #888;
54
+ }
56
55
 
57
- .inverted .area {
58
- fill-opacity: 0.9;
59
- }
56
+ .inverted .grid line {
57
+ stroke: #777;
58
+ }
60
59
 
61
- .inverted .axis text {
62
- fill: #fff;
63
- }
60
+ .inverted .area {
61
+ fill-opacity: 0.9;
62
+ }
64
63
 
65
- .inverted .axis line {
66
- stroke: #fff;
67
- }
64
+ .inverted .axis text {
65
+ fill: #fff;
66
+ }
68
67
 
69
- .inverted .dot {
70
- fill: #fff;
71
- }
72
- CSS
73
- end
68
+ .inverted .axis line {
69
+ stroke: #fff;
70
+ }
74
71
 
75
- sig { returns(String) }
76
- def self.header_script
77
- <<~JS
78
- var parseVersion = function(version) {
79
- if (!version) {
80
- return null;
72
+ .inverted .dot {
73
+ fill: #fff;
81
74
  }
82
- return parseFloat(version.replaceAll("0.", ""));
83
- }
75
+ CSS
76
+ end
84
77
 
85
- function tooltipTimeline(d, kind) {
86
- moveTooltip(d)
87
- .html("commit <b>" + d.data.commit + "</b><br>"
88
- + d3.timeFormat("%y/%m/%d")(parseDate(d.data.timestamp)) + "<br><br>"
89
- + "<b>typed: " + d.key + "</b><br><br>"
90
- + "<b>" + (d.data.values[d.key] ? d.data.values[d.key] : 0) + "</b> " + kind +"<br>"
91
- + "<b>" + toPercent(d.data.values[d.key] ? d.data.values[d.key] : 0, d.data.total) + "%")
92
- }
93
- JS
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: 'ticks(8)'
271
+ ticks: "ticks(8)"
268
272
  )}
269
- #{line(y: 'parseVersion(d.runtime)', color: '#e83e8c', curve: 'curveStepAfter')}
270
- #{line(y: 'parseVersion(d.static)', color: '#007bff', curve: 'curveStepAfter')}
271
- #{points(y: 'parseVersion(d.static)')}
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: 'ticks(4)', format: "'v0.' + d.toFixed(2)", padding: 50)}
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: '0',
315
+ min: "0",
312
316
  max: "d3.max(data_#{id}, (d) => d.runtime)",
313
- ticks: 'ticks(10)'
317
+ ticks: "ticks(10)"
314
318
  )}
315
- #{area(y: 'd.runtime')}
316
- #{line(y: 'd.runtime')}
317
- #{points(y: 'd.runtime')}
319
+ #{area(y: "d.runtime")}
320
+ #{line(y: "d.runtime")}
321
+ #{points(y: "d.runtime")}
318
322
  #{x_ticks}
319
- #{y_ticks(ticks: 'ticks(5)', format: 'd.toFixed(2) + "s"', padding: 40)}
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: '0', max: '100', ticks: 'tickValues([0, 25, 50, 75, 100])')}
377
- #{line(y: 'd.data.timestamp')}
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: 'tickValues([25, 50, 75])', format: "d + '%'", padding: 30)}
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: 'strictnessColor(d.key)', curve: 'curveCatmullRom.alpha(1)')
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})))
@@ -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 = ['false', 'true']
453
+ keys = ["false", "true"]
450
454
  data = snapshots.map do |snapshot|
451
455
  {
452
456
  timestamp: snapshot.commit_timestamp,
@@ -473,7 +477,7 @@ module Spoom
473
477
 
474
478
  sig { params(id: String, snapshots: T::Array[Snapshot]).void }
475
479
  def initialize(id, snapshots)
476
- keys = ['false', 'true']
480
+ keys = ["false", "true"]
477
481
  data = snapshots.map do |snapshot|
478
482
  {
479
483
  timestamp: snapshot.commit_timestamp,
@@ -500,7 +504,7 @@ module Spoom
500
504
 
501
505
  sig { params(id: String, snapshots: T::Array[Snapshot]).void }
502
506
  def initialize(id, snapshots)
503
- keys = ['rbis', 'files']
507
+ keys = ["rbis", "files"]
504
508
  data = snapshots.map do |snapshot|
505
509
  {
506
510
  timestamp: snapshot.commit_timestamp,
@@ -567,7 +571,7 @@ module Spoom
567
571
  end
568
572
 
569
573
  sig { override.params(y: String, color: String, curve: String).returns(String) }
570
- def line(y:, color: 'strictnessColor(d.key)', curve: 'curveCatmullRom.alpha(1)')
574
+ def line(y:, color: "strictnessColor(d.key)", curve: "curveCatmullRom.alpha(1)")
571
575
  <<~JS
572
576
  var area_#{id} = d3.area()
573
577
  .x((d) => xScale_#{id}(parseDate(#{y})))
@@ -610,10 +614,10 @@ module Spoom
610
614
  def plot
611
615
  <<~JS
612
616
  #{x_scale}
613
- #{y_scale(min: '0', max: "d3.max(data_#{id}, (d) => d.total + 10)", ticks: 'tickValues([0, 25, 50, 75, 100])')}
614
- #{line(y: 'd.data.timestamp', color: "d.key == 'rbis' ? '#8673ff' : '#007bff'")}
617
+ #{y_scale(min: "0", max: "d3.max(data_#{id}, (d) => d.total + 10)", ticks: "tickValues([0, 25, 50, 75, 100])")}
618
+ #{line(y: "d.data.timestamp", color: "d.key == 'rbis' ? '#8673ff' : '#007bff'")}
615
619
  #{x_ticks}
616
- #{y_ticks(ticks: 'tickValues([25, 50, 75])', format: 'd', padding: 20)}
620
+ #{y_ticks(ticks: "tickValues([25, 50, 75])", format: "d", padding: 20)}
617
621
  JS
618
622
  end
619
623
  end
@@ -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
- sig { returns(String) }
20
- def self.header_style
21
- <<~CSS
22
- svg {
23
- width: 100%;
24
- height: 100%;
25
- }
17
+ class << self
18
+ extend T::Sig
26
19
 
27
- .tooltip {
28
- font: 12px Arial, sans-serif;
29
- color: #fff;
30
- text-align: center;
31
- background: rgba(0, 0, 0, 0.6);
32
- padding: 5px;
33
- border: 0px;
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
- .label {
42
- font: 14px Arial, sans-serif;
43
- font-weight: bold;
44
- fill: #fff;
45
- text-anchor: middle;
46
- pointer-events: none;
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
- .label .small {
50
- font-size: 10px;
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
- #{Pie.header_style}
54
- #{CircleMap.header_style}
55
- #{Timeline.header_style}
56
- CSS
57
- end
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
- sig { params(palette: ColorPalette).returns(String) }
60
- def self.header_script(palette)
61
- <<~JS
62
- var parseDate = d3.timeParse("%s");
60
+ sig { params(palette: ColorPalette).returns(String) }
61
+ def header_script(palette)
62
+ <<~JS
63
+ var parseDate = d3.timeParse("%s");
63
64
 
64
- function strictnessColor(strictness) {
65
- switch(strictness) {
66
- case "ignore":
67
- return "#{palette.ignore}";
68
- case "false":
69
- return "#{palette.false}";
70
- case "true":
71
- return "#{palette.true}";
72
- case "strict":
73
- return "#{palette.strict}";
74
- case "strong":
75
- return "#{palette.strong}";
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
- function toPercent(value, sum) {
81
- return value ? Math.round(value * 100 / sum) : 0;
82
- }
81
+ function toPercent(value, sum) {
82
+ return value ? Math.round(value * 100 / sum) : 0;
83
+ }
83
84
 
84
- var tooltip = d3.select("body")
85
- .append("div")
85
+ var tooltip = d3.select("body")
86
86
  .append("div")
87
- .attr("class", "tooltip");
87
+ .append("div")
88
+ .attr("class", "tooltip");
88
89
 
89
- function moveTooltip(d) {
90
- return tooltip
91
- .style("left", (d3.event.pageX + 20) + "px")
92
- .style("top", (d3.event.pageY) + "px")
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
- #{Pie.header_script}
96
- #{CircleMap.header_script}
97
- #{Timeline.header_script}
98
- JS
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
@@ -109,7 +109,7 @@ module Spoom
109
109
  abstract!
110
110
 
111
111
  sig { void }
112
- def initialize; end
112
+ def initialize; end # rubocop:disable Lint/MissingSuper
113
113
 
114
114
  sig { override.returns(String) }
115
115
  def html
@@ -136,17 +136,17 @@ module Spoom
136
136
 
137
137
  sig { returns(D3::Pie::Sigils) }
138
138
  def pie_sigils
139
- D3::Pie::Sigils.new('pie_sigils', 'Sigils', snapshot)
139
+ D3::Pie::Sigils.new("pie_sigils", "Sigils", snapshot)
140
140
  end
141
141
 
142
142
  sig { returns(D3::Pie::Calls) }
143
143
  def pie_calls
144
- D3::Pie::Calls.new('pie_calls', 'Calls', snapshot)
144
+ D3::Pie::Calls.new("pie_calls", "Calls", snapshot)
145
145
  end
146
146
 
147
147
  sig { returns(D3::Pie::Sigs) }
148
148
  def pie_sigs
149
- D3::Pie::Sigs.new('pie_sigs', 'Sigs', snapshot)
149
+ D3::Pie::Sigs.new("pie_sigs", "Sigs", snapshot)
150
150
  end
151
151
  end
152
152
 
@@ -226,7 +226,7 @@ module Spoom
226
226
  extend T::Sig
227
227
 
228
228
  sig { params(sorbet_intro_commit: T.nilable(String), sorbet_intro_date: T.nilable(Time)).void }
229
- def initialize(sorbet_intro_commit: nil, sorbet_intro_date: nil)
229
+ def initialize(sorbet_intro_commit: nil, sorbet_intro_date: nil) # rubocop:disable Lint/MissingSuper
230
230
  @sorbet_intro_commit = sorbet_intro_commit
231
231
  @sorbet_intro_date = sorbet_intro_date
232
232
  end
@@ -235,7 +235,7 @@ module Spoom
235
235
  def erb
236
236
  <<~ERB
237
237
  <div class="text-center" style="margin-top: 30px">
238
- Typchecked by Sorbet since <b>#{@sorbet_intro_date&.strftime('%F')}</b>
238
+ Typchecked by Sorbet since <b>#{@sorbet_intro_date&.strftime("%F")}</b>
239
239
  (commit <b>#{@sorbet_intro_commit}</b>).
240
240
  </div>
241
241
  ERB
@@ -32,44 +32,49 @@ module Spoom
32
32
  printer.print_snapshot(self)
33
33
  end
34
34
 
35
- sig { params(json: String).returns(Snapshot) }
36
- def self.from_json(json)
37
- from_obj(JSON.parse(json))
35
+ sig { params(arg: T.untyped).returns(String) }
36
+ def to_json(*arg)
37
+ serialize.to_json(*arg)
38
38
  end
39
39
 
40
- sig { params(obj: T::Hash[String, T.untyped]).returns(Snapshot) }
41
- def self.from_obj(obj)
42
- snapshot = Snapshot.new
43
- snapshot.timestamp = obj.fetch("timestamp", 0)
44
- snapshot.version_static = obj.fetch("version_static", nil)
45
- snapshot.version_runtime = obj.fetch("version_runtime", nil)
46
- snapshot.duration = obj.fetch("duration", 0)
47
- snapshot.commit_sha = obj.fetch("commit_sha", nil)
48
- snapshot.commit_timestamp = obj.fetch("commit_timestamp", nil)
49
- snapshot.files = obj.fetch("files", 0)
50
- snapshot.rbi_files = obj.fetch("rbi_files", 0)
51
- snapshot.modules = obj.fetch("modules", 0)
52
- snapshot.classes = obj.fetch("classes", 0)
53
- snapshot.singleton_classes = obj.fetch("singleton_classes", 0)
54
- snapshot.methods_with_sig = obj.fetch("methods_with_sig", 0)
55
- snapshot.methods_without_sig = obj.fetch("methods_without_sig", 0)
56
- snapshot.calls_typed = obj.fetch("calls_typed", 0)
57
- snapshot.calls_untyped = obj.fetch("calls_untyped", 0)
58
-
59
- sigils = obj.fetch("sigils", {})
60
- if sigils
61
- Snapshot::STRICTNESSES.each do |strictness|
62
- next unless sigils.key?(strictness)
63
- snapshot.sigils[strictness] = sigils[strictness]
64
- end
40
+ class << self
41
+ extend T::Sig
42
+
43
+ sig { params(json: String).returns(Snapshot) }
44
+ def from_json(json)
45
+ from_obj(JSON.parse(json))
65
46
  end
66
47
 
67
- snapshot
68
- end
48
+ sig { params(obj: T::Hash[String, T.untyped]).returns(Snapshot) }
49
+ def from_obj(obj)
50
+ snapshot = Snapshot.new
51
+ snapshot.timestamp = obj.fetch("timestamp", 0)
52
+ snapshot.version_static = obj.fetch("version_static", nil)
53
+ snapshot.version_runtime = obj.fetch("version_runtime", nil)
54
+ snapshot.duration = obj.fetch("duration", 0)
55
+ snapshot.commit_sha = obj.fetch("commit_sha", nil)
56
+ snapshot.commit_timestamp = obj.fetch("commit_timestamp", nil)
57
+ snapshot.files = obj.fetch("files", 0)
58
+ snapshot.rbi_files = obj.fetch("rbi_files", 0)
59
+ snapshot.modules = obj.fetch("modules", 0)
60
+ snapshot.classes = obj.fetch("classes", 0)
61
+ snapshot.singleton_classes = obj.fetch("singleton_classes", 0)
62
+ snapshot.methods_with_sig = obj.fetch("methods_with_sig", 0)
63
+ snapshot.methods_without_sig = obj.fetch("methods_without_sig", 0)
64
+ snapshot.calls_typed = obj.fetch("calls_typed", 0)
65
+ snapshot.calls_untyped = obj.fetch("calls_untyped", 0)
69
66
 
70
- sig { params(arg: T.untyped).returns(String) }
71
- def to_json(*arg)
72
- serialize.to_json(*arg)
67
+ sigils = obj.fetch("sigils", {})
68
+ if sigils
69
+ Snapshot::STRICTNESSES.each do |strictness|
70
+ next unless sigils.key?(strictness)
71
+
72
+ snapshot.sigils[strictness] = sigils[strictness]
73
+ end
74
+ end
75
+
76
+ snapshot
77
+ end
73
78
  end
74
79
  end
75
80
 
@@ -119,6 +124,7 @@ module Spoom
119
124
  indent
120
125
  hash.each do |key, value|
121
126
  next unless value > 0
127
+
122
128
  printl("#{key}: #{value}#{percent(value, total)}")
123
129
  end
124
130
  dedent
@@ -127,6 +133,7 @@ module Spoom
127
133
  sig { params(value: T.nilable(Integer), total: T.nilable(Integer)).returns(String) }
128
134
  def percent(value, total)
129
135
  return "" if value.nil? || total.nil? || total == 0
136
+
130
137
  " (#{(value.to_f * 100.0 / total.to_f).round}%)"
131
138
  end
132
139
  end