Skip to content

Commit d02f7a3

Browse files
authored
Merge pull request #954 from Shopify/Alex/Options-object
Introduce `Options` object
2 parents 7ee85dc + 48c4e23 commit d02f7a3

6 files changed

Lines changed: 154 additions & 21 deletions

File tree

lib/spoom/sorbet/translate/rbs_comments_to_sorbet_sigs.rb

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,33 @@ def contains_rbs_syntax?(source)
2424
Sigils.contains_valid_sigil?(source) && source.match?(RBS_REWRITE_PATTERN)
2525
end
2626

27-
#: (String ruby_contents, file: String, ?max_line_length: Integer?, ?overloads_strategy: Symbol) -> String
28-
def rewrite_if_needed(ruby_contents, file:, max_line_length: nil, overloads_strategy: :translate_all)
27+
#: (
28+
#| String ruby_contents,
29+
#| file: String,
30+
#| ?max_line_length: Integer?,
31+
#| ?overloads_strategy: Symbol) -> String
32+
def rewrite_if_needed(
33+
ruby_contents,
34+
file:,
35+
max_line_length: nil,
36+
overloads_strategy: :translate_all
37+
)
2938
return ruby_contents unless contains_rbs_syntax?(ruby_contents)
3039

31-
HumanReadableTranslator.new(ruby_contents, file:, max_line_length:, overloads_strategy:).rewrite
40+
options = Options.new(
41+
overloads_strategy:,
42+
output_format: HumanReadableRBIFormat.new(
43+
max_line_length:,
44+
),
45+
)
46+
47+
HumanReadableTranslator.new(ruby_contents, file:, options:).rewrite
3248
end
3349
end
3450
end
3551
end
3652
end
3753
end
3854

55+
require "spoom/sorbet/translate/rbs_comments_to_sorbet_sigs/options"
3956
require "spoom/sorbet/translate/rbs_comments_to_sorbet_sigs/human_readable_translator"

lib/spoom/sorbet/translate/rbs_comments_to_sorbet_sigs/base_translator.rb

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,22 @@ module RBSCommentsToSorbetSigs
99
class BaseTranslator < Translator
1010
include Spoom::RBS::ExtractRBSComments
1111

12-
ALLOWED_OVERLOAD_STRATEGIES = [:translate_all, :translate_last, :raise].freeze #: Array[Symbol]
13-
14-
#: (String, file: String, ?max_line_length: Integer?, ?overloads_strategy: Symbol) -> void
15-
def initialize(ruby_contents, file:, max_line_length: nil, overloads_strategy: :translate_all)
16-
super(ruby_contents, file: file)
17-
18-
unless ALLOWED_OVERLOAD_STRATEGIES.include?(overloads_strategy)
19-
raise ArgumentError, "Unknown overloads_strategy: #{overloads_strategy.inspect}. " \
20-
"Must be one of: #{ALLOWED_OVERLOAD_STRATEGIES.map(&:inspect).join(", ")}"
21-
end
12+
#: (String, file: String, ?options: Options) -> void
13+
def initialize(
14+
ruby_contents,
15+
file:,
16+
options: Options.default
17+
)
18+
super(ruby_contents, file:)
19+
20+
@max_line_length = case (format = options.output_format)
21+
when HumanReadableRBIFormat
22+
format.max_line_length
23+
else
24+
nil
25+
end #: Integer?
2226

23-
@max_line_length = max_line_length
24-
@overloads_strategy = overloads_strategy
27+
@overloads_strategy = options.overloads_strategy #: Symbol
2528
@type_translator = RBI::RBS::TypeTranslator.new #: RBI::RBS::TypeTranslator
2629
end
2730

lib/spoom/sorbet/translate/rbs_comments_to_sorbet_sigs/human_readable_translator.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# frozen_string_literal: true
33

44
require "spoom/sorbet/translate/rbs_comments_to_sorbet_sigs/base_translator"
5+
require "spoom/sorbet/translate/rbs_comments_to_sorbet_sigs/options"
56

67
module Spoom
78
module Sorbet
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# typed: strict
2+
# frozen_string_literal: true
3+
4+
module Spoom
5+
module Sorbet
6+
module Translate
7+
module RBSCommentsToSorbetSigs
8+
# @abstract
9+
class BaseRBIFormat
10+
end
11+
12+
class HumanReadableRBIFormat < BaseRBIFormat
13+
#: Integer?
14+
attr_reader :max_line_length
15+
16+
#: (
17+
#| ?max_line_length: Integer?,
18+
#| ) -> void
19+
def initialize(max_line_length: nil)
20+
super()
21+
@max_line_length = max_line_length
22+
23+
freeze
24+
end
25+
26+
@default = new #: HumanReadableRBIFormat
27+
class << self
28+
#: HumanReadableRBIFormat
29+
attr_reader :default
30+
end
31+
end
32+
33+
class Options
34+
#: Symbol
35+
attr_reader :overloads_strategy
36+
37+
ALLOWED_OVERLOAD_STRATEGIES = [:translate_all, :translate_last, :raise].freeze
38+
39+
#: BaseRBIFormat
40+
attr_reader :output_format
41+
42+
#: (
43+
#| ?overloads_strategy: Symbol,
44+
#| ?output_format: BaseRBIFormat,
45+
#| ) -> void
46+
def initialize(
47+
overloads_strategy: :translate_all,
48+
output_format: HumanReadableRBIFormat.default
49+
)
50+
unless ALLOWED_OVERLOAD_STRATEGIES.include?(overloads_strategy)
51+
raise ArgumentError, "Unknown overloads_strategy: #{overloads_strategy.inspect}. " \
52+
"Must be one of: #{ALLOWED_OVERLOAD_STRATEGIES.map(&:inspect).join(", ")}"
53+
end
54+
55+
@overloads_strategy = overloads_strategy
56+
@output_format = output_format
57+
58+
freeze
59+
end
60+
61+
@default = new #: Options
62+
class << self
63+
#: Options
64+
attr_reader :default
65+
end
66+
end
67+
end
68+
end
69+
end
70+
end

rbi/spoom.rbi

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2937,6 +2937,10 @@ module Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs
29372937
end
29382938
end
29392939

2940+
class Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::BaseRBIFormat
2941+
abstract!
2942+
end
2943+
29402944
class Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::BaseTranslator < ::Spoom::Sorbet::Translate::Translator
29412945
include ::Spoom::RBS::ExtractRBSComments
29422946

@@ -2946,11 +2950,10 @@ class Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::BaseTranslator < ::Spoo
29462950
params(
29472951
ruby_contents: ::String,
29482952
file: ::String,
2949-
max_line_length: T.nilable(::Integer),
2950-
overloads_strategy: ::Symbol
2953+
options: ::Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::Options
29512954
).void
29522955
end
2953-
def initialize(ruby_contents, file:, max_line_length: T.unsafe(nil), overloads_strategy: T.unsafe(nil)); end
2956+
def initialize(ruby_contents, file:, options: T.unsafe(nil)); end
29542957

29552958
sig { override.params(node: ::Prism::CallNode).void }
29562959
def visit_call_node(node); end
@@ -3008,9 +3011,44 @@ class Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::BaseTranslator < ::Spoo
30083011
def visit_attr(node); end
30093012
end
30103013

3011-
Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::BaseTranslator::ALLOWED_OVERLOAD_STRATEGIES = T.let(T.unsafe(nil), Array)
3014+
class Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::HumanReadableRBIFormat < ::Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::BaseRBIFormat
3015+
sig { params(max_line_length: T.nilable(::Integer)).void }
3016+
def initialize(max_line_length: T.unsafe(nil)); end
3017+
3018+
sig { returns(T.nilable(::Integer)) }
3019+
def max_line_length; end
3020+
3021+
class << self
3022+
sig { returns(::Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::HumanReadableRBIFormat) }
3023+
def default; end
3024+
end
3025+
end
3026+
30123027
class Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::HumanReadableTranslator < ::Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::BaseTranslator; end
30133028

3029+
class Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::Options
3030+
sig do
3031+
params(
3032+
overloads_strategy: ::Symbol,
3033+
output_format: ::Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::BaseRBIFormat
3034+
).void
3035+
end
3036+
def initialize(overloads_strategy: T.unsafe(nil), output_format: T.unsafe(nil)); end
3037+
3038+
sig { returns(::Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::BaseRBIFormat) }
3039+
def output_format; end
3040+
3041+
sig { returns(::Symbol) }
3042+
def overloads_strategy; end
3043+
3044+
class << self
3045+
sig { returns(::Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::Options) }
3046+
def default; end
3047+
end
3048+
end
3049+
3050+
Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::Options::ALLOWED_OVERLOAD_STRATEGIES = T.let(T.unsafe(nil), Array)
3051+
30143052
class Spoom::Sorbet::Translate::SorbetAssertionsToRBSComments < ::Spoom::Sorbet::Translate::Translator
30153053
sig do
30163054
params(

test/spoom/sorbet/translate/rbs_comments_to_sorbet_sigs_test.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -988,8 +988,12 @@ def rbs_comments_to_sorbet_sigs(ruby_contents, max_line_length: nil, overloads_s
988988
RBSCommentsToSorbetSigs::HumanReadableTranslator.new(
989989
ruby_contents,
990990
file: "test.rb",
991-
max_line_length: max_line_length,
992-
overloads_strategy: overloads_strategy,
991+
options: RBSCommentsToSorbetSigs::Options.new(
992+
overloads_strategy:,
993+
output_format: RBSCommentsToSorbetSigs::HumanReadableRBIFormat.new(
994+
max_line_length:,
995+
),
996+
),
993997
).rewrite
994998
end
995999

0 commit comments

Comments
 (0)