diff --git a/Gemfile.lock b/Gemfile.lock index 272d28fc2..c16baba7f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -22,7 +22,7 @@ PATH netrc (>= 0.11.0) parallel (>= 1.21.0) rbi (~> 0.0.0, >= 0.0.16) - sorbet-static-and-runtime (>= 0.5.9204) + sorbet-static-and-runtime (>= 0.5.9892) spoom (~> 1.1.0, >= 1.1.11) thor (>= 1.2.0) yard-sorbet diff --git a/lib/tapioca/commands/check_shims.rb b/lib/tapioca/commands/check_shims.rb index cc37f6275..1e720ea67 100644 --- a/lib/tapioca/commands/check_shims.rb +++ b/lib/tapioca/commands/check_shims.rb @@ -51,26 +51,18 @@ def execute payload_path = T.let(nil, T.nilable(String)) if @payload - if sorbet_supports?(:print_payload_sources) - Dir.mktmpdir do |dir| - payload_path = dir - result = sorbet("--no-config --print=payload-sources:#{payload_path}") - - unless result.status - raise Thor::Error, <<~ERROR - "Sorbet failed to dump payload" - #{result.err} - ERROR - end - - index_rbis(index, "payload", payload_path, number_of_workers: @number_of_workers) + Dir.mktmpdir do |dir| + payload_path = dir + result = sorbet("--no-config --print=payload-sources:#{payload_path}") + + unless result.status + raise Thor::Error, <<~ERROR + "Sorbet failed to dump payload" + #{result.err} + ERROR end - else - raise Thor::Error, <<~ERROR - The version of Sorbet used in your Gemfile.lock does not support `--print=payload-sources` - Current: v#{SORBET_GEM_SPEC.version} - Required: #{FEATURE_REQUIREMENTS[:print_payload_sources]} - ERROR + + index_rbis(index, "payload", payload_path, number_of_workers: @number_of_workers) end end diff --git a/lib/tapioca/dsl/compilers/active_record_relations.rb b/lib/tapioca/dsl/compilers/active_record_relations.rb index 5cd1944d2..1ed602f25 100644 --- a/lib/tapioca/dsl/compilers/active_record_relations.rb +++ b/lib/tapioca/dsl/compilers/active_record_relations.rb @@ -243,15 +243,9 @@ def create_classes_and_includes(model) # The model always extends the generated relation module model.create_extend(RelationMethodsModuleName) - # This feature is only available in versions of Sorbet with special support for - # handling `NilClass` returns from `to_ary`. We should not be typing `to_ary` like - # this for older versions since it will make all flatten operations be - # `T::Array[NilClass]`, otherwise. - if sorbet_supports?(:to_ary_nil_support) - # Type the `to_ary` method as returning `NilClass` so that flatten stops recursing - # See https://github.com/sorbet/sorbet/pull/4706 for details - model.create_method("to_ary", return_type: "NilClass", visibility: RBI::Private.new) - end + # Type the `to_ary` method as returning `NilClass` so that flatten stops recursing + # See https://github.com/sorbet/sorbet/pull/4706 for details + model.create_method("to_ary", return_type: "NilClass", visibility: RBI::Private.new) create_relation_class(model) create_association_relation_class(model) diff --git a/lib/tapioca/helpers/rbi_helper.rb b/lib/tapioca/helpers/rbi_helper.rb index f3bf6df16..4796de773 100644 --- a/lib/tapioca/helpers/rbi_helper.rb +++ b/lib/tapioca/helpers/rbi_helper.rb @@ -23,22 +23,14 @@ class << self def serialize_type_variable(type, variance, fixed, upper, lower) variance = nil if variance == :invariant - bounds = [] - bounds << "fixed: #{fixed}" if fixed - bounds << "lower: #{lower}" if lower - bounds << "upper: #{upper}" if upper - - parameters = [] block = [] + block << "fixed: #{fixed}" if fixed + block << "lower: #{lower}" if lower + block << "upper: #{upper}" if upper + parameters = [] parameters << ":#{variance}" if variance - if sorbet_supports?(:type_variable_block_syntax) - block = bounds - else - parameters.concat(bounds) - end - serialized = type.dup serialized << "(#{parameters.join(", ")})" unless parameters.empty? serialized << " { { #{block.join(", ")} } }" unless block.empty? diff --git a/lib/tapioca/helpers/sorbet_helper.rb b/lib/tapioca/helpers/sorbet_helper.rb index 1efebdf9a..62aada044 100644 --- a/lib/tapioca/helpers/sorbet_helper.rb +++ b/lib/tapioca/helpers/sorbet_helper.rb @@ -20,9 +20,7 @@ module SorbetHelper SORBET_PAYLOAD_URL = "https://github.com/sorbet/sorbet/tree/master/rbi" FEATURE_REQUIREMENTS = T.let({ - to_ary_nil_support: ::Gem::Requirement.new(">= 0.5.9220"), # https://github.com/sorbet/sorbet/pull/4706 - print_payload_sources: ::Gem::Requirement.new(">= 0.5.9818"), # https://github.com/sorbet/sorbet/pull/5504 - type_variable_block_syntax: ::Gem::Requirement.new(">= 0.5.9892"), # https://github.com/sorbet/sorbet/pull/5639 + # feature_name: ::Gem::Requirement.new(">= ___"), # https://github.com/sorbet/sorbet/pull/___ }.freeze, T::Hash[Symbol, ::Gem::Requirement]) sig { params(sorbet_args: String).returns(Spoom::ExecResult) } diff --git a/spec/tapioca/cli/check_shims_spec.rb b/spec/tapioca/cli/check_shims_spec.rb index be94a6265..085946552 100644 --- a/spec/tapioca/cli/check_shims_spec.rb +++ b/spec/tapioca/cli/check_shims_spec.rb @@ -669,35 +669,6 @@ class Foo; end end end - describe "when Sorbet version is too old" do - before(:all) do - @project = mock_project(sorbet_dependency: false) - @project.require_real_gem("sorbet-static-and-runtime", "=0.5.9760") - @project.bundle_install - end - - it "does not check shims against payload for older Sorbet versions" do - @project.write("sorbet/rbi/shims/core/string.rbi", <<~RBI) - class String - sig { returns(String) } - def capitalize(); end - - def some_method_that_is_not_defined_in_the_payload; end - end - RBI - - result = @project.tapioca("check-shims") - - assert_equal(<<~ERR, result.err) - The version of Sorbet used in your Gemfile.lock does not support `--print=payload-sources` - Current: v0.5.9760 - Required: >= 0.5.9818 - ERR - - refute_success_status(result) - end - end - sig { params(string: String).returns(String) } def strip_timer(string) string.gsub(/ \(\d+\.\d+s\)/, "") diff --git a/spec/tapioca/cli/gem_spec.rb b/spec/tapioca/cli/gem_spec.rb index ca0afc883..8369decba 100644 --- a/spec/tapioca/cli/gem_spec.rb +++ b/spec/tapioca/cli/gem_spec.rb @@ -1872,95 +1872,42 @@ def bar(&block); end end end - describe "type variable syntax" do - before do - @project = mock_project(sorbet_dependency: false) + it "generates the correct type variable syntax" do + type_variable = mock_gem("type_variable", "0.0.1") do + write("lib/type_variable.rb", TYPE_VARIABLE_RB) end - after do - @project.destroy - end - - it "must generate old type variable syntax on old Sorbet versions" do - type_variable = mock_gem("type_variable", "0.0.1") do - write("lib/type_variable.rb", TYPE_VARIABLE_RB) - end - - @project.require_real_gem("sorbet-static-and-runtime", "=0.5.9874") - @project.require_mock_gem(type_variable) - @project.bundle_install - - result = @project.tapioca("gem") - - assert_stdout_includes(result, <<~OUT) - Compiled type_variable - create sorbet/rbi/gems/type_variable@0.0.1.rbi - OUT - - assert_project_file_equal("sorbet/rbi/gems/type_variable@0.0.1.rbi", <<~RBI) - # typed: true - - # DO NOT EDIT MANUALLY - # This is an autogenerated file for types exported from the `type_variable` gem. - # Please instead update this file by running `bin/tapioca gem type_variable`. - - class ComplexGenericType - extend T::Generic - - A = type_template(:in) - B = type_template(:out) - C = type_template - D = type_member(fixed: Integer) - E = type_member(fixed: Integer, upper: Numeric) - F = type_member(fixed: Integer, lower: Complex, upper: Numeric) - G = type_member(:in, fixed: Integer) - H = type_member(:in, fixed: Integer, upper: Numeric) - I = type_member(:in, fixed: Integer, lower: Complex, upper: Numeric) - - class << self - extend T::Generic - - A = type_template(:in) - B = type_template(:out) - C = type_template - D = type_member(fixed: Integer) - E = type_member(fixed: Integer, upper: Numeric) - F = type_member(fixed: Integer, lower: Complex, upper: Numeric) - G = type_member(:in, fixed: Integer) - H = type_member(:in, fixed: Integer, upper: Numeric) - I = type_member(:in, fixed: Integer, lower: Complex, upper: Numeric) - end - end - RBI + @project.require_mock_gem(type_variable) + @project.bundle_install - assert_empty_stderr(result) - assert_success_status(result) - end + result = @project.tapioca("gem") - it "must generate new type variable syntax on new Sorbet versions" do - type_variable = mock_gem("type_variable", "0.0.1") do - write("lib/type_variable.rb", TYPE_VARIABLE_RB) - end + assert_stdout_includes(result, <<~OUT) + Compiled type_variable + create sorbet/rbi/gems/type_variable@0.0.1.rbi + OUT - @project.require_real_gem("sorbet-static-and-runtime", "=0.5.9896") - @project.require_mock_gem(type_variable) - @project.bundle_install + assert_project_file_equal("sorbet/rbi/gems/type_variable@0.0.1.rbi", <<~RBI) + # typed: true - result = @project.tapioca("gem") + # DO NOT EDIT MANUALLY + # This is an autogenerated file for types exported from the `type_variable` gem. + # Please instead update this file by running `bin/tapioca gem type_variable`. - assert_stdout_includes(result, <<~OUT) - Compiled type_variable - create sorbet/rbi/gems/type_variable@0.0.1.rbi - OUT + class ComplexGenericType + extend T::Generic - assert_project_file_equal("sorbet/rbi/gems/type_variable@0.0.1.rbi", <<~RBI) - # typed: true + A = type_template(:in) + B = type_template(:out) + C = type_template + D = type_member { { fixed: Integer } } + E = type_member { { fixed: Integer, upper: Numeric } } + F = type_member { { fixed: Integer, lower: Complex, upper: Numeric } } + G = type_member(:in) { { fixed: Integer } } + H = type_member(:in) { { fixed: Integer, upper: Numeric } } + I = type_member(:in) { { fixed: Integer, lower: Complex, upper: Numeric } } - # DO NOT EDIT MANUALLY - # This is an autogenerated file for types exported from the `type_variable` gem. - # Please instead update this file by running `bin/tapioca gem type_variable`. - - class ComplexGenericType + class << self extend T::Generic A = type_template(:in) @@ -1972,26 +1919,12 @@ class ComplexGenericType G = type_member(:in) { { fixed: Integer } } H = type_member(:in) { { fixed: Integer, upper: Numeric } } I = type_member(:in) { { fixed: Integer, lower: Complex, upper: Numeric } } - - class << self - extend T::Generic - - A = type_template(:in) - B = type_template(:out) - C = type_template - D = type_member { { fixed: Integer } } - E = type_member { { fixed: Integer, upper: Numeric } } - F = type_member { { fixed: Integer, lower: Complex, upper: Numeric } } - G = type_member(:in) { { fixed: Integer } } - H = type_member(:in) { { fixed: Integer, upper: Numeric } } - I = type_member(:in) { { fixed: Integer, lower: Complex, upper: Numeric } } - end end - RBI + end + RBI - assert_empty_stderr(result) - assert_success_status(result) - end + assert_empty_stderr(result) + assert_success_status(result) end describe "environment" do diff --git a/spec/tapioca/dsl/compilers/active_record_relations_spec.rb b/spec/tapioca/dsl/compilers/active_record_relations_spec.rb index e59c7a700..c2bb18bd9 100644 --- a/spec/tapioca/dsl/compilers/active_record_relations_spec.rb +++ b/spec/tapioca/dsl/compilers/active_record_relations_spec.rb @@ -46,13 +46,11 @@ class Post extend CommonRelationMethods extend GeneratedRelationMethods - <% if sorbet_supports?(:to_ary_nil_support) %> private sig { returns(NilClass) } def to_ary; end - <% end %> module CommonRelationMethods sig { params(block: T.nilable(T.proc.params(record: ::Post).returns(T.untyped))).returns(T::Boolean) } def any?(&block); end diff --git a/tapioca.gemspec b/tapioca.gemspec index 1accd7963..c5d035f3c 100644 --- a/tapioca.gemspec +++ b/tapioca.gemspec @@ -27,7 +27,7 @@ Gem::Specification.new do |spec| spec.add_dependency("netrc", ">= 0.11.0") spec.add_dependency("parallel", ">= 1.21.0") spec.add_dependency("rbi", "~> 0.0.0", ">= 0.0.16") - spec.add_dependency("sorbet-static-and-runtime", ">= 0.5.9204") + spec.add_dependency("sorbet-static-and-runtime", ">= 0.5.9892") spec.add_dependency("spoom", "~> 1.1.0", ">= 1.1.11") spec.add_dependency("thor", ">= 1.2.0") spec.add_dependency("yard-sorbet")