danger-packwerk 0.7.0 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/lib/danger-packwerk/packwerk_wrapper.rb +2 -2
  3. data/lib/danger-packwerk/version.rb +1 -1
  4. data/sorbet/config +1 -0
  5. data/sorbet/rbi/gems/actionview@7.0.4.rbi +11543 -0
  6. data/sorbet/rbi/gems/activesupport@7.0.4.rbi +12959 -0
  7. data/sorbet/rbi/gems/addressable@2.8.1.rbi +1505 -0
  8. data/sorbet/rbi/gems/ast@2.4.2.rbi +522 -0
  9. data/sorbet/rbi/gems/better_html@2.0.1.rbi +286 -0
  10. data/sorbet/rbi/gems/builder@3.2.4.rbi +8 -0
  11. data/sorbet/rbi/gems/claide-plugins@0.9.2.rbi +791 -0
  12. data/sorbet/rbi/gems/claide@1.1.0.rbi +1132 -0
  13. data/sorbet/rbi/gems/coderay@1.1.3.rbi +2256 -0
  14. data/sorbet/rbi/gems/colored2@3.1.2.rbi +130 -0
  15. data/sorbet/rbi/gems/concurrent-ruby@1.1.10.rbi +8695 -0
  16. data/sorbet/rbi/gems/cork@0.3.0.rbi +248 -0
  17. data/sorbet/rbi/gems/crass@1.0.6.rbi +436 -0
  18. data/sorbet/rbi/gems/danger-plugin-api@1.0.0.rbi +8 -0
  19. data/sorbet/rbi/gems/danger@9.0.0.rbi +4722 -0
  20. data/sorbet/rbi/gems/diff-lcs@1.5.0.rbi +862 -0
  21. data/sorbet/rbi/gems/erubi@1.11.0.rbi +102 -0
  22. data/sorbet/rbi/gems/faraday-em_http@1.0.0.rbi +266 -0
  23. data/sorbet/rbi/gems/faraday-em_synchrony@1.0.0.rbi +209 -0
  24. data/sorbet/rbi/gems/faraday-excon@1.1.0.rbi +212 -0
  25. data/sorbet/rbi/gems/faraday-http-cache@2.4.1.rbi +805 -0
  26. data/sorbet/rbi/gems/faraday-httpclient@1.0.1.rbi +221 -0
  27. data/sorbet/rbi/gems/faraday-multipart@1.0.4.rbi +266 -0
  28. data/sorbet/rbi/gems/faraday-net_http@1.0.1.rbi +216 -0
  29. data/sorbet/rbi/gems/faraday-net_http_persistent@1.2.0.rbi +206 -0
  30. data/sorbet/rbi/gems/faraday-patron@1.0.0.rbi +212 -0
  31. data/sorbet/rbi/gems/faraday-rack@1.0.0.rbi +225 -0
  32. data/sorbet/rbi/gems/faraday-retry@1.0.3.rbi +222 -0
  33. data/sorbet/rbi/gems/faraday@1.10.2.rbi +1862 -0
  34. data/sorbet/rbi/gems/git@1.12.0.rbi +1936 -0
  35. data/sorbet/rbi/gems/i18n@1.12.0.rbi +1643 -0
  36. data/sorbet/rbi/gems/json@2.6.2.rbi +1418 -0
  37. data/sorbet/rbi/gems/kramdown-parser-gfm@1.1.0.rbi +8 -0
  38. data/sorbet/rbi/gems/kramdown@2.4.0.rbi +2168 -0
  39. data/sorbet/rbi/gems/loofah@2.19.0.rbi +646 -0
  40. data/sorbet/rbi/gems/method_source@1.0.0.rbi +199 -0
  41. data/sorbet/rbi/gems/minitest@5.16.3.rbi +997 -0
  42. data/sorbet/rbi/gems/multipart-post@2.2.3.rbi +165 -0
  43. data/sorbet/rbi/gems/nap@1.1.0.rbi +351 -0
  44. data/sorbet/rbi/gems/no_proxy_fix@0.1.2.rbi +8 -0
  45. data/sorbet/rbi/gems/nokogiri@1.13.8.rbi +4916 -0
  46. data/sorbet/rbi/gems/octokit@5.6.1.rbi +8939 -0
  47. data/sorbet/rbi/gems/open4@1.3.4.rbi +8 -0
  48. data/sorbet/rbi/gems/{packwerk@2.1.1.rbi → packwerk@2.2.1.rbi} +602 -51
  49. data/sorbet/rbi/gems/parallel@1.22.1.rbi +163 -0
  50. data/sorbet/rbi/gems/parser@3.1.2.1.rbi +5988 -0
  51. data/sorbet/rbi/gems/pry@0.14.1.rbi +6969 -0
  52. data/sorbet/rbi/gems/public_suffix@5.0.0.rbi +779 -0
  53. data/sorbet/rbi/gems/racc@1.6.0.rbi +92 -0
  54. data/sorbet/rbi/gems/rails-dom-testing@2.0.3.rbi +8 -0
  55. data/sorbet/rbi/gems/rails-html-sanitizer@1.4.3.rbi +493 -0
  56. data/sorbet/rbi/gems/rainbow@3.1.1.rbi +227 -0
  57. data/sorbet/rbi/gems/rake@13.0.6.rbi +1865 -0
  58. data/sorbet/rbi/gems/rbi@0.0.14.rbi +2337 -0
  59. data/sorbet/rbi/gems/rchardet@1.8.0.rbi +587 -0
  60. data/sorbet/rbi/gems/regexp_parser@2.5.0.rbi +1851 -0
  61. data/sorbet/rbi/gems/rexml@3.2.5.rbi +3852 -0
  62. data/sorbet/rbi/gems/rspec-core@3.11.0.rbi +7725 -0
  63. data/sorbet/rbi/gems/rspec-expectations@3.11.0.rbi +6201 -0
  64. data/sorbet/rbi/gems/rspec-mocks@3.11.1.rbi +3625 -0
  65. data/sorbet/rbi/gems/rspec-support@3.11.0.rbi +1176 -0
  66. data/sorbet/rbi/gems/rspec@3.11.0.rbi +40 -0
  67. data/sorbet/rbi/gems/rubocop-ast@1.21.0.rbi +4193 -0
  68. data/sorbet/rbi/gems/rubocop-sorbet@0.6.8.rbi +677 -0
  69. data/sorbet/rbi/gems/rubocop@1.36.0.rbi +37914 -0
  70. data/sorbet/rbi/gems/ruby-progressbar@1.11.0.rbi +732 -0
  71. data/sorbet/rbi/gems/ruby2_keywords@0.0.5.rbi +8 -0
  72. data/sorbet/rbi/gems/sawyer@0.9.2.rbi +513 -0
  73. data/sorbet/rbi/gems/smart_properties@1.17.0.rbi +326 -0
  74. data/sorbet/rbi/gems/spoom@1.1.11.rbi +1600 -0
  75. data/sorbet/rbi/gems/tapioca@0.8.0.rbi +1959 -0
  76. data/sorbet/rbi/gems/terminal-table@3.0.2.rbi +438 -0
  77. data/sorbet/rbi/gems/thor@1.2.1.rbi +2921 -0
  78. data/sorbet/rbi/gems/tzinfo@2.0.5.rbi +4879 -0
  79. data/sorbet/rbi/gems/unicode-display_width@2.3.0.rbi +27 -0
  80. data/sorbet/rbi/gems/unparser@0.6.5.rbi +2789 -0
  81. data/sorbet/rbi/gems/webrick@1.7.0.rbi +1802 -0
  82. data/sorbet/rbi/gems/yard-sorbet@0.6.1.rbi +288 -0
  83. data/sorbet/rbi/gems/yard@0.9.27.rbi +12668 -0
  84. data/sorbet/rbi/todo.rbi +122 -0
  85. metadata +84 -7
  86. data/sorbet/rbi/gems/danger@8.5.0.rbi +0 -122
@@ -0,0 +1,1600 @@
1
+ # typed: true
2
+
3
+ # DO NOT EDIT MANUALLY
4
+ # This is an autogenerated file for types exported from the `spoom` gem.
5
+ # Please instead update this file by running `bin/tapioca gem spoom`.
6
+
7
+ module Spoom
8
+ class << self
9
+ sig { params(cmd: ::String, arg: ::String, path: ::String, capture_err: T::Boolean).returns(::Spoom::ExecResult) }
10
+ def exec(cmd, *arg, path: T.unsafe(nil), capture_err: T.unsafe(nil)); end
11
+ end
12
+ end
13
+
14
+ module Spoom::Cli; end
15
+
16
+ class Spoom::Cli::Bump < ::Thor
17
+ include ::Spoom::Colorize
18
+ include ::Spoom::Cli::Helper
19
+
20
+ sig { params(directory: ::String).void }
21
+ def bump(directory = T.unsafe(nil)); end
22
+
23
+ def config_files(path: T.unsafe(nil)); end
24
+ def help(command = T.unsafe(nil), subcommand = T.unsafe(nil)); end
25
+ def print_changes(files, command:, from: T.unsafe(nil), to: T.unsafe(nil), dry: T.unsafe(nil), path: T.unsafe(nil)); end
26
+ def undo_changes(files, from_strictness); end
27
+ end
28
+
29
+ class Spoom::Cli::Config < ::Thor
30
+ include ::Spoom::Colorize
31
+ include ::Spoom::Cli::Helper
32
+
33
+ def help(command = T.unsafe(nil), subcommand = T.unsafe(nil)); end
34
+ def show; end
35
+ end
36
+
37
+ class Spoom::Cli::Coverage < ::Thor
38
+ include ::Spoom::Colorize
39
+ include ::Spoom::Cli::Helper
40
+
41
+ def bundle_install(path, sha); end
42
+ def help(command = T.unsafe(nil), subcommand = T.unsafe(nil)); end
43
+ def message_no_data(file); end
44
+ def open(file = T.unsafe(nil)); end
45
+ def parse_time(string, option); end
46
+ def report; end
47
+ def snapshot; end
48
+ def timeline; end
49
+ end
50
+
51
+ Spoom::Cli::Coverage::DATA_DIR = T.let(T.unsafe(nil), String)
52
+
53
+ module Spoom::Cli::Helper
54
+ include ::Spoom::Colorize
55
+
56
+ requires_ancestor { Thor }
57
+
58
+ sig { params(string: ::String).returns(::String) }
59
+ def blue(string); end
60
+
61
+ sig { params(exit_code: ::Integer, block: T.nilable(T.proc.void)).void }
62
+ def check_sorbet_segfault(exit_code, &block); end
63
+
64
+ # Is the `--color` option true?
65
+ sig { returns(T::Boolean) }
66
+ def color?; end
67
+
68
+ # Colorize a string if `color?`
69
+ sig { params(string: ::String, color: ::Spoom::Color).returns(::String) }
70
+ def colorize(string, *color); end
71
+
72
+ sig { params(string: ::String).returns(::String) }
73
+ def cyan(string); end
74
+
75
+ # Return the path specified through `--path`
76
+ sig { returns(::String) }
77
+ def exec_path; end
78
+
79
+ sig { params(string: ::String).returns(::String) }
80
+ def gray(string); end
81
+
82
+ sig { params(string: ::String).returns(::String) }
83
+ def green(string); end
84
+
85
+ sig { params(string: ::String).returns(::String) }
86
+ def highlight(string); end
87
+
88
+ # Enforce that `spoom` is ran inside a project with a `sorbet/config` file
89
+ #
90
+ # Display an error message and exit otherwise.
91
+ sig { void }
92
+ def in_sorbet_project!; end
93
+
94
+ # Is `spoom` ran inside a project with a `sorbet/config` file?
95
+ sig { returns(T::Boolean) }
96
+ def in_sorbet_project?; end
97
+
98
+ sig { params(string: ::String).returns(::String) }
99
+ def red(string); end
100
+
101
+ # Print `message` on `$stdout`
102
+ sig { params(message: ::String).void }
103
+ def say(message); end
104
+
105
+ # Print `message` on `$stderr`
106
+ #
107
+ # The message is prefixed by a status (default: `Error`).
108
+ sig { params(message: ::String, status: T.nilable(::String), nl: T::Boolean).void }
109
+ def say_error(message, status: T.unsafe(nil), nl: T.unsafe(nil)); end
110
+
111
+ sig { returns(::Spoom::Sorbet::Config) }
112
+ def sorbet_config; end
113
+
114
+ sig { returns(::String) }
115
+ def sorbet_config_file; end
116
+
117
+ sig { params(string: ::String).returns(::String) }
118
+ def yellow(string); end
119
+ end
120
+
121
+ class Spoom::Cli::LSP < ::Thor
122
+ include ::Spoom::Colorize
123
+ include ::Spoom::Cli::Helper
124
+
125
+ # TODO: options, filter, limit, kind etc.. filter rbi
126
+ def defs(file, line, col); end
127
+
128
+ # TODO: options, filter, limit, kind etc.. filter rbi
129
+ def find(query); end
130
+
131
+ def help(command = T.unsafe(nil), subcommand = T.unsafe(nil)); end
132
+
133
+ # TODO: options, filter, limit, kind etc.. filter rbi
134
+ def hover(file, line, col); end
135
+
136
+ # TODO: options, filter, limit, kind etc.. filter rbi
137
+ def list; end
138
+
139
+ def lsp_client; end
140
+
141
+ # TODO: options, filter, limit, kind etc.. filter rbi
142
+ def refs(file, line, col); end
143
+
144
+ def run(&block); end
145
+ def show; end
146
+
147
+ # TODO: options, filter, limit, kind etc.. filter rbi
148
+ def sigs(file, line, col); end
149
+
150
+ def symbol_printer; end
151
+
152
+ # TODO: options, filter, limit, kind etc.. filter rbi
153
+ def symbols(file); end
154
+
155
+ def to_uri(path); end
156
+
157
+ # TODO: options, filter, limit, kind etc.. filter rbi
158
+ def types(file, line, col); end
159
+ end
160
+
161
+ class Spoom::Cli::Main < ::Thor
162
+ include ::Spoom::Colorize
163
+ include ::Spoom::Cli::Helper
164
+
165
+ def __print_version; end
166
+ def bump(*args); end
167
+ def config(*args); end
168
+ def coverage(*args); end
169
+ def files; end
170
+ def lsp(*args); end
171
+ def tc(*args); end
172
+
173
+ class << self
174
+ # Utils
175
+ #
176
+ # @return [Boolean]
177
+ def exit_on_failure?; end
178
+ end
179
+ end
180
+
181
+ class Spoom::Cli::Run < ::Thor
182
+ include ::Spoom::Colorize
183
+ include ::Spoom::Cli::Helper
184
+
185
+ def colorize_message(message); end
186
+ def format_error(error, format); end
187
+ def help(command = T.unsafe(nil), subcommand = T.unsafe(nil)); end
188
+ def tc(*arg); end
189
+ end
190
+
191
+ Spoom::Cli::Run::DEFAULT_FORMAT = T.let(T.unsafe(nil), String)
192
+ Spoom::Cli::Run::SORT_CODE = T.let(T.unsafe(nil), String)
193
+ Spoom::Cli::Run::SORT_ENUM = T.let(T.unsafe(nil), Array)
194
+ Spoom::Cli::Run::SORT_LOC = T.let(T.unsafe(nil), String)
195
+
196
+ class Spoom::Color < ::T::Enum
197
+ enums do
198
+ CLEAR = new
199
+ BOLD = new
200
+ BLACK = new
201
+ RED = new
202
+ GREEN = new
203
+ YELLOW = new
204
+ BLUE = new
205
+ MAGENTA = new
206
+ CYAN = new
207
+ WHITE = new
208
+ LIGHT_BLACK = new
209
+ LIGHT_RED = new
210
+ LIGHT_GREEN = new
211
+ LIGHT_YELLOW = new
212
+ LIGHT_BLUE = new
213
+ LIGHT_MAGENTA = new
214
+ LIGHT_CYAN = new
215
+ LIGHT_WHITE = new
216
+ end
217
+
218
+ sig { returns(::String) }
219
+ def ansi_code; end
220
+ end
221
+
222
+ module Spoom::Colorize
223
+ sig { params(string: ::String, color: ::Spoom::Color).returns(::String) }
224
+ def set_color(string, *color); end
225
+ end
226
+
227
+ module Spoom::Coverage
228
+ class << self
229
+ sig do
230
+ params(
231
+ snapshots: T::Array[::Spoom::Coverage::Snapshot],
232
+ palette: ::Spoom::Coverage::D3::ColorPalette,
233
+ path: ::String
234
+ ).returns(::Spoom::Coverage::Report)
235
+ end
236
+ def report(snapshots, palette:, path: T.unsafe(nil)); end
237
+
238
+ sig { params(path: ::String).returns(::Spoom::FileTree) }
239
+ def sigils_tree(path: T.unsafe(nil)); end
240
+
241
+ sig do
242
+ params(
243
+ path: ::String,
244
+ rbi: T::Boolean,
245
+ sorbet_bin: T.nilable(::String)
246
+ ).returns(::Spoom::Coverage::Snapshot)
247
+ end
248
+ def snapshot(path: T.unsafe(nil), rbi: T.unsafe(nil), sorbet_bin: T.unsafe(nil)); end
249
+
250
+ sig { params(path: ::String).returns(::Spoom::Sorbet::Config) }
251
+ def sorbet_config(path: T.unsafe(nil)); end
252
+ end
253
+ end
254
+
255
+ module Spoom::Coverage::Cards; end
256
+
257
+ class Spoom::Coverage::Cards::Card < ::Spoom::Coverage::Template
258
+ sig { params(template: ::String, title: T.nilable(::String), body: T.nilable(::String)).void }
259
+ def initialize(template: T.unsafe(nil), title: T.unsafe(nil), body: T.unsafe(nil)); end
260
+
261
+ # @return [String, nil]
262
+ def body; end
263
+
264
+ sig { returns(T.nilable(::String)) }
265
+ def title; end
266
+ end
267
+
268
+ Spoom::Coverage::Cards::Card::TEMPLATE = T.let(T.unsafe(nil), String)
269
+
270
+ # @abstract It cannont be directly instantiated. Subclasses must implement the `abstract` methods below.
271
+ class Spoom::Coverage::Cards::Erb < ::Spoom::Coverage::Cards::Card
272
+ abstract!
273
+
274
+ sig { void }
275
+ def initialize; end
276
+
277
+ # @abstract
278
+ sig { abstract.returns(::String) }
279
+ def erb; end
280
+
281
+ sig { override.returns(::String) }
282
+ def html; end
283
+ end
284
+
285
+ class Spoom::Coverage::Cards::Map < ::Spoom::Coverage::Cards::Card
286
+ sig { params(sigils_tree: ::Spoom::FileTree, title: ::String).void }
287
+ def initialize(sigils_tree:, title: T.unsafe(nil)); end
288
+ end
289
+
290
+ class Spoom::Coverage::Cards::Snapshot < ::Spoom::Coverage::Cards::Card
291
+ sig { params(snapshot: ::Spoom::Coverage::Snapshot, title: ::String).void }
292
+ def initialize(snapshot:, title: T.unsafe(nil)); end
293
+
294
+ sig { returns(::Spoom::Coverage::D3::Pie::Calls) }
295
+ def pie_calls; end
296
+
297
+ sig { returns(::Spoom::Coverage::D3::Pie::Sigils) }
298
+ def pie_sigils; end
299
+
300
+ sig { returns(::Spoom::Coverage::D3::Pie::Sigs) }
301
+ def pie_sigs; end
302
+
303
+ sig { returns(::Spoom::Coverage::Snapshot) }
304
+ def snapshot; end
305
+ end
306
+
307
+ Spoom::Coverage::Cards::Snapshot::TEMPLATE = T.let(T.unsafe(nil), String)
308
+
309
+ class Spoom::Coverage::Cards::SorbetIntro < ::Spoom::Coverage::Cards::Erb
310
+ sig { params(sorbet_intro_commit: T.nilable(::String), sorbet_intro_date: T.nilable(::Time)).void }
311
+ def initialize(sorbet_intro_commit: T.unsafe(nil), sorbet_intro_date: T.unsafe(nil)); end
312
+
313
+ sig { override.returns(::String) }
314
+ def erb; end
315
+ end
316
+
317
+ class Spoom::Coverage::Cards::Timeline < ::Spoom::Coverage::Cards::Card
318
+ sig { params(title: ::String, timeline: ::Spoom::Coverage::D3::Timeline).void }
319
+ def initialize(title:, timeline:); end
320
+ end
321
+
322
+ class Spoom::Coverage::Cards::Timeline::Calls < ::Spoom::Coverage::Cards::Timeline
323
+ sig { params(snapshots: T::Array[::Spoom::Coverage::Snapshot], title: ::String).void }
324
+ def initialize(snapshots:, title: T.unsafe(nil)); end
325
+ end
326
+
327
+ class Spoom::Coverage::Cards::Timeline::RBIs < ::Spoom::Coverage::Cards::Timeline
328
+ sig { params(snapshots: T::Array[::Spoom::Coverage::Snapshot], title: ::String).void }
329
+ def initialize(snapshots:, title: T.unsafe(nil)); end
330
+ end
331
+
332
+ class Spoom::Coverage::Cards::Timeline::Runtimes < ::Spoom::Coverage::Cards::Timeline
333
+ sig { params(snapshots: T::Array[::Spoom::Coverage::Snapshot], title: ::String).void }
334
+ def initialize(snapshots:, title: T.unsafe(nil)); end
335
+ end
336
+
337
+ class Spoom::Coverage::Cards::Timeline::Sigils < ::Spoom::Coverage::Cards::Timeline
338
+ sig { params(snapshots: T::Array[::Spoom::Coverage::Snapshot], title: ::String).void }
339
+ def initialize(snapshots:, title: T.unsafe(nil)); end
340
+ end
341
+
342
+ class Spoom::Coverage::Cards::Timeline::Sigs < ::Spoom::Coverage::Cards::Timeline
343
+ sig { params(snapshots: T::Array[::Spoom::Coverage::Snapshot], title: ::String).void }
344
+ def initialize(snapshots:, title: T.unsafe(nil)); end
345
+ end
346
+
347
+ class Spoom::Coverage::Cards::Timeline::Versions < ::Spoom::Coverage::Cards::Timeline
348
+ sig { params(snapshots: T::Array[::Spoom::Coverage::Snapshot], title: ::String).void }
349
+ def initialize(snapshots:, title: T.unsafe(nil)); end
350
+ end
351
+
352
+ module Spoom::Coverage::D3
353
+ class << self
354
+ sig { params(palette: ::Spoom::Coverage::D3::ColorPalette).returns(::String) }
355
+ def header_script(palette); end
356
+
357
+ sig { returns(::String) }
358
+ def header_style; end
359
+ end
360
+ end
361
+
362
+ # @abstract It cannont be directly instantiated. Subclasses must implement the `abstract` methods below.
363
+ class Spoom::Coverage::D3::Base
364
+ abstract!
365
+
366
+ sig { params(id: ::String, data: T.untyped).void }
367
+ def initialize(id, data); end
368
+
369
+ sig { returns(::String) }
370
+ def html; end
371
+
372
+ sig { returns(::String) }
373
+ def id; end
374
+
375
+ # @abstract
376
+ sig { abstract.returns(::String) }
377
+ def script; end
378
+
379
+ sig { returns(::String) }
380
+ def tooltip; end
381
+
382
+ class << self
383
+ sig { returns(::String) }
384
+ def header_script; end
385
+
386
+ sig { returns(::String) }
387
+ def header_style; end
388
+ end
389
+ end
390
+
391
+ Spoom::Coverage::D3::COLOR_FALSE = T.let(T.unsafe(nil), String)
392
+ Spoom::Coverage::D3::COLOR_IGNORE = T.let(T.unsafe(nil), String)
393
+ Spoom::Coverage::D3::COLOR_STRICT = T.let(T.unsafe(nil), String)
394
+ Spoom::Coverage::D3::COLOR_STRONG = T.let(T.unsafe(nil), String)
395
+ Spoom::Coverage::D3::COLOR_TRUE = T.let(T.unsafe(nil), String)
396
+
397
+ class Spoom::Coverage::D3::CircleMap < ::Spoom::Coverage::D3::Base
398
+ sig { override.returns(::String) }
399
+ def script; end
400
+
401
+ class << self
402
+ sig { returns(::String) }
403
+ def header_script; end
404
+
405
+ sig { returns(::String) }
406
+ def header_style; end
407
+ end
408
+ end
409
+
410
+ class Spoom::Coverage::D3::CircleMap::Sigils < ::Spoom::Coverage::D3::CircleMap
411
+ sig { params(id: ::String, sigils_tree: ::Spoom::FileTree).void }
412
+ def initialize(id, sigils_tree); end
413
+
414
+ sig { params(node: ::Spoom::FileTree::Node).returns(::Float) }
415
+ def tree_node_score(node); end
416
+
417
+ sig { params(node: ::Spoom::FileTree::Node).returns(T.nilable(::String)) }
418
+ def tree_node_strictness(node); end
419
+
420
+ sig { params(node: ::Spoom::FileTree::Node).returns(T::Hash[::Symbol, T.untyped]) }
421
+ def tree_node_to_json(node); end
422
+ end
423
+
424
+ class Spoom::Coverage::D3::ColorPalette < ::T::Struct
425
+ prop :false, ::String
426
+ prop :ignore, ::String
427
+ prop :strict, ::String
428
+ prop :strong, ::String
429
+ prop :true, ::String
430
+
431
+ class << self
432
+ def inherited(s); end
433
+ end
434
+ end
435
+
436
+ # @abstract It cannont be directly instantiated. Subclasses must implement the `abstract` methods below.
437
+ class Spoom::Coverage::D3::Pie < ::Spoom::Coverage::D3::Base
438
+ abstract!
439
+
440
+ sig { params(id: ::String, title: ::String, data: T.untyped).void }
441
+ def initialize(id, title, data); end
442
+
443
+ sig { override.returns(::String) }
444
+ def script; end
445
+
446
+ class << self
447
+ sig { returns(::String) }
448
+ def header_script; end
449
+
450
+ sig { returns(::String) }
451
+ def header_style; end
452
+ end
453
+ end
454
+
455
+ class Spoom::Coverage::D3::Pie::Calls < ::Spoom::Coverage::D3::Pie
456
+ sig { params(id: ::String, title: ::String, snapshot: ::Spoom::Coverage::Snapshot).void }
457
+ def initialize(id, title, snapshot); end
458
+
459
+ sig { override.returns(::String) }
460
+ def tooltip; end
461
+ end
462
+
463
+ class Spoom::Coverage::D3::Pie::Sigils < ::Spoom::Coverage::D3::Pie
464
+ sig { params(id: ::String, title: ::String, snapshot: ::Spoom::Coverage::Snapshot).void }
465
+ def initialize(id, title, snapshot); end
466
+
467
+ sig { override.returns(::String) }
468
+ def tooltip; end
469
+ end
470
+
471
+ class Spoom::Coverage::D3::Pie::Sigs < ::Spoom::Coverage::D3::Pie
472
+ sig { params(id: ::String, title: ::String, snapshot: ::Spoom::Coverage::Snapshot).void }
473
+ def initialize(id, title, snapshot); end
474
+
475
+ sig { override.returns(::String) }
476
+ def tooltip; end
477
+ end
478
+
479
+ # @abstract It cannont be directly instantiated. Subclasses must implement the `abstract` methods below.
480
+ class Spoom::Coverage::D3::Timeline < ::Spoom::Coverage::D3::Base
481
+ abstract!
482
+
483
+ sig { params(id: ::String, data: T.untyped, keys: T::Array[::String]).void }
484
+ def initialize(id, data, keys); end
485
+
486
+ sig { params(y: ::String, color: ::String, curve: ::String).returns(::String) }
487
+ def area(y:, color: T.unsafe(nil), curve: T.unsafe(nil)); end
488
+
489
+ sig { params(y: ::String, color: ::String, curve: ::String).returns(::String) }
490
+ def line(y:, color: T.unsafe(nil), curve: T.unsafe(nil)); end
491
+
492
+ # @abstract
493
+ sig { abstract.returns(::String) }
494
+ def plot; end
495
+
496
+ sig { params(y: ::String).returns(::String) }
497
+ def points(y:); end
498
+
499
+ sig { override.returns(::String) }
500
+ def script; end
501
+
502
+ sig { returns(::String) }
503
+ def x_scale; end
504
+
505
+ sig { returns(::String) }
506
+ def x_ticks; end
507
+
508
+ sig { params(min: ::String, max: ::String, ticks: ::String).returns(::String) }
509
+ def y_scale(min:, max:, ticks:); end
510
+
511
+ sig { params(ticks: ::String, format: ::String, padding: ::Integer).returns(::String) }
512
+ def y_ticks(ticks:, format:, padding:); end
513
+
514
+ class << self
515
+ sig { returns(::String) }
516
+ def header_script; end
517
+
518
+ sig { returns(::String) }
519
+ def header_style; end
520
+ end
521
+ end
522
+
523
+ class Spoom::Coverage::D3::Timeline::Calls < ::Spoom::Coverage::D3::Timeline::Stacked
524
+ sig { params(id: ::String, snapshots: T::Array[::Spoom::Coverage::Snapshot]).void }
525
+ def initialize(id, snapshots); end
526
+
527
+ sig { override.returns(::String) }
528
+ def tooltip; end
529
+ end
530
+
531
+ class Spoom::Coverage::D3::Timeline::RBIs < ::Spoom::Coverage::D3::Timeline::Stacked
532
+ sig { params(id: ::String, snapshots: T::Array[::Spoom::Coverage::Snapshot]).void }
533
+ def initialize(id, snapshots); end
534
+
535
+ sig { override.params(y: ::String, color: ::String, curve: ::String).returns(::String) }
536
+ def line(y:, color: T.unsafe(nil), curve: T.unsafe(nil)); end
537
+
538
+ sig { override.returns(::String) }
539
+ def plot; end
540
+
541
+ sig { override.returns(::String) }
542
+ def script; end
543
+
544
+ sig { override.returns(::String) }
545
+ def tooltip; end
546
+ end
547
+
548
+ class Spoom::Coverage::D3::Timeline::Runtimes < ::Spoom::Coverage::D3::Timeline
549
+ sig { params(id: ::String, snapshots: T::Array[::Spoom::Coverage::Snapshot]).void }
550
+ def initialize(id, snapshots); end
551
+
552
+ sig { override.returns(::String) }
553
+ def plot; end
554
+
555
+ sig { override.returns(::String) }
556
+ def tooltip; end
557
+ end
558
+
559
+ class Spoom::Coverage::D3::Timeline::Sigils < ::Spoom::Coverage::D3::Timeline::Stacked
560
+ sig { params(id: ::String, snapshots: T::Array[::Spoom::Coverage::Snapshot]).void }
561
+ def initialize(id, snapshots); end
562
+
563
+ sig { override.returns(::String) }
564
+ def tooltip; end
565
+ end
566
+
567
+ class Spoom::Coverage::D3::Timeline::Sigs < ::Spoom::Coverage::D3::Timeline::Stacked
568
+ sig { params(id: ::String, snapshots: T::Array[::Spoom::Coverage::Snapshot]).void }
569
+ def initialize(id, snapshots); end
570
+
571
+ sig { override.returns(::String) }
572
+ def tooltip; end
573
+ end
574
+
575
+ # @abstract It cannont be directly instantiated. Subclasses must implement the `abstract` methods below.
576
+ class Spoom::Coverage::D3::Timeline::Stacked < ::Spoom::Coverage::D3::Timeline
577
+ abstract!
578
+
579
+ def initialize(*args, &blk); end
580
+
581
+ sig { override.params(y: ::String, color: ::String, curve: ::String).returns(::String) }
582
+ def line(y:, color: T.unsafe(nil), curve: T.unsafe(nil)); end
583
+
584
+ sig { override.returns(::String) }
585
+ def plot; end
586
+
587
+ sig { override.returns(::String) }
588
+ def script; end
589
+ end
590
+
591
+ class Spoom::Coverage::D3::Timeline::Versions < ::Spoom::Coverage::D3::Timeline
592
+ sig { params(id: ::String, snapshots: T::Array[::Spoom::Coverage::Snapshot]).void }
593
+ def initialize(id, snapshots); end
594
+
595
+ sig { override.returns(::String) }
596
+ def plot; end
597
+
598
+ sig { override.returns(::String) }
599
+ def tooltip; end
600
+ end
601
+
602
+ # @abstract It cannont be directly instantiated. Subclasses must implement the `abstract` methods below.
603
+ class Spoom::Coverage::Page < ::Spoom::Coverage::Template
604
+ abstract!
605
+
606
+ sig { params(title: ::String, palette: ::Spoom::Coverage::D3::ColorPalette, template: ::String).void }
607
+ def initialize(title:, palette:, template: T.unsafe(nil)); end
608
+
609
+ sig { returns(::String) }
610
+ def body_html; end
611
+
612
+ # @abstract
613
+ sig { abstract.returns(T::Array[::Spoom::Coverage::Cards::Card]) }
614
+ def cards; end
615
+
616
+ sig { returns(::String) }
617
+ def footer_html; end
618
+
619
+ sig { returns(::String) }
620
+ def header_html; end
621
+
622
+ sig { returns(::String) }
623
+ def header_script; end
624
+
625
+ sig { returns(::String) }
626
+ def header_style; end
627
+
628
+ sig { returns(::Spoom::Coverage::D3::ColorPalette) }
629
+ def palette; end
630
+
631
+ sig { returns(::String) }
632
+ def title; end
633
+ end
634
+
635
+ Spoom::Coverage::Page::TEMPLATE = T.let(T.unsafe(nil), String)
636
+
637
+ class Spoom::Coverage::Report < ::Spoom::Coverage::Page
638
+ sig do
639
+ params(
640
+ project_name: ::String,
641
+ palette: ::Spoom::Coverage::D3::ColorPalette,
642
+ snapshots: T::Array[::Spoom::Coverage::Snapshot],
643
+ sigils_tree: ::Spoom::FileTree,
644
+ sorbet_intro_commit: T.nilable(::String),
645
+ sorbet_intro_date: T.nilable(::Time)
646
+ ).void
647
+ end
648
+ def initialize(project_name:, palette:, snapshots:, sigils_tree:, sorbet_intro_commit: T.unsafe(nil), sorbet_intro_date: T.unsafe(nil)); end
649
+
650
+ sig { override.returns(T::Array[::Spoom::Coverage::Cards::Card]) }
651
+ def cards; end
652
+
653
+ sig { override.returns(::String) }
654
+ def header_html; end
655
+
656
+ sig { returns(::String) }
657
+ def project_name; end
658
+
659
+ sig { returns(::Spoom::FileTree) }
660
+ def sigils_tree; end
661
+
662
+ sig { returns(T::Array[::Spoom::Coverage::Snapshot]) }
663
+ def snapshots; end
664
+
665
+ sig { returns(T.nilable(::String)) }
666
+ def sorbet_intro_commit; end
667
+
668
+ sig { returns(T.nilable(::Time)) }
669
+ def sorbet_intro_date; end
670
+ end
671
+
672
+ class Spoom::Coverage::Snapshot < ::T::Struct
673
+ prop :calls_typed, ::Integer, default: T.unsafe(nil)
674
+ prop :calls_untyped, ::Integer, default: T.unsafe(nil)
675
+ prop :classes, ::Integer, default: T.unsafe(nil)
676
+ prop :commit_sha, T.nilable(::String), default: T.unsafe(nil)
677
+ prop :commit_timestamp, T.nilable(::Integer), default: T.unsafe(nil)
678
+ prop :duration, ::Integer, default: T.unsafe(nil)
679
+ prop :files, ::Integer, default: T.unsafe(nil)
680
+ prop :methods_with_sig, ::Integer, default: T.unsafe(nil)
681
+ prop :methods_without_sig, ::Integer, default: T.unsafe(nil)
682
+ prop :modules, ::Integer, default: T.unsafe(nil)
683
+ prop :rbi_files, ::Integer, default: T.unsafe(nil)
684
+ prop :sigils, T::Hash[::String, ::Integer], default: T.unsafe(nil)
685
+ prop :singleton_classes, ::Integer, default: T.unsafe(nil)
686
+ prop :timestamp, ::Integer, default: T.unsafe(nil)
687
+ prop :version_runtime, T.nilable(::String), default: T.unsafe(nil)
688
+ prop :version_static, T.nilable(::String), default: T.unsafe(nil)
689
+
690
+ sig { params(out: T.any(::IO, ::StringIO), colors: T::Boolean, indent_level: ::Integer).void }
691
+ def print(out: T.unsafe(nil), colors: T.unsafe(nil), indent_level: T.unsafe(nil)); end
692
+
693
+ sig { params(arg: T.untyped).returns(::String) }
694
+ def to_json(*arg); end
695
+
696
+ class << self
697
+ sig { params(json: ::String).returns(::Spoom::Coverage::Snapshot) }
698
+ def from_json(json); end
699
+
700
+ sig { params(obj: T::Hash[::String, T.untyped]).returns(::Spoom::Coverage::Snapshot) }
701
+ def from_obj(obj); end
702
+
703
+ def inherited(s); end
704
+ end
705
+ end
706
+
707
+ # The strictness name as found in the Sorbet metrics file
708
+ Spoom::Coverage::Snapshot::STRICTNESSES = T.let(T.unsafe(nil), Array)
709
+
710
+ class Spoom::Coverage::SnapshotPrinter < ::Spoom::Printer
711
+ sig { params(snapshot: ::Spoom::Coverage::Snapshot).void }
712
+ def print_snapshot(snapshot); end
713
+
714
+ private
715
+
716
+ sig { params(value: T.nilable(::Integer), total: T.nilable(::Integer)).returns(::String) }
717
+ def percent(value, total); end
718
+
719
+ sig { params(hash: T::Hash[::String, ::Integer], total: ::Integer).void }
720
+ def print_map(hash, total); end
721
+ end
722
+
723
+ # @abstract It cannont be directly instantiated. Subclasses must implement the `abstract` methods below.
724
+ class Spoom::Coverage::Template
725
+ abstract!
726
+
727
+ # Create a new template from an Erb file path
728
+ sig { params(template: ::String).void }
729
+ def initialize(template:); end
730
+
731
+ sig { returns(::String) }
732
+ def erb; end
733
+
734
+ sig { returns(::Binding) }
735
+ def get_binding; end
736
+
737
+ sig { returns(::String) }
738
+ def html; end
739
+ end
740
+
741
+ class Spoom::Error < ::StandardError; end
742
+
743
+ class Spoom::ExecResult < ::T::Struct
744
+ const :err, ::String
745
+ const :exit_code, ::Integer
746
+ const :out, ::String
747
+ const :status, T::Boolean
748
+
749
+ class << self
750
+ def inherited(s); end
751
+ end
752
+ end
753
+
754
+ # Build a file hierarchy from a set of file paths.
755
+ class Spoom::FileTree
756
+ sig { params(paths: T::Enumerable[::String], strip_prefix: T.nilable(::String)).void }
757
+ def initialize(paths = T.unsafe(nil), strip_prefix: T.unsafe(nil)); end
758
+
759
+ # Add a `path` to the tree
760
+ #
761
+ # This will create all nodes until the root of `path`.
762
+ sig { params(path: ::String).returns(::Spoom::FileTree::Node) }
763
+ def add_path(path); end
764
+
765
+ # Add all `paths` to the tree
766
+ sig { params(paths: T::Enumerable[::String]).void }
767
+ def add_paths(paths); end
768
+
769
+ # All the nodes in this tree
770
+ sig { returns(T::Array[::Spoom::FileTree::Node]) }
771
+ def nodes; end
772
+
773
+ # All the paths in this tree
774
+ sig { returns(T::Array[::String]) }
775
+ def paths; end
776
+
777
+ sig do
778
+ params(
779
+ out: T.any(::IO, ::StringIO),
780
+ show_strictness: T::Boolean,
781
+ colors: T::Boolean,
782
+ indent_level: ::Integer
783
+ ).void
784
+ end
785
+ def print(out: T.unsafe(nil), show_strictness: T.unsafe(nil), colors: T.unsafe(nil), indent_level: T.unsafe(nil)); end
786
+
787
+ # All root nodes
788
+ sig { returns(T::Array[::Spoom::FileTree::Node]) }
789
+ def roots; end
790
+
791
+ sig { returns(T.nilable(::String)) }
792
+ def strip_prefix; end
793
+
794
+ private
795
+
796
+ sig do
797
+ params(
798
+ node: ::Spoom::FileTree::Node,
799
+ collected_nodes: T::Array[::Spoom::FileTree::Node]
800
+ ).returns(T::Array[::Spoom::FileTree::Node])
801
+ end
802
+ def collect_nodes(node, collected_nodes = T.unsafe(nil)); end
803
+ end
804
+
805
+ # A node representing either a file or a directory inside a FileTree
806
+ class Spoom::FileTree::Node < ::T::Struct
807
+ const :children, T::Hash[::String, ::Spoom::FileTree::Node], default: T.unsafe(nil)
808
+ const :name, ::String
809
+ const :parent, T.nilable(::Spoom::FileTree::Node)
810
+
811
+ # Full path to this node from root
812
+ sig { returns(::String) }
813
+ def path; end
814
+
815
+ class << self
816
+ def inherited(s); end
817
+ end
818
+ end
819
+
820
+ # An internal class used to print a FileTree
821
+ #
822
+ # See `FileTree#print`
823
+ class Spoom::FileTree::TreePrinter < ::Spoom::Printer
824
+ sig do
825
+ params(
826
+ tree: ::Spoom::FileTree,
827
+ out: T.any(::IO, ::StringIO),
828
+ show_strictness: T::Boolean,
829
+ colors: T::Boolean,
830
+ indent_level: ::Integer
831
+ ).void
832
+ end
833
+ def initialize(tree:, out: T.unsafe(nil), show_strictness: T.unsafe(nil), colors: T.unsafe(nil), indent_level: T.unsafe(nil)); end
834
+
835
+ sig { params(node: ::Spoom::FileTree::Node).void }
836
+ def print_node(node); end
837
+
838
+ sig { params(nodes: T::Array[::Spoom::FileTree::Node]).void }
839
+ def print_nodes(nodes); end
840
+
841
+ sig { void }
842
+ def print_tree; end
843
+
844
+ sig { returns(::Spoom::FileTree) }
845
+ def tree; end
846
+
847
+ private
848
+
849
+ sig { params(node: ::Spoom::FileTree::Node).returns(T.nilable(::String)) }
850
+ def node_strictness(node); end
851
+
852
+ sig { params(strictness: T.nilable(::String)).returns(::Spoom::Color) }
853
+ def strictness_color(strictness); end
854
+ end
855
+
856
+ # Execute git commands
857
+ module Spoom::Git
858
+ class << self
859
+ # Git commands
860
+ sig { params(arg: ::String, path: ::String).returns(::Spoom::ExecResult) }
861
+ def checkout(*arg, path: T.unsafe(nil)); end
862
+
863
+ # Get the commit Time for a `sha`
864
+ sig { params(sha: ::String, path: ::String).returns(T.nilable(::Time)) }
865
+ def commit_time(sha, path: T.unsafe(nil)); end
866
+
867
+ # Get the commit epoch timestamp for a `sha`
868
+ sig { params(sha: ::String, path: ::String).returns(T.nilable(::Integer)) }
869
+ def commit_timestamp(sha, path: T.unsafe(nil)); end
870
+
871
+ sig { params(path: ::String).returns(T.nilable(::String)) }
872
+ def current_branch(path: T.unsafe(nil)); end
873
+
874
+ sig { params(arg: ::String, path: ::String).returns(::Spoom::ExecResult) }
875
+ def diff(*arg, path: T.unsafe(nil)); end
876
+
877
+ # Translate a git epoch timestamp into a Time
878
+ sig { params(timestamp: ::String).returns(::Time) }
879
+ def epoch_to_time(timestamp); end
880
+
881
+ # Execute a `command`
882
+ sig { params(command: ::String, arg: ::String, path: ::String).returns(::Spoom::ExecResult) }
883
+ def exec(command, *arg, path: T.unsafe(nil)); end
884
+
885
+ # Get the last commit sha
886
+ sig { params(path: ::String).returns(T.nilable(::String)) }
887
+ def last_commit(path: T.unsafe(nil)); end
888
+
889
+ sig { params(arg: ::String, path: ::String).returns(::Spoom::ExecResult) }
890
+ def log(*arg, path: T.unsafe(nil)); end
891
+
892
+ sig { params(arg: ::String, path: ::String).returns(::Spoom::ExecResult) }
893
+ def rev_parse(*arg, path: T.unsafe(nil)); end
894
+
895
+ sig { params(arg: ::String, path: ::String).returns(::Spoom::ExecResult) }
896
+ def show(*arg, path: T.unsafe(nil)); end
897
+
898
+ # Get the hash of the commit introducing the `sorbet/config` file
899
+ sig { params(path: ::String).returns(T.nilable(::String)) }
900
+ def sorbet_intro_commit(path: T.unsafe(nil)); end
901
+
902
+ # Get the hash of the commit removing the `sorbet/config` file
903
+ sig { params(path: ::String).returns(T.nilable(::String)) }
904
+ def sorbet_removal_commit(path: T.unsafe(nil)); end
905
+
906
+ # Is there uncommited changes in `path`?
907
+ sig { params(path: ::String).returns(T::Boolean) }
908
+ def workdir_clean?(path: T.unsafe(nil)); end
909
+ end
910
+ end
911
+
912
+ module Spoom::LSP; end
913
+
914
+ class Spoom::LSP::Client
915
+ sig { params(sorbet_bin: ::String, sorbet_args: ::String, path: ::String).void }
916
+ def initialize(sorbet_bin, *sorbet_args, path: T.unsafe(nil)); end
917
+
918
+ sig { void }
919
+ def close; end
920
+
921
+ sig { params(uri: ::String, line: ::Integer, column: ::Integer).returns(T::Array[::Spoom::LSP::Location]) }
922
+ def definitions(uri, line, column); end
923
+
924
+ sig { params(uri: ::String).returns(T::Array[::Spoom::LSP::DocumentSymbol]) }
925
+ def document_symbols(uri); end
926
+
927
+ sig { params(uri: ::String, line: ::Integer, column: ::Integer).returns(T.nilable(::Spoom::LSP::Hover)) }
928
+ def hover(uri, line, column); end
929
+
930
+ sig { returns(::Integer) }
931
+ def next_id; end
932
+
933
+ # LSP requests
934
+ #
935
+ # @raise [Error::AlreadyOpen]
936
+ sig { params(workspace_path: ::String).void }
937
+ def open(workspace_path); end
938
+
939
+ sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) }
940
+ def read; end
941
+
942
+ # @raise [Error::BadHeaders]
943
+ sig { returns(T.nilable(::String)) }
944
+ def read_raw; end
945
+
946
+ sig do
947
+ params(
948
+ uri: ::String,
949
+ line: ::Integer,
950
+ column: ::Integer,
951
+ include_decl: T::Boolean
952
+ ).returns(T::Array[::Spoom::LSP::Location])
953
+ end
954
+ def references(uri, line, column, include_decl = T.unsafe(nil)); end
955
+
956
+ sig { params(message: ::Spoom::LSP::Message).returns(T.nilable(T::Hash[T.untyped, T.untyped])) }
957
+ def send(message); end
958
+
959
+ sig { params(json_string: ::String).void }
960
+ def send_raw(json_string); end
961
+
962
+ sig { params(uri: ::String, line: ::Integer, column: ::Integer).returns(T::Array[::Spoom::LSP::SignatureHelp]) }
963
+ def signatures(uri, line, column); end
964
+
965
+ sig { params(query: ::String).returns(T::Array[::Spoom::LSP::DocumentSymbol]) }
966
+ def symbols(query); end
967
+
968
+ sig { params(uri: ::String, line: ::Integer, column: ::Integer).returns(T::Array[::Spoom::LSP::Location]) }
969
+ def type_definitions(uri, line, column); end
970
+ end
971
+
972
+ class Spoom::LSP::Diagnostic < ::T::Struct
973
+ include ::Spoom::LSP::PrintableSymbol
974
+
975
+ const :code, ::Integer
976
+ const :informations, ::Object
977
+ const :message, ::String
978
+ const :range, ::Spoom::LSP::Range
979
+
980
+ sig { override.params(printer: ::Spoom::LSP::SymbolPrinter).void }
981
+ def accept_printer(printer); end
982
+
983
+ sig { returns(::String) }
984
+ def to_s; end
985
+
986
+ class << self
987
+ sig { params(json: T::Hash[T.untyped, T.untyped]).returns(::Spoom::LSP::Diagnostic) }
988
+ def from_json(json); end
989
+
990
+ def inherited(s); end
991
+ end
992
+ end
993
+
994
+ class Spoom::LSP::DocumentSymbol < ::T::Struct
995
+ include ::Spoom::LSP::PrintableSymbol
996
+
997
+ const :children, T::Array[::Spoom::LSP::DocumentSymbol]
998
+ const :detail, T.nilable(::String)
999
+ const :kind, ::Integer
1000
+ const :location, T.nilable(::Spoom::LSP::Location)
1001
+ const :name, ::String
1002
+ const :range, T.nilable(::Spoom::LSP::Range)
1003
+
1004
+ sig { override.params(printer: ::Spoom::LSP::SymbolPrinter).void }
1005
+ def accept_printer(printer); end
1006
+
1007
+ sig { returns(::String) }
1008
+ def kind_string; end
1009
+
1010
+ sig { returns(::String) }
1011
+ def to_s; end
1012
+
1013
+ class << self
1014
+ sig { params(json: T::Hash[T.untyped, T.untyped]).returns(::Spoom::LSP::DocumentSymbol) }
1015
+ def from_json(json); end
1016
+
1017
+ def inherited(s); end
1018
+ end
1019
+ end
1020
+
1021
+ Spoom::LSP::DocumentSymbol::SYMBOL_KINDS = T.let(T.unsafe(nil), Hash)
1022
+ class Spoom::LSP::Error < ::StandardError; end
1023
+ class Spoom::LSP::Error::AlreadyOpen < ::Spoom::LSP::Error; end
1024
+ class Spoom::LSP::Error::BadHeaders < ::Spoom::LSP::Error; end
1025
+
1026
+ class Spoom::LSP::Error::Diagnostics < ::Spoom::LSP::Error
1027
+ sig { params(uri: ::String, diagnostics: T::Array[::Spoom::LSP::Diagnostic]).void }
1028
+ def initialize(uri, diagnostics); end
1029
+
1030
+ sig { returns(T::Array[::Spoom::LSP::Diagnostic]) }
1031
+ def diagnostics; end
1032
+
1033
+ sig { returns(::String) }
1034
+ def uri; end
1035
+
1036
+ class << self
1037
+ sig { params(json: T::Hash[T.untyped, T.untyped]).returns(::Spoom::LSP::Error::Diagnostics) }
1038
+ def from_json(json); end
1039
+ end
1040
+ end
1041
+
1042
+ class Spoom::LSP::Hover < ::T::Struct
1043
+ include ::Spoom::LSP::PrintableSymbol
1044
+
1045
+ const :contents, ::String
1046
+ const :range, T.nilable(T::Range[T.untyped])
1047
+
1048
+ sig { override.params(printer: ::Spoom::LSP::SymbolPrinter).void }
1049
+ def accept_printer(printer); end
1050
+
1051
+ sig { returns(::String) }
1052
+ def to_s; end
1053
+
1054
+ class << self
1055
+ sig { params(json: T::Hash[T.untyped, T.untyped]).returns(::Spoom::LSP::Hover) }
1056
+ def from_json(json); end
1057
+
1058
+ def inherited(s); end
1059
+ end
1060
+ end
1061
+
1062
+ class Spoom::LSP::Location < ::T::Struct
1063
+ include ::Spoom::LSP::PrintableSymbol
1064
+
1065
+ const :range, ::Spoom::LSP::Range
1066
+ const :uri, ::String
1067
+
1068
+ sig { override.params(printer: ::Spoom::LSP::SymbolPrinter).void }
1069
+ def accept_printer(printer); end
1070
+
1071
+ sig { returns(::String) }
1072
+ def to_s; end
1073
+
1074
+ class << self
1075
+ sig { params(json: T::Hash[T.untyped, T.untyped]).returns(::Spoom::LSP::Location) }
1076
+ def from_json(json); end
1077
+
1078
+ def inherited(s); end
1079
+ end
1080
+ end
1081
+
1082
+ # A general message as defined by JSON-RPC.
1083
+ #
1084
+ # The language server protocol always uses `"2.0"` as the `jsonrpc` version.
1085
+ class Spoom::LSP::Message
1086
+ sig { void }
1087
+ def initialize; end
1088
+
1089
+ sig { returns(T::Hash[T.untyped, T.untyped]) }
1090
+ def as_json; end
1091
+
1092
+ sig { returns(::String) }
1093
+ def jsonrpc; end
1094
+
1095
+ sig { params(args: T.untyped).returns(::String) }
1096
+ def to_json(*args); end
1097
+ end
1098
+
1099
+ # A notification message.
1100
+ #
1101
+ # A processed notification message must not send a response back. They work like events.
1102
+ class Spoom::LSP::Notification < ::Spoom::LSP::Message
1103
+ sig { params(method: ::String, params: T::Hash[T.untyped, T.untyped]).void }
1104
+ def initialize(method, params); end
1105
+
1106
+ sig { returns(::String) }
1107
+ def method; end
1108
+
1109
+ sig { returns(T::Hash[T.untyped, T.untyped]) }
1110
+ def params; end
1111
+ end
1112
+
1113
+ class Spoom::LSP::Position < ::T::Struct
1114
+ include ::Spoom::LSP::PrintableSymbol
1115
+
1116
+ const :char, ::Integer
1117
+ const :line, ::Integer
1118
+
1119
+ sig { override.params(printer: ::Spoom::LSP::SymbolPrinter).void }
1120
+ def accept_printer(printer); end
1121
+
1122
+ sig { returns(::String) }
1123
+ def to_s; end
1124
+
1125
+ class << self
1126
+ sig { params(json: T::Hash[T.untyped, T.untyped]).returns(::Spoom::LSP::Position) }
1127
+ def from_json(json); end
1128
+
1129
+ def inherited(s); end
1130
+ end
1131
+ end
1132
+
1133
+ # @abstract Subclasses must implement the `abstract` methods below.
1134
+ module Spoom::LSP::PrintableSymbol
1135
+ interface!
1136
+
1137
+ # @abstract
1138
+ sig { abstract.params(printer: ::Spoom::LSP::SymbolPrinter).void }
1139
+ def accept_printer(printer); end
1140
+ end
1141
+
1142
+ class Spoom::LSP::Range < ::T::Struct
1143
+ include ::Spoom::LSP::PrintableSymbol
1144
+
1145
+ const :end, ::Spoom::LSP::Position
1146
+ const :start, ::Spoom::LSP::Position
1147
+
1148
+ sig { override.params(printer: ::Spoom::LSP::SymbolPrinter).void }
1149
+ def accept_printer(printer); end
1150
+
1151
+ sig { returns(::String) }
1152
+ def to_s; end
1153
+
1154
+ class << self
1155
+ sig { params(json: T::Hash[T.untyped, T.untyped]).returns(::Spoom::LSP::Range) }
1156
+ def from_json(json); end
1157
+
1158
+ def inherited(s); end
1159
+ end
1160
+ end
1161
+
1162
+ # A request message to describe a request between the client and the server.
1163
+ #
1164
+ # Every processed request must send a response back to the sender of the request.
1165
+ class Spoom::LSP::Request < ::Spoom::LSP::Message
1166
+ sig { params(id: ::Integer, method: ::String, params: T::Hash[T.untyped, T.untyped]).void }
1167
+ def initialize(id, method, params); end
1168
+
1169
+ sig { returns(::Integer) }
1170
+ def id; end
1171
+
1172
+ sig { returns(::String) }
1173
+ def method; end
1174
+
1175
+ sig { returns(T::Hash[T.untyped, T.untyped]) }
1176
+ def params; end
1177
+ end
1178
+
1179
+ class Spoom::LSP::ResponseError < ::Spoom::LSP::Error
1180
+ sig { params(code: ::Integer, message: ::String, data: T::Hash[T.untyped, T.untyped]).void }
1181
+ def initialize(code, message, data); end
1182
+
1183
+ sig { returns(::Integer) }
1184
+ def code; end
1185
+
1186
+ sig { returns(T::Hash[T.untyped, T.untyped]) }
1187
+ def data; end
1188
+
1189
+ sig { returns(::String) }
1190
+ def message; end
1191
+
1192
+ class << self
1193
+ sig { params(json: T::Hash[T.untyped, T.untyped]).returns(::Spoom::LSP::ResponseError) }
1194
+ def from_json(json); end
1195
+ end
1196
+ end
1197
+
1198
+ class Spoom::LSP::SignatureHelp < ::T::Struct
1199
+ include ::Spoom::LSP::PrintableSymbol
1200
+
1201
+ const :doc, ::Object
1202
+ const :label, T.nilable(::String)
1203
+ const :params, T::Array[T.untyped]
1204
+
1205
+ sig { override.params(printer: ::Spoom::LSP::SymbolPrinter).void }
1206
+ def accept_printer(printer); end
1207
+
1208
+ sig { returns(::String) }
1209
+ def to_s; end
1210
+
1211
+ class << self
1212
+ sig { params(json: T::Hash[T.untyped, T.untyped]).returns(::Spoom::LSP::SignatureHelp) }
1213
+ def from_json(json); end
1214
+
1215
+ def inherited(s); end
1216
+ end
1217
+ end
1218
+
1219
+ class Spoom::LSP::SymbolPrinter < ::Spoom::Printer
1220
+ sig do
1221
+ params(
1222
+ out: T.any(::IO, ::StringIO),
1223
+ colors: T::Boolean,
1224
+ indent_level: ::Integer,
1225
+ prefix: T.nilable(::String)
1226
+ ).void
1227
+ end
1228
+ def initialize(out: T.unsafe(nil), colors: T.unsafe(nil), indent_level: T.unsafe(nil), prefix: T.unsafe(nil)); end
1229
+
1230
+ sig { params(uri: ::String).returns(::String) }
1231
+ def clean_uri(uri); end
1232
+
1233
+ sig { returns(T.nilable(::String)) }
1234
+ def prefix; end
1235
+
1236
+ # @return [String, nil]
1237
+ def prefix=(_arg0); end
1238
+
1239
+ sig { params(objects: T::Array[::Spoom::LSP::PrintableSymbol]).void }
1240
+ def print_list(objects); end
1241
+
1242
+ sig { params(object: T.nilable(::Spoom::LSP::PrintableSymbol)).void }
1243
+ def print_object(object); end
1244
+
1245
+ sig { params(objects: T::Array[::Spoom::LSP::PrintableSymbol]).void }
1246
+ def print_objects(objects); end
1247
+
1248
+ sig { returns(T::Set[::Integer]) }
1249
+ def seen; end
1250
+
1251
+ # @return [Set<Integer>]
1252
+ def seen=(_arg0); end
1253
+ end
1254
+
1255
+ # @abstract It cannont be directly instantiated. Subclasses must implement the `abstract` methods below.
1256
+ class Spoom::Printer
1257
+ include ::Spoom::Colorize
1258
+
1259
+ abstract!
1260
+
1261
+ sig { params(out: T.any(::IO, ::StringIO), colors: T::Boolean, indent_level: ::Integer).void }
1262
+ def initialize(out: T.unsafe(nil), colors: T.unsafe(nil), indent_level: T.unsafe(nil)); end
1263
+
1264
+ # Colorize `string` with color if `@colors`
1265
+ sig { params(string: ::String, color: ::Spoom::Color).returns(::String) }
1266
+ def colorize(string, *color); end
1267
+
1268
+ # Decrease indent level
1269
+ sig { void }
1270
+ def dedent; end
1271
+
1272
+ # Increase indent level
1273
+ sig { void }
1274
+ def indent; end
1275
+
1276
+ sig { returns(T.any(::IO, ::StringIO)) }
1277
+ def out; end
1278
+
1279
+ # @return [IO, StringIO]
1280
+ def out=(_arg0); end
1281
+
1282
+ # Print `string` into `out`
1283
+ sig { params(string: T.nilable(::String)).void }
1284
+ def print(string); end
1285
+
1286
+ # Print `string` colored with `color` into `out`
1287
+ #
1288
+ # Does not use colors unless `@colors`.
1289
+ sig { params(string: T.nilable(::String), color: ::Spoom::Color).void }
1290
+ def print_colored(string, *color); end
1291
+
1292
+ # Print `string` with indent and newline
1293
+ sig { params(string: T.nilable(::String)).void }
1294
+ def printl(string); end
1295
+
1296
+ # Print a new line into `out`
1297
+ sig { void }
1298
+ def printn; end
1299
+
1300
+ # Print an indent space into `out`
1301
+ sig { void }
1302
+ def printt; end
1303
+ end
1304
+
1305
+ Spoom::SPOOM_PATH = T.let(T.unsafe(nil), String)
1306
+
1307
+ module Spoom::Sorbet
1308
+ class << self
1309
+ sig do
1310
+ params(
1311
+ arg: ::String,
1312
+ path: ::String,
1313
+ capture_err: T::Boolean,
1314
+ sorbet_bin: T.nilable(::String)
1315
+ ).returns(::Spoom::ExecResult)
1316
+ end
1317
+ def srb(*arg, path: T.unsafe(nil), capture_err: T.unsafe(nil), sorbet_bin: T.unsafe(nil)); end
1318
+
1319
+ # List all files typechecked by Sorbet from its `config`
1320
+ sig { params(config: ::Spoom::Sorbet::Config, path: ::String).returns(T::Array[::String]) }
1321
+ def srb_files(config, path: T.unsafe(nil)); end
1322
+
1323
+ sig do
1324
+ params(
1325
+ arg: ::String,
1326
+ path: ::String,
1327
+ capture_err: T::Boolean,
1328
+ sorbet_bin: T.nilable(::String)
1329
+ ).returns(T.nilable(T::Hash[::String, ::Integer]))
1330
+ end
1331
+ def srb_metrics(*arg, path: T.unsafe(nil), capture_err: T.unsafe(nil), sorbet_bin: T.unsafe(nil)); end
1332
+
1333
+ sig do
1334
+ params(
1335
+ arg: ::String,
1336
+ path: ::String,
1337
+ capture_err: T::Boolean,
1338
+ sorbet_bin: T.nilable(::String)
1339
+ ).returns(::Spoom::ExecResult)
1340
+ end
1341
+ def srb_tc(*arg, path: T.unsafe(nil), capture_err: T.unsafe(nil), sorbet_bin: T.unsafe(nil)); end
1342
+
1343
+ sig do
1344
+ params(
1345
+ arg: ::String,
1346
+ path: ::String,
1347
+ capture_err: T::Boolean,
1348
+ sorbet_bin: T.nilable(::String)
1349
+ ).returns(T.nilable(::String))
1350
+ end
1351
+ def srb_version(*arg, path: T.unsafe(nil), capture_err: T.unsafe(nil), sorbet_bin: T.unsafe(nil)); end
1352
+
1353
+ # Get `gem` version from the `Gemfile.lock` content
1354
+ #
1355
+ # Returns `nil` if `gem` cannot be found in the Gemfile.
1356
+ sig { params(gem: ::String, path: ::String).returns(T.nilable(::String)) }
1357
+ def version_from_gemfile_lock(gem: T.unsafe(nil), path: T.unsafe(nil)); end
1358
+ end
1359
+ end
1360
+
1361
+ Spoom::Sorbet::BIN_PATH = T.let(T.unsafe(nil), String)
1362
+ Spoom::Sorbet::CONFIG_PATH = T.let(T.unsafe(nil), String)
1363
+
1364
+ # Parse Sorbet config files
1365
+ #
1366
+ # Parses a Sorbet config file:
1367
+ #
1368
+ # ```ruby
1369
+ # config = Spoom::Sorbet::Config.parse_file("sorbet/config")
1370
+ # puts config.paths # "."
1371
+ # ```
1372
+ #
1373
+ # Parses a Sorbet config string:
1374
+ #
1375
+ # ```ruby
1376
+ # config = Spoom::Sorbet::Config.parse_string(<<~CONFIG)
1377
+ # a
1378
+ # --file=b
1379
+ # --ignore=c
1380
+ # CONFIG
1381
+ # puts config.paths # "a", "b"
1382
+ # puts config.ignore # "c"
1383
+ # ```
1384
+ class Spoom::Sorbet::Config
1385
+ sig { void }
1386
+ def initialize; end
1387
+
1388
+ # @return [Array<String>]
1389
+ def allowed_extensions; end
1390
+
1391
+ sig { returns(::Spoom::Sorbet::Config) }
1392
+ def copy; end
1393
+
1394
+ # @return [Array<String>]
1395
+ def ignore; end
1396
+
1397
+ sig { returns(T::Boolean) }
1398
+ def no_stdlib; end
1399
+
1400
+ # @return [Boolean]
1401
+ def no_stdlib=(_arg0); end
1402
+
1403
+ # Returns self as a string of options that can be passed to Sorbet
1404
+ #
1405
+ # Example:
1406
+ # ~~~rb
1407
+ # config = Sorbet::Config.new
1408
+ # config.paths << "/foo"
1409
+ # config.paths << "/bar"
1410
+ # config.ignore << "/baz"
1411
+ # config.allowed_extensions << ".rb"
1412
+ #
1413
+ # puts config.options_string # "/foo /bar --ignore /baz --allowed-extension .rb"
1414
+ # ~~~
1415
+ sig { returns(::String) }
1416
+ def options_string; end
1417
+
1418
+ sig { returns(T::Array[::String]) }
1419
+ def paths; end
1420
+
1421
+ class << self
1422
+ sig { params(sorbet_config_path: ::String).returns(::Spoom::Sorbet::Config) }
1423
+ def parse_file(sorbet_config_path); end
1424
+
1425
+ sig { params(sorbet_config: ::String).returns(::Spoom::Sorbet::Config) }
1426
+ def parse_string(sorbet_config); end
1427
+
1428
+ private
1429
+
1430
+ sig { params(line: ::String).returns(::String) }
1431
+ def parse_option(line); end
1432
+ end
1433
+ end
1434
+
1435
+ module Spoom::Sorbet::Errors
1436
+ class << self
1437
+ sig { params(errors: T::Array[::Spoom::Sorbet::Errors::Error]).returns(T::Array[::Spoom::Sorbet::Errors::Error]) }
1438
+ def sort_errors_by_code(errors); end
1439
+ end
1440
+ end
1441
+
1442
+ Spoom::Sorbet::Errors::DEFAULT_ERROR_URL_BASE = T.let(T.unsafe(nil), String)
1443
+
1444
+ class Spoom::Sorbet::Errors::Error
1445
+ include ::Comparable
1446
+
1447
+ sig do
1448
+ params(
1449
+ file: T.nilable(::String),
1450
+ line: T.nilable(::Integer),
1451
+ message: T.nilable(::String),
1452
+ code: T.nilable(::Integer),
1453
+ more: T::Array[::String]
1454
+ ).void
1455
+ end
1456
+ def initialize(file, line, message, code, more = T.unsafe(nil)); end
1457
+
1458
+ # By default errors are sorted by location
1459
+ sig { params(other: T.untyped).returns(::Integer) }
1460
+ def <=>(other); end
1461
+
1462
+ # @return [Integer, nil]
1463
+ def code; end
1464
+
1465
+ sig { returns(T.nilable(::String)) }
1466
+ def file; end
1467
+
1468
+ sig { returns(T.nilable(::Integer)) }
1469
+ def line; end
1470
+
1471
+ # @return [String, nil]
1472
+ def message; end
1473
+
1474
+ sig { returns(T::Array[::String]) }
1475
+ def more; end
1476
+
1477
+ sig { returns(::String) }
1478
+ def to_s; end
1479
+ end
1480
+
1481
+ # Parse errors from Sorbet output
1482
+ class Spoom::Sorbet::Errors::Parser
1483
+ sig { params(error_url_base: ::String).void }
1484
+ def initialize(error_url_base: T.unsafe(nil)); end
1485
+
1486
+ sig { params(output: ::String).returns(T::Array[::Spoom::Sorbet::Errors::Error]) }
1487
+ def parse(output); end
1488
+
1489
+ private
1490
+
1491
+ sig { params(line: ::String).void }
1492
+ def append_error(line); end
1493
+
1494
+ sig { void }
1495
+ def close_error; end
1496
+
1497
+ sig { params(error_url_base: ::String).returns(::Regexp) }
1498
+ def error_line_match_regexp(error_url_base); end
1499
+
1500
+ sig { params(line: ::String).returns(T.nilable(::Spoom::Sorbet::Errors::Error)) }
1501
+ def match_error_line(line); end
1502
+
1503
+ sig { params(error: ::Spoom::Sorbet::Errors::Error).void }
1504
+ def open_error(error); end
1505
+
1506
+ class << self
1507
+ sig { params(output: ::String, error_url_base: ::String).returns(T::Array[::Spoom::Sorbet::Errors::Error]) }
1508
+ def parse_string(output, error_url_base: T.unsafe(nil)); end
1509
+ end
1510
+ end
1511
+
1512
+ Spoom::Sorbet::Errors::Parser::HEADER = T.let(T.unsafe(nil), Array)
1513
+ Spoom::Sorbet::GEM_PATH = T.let(T.unsafe(nil), String)
1514
+
1515
+ module Spoom::Sorbet::MetricsParser
1516
+ class << self
1517
+ sig { params(path: ::String, prefix: ::String).returns(T::Hash[::String, ::Integer]) }
1518
+ def parse_file(path, prefix = T.unsafe(nil)); end
1519
+
1520
+ sig { params(obj: T::Hash[::String, T.untyped], prefix: ::String).returns(T::Hash[::String, ::Integer]) }
1521
+ def parse_hash(obj, prefix = T.unsafe(nil)); end
1522
+
1523
+ sig { params(string: ::String, prefix: ::String).returns(T::Hash[::String, ::Integer]) }
1524
+ def parse_string(string, prefix = T.unsafe(nil)); end
1525
+ end
1526
+ end
1527
+
1528
+ Spoom::Sorbet::MetricsParser::DEFAULT_PREFIX = T.let(T.unsafe(nil), String)
1529
+ Spoom::Sorbet::SEGFAULT_CODE = T.let(T.unsafe(nil), Integer)
1530
+
1531
+ module Spoom::Sorbet::Sigils
1532
+ class << self
1533
+ # changes the sigil in the file at the passed path to the specified new strictness
1534
+ sig { params(path: T.any(::Pathname, ::String), new_strictness: ::String).returns(T::Boolean) }
1535
+ def change_sigil_in_file(path, new_strictness); end
1536
+
1537
+ # changes the sigil to have a new strictness in a list of files
1538
+ sig { params(path_list: T::Array[::String], new_strictness: ::String).returns(T::Array[::String]) }
1539
+ def change_sigil_in_files(path_list, new_strictness); end
1540
+
1541
+ # returns a string containing the strictness of a sigil in a file at the passed path
1542
+ # * returns nil if no sigil
1543
+ sig { params(path: T.any(::Pathname, ::String)).returns(T.nilable(::String)) }
1544
+ def file_strictness(path); end
1545
+
1546
+ # finds all files in the specified directory with the passed strictness
1547
+ sig do
1548
+ params(
1549
+ directory: T.any(::Pathname, ::String),
1550
+ strictness: ::String,
1551
+ extension: ::String
1552
+ ).returns(T::Array[::String])
1553
+ end
1554
+ def files_with_sigil_strictness(directory, strictness, extension: T.unsafe(nil)); end
1555
+
1556
+ # returns the full sigil comment string for the passed strictness
1557
+ sig { params(strictness: ::String).returns(::String) }
1558
+ def sigil_string(strictness); end
1559
+
1560
+ # returns the strictness of a sigil in the passed file content string (nil if no sigil)
1561
+ sig { params(content: ::String).returns(T.nilable(::String)) }
1562
+ def strictness_in_content(content); end
1563
+
1564
+ # returns a string which is the passed content but with the sigil updated to a new strictness
1565
+ sig { params(content: ::String, new_strictness: ::String).returns(::String) }
1566
+ def update_sigil(content, new_strictness); end
1567
+
1568
+ # returns true if the passed string is a valid strictness (else false)
1569
+ sig { params(strictness: ::String).returns(T::Boolean) }
1570
+ def valid_strictness?(strictness); end
1571
+ end
1572
+ end
1573
+
1574
+ Spoom::Sorbet::Sigils::SIGIL_REGEXP = T.let(T.unsafe(nil), Regexp)
1575
+ Spoom::Sorbet::Sigils::STRICTNESS_FALSE = T.let(T.unsafe(nil), String)
1576
+ Spoom::Sorbet::Sigils::STRICTNESS_IGNORE = T.let(T.unsafe(nil), String)
1577
+ Spoom::Sorbet::Sigils::STRICTNESS_INTERNAL = T.let(T.unsafe(nil), String)
1578
+ Spoom::Sorbet::Sigils::STRICTNESS_STRICT = T.let(T.unsafe(nil), String)
1579
+ Spoom::Sorbet::Sigils::STRICTNESS_STRONG = T.let(T.unsafe(nil), String)
1580
+ Spoom::Sorbet::Sigils::STRICTNESS_TRUE = T.let(T.unsafe(nil), String)
1581
+ Spoom::Sorbet::Sigils::VALID_STRICTNESS = T.let(T.unsafe(nil), Array)
1582
+
1583
+ class Spoom::Timeline
1584
+ sig { params(from: ::Time, to: ::Time, path: ::String).void }
1585
+ def initialize(from, to, path: T.unsafe(nil)); end
1586
+
1587
+ # Return one commit for each date in `dates`
1588
+ sig { params(dates: T::Array[::Time]).returns(T::Array[::String]) }
1589
+ def commits_for_dates(dates); end
1590
+
1591
+ # Return all months between `from` and `to`
1592
+ sig { returns(T::Array[::Time]) }
1593
+ def months; end
1594
+
1595
+ # Return one commit for each month between `from` and `to`
1596
+ sig { returns(T::Array[::String]) }
1597
+ def ticks; end
1598
+ end
1599
+
1600
+ Spoom::VERSION = T.let(T.unsafe(nil), String)