Skip to content

Commit 7654edc

Browse files
committed
Introduce Options object
1 parent 764ddb8 commit 7654edc

6 files changed

Lines changed: 161 additions & 21 deletions

File tree

lib/spoom/sorbet/translate/rbs_comments_to_sorbet_sigs.rb

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,34 @@ 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+
# :translate_all | :translate_last | :raise
32+
#| ?overloads_strategy: Symbol) -> String
33+
def rewrite_if_needed(
34+
ruby_contents,
35+
file:,
36+
max_line_length: nil,
37+
overloads_strategy: :translate_all
38+
)
2939
return ruby_contents unless contains_rbs_syntax?(ruby_contents)
3040

31-
HumanReadableTranslator.new(ruby_contents, file:, max_line_length:, overloads_strategy:).rewrite
41+
options = Options.new(
42+
overloads_strategy:,
43+
output_format: HumanReadableRBIFormat.new(
44+
max_line_length:,
45+
),
46+
)
47+
48+
HumanReadableTranslator.new(ruby_contents, file:, options:).rewrite
3249
end
3350
end
3451
end
3552
end
3653
end
3754
end
3855

56+
require "spoom/sorbet/translate/rbs_comments_to_sorbet_sigs/options"
3957
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: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,29 @@ 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 #: Integer?
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
29+
30+
# @rbs_translator = RBI::RBS::TypeTranslator.new(
31+
# options: RBI::RBS::TypeTranslator::Options.new(
32+
# associate_origin_rbs_nodes: type_translator_should_associate_origin_rbs_nodes
33+
# )
34+
# ) #: RBI::RBS::TypeTranslator
2635
end
2736

2837
# @override

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

rbi/spoom.rbi

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

2940+
class Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::BaseRBIFormat; end
2941+
29402942
class Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::BaseTranslator < ::Spoom::Sorbet::Translate::Translator
29412943
include ::Spoom::RBS::ExtractRBSComments
29422944

@@ -2946,11 +2948,10 @@ class Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::BaseTranslator < ::Spoo
29462948
params(
29472949
ruby_contents: ::String,
29482950
file: ::String,
2949-
max_line_length: T.nilable(::Integer),
2950-
overloads_strategy: ::Symbol
2951+
options: ::Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::Options
29512952
).void
29522953
end
2953-
def initialize(ruby_contents, file:, max_line_length: T.unsafe(nil), overloads_strategy: T.unsafe(nil)); end
2954+
def initialize(ruby_contents, file:, options: T.unsafe(nil)); end
29542955

29552956
sig { override.params(node: ::Prism::CallNode).void }
29562957
def visit_call_node(node); end
@@ -3008,9 +3009,44 @@ class Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::BaseTranslator < ::Spoo
30083009
def visit_attr(node); end
30093010
end
30103011

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

3027+
class Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::Options
3028+
sig do
3029+
params(
3030+
overloads_strategy: ::Symbol,
3031+
output_format: ::Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::BaseRBIFormat
3032+
).void
3033+
end
3034+
def initialize(overloads_strategy: T.unsafe(nil), output_format: T.unsafe(nil)); end
3035+
3036+
sig { returns(::Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::BaseRBIFormat) }
3037+
def output_format; end
3038+
3039+
sig { returns(::Symbol) }
3040+
def overloads_strategy; end
3041+
3042+
class << self
3043+
sig { returns(::Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::Options) }
3044+
def default; end
3045+
end
3046+
end
3047+
3048+
Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs::Options::ALLOWED_OVERLOAD_STRATEGIES = T.let(T.unsafe(nil), Array)
3049+
30143050
class Spoom::Sorbet::Translate::SorbetAssertionsToRBSComments < ::Spoom::Sorbet::Translate::Translator
30153051
sig do
30163052
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)