spoom 1.5.4 → 1.6.0

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 (74) hide show
  1. checksums.yaml +4 -4
  2. data/lib/spoom/backtrace_filter/minitest.rb +2 -3
  3. data/lib/spoom/cli/deadcode.rb +1 -2
  4. data/lib/spoom/cli/helper.rb +36 -28
  5. data/lib/spoom/cli/srb/assertions.rb +48 -0
  6. data/lib/spoom/cli/srb/bump.rb +1 -2
  7. data/lib/spoom/cli/srb/sigs.rb +133 -18
  8. data/lib/spoom/cli/srb.rb +8 -4
  9. data/lib/spoom/cli.rb +1 -2
  10. data/lib/spoom/colors.rb +2 -6
  11. data/lib/spoom/context/bundle.rb +8 -9
  12. data/lib/spoom/context/exec.rb +2 -5
  13. data/lib/spoom/context/file_system.rb +12 -19
  14. data/lib/spoom/context/git.rb +14 -19
  15. data/lib/spoom/context/sorbet.rb +13 -26
  16. data/lib/spoom/context.rb +3 -7
  17. data/lib/spoom/coverage/d3/base.rb +6 -8
  18. data/lib/spoom/coverage/d3/circle_map.rb +6 -16
  19. data/lib/spoom/coverage/d3/pie.rb +14 -19
  20. data/lib/spoom/coverage/d3/timeline.rb +46 -47
  21. data/lib/spoom/coverage/d3.rb +2 -4
  22. data/lib/spoom/coverage/report.rb +38 -76
  23. data/lib/spoom/coverage/snapshot.rb +7 -13
  24. data/lib/spoom/coverage.rb +3 -5
  25. data/lib/spoom/deadcode/definition.rb +12 -14
  26. data/lib/spoom/deadcode/erb.rb +10 -8
  27. data/lib/spoom/deadcode/index.rb +19 -23
  28. data/lib/spoom/deadcode/indexer.rb +5 -6
  29. data/lib/spoom/deadcode/plugins/action_mailer.rb +2 -3
  30. data/lib/spoom/deadcode/plugins/action_mailer_preview.rb +2 -3
  31. data/lib/spoom/deadcode/plugins/actionpack.rb +4 -4
  32. data/lib/spoom/deadcode/plugins/active_model.rb +2 -3
  33. data/lib/spoom/deadcode/plugins/active_record.rb +2 -3
  34. data/lib/spoom/deadcode/plugins/active_support.rb +2 -1
  35. data/lib/spoom/deadcode/plugins/base.rb +29 -32
  36. data/lib/spoom/deadcode/plugins/graphql.rb +2 -3
  37. data/lib/spoom/deadcode/plugins/minitest.rb +4 -4
  38. data/lib/spoom/deadcode/plugins/namespaces.rb +5 -5
  39. data/lib/spoom/deadcode/plugins/rails.rb +5 -5
  40. data/lib/spoom/deadcode/plugins/rubocop.rb +4 -4
  41. data/lib/spoom/deadcode/plugins/ruby.rb +3 -4
  42. data/lib/spoom/deadcode/plugins/sorbet.rb +12 -6
  43. data/lib/spoom/deadcode/plugins/thor.rb +2 -3
  44. data/lib/spoom/deadcode/plugins.rb +2 -4
  45. data/lib/spoom/deadcode/remover.rb +37 -59
  46. data/lib/spoom/deadcode/send.rb +2 -8
  47. data/lib/spoom/file_collector.rb +10 -18
  48. data/lib/spoom/file_tree.rb +31 -46
  49. data/lib/spoom/location.rb +9 -20
  50. data/lib/spoom/model/builder.rb +60 -15
  51. data/lib/spoom/model/model.rb +65 -68
  52. data/lib/spoom/model/namespace_visitor.rb +3 -2
  53. data/lib/spoom/model/reference.rb +4 -8
  54. data/lib/spoom/model/references_visitor.rb +49 -29
  55. data/lib/spoom/parse.rb +17 -3
  56. data/lib/spoom/poset.rb +17 -19
  57. data/lib/spoom/printer.rb +10 -13
  58. data/lib/spoom/sorbet/assertions.rb +278 -0
  59. data/lib/spoom/sorbet/config.rb +8 -12
  60. data/lib/spoom/sorbet/errors.rb +16 -31
  61. data/lib/spoom/sorbet/lsp/base.rb +9 -15
  62. data/lib/spoom/sorbet/lsp/errors.rb +8 -16
  63. data/lib/spoom/sorbet/lsp/structures.rb +36 -59
  64. data/lib/spoom/sorbet/lsp.rb +15 -17
  65. data/lib/spoom/sorbet/metrics.rb +3 -5
  66. data/lib/spoom/sorbet/sigils.rb +7 -11
  67. data/lib/spoom/sorbet/sigs.rb +118 -25
  68. data/lib/spoom/sorbet.rb +3 -9
  69. data/lib/spoom/timeline.rb +4 -6
  70. data/lib/spoom/version.rb +1 -1
  71. data/lib/spoom/visitor.rb +298 -151
  72. data/lib/spoom.rb +0 -2
  73. data/rbi/spoom.rbi +3963 -0
  74. metadata +6 -3
@@ -7,17 +7,13 @@ module Spoom
7
7
  DEFAULT_ERROR_URL_BASE = "https://srb.help/"
8
8
 
9
9
  class << self
10
- extend T::Sig
11
-
12
- sig { params(errors: T::Array[Error]).returns(T::Array[Error]) }
10
+ #: (Array[Error] errors) -> Array[Error]
13
11
  def sort_errors_by_code(errors)
14
12
  errors.sort_by { |e| [e.code, e.file, e.line, e.message] }
15
13
  end
16
14
  end
17
15
  # Parse errors from Sorbet output
18
16
  class Parser
19
- extend T::Sig
20
-
21
17
  class ParseError < Spoom::Error; end
22
18
 
23
19
  HEADER = T.let(
@@ -32,23 +28,21 @@ module Spoom
32
28
  )
33
29
 
34
30
  class << self
35
- extend T::Sig
36
-
37
- sig { params(output: String, error_url_base: String).returns(T::Array[Error]) }
31
+ #: (String output, ?error_url_base: String) -> Array[Error]
38
32
  def parse_string(output, error_url_base: DEFAULT_ERROR_URL_BASE)
39
33
  parser = Spoom::Sorbet::Errors::Parser.new(error_url_base: error_url_base)
40
34
  parser.parse(output)
41
35
  end
42
36
  end
43
37
 
44
- sig { params(error_url_base: String).void }
38
+ #: (?error_url_base: String) -> void
45
39
  def initialize(error_url_base: DEFAULT_ERROR_URL_BASE)
46
40
  @errors = T.let([], T::Array[Error])
47
41
  @error_line_match_regex = T.let(error_line_match_regexp(error_url_base), Regexp)
48
42
  @current_error = T.let(nil, T.nilable(Error))
49
43
  end
50
44
 
51
- sig { params(output: String).returns(T::Array[Error]) }
45
+ #: (String output) -> Array[Error]
52
46
  def parse(output)
53
47
  output.each_line do |line|
54
48
  break if /^No errors! Great job\./.match?(line)
@@ -71,7 +65,7 @@ module Spoom
71
65
 
72
66
  private
73
67
 
74
- sig { params(error_url_base: String).returns(Regexp) }
68
+ #: (String error_url_base) -> Regexp
75
69
  def error_line_match_regexp(error_url_base)
76
70
  url = Regexp.escape(error_url_base)
77
71
  %r{
@@ -88,7 +82,7 @@ module Spoom
88
82
  }x
89
83
  end
90
84
 
91
- sig { params(line: String).returns(T.nilable(Error)) }
85
+ #: (String line) -> Error?
92
86
  def match_error_line(line)
93
87
  match = line.match(@error_line_match_regex)
94
88
  return unless match
@@ -97,14 +91,14 @@ module Spoom
97
91
  Error.new(file, line&.to_i, message, code&.to_i)
98
92
  end
99
93
 
100
- sig { params(error: Error).void }
94
+ #: (Error error) -> void
101
95
  def open_error(error)
102
96
  raise ParseError, "Error: Already parsing an error!" if @current_error
103
97
 
104
98
  @current_error = error
105
99
  end
106
100
 
107
- sig { void }
101
+ #: -> void
108
102
  def close_error
109
103
  raise ParseError, "Error: Not already parsing an error!" unless @current_error
110
104
 
@@ -112,7 +106,7 @@ module Spoom
112
106
  @current_error = nil
113
107
  end
114
108
 
115
- sig { params(line: String).void }
109
+ #: (String line) -> void
116
110
  def append_error(line)
117
111
  raise ParseError, "Error: Not already parsing an error!" unless @current_error
118
112
 
@@ -126,30 +120,21 @@ module Spoom
126
120
 
127
121
  class Error
128
122
  include Comparable
129
- extend T::Sig
130
123
 
131
- sig { returns(T.nilable(String)) }
124
+ #: String?
132
125
  attr_reader :file, :message
133
126
 
134
- sig { returns(T.nilable(Integer)) }
127
+ #: Integer?
135
128
  attr_reader :line, :code
136
129
 
137
- sig { returns(T::Array[String]) }
130
+ #: Array[String]
138
131
  attr_reader :more
139
132
 
140
133
  # Other files associated with the error
141
- sig { returns(T::Set[String]) }
134
+ #: Set[String]
142
135
  attr_reader :files_from_error_sections
143
136
 
144
- sig do
145
- params(
146
- file: T.nilable(String),
147
- line: T.nilable(Integer),
148
- message: T.nilable(String),
149
- code: T.nilable(Integer),
150
- more: T::Array[String],
151
- ).void
152
- end
137
+ #: (String? file, Integer? line, String? message, Integer? code, ?Array[String] more) -> void
153
138
  def initialize(file, line, message, code, more = [])
154
139
  @file = file
155
140
  @line = line
@@ -160,14 +145,14 @@ module Spoom
160
145
  end
161
146
 
162
147
  # By default errors are sorted by location
163
- sig { params(other: T.untyped).returns(Integer) }
148
+ #: (untyped other) -> Integer
164
149
  def <=>(other)
165
150
  return 0 unless other.is_a?(Error)
166
151
 
167
152
  [file, line, code, message] <=> [other.file, other.line, other.code, other.message]
168
153
  end
169
154
 
170
- sig { returns(String) }
155
+ #: -> String
171
156
  def to_s
172
157
  "#{file}:#{line}: #{message} (#{code})"
173
158
  end
@@ -10,14 +10,12 @@ module Spoom
10
10
  #
11
11
  # The language server protocol always uses `"2.0"` as the `jsonrpc` version.
12
12
  class Message
13
- extend T::Sig
14
-
15
- sig { void }
13
+ #: -> void
16
14
  def initialize
17
15
  @jsonrpc = T.let("2.0", String)
18
16
  end
19
17
 
20
- sig { returns(T::Hash[T.untyped, T.untyped]) }
18
+ #: -> Hash[untyped, untyped]
21
19
  def as_json
22
20
  instance_variables.each_with_object({}) do |var, obj|
23
21
  val = instance_variable_get(var)
@@ -25,7 +23,7 @@ module Spoom
25
23
  end
26
24
  end
27
25
 
28
- sig { params(args: T.untyped).returns(String) }
26
+ #: (*untyped args) -> String
29
27
  def to_json(*args)
30
28
  T.unsafe(as_json).to_json(*args)
31
29
  end
@@ -35,15 +33,13 @@ module Spoom
35
33
  #
36
34
  # Every processed request must send a response back to the sender of the request.
37
35
  class Request < Message
38
- extend T::Sig
39
-
40
- sig { returns(Integer) }
36
+ #: Integer
41
37
  attr_reader :id
42
38
 
43
- sig { returns(T::Hash[T.untyped, T.untyped]) }
39
+ #: Hash[untyped, untyped]
44
40
  attr_reader :params
45
41
 
46
- sig { params(id: Integer, method: String, params: T::Hash[T.untyped, T.untyped]).void }
42
+ #: (Integer id, String method, Hash[untyped, untyped] params) -> void
47
43
  def initialize(id, method, params)
48
44
  super()
49
45
  @id = id
@@ -56,15 +52,13 @@ module Spoom
56
52
  #
57
53
  # A processed notification message must not send a response back. They work like events.
58
54
  class Notification < Message
59
- extend T::Sig
60
-
61
- sig { returns(String) }
55
+ #: String
62
56
  attr_reader :method
63
57
 
64
- sig { returns(T::Hash[T.untyped, T.untyped]) }
58
+ #: Hash[untyped, untyped]
65
59
  attr_reader :params
66
60
 
67
- sig { params(method: String, params: T::Hash[T.untyped, T.untyped]).void }
61
+ #: (String method, Hash[untyped, untyped] params) -> void
68
62
  def initialize(method, params)
69
63
  super()
70
64
  @method = method
@@ -8,18 +8,14 @@ module Spoom
8
8
  class BadHeaders < Error; end
9
9
 
10
10
  class Diagnostics < Error
11
- extend T::Sig
12
-
13
- sig { returns(String) }
11
+ #: String
14
12
  attr_reader :uri
15
13
 
16
- sig { returns(T::Array[Diagnostic]) }
14
+ #: Array[Diagnostic]
17
15
  attr_reader :diagnostics
18
16
 
19
17
  class << self
20
- extend T::Sig
21
-
22
- sig { params(json: T::Hash[T.untyped, T.untyped]).returns(Diagnostics) }
18
+ #: (Hash[untyped, untyped] json) -> Diagnostics
23
19
  def from_json(json)
24
20
  Diagnostics.new(
25
21
  json["uri"],
@@ -28,7 +24,7 @@ module Spoom
28
24
  end
29
25
  end
30
26
 
31
- sig { params(uri: String, diagnostics: T::Array[Diagnostic]).void }
27
+ #: (String uri, Array[Diagnostic] diagnostics) -> void
32
28
  def initialize(uri, diagnostics)
33
29
  @uri = uri
34
30
  @diagnostics = diagnostics
@@ -38,18 +34,14 @@ module Spoom
38
34
  end
39
35
 
40
36
  class ResponseError < Error
41
- extend T::Sig
42
-
43
- sig { returns(Integer) }
37
+ #: Integer
44
38
  attr_reader :code
45
39
 
46
- sig { returns(T::Hash[T.untyped, T.untyped]) }
40
+ #: Hash[untyped, untyped]
47
41
  attr_reader :data
48
42
 
49
43
  class << self
50
- extend T::Sig
51
-
52
- sig { params(json: T::Hash[T.untyped, T.untyped]).returns(ResponseError) }
44
+ #: (Hash[untyped, untyped] json) -> ResponseError
53
45
  def from_json(json)
54
46
  ResponseError.new(
55
47
  json["code"],
@@ -59,7 +51,7 @@ module Spoom
59
51
  end
60
52
  end
61
53
 
62
- sig { params(code: Integer, message: String, data: T::Hash[T.untyped, T.untyped]).void }
54
+ #: (Integer code, String message, Hash[untyped, untyped] data) -> void
63
55
  def initialize(code, message, data)
64
56
  super(message)
65
57
  @code = code
@@ -17,16 +17,13 @@ module Spoom
17
17
  end
18
18
 
19
19
  class Hover < T::Struct
20
- extend T::Sig
21
20
  include PrintableSymbol
22
21
 
23
22
  const :contents, String
24
23
  const :range, T.nilable(Range)
25
24
 
26
25
  class << self
27
- extend T::Sig
28
-
29
- sig { params(json: T::Hash[T.untyped, T.untyped]).returns(Hover) }
26
+ #: (Hash[untyped, untyped] json) -> Hover
30
27
  def from_json(json)
31
28
  Hover.new(
32
29
  contents: json["contents"]["value"],
@@ -35,29 +32,27 @@ module Spoom
35
32
  end
36
33
  end
37
34
 
38
- sig { override.params(printer: SymbolPrinter).void }
35
+ # @override
36
+ #: (SymbolPrinter printer) -> void
39
37
  def accept_printer(printer)
40
38
  printer.print("#{contents}\n")
41
39
  printer.print_object(range) if range
42
40
  end
43
41
 
44
- sig { returns(String) }
42
+ #: -> String
45
43
  def to_s
46
44
  "#{contents} (#{range})."
47
45
  end
48
46
  end
49
47
 
50
48
  class Position < T::Struct
51
- extend T::Sig
52
49
  include PrintableSymbol
53
50
 
54
51
  const :line, Integer
55
52
  const :char, Integer
56
53
 
57
54
  class << self
58
- extend T::Sig
59
-
60
- sig { params(json: T::Hash[T.untyped, T.untyped]).returns(Position) }
55
+ #: (Hash[untyped, untyped] json) -> Position
61
56
  def from_json(json)
62
57
  Position.new(
63
58
  line: json["line"].to_i,
@@ -66,28 +61,26 @@ module Spoom
66
61
  end
67
62
  end
68
63
 
69
- sig { override.params(printer: SymbolPrinter).void }
64
+ # @override
65
+ #: (SymbolPrinter printer) -> void
70
66
  def accept_printer(printer)
71
67
  printer.print_colored("#{line}:#{char}", Color::LIGHT_BLACK)
72
68
  end
73
69
 
74
- sig { returns(String) }
70
+ #: -> String
75
71
  def to_s
76
72
  "#{line}:#{char}"
77
73
  end
78
74
  end
79
75
 
80
76
  class Range < T::Struct
81
- extend T::Sig
82
77
  include PrintableSymbol
83
78
 
84
79
  const :start, Position
85
80
  const :end, Position
86
81
 
87
82
  class << self
88
- extend T::Sig
89
-
90
- sig { params(json: T::Hash[T.untyped, T.untyped]).returns(Range) }
83
+ #: (Hash[untyped, untyped] json) -> Range
91
84
  def from_json(json)
92
85
  Range.new(
93
86
  start: Position.from_json(json["start"]),
@@ -96,30 +89,28 @@ module Spoom
96
89
  end
97
90
  end
98
91
 
99
- sig { override.params(printer: SymbolPrinter).void }
92
+ # @override
93
+ #: (SymbolPrinter printer) -> void
100
94
  def accept_printer(printer)
101
95
  printer.print_object(start)
102
96
  printer.print_colored("-", Color::LIGHT_BLACK)
103
97
  printer.print_object(self.end)
104
98
  end
105
99
 
106
- sig { returns(String) }
100
+ #: -> String
107
101
  def to_s
108
102
  "#{start}-#{self.end}"
109
103
  end
110
104
  end
111
105
 
112
106
  class Location < T::Struct
113
- extend T::Sig
114
107
  include PrintableSymbol
115
108
 
116
109
  const :uri, String
117
110
  const :range, LSP::Range
118
111
 
119
112
  class << self
120
- extend T::Sig
121
-
122
- sig { params(json: T::Hash[T.untyped, T.untyped]).returns(Location) }
113
+ #: (Hash[untyped, untyped] json) -> Location
123
114
  def from_json(json)
124
115
  Location.new(
125
116
  uri: json["uri"],
@@ -128,20 +119,20 @@ module Spoom
128
119
  end
129
120
  end
130
121
 
131
- sig { override.params(printer: SymbolPrinter).void }
122
+ # @override
123
+ #: (SymbolPrinter printer) -> void
132
124
  def accept_printer(printer)
133
125
  printer.print_colored("#{printer.clean_uri(uri)}:", Color::LIGHT_BLACK)
134
126
  printer.print_object(range)
135
127
  end
136
128
 
137
- sig { returns(String) }
129
+ #: -> String
138
130
  def to_s
139
131
  "#{uri}:#{range}"
140
132
  end
141
133
  end
142
134
 
143
135
  class SignatureHelp < T::Struct
144
- extend T::Sig
145
136
  include PrintableSymbol
146
137
 
147
138
  const :label, T.nilable(String)
@@ -149,9 +140,7 @@ module Spoom
149
140
  const :params, T::Array[T.untyped] # TODO
150
141
 
151
142
  class << self
152
- extend T::Sig
153
-
154
- sig { params(json: T::Hash[T.untyped, T.untyped]).returns(SignatureHelp) }
143
+ #: (Hash[untyped, untyped] json) -> SignatureHelp
155
144
  def from_json(json)
156
145
  SignatureHelp.new(
157
146
  label: json["label"],
@@ -161,7 +150,8 @@ module Spoom
161
150
  end
162
151
  end
163
152
 
164
- sig { override.params(printer: SymbolPrinter).void }
153
+ # @override
154
+ #: (SymbolPrinter printer) -> void
165
155
  def accept_printer(printer)
166
156
  printer.print(label)
167
157
  printer.print("(")
@@ -169,14 +159,13 @@ module Spoom
169
159
  printer.print(")")
170
160
  end
171
161
 
172
- sig { returns(String) }
162
+ #: -> String
173
163
  def to_s
174
164
  "#{label}(#{params})."
175
165
  end
176
166
  end
177
167
 
178
168
  class Diagnostic < T::Struct
179
- extend T::Sig
180
169
  include PrintableSymbol
181
170
 
182
171
  const :range, LSP::Range
@@ -185,9 +174,7 @@ module Spoom
185
174
  const :information, Object
186
175
 
187
176
  class << self
188
- extend T::Sig
189
-
190
- sig { params(json: T::Hash[T.untyped, T.untyped]).returns(Diagnostic) }
177
+ #: (Hash[untyped, untyped] json) -> Diagnostic
191
178
  def from_json(json)
192
179
  Diagnostic.new(
193
180
  range: Range.from_json(json["range"]),
@@ -198,19 +185,19 @@ module Spoom
198
185
  end
199
186
  end
200
187
 
201
- sig { override.params(printer: SymbolPrinter).void }
188
+ # @override
189
+ #: (SymbolPrinter printer) -> void
202
190
  def accept_printer(printer)
203
191
  printer.print(to_s)
204
192
  end
205
193
 
206
- sig { returns(String) }
194
+ #: -> String
207
195
  def to_s
208
196
  "Error: #{message} (#{code})."
209
197
  end
210
198
  end
211
199
 
212
200
  class DocumentSymbol < T::Struct
213
- extend T::Sig
214
201
  include PrintableSymbol
215
202
 
216
203
  const :name, String
@@ -221,9 +208,7 @@ module Spoom
221
208
  const :children, T::Array[DocumentSymbol]
222
209
 
223
210
  class << self
224
- extend T::Sig
225
-
226
- sig { params(json: T::Hash[T.untyped, T.untyped]).returns(DocumentSymbol) }
211
+ #: (Hash[untyped, untyped] json) -> DocumentSymbol
227
212
  def from_json(json)
228
213
  DocumentSymbol.new(
229
214
  name: json["name"],
@@ -236,7 +221,8 @@ module Spoom
236
221
  end
237
222
  end
238
223
 
239
- sig { override.params(printer: SymbolPrinter).void }
224
+ # @override
225
+ #: (SymbolPrinter printer) -> void
240
226
  def accept_printer(printer)
241
227
  h = serialize.hash
242
228
  return if printer.seen.include?(h)
@@ -263,12 +249,12 @@ module Spoom
263
249
  # TODO: also display details?
264
250
  end
265
251
 
266
- sig { returns(String) }
252
+ #: -> String
267
253
  def to_s
268
254
  "#{name} (#{range})"
269
255
  end
270
256
 
271
- sig { returns(String) }
257
+ #: -> String
272
258
  def kind_string
273
259
  SYMBOL_KINDS[kind] || "<unknown:#{kind}>"
274
260
  end
@@ -307,22 +293,13 @@ module Spoom
307
293
  end
308
294
 
309
295
  class SymbolPrinter < Printer
310
- extend T::Sig
311
-
312
- sig { returns(T::Set[Integer]) }
296
+ #: Set[Integer]
313
297
  attr_reader :seen
314
298
 
315
- sig { returns(T.nilable(String)) }
299
+ #: String?
316
300
  attr_accessor :prefix
317
301
 
318
- sig do
319
- params(
320
- out: T.any(IO, StringIO),
321
- colors: T::Boolean,
322
- indent_level: Integer,
323
- prefix: T.nilable(String),
324
- ).void
325
- end
302
+ #: (?out: (IO | StringIO), ?colors: bool, ?indent_level: Integer, ?prefix: String?) -> void
326
303
  def initialize(out: $stdout, colors: true, indent_level: 0, prefix: nil)
327
304
  super(out: out, colors: colors, indent_level: indent_level)
328
305
  @seen = T.let(Set.new, T::Set[Integer])
@@ -332,19 +309,19 @@ module Spoom
332
309
  @prefix = prefix
333
310
  end
334
311
 
335
- sig { params(object: T.nilable(PrintableSymbol)).void }
312
+ #: (PrintableSymbol? object) -> void
336
313
  def print_object(object)
337
314
  return unless object
338
315
 
339
316
  object.accept_printer(self)
340
317
  end
341
318
 
342
- sig { params(objects: T::Array[PrintableSymbol]).void }
319
+ #: (Array[PrintableSymbol] objects) -> void
343
320
  def print_objects(objects)
344
321
  objects.each { |object| print_object(object) }
345
322
  end
346
323
 
347
- sig { params(uri: String).returns(String) }
324
+ #: (String uri) -> String
348
325
  def clean_uri(uri)
349
326
  prefix = self.prefix
350
327
  return uri unless prefix
@@ -352,7 +329,7 @@ module Spoom
352
329
  uri.delete_prefix(prefix)
353
330
  end
354
331
 
355
- sig { params(objects: T::Array[PrintableSymbol]).void }
332
+ #: (Array[PrintableSymbol] objects) -> void
356
333
  def print_list(objects)
357
334
  objects.each do |object|
358
335
  printt