Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
30 changes: 11 additions & 19 deletions lib/tapioca/commands/check_shims.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
12 changes: 3 additions & 9 deletions lib/tapioca/dsl/compilers/active_record_relations.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
16 changes: 4 additions & 12 deletions lib/tapioca/helpers/rbi_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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?
Expand Down
4 changes: 1 addition & 3 deletions lib/tapioca/helpers/sorbet_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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) }
Expand Down
29 changes: 0 additions & 29 deletions spec/tapioca/cli/check_shims_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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\)/, "")
Expand Down
129 changes: 31 additions & 98 deletions spec/tapioca/cli/gem_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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
Expand Down
2 changes: 0 additions & 2 deletions spec/tapioca/dsl/compilers/active_record_relations_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion tapioca.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down