spoom 1.5.0 → 1.7.2

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.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +14 -0
  3. data/lib/spoom/backtrace_filter/minitest.rb +3 -4
  4. data/lib/spoom/cli/deadcode.rb +1 -2
  5. data/lib/spoom/cli/helper.rb +41 -31
  6. data/lib/spoom/cli/srb/assertions.rb +48 -0
  7. data/lib/spoom/cli/srb/bump.rb +1 -2
  8. data/lib/spoom/cli/srb/coverage.rb +1 -1
  9. data/lib/spoom/cli/srb/metrics.rb +68 -0
  10. data/lib/spoom/cli/srb/sigs.rb +209 -0
  11. data/lib/spoom/cli/srb/tc.rb +16 -1
  12. data/lib/spoom/cli/srb.rb +16 -4
  13. data/lib/spoom/cli.rb +1 -2
  14. data/lib/spoom/colors.rb +2 -6
  15. data/lib/spoom/context/bundle.rb +8 -9
  16. data/lib/spoom/context/exec.rb +3 -6
  17. data/lib/spoom/context/file_system.rb +12 -19
  18. data/lib/spoom/context/git.rb +14 -19
  19. data/lib/spoom/context/sorbet.rb +14 -27
  20. data/lib/spoom/context.rb +4 -8
  21. data/lib/spoom/counters.rb +22 -0
  22. data/lib/spoom/coverage/d3/base.rb +6 -8
  23. data/lib/spoom/coverage/d3/circle_map.rb +6 -16
  24. data/lib/spoom/coverage/d3/pie.rb +14 -19
  25. data/lib/spoom/coverage/d3/timeline.rb +46 -47
  26. data/lib/spoom/coverage/d3.rb +2 -4
  27. data/lib/spoom/coverage/report.rb +41 -79
  28. data/lib/spoom/coverage/snapshot.rb +8 -14
  29. data/lib/spoom/coverage.rb +3 -5
  30. data/lib/spoom/deadcode/definition.rb +12 -14
  31. data/lib/spoom/deadcode/erb.rb +10 -8
  32. data/lib/spoom/deadcode/index.rb +21 -25
  33. data/lib/spoom/deadcode/indexer.rb +5 -6
  34. data/lib/spoom/deadcode/plugins/action_mailer.rb +2 -3
  35. data/lib/spoom/deadcode/plugins/action_mailer_preview.rb +2 -3
  36. data/lib/spoom/deadcode/plugins/actionpack.rb +19 -22
  37. data/lib/spoom/deadcode/plugins/active_model.rb +2 -3
  38. data/lib/spoom/deadcode/plugins/active_record.rb +62 -53
  39. data/lib/spoom/deadcode/plugins/active_support.rb +3 -2
  40. data/lib/spoom/deadcode/plugins/base.rb +29 -32
  41. data/lib/spoom/deadcode/plugins/graphql.rb +2 -3
  42. data/lib/spoom/deadcode/plugins/minitest.rb +4 -4
  43. data/lib/spoom/deadcode/plugins/namespaces.rb +5 -5
  44. data/lib/spoom/deadcode/plugins/rails.rb +5 -5
  45. data/lib/spoom/deadcode/plugins/rubocop.rb +5 -5
  46. data/lib/spoom/deadcode/plugins/ruby.rb +3 -4
  47. data/lib/spoom/deadcode/plugins/sorbet.rb +12 -6
  48. data/lib/spoom/deadcode/plugins/thor.rb +2 -3
  49. data/lib/spoom/deadcode/plugins.rb +23 -31
  50. data/lib/spoom/deadcode/remover.rb +58 -79
  51. data/lib/spoom/deadcode/send.rb +2 -8
  52. data/lib/spoom/file_collector.rb +11 -19
  53. data/lib/spoom/file_tree.rb +36 -51
  54. data/lib/spoom/location.rb +9 -20
  55. data/lib/spoom/model/builder.rb +54 -17
  56. data/lib/spoom/model/model.rb +71 -74
  57. data/lib/spoom/model/namespace_visitor.rb +4 -3
  58. data/lib/spoom/model/reference.rb +4 -8
  59. data/lib/spoom/model/references_visitor.rb +50 -30
  60. data/lib/spoom/parse.rb +4 -4
  61. data/lib/spoom/poset.rb +22 -24
  62. data/lib/spoom/printer.rb +10 -13
  63. data/lib/spoom/rbs.rb +77 -0
  64. data/lib/spoom/sorbet/config.rb +17 -24
  65. data/lib/spoom/sorbet/errors.rb +87 -45
  66. data/lib/spoom/sorbet/lsp/base.rb +10 -16
  67. data/lib/spoom/sorbet/lsp/errors.rb +8 -16
  68. data/lib/spoom/sorbet/lsp/structures.rb +65 -91
  69. data/lib/spoom/sorbet/lsp.rb +20 -22
  70. data/lib/spoom/sorbet/metrics/code_metrics_visitor.rb +236 -0
  71. data/lib/spoom/sorbet/metrics/metrics_file_parser.rb +34 -0
  72. data/lib/spoom/sorbet/metrics.rb +2 -32
  73. data/lib/spoom/sorbet/sigils.rb +16 -23
  74. data/lib/spoom/sorbet/translate/rbs_comments_to_sorbet_sigs.rb +242 -0
  75. data/lib/spoom/sorbet/translate/sorbet_assertions_to_rbs_comments.rb +123 -0
  76. data/lib/spoom/sorbet/translate/sorbet_sigs_to_rbs_comments.rb +293 -0
  77. data/lib/spoom/sorbet/translate/strip_sorbet_sigs.rb +23 -0
  78. data/lib/spoom/sorbet/translate/translator.rb +71 -0
  79. data/lib/spoom/sorbet/translate.rb +49 -0
  80. data/lib/spoom/sorbet.rb +6 -12
  81. data/lib/spoom/source/rewriter.rb +167 -0
  82. data/lib/spoom/source.rb +4 -0
  83. data/lib/spoom/timeline.rb +4 -6
  84. data/lib/spoom/version.rb +1 -1
  85. data/lib/spoom/visitor.rb +298 -151
  86. data/lib/spoom.rb +4 -3
  87. data/rbi/spoom.rbi +3567 -0
  88. metadata +62 -8
@@ -7,21 +7,18 @@ module Spoom
7
7
  module Coverage
8
8
  module D3
9
9
  class Pie < Base
10
- extend T::Sig
11
10
  extend T::Helpers
12
11
 
13
12
  abstract!
14
13
 
15
- sig { params(id: String, title: String, data: T.untyped).void }
14
+ #: (String id, String title, untyped data) -> void
16
15
  def initialize(id, title, data)
17
16
  super(id, data)
18
17
  @title = title
19
18
  end
20
19
 
21
20
  class << self
22
- extend T::Sig
23
-
24
- sig { returns(String) }
21
+ #: -> String
25
22
  def header_style
26
23
  <<~CSS
27
24
  .pie .title {
@@ -39,7 +36,7 @@ module Spoom
39
36
  CSS
40
37
  end
41
38
 
42
- sig { returns(String) }
39
+ #: -> String
43
40
  def header_script
44
41
  <<~JS
45
42
  function tooltipPie(d, title, kind, sum) {
@@ -52,7 +49,8 @@ module Spoom
52
49
  end
53
50
  end
54
51
 
55
- sig { override.returns(String) }
52
+ # @override
53
+ #: -> String
56
54
  def script
57
55
  <<~JS
58
56
  #{tooltip}
@@ -121,14 +119,13 @@ module Spoom
121
119
  end
122
120
 
123
121
  class Sigils < Pie
124
- extend T::Sig
125
-
126
- sig { params(id: String, title: String, snapshot: Snapshot).void }
122
+ #: (String id, String title, Snapshot snapshot) -> void
127
123
  def initialize(id, title, snapshot)
128
124
  super(id, title, snapshot.sigils_excluding_rbis.select { |_k, v| v })
129
125
  end
130
126
 
131
- sig { override.returns(String) }
127
+ # @override
128
+ #: -> String
132
129
  def tooltip
133
130
  <<~JS
134
131
  function tooltip_#{id}(d) {
@@ -139,14 +136,13 @@ module Spoom
139
136
  end
140
137
 
141
138
  class Calls < Pie
142
- extend T::Sig
143
-
144
- sig { params(id: String, title: String, snapshot: Snapshot).void }
139
+ #: (String id, String title, Snapshot snapshot) -> void
145
140
  def initialize(id, title, snapshot)
146
141
  super(id, title, { true: snapshot.calls_typed, false: snapshot.calls_untyped })
147
142
  end
148
143
 
149
- sig { override.returns(String) }
144
+ # @override
145
+ #: -> String
150
146
  def tooltip
151
147
  <<~JS
152
148
  function tooltip_#{id}(d) {
@@ -157,9 +153,7 @@ module Spoom
157
153
  end
158
154
 
159
155
  class Sigs < Pie
160
- extend T::Sig
161
-
162
- sig { params(id: String, title: String, snapshot: Snapshot).void }
156
+ #: (String id, String title, Snapshot snapshot) -> void
163
157
  def initialize(id, title, snapshot)
164
158
  super(
165
159
  id,
@@ -168,7 +162,8 @@ module Spoom
168
162
  )
169
163
  end
170
164
 
171
- sig { override.returns(String) }
165
+ # @override
166
+ #: -> String
172
167
  def tooltip
173
168
  <<~JS
174
169
  function tooltip_#{id}(d) {
@@ -7,21 +7,18 @@ module Spoom
7
7
  module Coverage
8
8
  module D3
9
9
  class Timeline < Base
10
- extend T::Sig
11
10
  extend T::Helpers
12
11
 
13
12
  abstract!
14
13
 
15
- sig { params(id: String, data: T.untyped, keys: T::Array[String]).void }
14
+ #: (String id, untyped data, Array[String] keys) -> void
16
15
  def initialize(id, data, keys)
17
16
  super(id, data)
18
17
  @keys = keys
19
18
  end
20
19
 
21
20
  class << self
22
- extend T::Sig
23
-
24
- sig { returns(String) }
21
+ #: -> String
25
22
  def header_style
26
23
  <<~CSS
27
24
  .domain {
@@ -75,7 +72,7 @@ module Spoom
75
72
  CSS
76
73
  end
77
74
 
78
- sig { returns(String) }
75
+ #: -> String
79
76
  def header_script
80
77
  <<~JS
81
78
  var parseVersion = function(version) {
@@ -97,7 +94,8 @@ module Spoom
97
94
  end
98
95
  end
99
96
 
100
- sig { override.returns(String) }
97
+ # @override
98
+ #: -> String
101
99
  def script
102
100
  <<~HTML
103
101
  #{tooltip}
@@ -125,7 +123,7 @@ module Spoom
125
123
  sig { abstract.returns(String) }
126
124
  def plot; end
127
125
 
128
- sig { returns(String) }
126
+ #: -> String
129
127
  def x_scale
130
128
  <<~HTML
131
129
  var xScale_#{id} = d3.scaleTime()
@@ -141,7 +139,7 @@ module Spoom
141
139
  HTML
142
140
  end
143
141
 
144
- sig { returns(String) }
142
+ #: -> String
145
143
  def x_ticks
146
144
  <<~HTML
147
145
  svg_#{id}.append("g")
@@ -154,7 +152,7 @@ module Spoom
154
152
  HTML
155
153
  end
156
154
 
157
- sig { params(min: String, max: String, ticks: String).returns(String) }
155
+ #: (min: String, max: String, ticks: String) -> String
158
156
  def y_scale(min:, max:, ticks:)
159
157
  <<~HTML
160
158
  var yScale_#{id} = d3.scaleLinear()
@@ -170,7 +168,7 @@ module Spoom
170
168
  HTML
171
169
  end
172
170
 
173
- sig { params(ticks: String, format: String, padding: Integer).returns(String) }
171
+ #: (ticks: String, format: String, padding: Integer) -> String
174
172
  def y_ticks(ticks:, format:, padding:)
175
173
  <<~HTML
176
174
  svg_#{id}.append("g")
@@ -183,7 +181,7 @@ module Spoom
183
181
  HTML
184
182
  end
185
183
 
186
- sig { params(y: String, color: String, curve: String).returns(String) }
184
+ #: (y: String, ?color: String, ?curve: String) -> String
187
185
  def area(y:, color: "#ccc", curve: "curveCatmullRom.alpha(1)")
188
186
  <<~HTML
189
187
  svg_#{id}.append("path")
@@ -199,7 +197,7 @@ module Spoom
199
197
  HTML
200
198
  end
201
199
 
202
- sig { params(y: String, color: String, curve: String).returns(String) }
200
+ #: (y: String, ?color: String, ?curve: String) -> String
203
201
  def line(y:, color: "#ccc", curve: "curveCatmullRom.alpha(1)")
204
202
  <<~HTML
205
203
  svg_#{id}.append("path")
@@ -213,7 +211,7 @@ module Spoom
213
211
  HTML
214
212
  end
215
213
 
216
- sig { params(y: String).returns(String) }
214
+ #: (y: String) -> String
217
215
  def points(y:)
218
216
  <<~HTML
219
217
  svg_#{id}.selectAll("circle")
@@ -230,9 +228,7 @@ module Spoom
230
228
  end
231
229
 
232
230
  class Versions < Timeline
233
- extend T::Sig
234
-
235
- sig { params(id: String, snapshots: T::Array[Snapshot]).void }
231
+ #: (String id, Array[Snapshot] snapshots) -> void
236
232
  def initialize(id, snapshots)
237
233
  data = snapshots.map do |snapshot|
238
234
  {
@@ -245,7 +241,8 @@ module Spoom
245
241
  super(id, data, [])
246
242
  end
247
243
 
248
- sig { override.returns(String) }
244
+ # @override
245
+ #: -> String
249
246
  def tooltip
250
247
  <<~JS
251
248
  function tooltip_#{id}(d) {
@@ -259,7 +256,8 @@ module Spoom
259
256
  JS
260
257
  end
261
258
 
262
- sig { override.returns(String) }
259
+ # @override
260
+ #: -> String
263
261
  def plot
264
262
  <<~JS
265
263
  #{x_scale}
@@ -280,9 +278,7 @@ module Spoom
280
278
  end
281
279
 
282
280
  class Runtimes < Timeline
283
- extend T::Sig
284
-
285
- sig { params(id: String, snapshots: T::Array[Snapshot]).void }
281
+ #: (String id, Array[Snapshot] snapshots) -> void
286
282
  def initialize(id, snapshots)
287
283
  data = snapshots.map do |snapshot|
288
284
  {
@@ -294,7 +290,8 @@ module Spoom
294
290
  super(id, data, [])
295
291
  end
296
292
 
297
- sig { override.returns(String) }
293
+ # @override
294
+ #: -> String
298
295
  def tooltip
299
296
  <<~JS
300
297
  function tooltip_#{id}(d) {
@@ -307,7 +304,8 @@ module Spoom
307
304
  JS
308
305
  end
309
306
 
310
- sig { override.returns(String) }
307
+ # @override
308
+ #: -> String
311
309
  def plot
312
310
  <<~JS
313
311
  #{x_scale}
@@ -327,12 +325,12 @@ module Spoom
327
325
  end
328
326
 
329
327
  class Stacked < Timeline
330
- extend T::Sig
331
328
  extend T::Helpers
332
329
 
333
330
  abstract!
334
331
 
335
- sig { override.returns(String) }
332
+ # @override
333
+ #: -> String
336
334
  def script
337
335
  <<~JS
338
336
  #{tooltip}
@@ -373,7 +371,8 @@ module Spoom
373
371
  JS
374
372
  end
375
373
 
376
- sig { override.returns(String) }
374
+ # @override
375
+ #: -> String
377
376
  def plot
378
377
  <<~JS
379
378
  #{x_scale}
@@ -384,7 +383,8 @@ module Spoom
384
383
  JS
385
384
  end
386
385
 
387
- sig { override.params(y: String, color: String, curve: String).returns(String) }
386
+ # @override
387
+ #: (y: String, ?color: String, ?curve: String) -> String
388
388
  def line(y:, color: "strictnessColor(d.key)", curve: "curveCatmullRom.alpha(1)")
389
389
  <<~JS
390
390
  var area_#{id} = d3.area()
@@ -419,9 +419,7 @@ module Spoom
419
419
  end
420
420
 
421
421
  class Sigils < Stacked
422
- extend T::Sig
423
-
424
- sig { params(id: String, snapshots: T::Array[Snapshot]).void }
422
+ #: (String id, Array[Snapshot] snapshots) -> void
425
423
  def initialize(id, snapshots)
426
424
  keys = Snapshot::STRICTNESSES
427
425
  data = snapshots.map do |snapshot|
@@ -435,7 +433,8 @@ module Spoom
435
433
  super(id, data, keys)
436
434
  end
437
435
 
438
- sig { override.returns(String) }
436
+ # @override
437
+ #: -> String
439
438
  def tooltip
440
439
  <<~JS
441
440
  function tooltip_#{id}(d) {
@@ -446,9 +445,7 @@ module Spoom
446
445
  end
447
446
 
448
447
  class Calls < Stacked
449
- extend T::Sig
450
-
451
- sig { params(id: String, snapshots: T::Array[Snapshot]).void }
448
+ #: (String id, Array[Snapshot] snapshots) -> void
452
449
  def initialize(id, snapshots)
453
450
  keys = ["false", "true"]
454
451
  data = snapshots.map do |snapshot|
@@ -462,7 +459,8 @@ module Spoom
462
459
  super(id, data, keys)
463
460
  end
464
461
 
465
- sig { override.returns(String) }
462
+ # @override
463
+ #: -> String
466
464
  def tooltip
467
465
  <<~JS
468
466
  function tooltip_#{id}(d) {
@@ -473,9 +471,7 @@ module Spoom
473
471
  end
474
472
 
475
473
  class Sigs < Stacked
476
- extend T::Sig
477
-
478
- sig { params(id: String, snapshots: T::Array[Snapshot]).void }
474
+ #: (String id, Array[Snapshot] snapshots) -> void
479
475
  def initialize(id, snapshots)
480
476
  keys = ["false", "true"]
481
477
  data = snapshots.map do |snapshot|
@@ -492,7 +488,8 @@ module Spoom
492
488
  super(id, data, keys)
493
489
  end
494
490
 
495
- sig { override.returns(String) }
491
+ # @override
492
+ #: -> String
496
493
  def tooltip
497
494
  <<~JS
498
495
  function tooltip_#{id}(d) {
@@ -503,9 +500,7 @@ module Spoom
503
500
  end
504
501
 
505
502
  class RBIs < Stacked
506
- extend T::Sig
507
-
508
- sig { params(id: String, snapshots: T::Array[Snapshot]).void }
503
+ #: (String id, Array[Snapshot] snapshots) -> void
509
504
  def initialize(id, snapshots)
510
505
  keys = ["rbis", "files"]
511
506
  data = snapshots.map do |snapshot|
@@ -519,7 +514,8 @@ module Spoom
519
514
  super(id, data, keys)
520
515
  end
521
516
 
522
- sig { override.returns(String) }
517
+ # @override
518
+ #: -> String
523
519
  def tooltip
524
520
  <<~JS
525
521
  function tooltip_#{id}(d) {
@@ -533,7 +529,8 @@ module Spoom
533
529
  JS
534
530
  end
535
531
 
536
- sig { override.returns(String) }
532
+ # @override
533
+ #: -> String
537
534
  def script
538
535
  <<~JS
539
536
  #{tooltip}
@@ -573,7 +570,8 @@ module Spoom
573
570
  JS
574
571
  end
575
572
 
576
- sig { override.params(y: String, color: String, curve: String).returns(String) }
573
+ # @override
574
+ #: (y: String, ?color: String, ?curve: String) -> String
577
575
  def line(y:, color: "strictnessColor(d.key)", curve: "curveCatmullRom.alpha(1)")
578
576
  <<~JS
579
577
  var area_#{id} = d3.area()
@@ -613,7 +611,8 @@ module Spoom
613
611
  JS
614
612
  end
615
613
 
616
- sig { override.returns(String) }
614
+ # @override
615
+ #: -> String
617
616
  def plot
618
617
  <<~JS
619
618
  #{x_scale}
@@ -15,9 +15,7 @@ module Spoom
15
15
  COLOR_STRONG = "#064828"
16
16
 
17
17
  class << self
18
- extend T::Sig
19
-
20
- sig { returns(String) }
18
+ #: -> String
21
19
  def header_style
22
20
  <<~CSS
23
21
  svg {
@@ -57,7 +55,7 @@ module Spoom
57
55
  CSS
58
56
  end
59
57
 
60
- sig { params(palette: ColorPalette).returns(String) }
58
+ #: (ColorPalette palette) -> String
61
59
  def header_script(palette)
62
60
  <<~JS
63
61
  var parseDate = d3.timeParse("%s");