sorbet-rails 0.5.4 → 0.5.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/README.md +48 -17
  4. data/lib/bundled_rbi/parameters.rbi +50 -0
  5. data/lib/sorbet-rails.rb +1 -0
  6. data/lib/sorbet-rails/gem_plugins/friendly_id_plugin.rb +1 -1
  7. data/lib/sorbet-rails/gem_plugins/kaminari_plugin.rb +1 -1
  8. data/lib/sorbet-rails/gem_plugins/pg_search_plugin.rb +1 -1
  9. data/lib/sorbet-rails/mailer_rbi_formatter.rb +2 -2
  10. data/lib/sorbet-rails/model_plugins/active_record_assoc.rb +1 -1
  11. data/lib/sorbet-rails/model_plugins/active_record_attribute.rb +1 -1
  12. data/lib/sorbet-rails/model_plugins/active_record_enum.rb +1 -1
  13. data/lib/sorbet-rails/model_plugins/active_record_finder_methods.rb +1 -1
  14. data/lib/sorbet-rails/model_plugins/active_record_named_scope.rb +1 -1
  15. data/lib/sorbet-rails/model_plugins/active_record_querying.rb +1 -1
  16. data/lib/sorbet-rails/model_plugins/active_relation_where_not.rb +1 -1
  17. data/lib/sorbet-rails/model_plugins/active_storage_methods.rb +1 -1
  18. data/lib/sorbet-rails/model_plugins/base.rb +1 -1
  19. data/lib/sorbet-rails/model_plugins/custom_finder_methods.rb +1 -1
  20. data/lib/sorbet-rails/model_plugins/enumerable_collections.rb +1 -1
  21. data/lib/sorbet-rails/model_plugins/plugins.rb +0 -1
  22. data/lib/sorbet-rails/model_rbi_formatter.rb +5 -3
  23. data/lib/sorbet-rails/{model_plugins → rails_mixins}/active_record_overrides.rb +0 -0
  24. data/lib/sorbet-rails/{custom_finder_methods.rb → rails_mixins/custom_finder_methods.rb} +1 -1
  25. data/lib/sorbet-rails/rails_mixins/custom_params_methods.rb +46 -0
  26. data/lib/sorbet-rails/railtie.rb +8 -1
  27. data/lib/sorbet-rails/routes_rbi_formatter.rb +1 -2
  28. data/lib/sorbet-rails/tasks/rails_rbi.rake +22 -0
  29. data/lib/sorbet-rails/type_assert/type_assert.rb +18 -0
  30. data/lib/sorbet-rails/type_assert/type_assert_impl.rb +26 -0
  31. data/lib/sorbet-rails/type_assert/type_assert_interface.rb +16 -0
  32. data/sorbet-rails.gemspec +2 -2
  33. data/spec/custom_finder_methods_spec.rb +5 -0
  34. data/spec/custom_params_methods_spec.rb +138 -0
  35. data/spec/generators/sorbet_test_cases.rb +49 -0
  36. data/spec/model_rbi_formatter_spec.rb +10 -3
  37. data/spec/sorbet_spec.rb +1 -5
  38. data/spec/support/v4.2/Gemfile.lock +3 -3
  39. data/spec/support/v4.2/sorbet_test_cases.rb +49 -0
  40. data/spec/support/v5.0/Gemfile.lock +3 -3
  41. data/spec/support/v5.0/sorbet_test_cases.rb +49 -0
  42. data/spec/support/v5.1/Gemfile.lock +3 -3
  43. data/spec/support/v5.1/sorbet_test_cases.rb +49 -0
  44. data/spec/support/v5.2/Gemfile.lock +3 -3
  45. data/spec/support/v5.2/sorbet_test_cases.rb +49 -0
  46. data/spec/support/v6.0/Gemfile.lock +3 -3
  47. data/spec/support/v6.0/sorbet_test_cases.rb +49 -0
  48. data/spec/test_data/v4.2/expected_helpers.rbi +1 -1
  49. data/spec/test_data/v4.2/expected_helpers_with_application_and_devise_helpers.rbi +1 -1
  50. data/spec/test_data/v4.2/expected_potion.rbi +3 -3
  51. data/spec/test_data/v4.2/expected_spell_book.rbi +3 -3
  52. data/spec/test_data/v4.2/expected_wand.rbi +3 -3
  53. data/spec/test_data/v4.2/expected_wizard.rbi +3 -3
  54. data/spec/test_data/v4.2/expected_wizard_wo_spellbook.rbi +3 -3
  55. data/spec/test_data/v5.0/expected_helpers.rbi +1 -1
  56. data/spec/test_data/v5.0/expected_helpers_with_application_and_devise_helpers.rbi +1 -1
  57. data/spec/test_data/v5.0/expected_internal_metadata.rbi +3 -3
  58. data/spec/test_data/v5.0/expected_potion.rbi +3 -3
  59. data/spec/test_data/v5.0/expected_schema_migration.rbi +3 -3
  60. data/spec/test_data/v5.0/expected_spell_book.rbi +3 -3
  61. data/spec/test_data/v5.0/expected_wand.rbi +3 -3
  62. data/spec/test_data/v5.0/expected_wizard.rbi +3 -3
  63. data/spec/test_data/v5.0/expected_wizard_wo_spellbook.rbi +3 -3
  64. data/spec/test_data/v5.1/expected_helpers.rbi +1 -1
  65. data/spec/test_data/v5.1/expected_helpers_with_application_and_devise_helpers.rbi +1 -1
  66. data/spec/test_data/v5.1/expected_internal_metadata.rbi +3 -3
  67. data/spec/test_data/v5.1/expected_potion.rbi +3 -3
  68. data/spec/test_data/v5.1/expected_schema_migration.rbi +3 -3
  69. data/spec/test_data/v5.1/expected_spell_book.rbi +3 -3
  70. data/spec/test_data/v5.1/expected_wand.rbi +3 -3
  71. data/spec/test_data/v5.1/expected_wizard.rbi +3 -3
  72. data/spec/test_data/v5.1/expected_wizard_wo_spellbook.rbi +3 -3
  73. data/spec/test_data/v5.2/expected_attachment.rbi +3 -3
  74. data/spec/test_data/v5.2/expected_blob.rbi +3 -3
  75. data/spec/test_data/v5.2/expected_helpers.rbi +1 -1
  76. data/spec/test_data/v5.2/expected_helpers_with_application_and_devise_helpers.rbi +1 -1
  77. data/spec/test_data/v5.2/expected_internal_metadata.rbi +3 -3
  78. data/spec/test_data/v5.2/expected_potion.rbi +3 -3
  79. data/spec/test_data/v5.2/expected_schema_migration.rbi +3 -3
  80. data/spec/test_data/v5.2/expected_spell_book.rbi +3 -3
  81. data/spec/test_data/v5.2/expected_wand.rbi +3 -3
  82. data/spec/test_data/v5.2/expected_wizard.rbi +3 -3
  83. data/spec/test_data/v5.2/expected_wizard_wo_spellbook.rbi +3 -3
  84. data/spec/test_data/v6.0/expected_attachment.rbi +3 -3
  85. data/spec/test_data/v6.0/expected_blob.rbi +3 -3
  86. data/spec/test_data/v6.0/expected_helpers.rbi +1 -1
  87. data/spec/test_data/v6.0/expected_helpers_with_application_and_devise_helpers.rbi +1 -1
  88. data/spec/test_data/v6.0/expected_internal_metadata.rbi +3 -3
  89. data/spec/test_data/v6.0/expected_potion.rbi +3 -3
  90. data/spec/test_data/v6.0/expected_schema_migration.rbi +3 -3
  91. data/spec/test_data/v6.0/expected_spell_book.rbi +3 -3
  92. data/spec/test_data/v6.0/expected_wand.rbi +3 -3
  93. data/spec/test_data/v6.0/expected_wizard.rbi +3 -3
  94. data/spec/test_data/v6.0/expected_wizard_wo_spellbook.rbi +3 -3
  95. metadata +12 -33
  96. data/spec/test_data/v5.2-no-sorbet/expected_attachment.rbi +0 -725
  97. data/spec/test_data/v5.2-no-sorbet/expected_blob.rbi +0 -755
  98. data/spec/test_data/v5.2-no-sorbet/expected_helpers.rbi +0 -22
  99. data/spec/test_data/v5.2-no-sorbet/expected_helpers_with_application_and_devise_helpers.rbi +0 -29
  100. data/spec/test_data/v5.2-no-sorbet/expected_internal_metadata.rbi +0 -749
  101. data/spec/test_data/v5.2-no-sorbet/expected_no_routes.rbi +0 -4
  102. data/spec/test_data/v5.2-no-sorbet/expected_potion.rbi +0 -708
  103. data/spec/test_data/v5.2-no-sorbet/expected_routes.rbi +0 -54
  104. data/spec/test_data/v5.2-no-sorbet/expected_schema_migration.rbi +0 -722
  105. data/spec/test_data/v5.2-no-sorbet/expected_spell_book.rbi +0 -822
  106. data/spec/test_data/v5.2-no-sorbet/expected_srb_tc_output.txt +0 -1
  107. data/spec/test_data/v5.2-no-sorbet/expected_wand.rbi +0 -933
  108. data/spec/test_data/v5.2-no-sorbet/expected_wizard.rbi +0 -885
  109. data/spec/test_data/v5.2-no-sorbet/expected_wizard_wo_spellbook.rbi +0 -885
@@ -1,7 +1,6 @@
1
1
  # typed: true
2
2
  require "rails"
3
3
  require "sorbet-runtime"
4
- require "sorbet-rails/custom_finder_methods"
5
4
  require "sorbet-rails/config"
6
5
 
7
6
  class SorbetRails::Railtie < Rails::Railtie
@@ -14,6 +13,9 @@ class SorbetRails::Railtie < Rails::Railtie
14
13
 
15
14
  initializer "sorbet-rails.initialize" do
16
15
  ActiveSupport.on_load(:active_record) do
16
+ require "sorbet-rails/rails_mixins/active_record_overrides"
17
+ require "sorbet-rails/rails_mixins/custom_finder_methods"
18
+
17
19
  ActiveRecord::Base.extend SorbetRails::CustomFinderMethods
18
20
  ActiveRecord::Relation.include SorbetRails::CustomFinderMethods
19
21
 
@@ -33,6 +35,11 @@ class SorbetRails::Railtie < Rails::Railtie
33
35
  end
34
36
  end
35
37
 
38
+ ActiveSupport.on_load(:action_controller) do
39
+ require "sorbet-rails/rails_mixins/custom_params_methods"
40
+ ActionController::Parameters.include SorbetRails::CustomParamsMethods
41
+ end
42
+
36
43
  SorbetRails.register_configured_plugins
37
44
  end
38
45
  end
@@ -44,8 +44,7 @@ class SorbetRails::RoutesRbiFormatter
44
44
 
45
45
  sig { returns(String) }
46
46
  def result
47
- # by default parlour doesn't add a \n at the end of file
48
- @parlour.rbi + "\n"
47
+ @parlour.rbi
49
48
  end
50
49
 
51
50
  private
@@ -4,13 +4,21 @@ require("sorbet-rails/helper_rbi_formatter")
4
4
  require("sorbet-rails/mailer_rbi_formatter")
5
5
  require("sorbet-rails/utils")
6
6
 
7
+ RAILS_RBI_RAKE_DIR = File.dirname(__FILE__)
8
+
7
9
  namespace :rails_rbi do
8
10
  desc "Generate rbis for rails models, routes, and helpers."
9
11
  task :all, :environment do |t, args|
12
+ # reset rails-rbi folder
13
+ rails_rbi_root_path = Rails.root.join("sorbet", "rails-rbi")
14
+ FileUtils.rm_rf(rails_rbi_root_path)
15
+
16
+ # run all rake tasks
10
17
  Rake::Task['rails_rbi:routes'].invoke
11
18
  Rake::Task['rails_rbi:models'].invoke
12
19
  Rake::Task['rails_rbi:helpers'].invoke
13
20
  Rake::Task['rails_rbi:mailers'].invoke
21
+ Rake::Task['rails_rbi:params'].invoke
14
22
  end
15
23
 
16
24
  desc "Generate rbis for rails routes"
@@ -24,6 +32,11 @@ namespace :rails_rbi do
24
32
  File.write(file_path, inspector.format(SorbetRails::RoutesRbiFormatter.new))
25
33
  end
26
34
 
35
+ desc "Copy additional rbis for ActionController::Parameters"
36
+ task params: :environment do
37
+ copy_bundled_rbi('parameters.rbi')
38
+ end
39
+
27
40
  desc "Generate rbis for rails models. Pass models name to regenerate rbi for only the given models."
28
41
  task models: :environment do |t, args|
29
42
  SorbetRails::Utils.rails_eager_load_all!
@@ -119,4 +132,13 @@ namespace :rails_rbi do
119
132
  whitelisted_models << ActiveRecord::SchemaMigration if Object.const_defined?('ActiveRecord::SchemaMigration')
120
133
  whitelisted_models
121
134
  end
135
+
136
+ def copy_bundled_rbi(filename)
137
+ puts "rails rbi rake dir #{RAILS_RBI_RAKE_DIR}"
138
+ bundled_rbi_file_path = File.join(RAILS_RBI_RAKE_DIR, "..", "..", "bundled_rbi", filename)
139
+ copy_to_path = Rails.root.join("sorbet", "rails-rbi", filename)
140
+ FileUtils.mkdir_p(File.dirname(copy_to_path))
141
+ puts "file path to copy #{bundled_rbi_file_path}"
142
+ FileUtils.cp(bundled_rbi_file_path, copy_to_path)
143
+ end
122
144
  end
@@ -0,0 +1,18 @@
1
+ # typed: true
2
+ require 'sorbet-runtime'
3
+ require 'sorbet-rails/type_assert/type_assert_interface'
4
+ require 'sorbet-rails/type_assert/type_assert_impl'
5
+
6
+ class TA
7
+ extend T::Sig
8
+ extend T::Generic
9
+ include ITypeAssert
10
+ include TypeAssertImpl
11
+
12
+ Elem = type_member
13
+
14
+ sig { override.params(val: T.untyped).returns(Elem) }
15
+ def assert(val)
16
+ val # assertion happens in the Impl module
17
+ end
18
+ end
@@ -0,0 +1,26 @@
1
+ # typed: ignore
2
+ require 'sorbet-runtime'
3
+
4
+ module TypeAssertImpl
5
+ def self.included(klass)
6
+ klass.define_singleton_method(:[]) do |*types|
7
+ if types.length != 1
8
+ raise Unsupported.new("TypeAssert only supports 1 type, given #{types}")
9
+ end
10
+ type = types.first
11
+ return Class.new do
12
+ include ITypeAssert
13
+
14
+ define_method(:to_s) { "TA[#{type.to_s}]" }
15
+
16
+ define_method(:assert) do |val|
17
+ T.let(val, type)
18
+ end
19
+
20
+ define_method(:get_type) { type }
21
+ end
22
+ end
23
+ end
24
+
25
+ class Unsupported < StandardError; end
26
+ end
@@ -0,0 +1,16 @@
1
+ # typed: true
2
+ require ('sorbet-runtime')
3
+
4
+ module ITypeAssert
5
+ extend T::Sig
6
+ extend T::Generic
7
+
8
+ Elem = type_member(:out)
9
+
10
+ abstract!
11
+
12
+ sig { abstract.params(val: T.untyped).returns(Elem) }
13
+ def assert(val); end
14
+
15
+ def get_type; Elem; end
16
+ end
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = %q{sorbet-rails}
3
- s.version = "0.5.4"
3
+ s.version = "0.5.5"
4
4
  s.date = %q{2019-04-18}
5
5
  s.summary = %q{Set of tools to make Sorbet work with Rails seamlessly.}
6
6
  s.authors = ["Chan Zuckerberg Initiative"]
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
15
15
  `git ls-files -z`.split("\x0").select { |f| f.match(%r{^(test|spec|features)/}) }
16
16
  end
17
17
 
18
- s.add_dependency 'parlour', '~> 0.6.0'
18
+ s.add_dependency 'parlour', '~> 0.8.0'
19
19
 
20
20
  # Development
21
21
  s.add_development_dependency 'rspec', '~> 3.8', '>= 3.8'
@@ -32,6 +32,11 @@ RSpec.describe SorbetRails::CustomFinderMethods do
32
32
  expect(with_splash.size).to eql(3)
33
33
  end
34
34
 
35
+ it 'works with empty array' do
36
+ with_no_element = Wizard.find_n([])
37
+ expect(with_no_element).to eql([])
38
+ end
39
+
35
40
  it 'works with single id array' do
36
41
  with_one_element = Wizard.find_n([wizard_ids.first])
37
42
  expect(with_one_element.size).to eql(1)
@@ -0,0 +1,138 @@
1
+ require 'rails_helper'
2
+
3
+ describe ActionController::Parameters do
4
+ let!(:params) do
5
+ ActionController::Parameters.new({
6
+ age: 11,
7
+ name: 'Harry Potter',
8
+ info: {
9
+ birthday: Date.parse('1980-07-31'),
10
+ friends: [
11
+ 'Hermione',
12
+ 'Ron',
13
+ ],
14
+ grandson: nil,
15
+ },
16
+ })
17
+ end
18
+ let!(:params_info) { params.require(:info) }
19
+
20
+ context 'require_typed' do
21
+ it 'gets basic param correctly' do
22
+ val = params.require_typed(:age, TA[Integer].new)
23
+ expect(val).to eql(11)
24
+
25
+ val = params.require_typed(:name, TA[String].new)
26
+ expect(val).to eql('Harry Potter')
27
+ end
28
+
29
+ it 'gets param with complex type correctly' do
30
+ val = params.require_typed(:age, TA[T.any(String, Integer)].new)
31
+ expect(val).to eql(11)
32
+ end
33
+
34
+ it 'gets param object correctly' do
35
+ val = params.require_typed(:info, TA[ActionController::Parameters].new)
36
+ expect(val.is_a?(ActionController::Parameters))
37
+ expect(val).to eql(params_info)
38
+
39
+ friends = val.require_typed(:friends, TA[T::Array[String]].new)
40
+ expect(friends).to eql([
41
+ 'Hermione',
42
+ 'Ron',
43
+ ])
44
+ end
45
+
46
+ it 'raises error when param doesnt exist' do
47
+ expect {
48
+ params.require_typed(:nonexistence, TA[String].new)
49
+ }.to raise_error(ActionController::ParameterMissing)
50
+ end
51
+
52
+ it 'raises error when param is nil' do
53
+ expect {
54
+ params_info.require_typed(:grandson, TA[T::Array[String]].new)
55
+ }.to raise_error(ActionController::ParameterMissing)
56
+ end
57
+
58
+ it 'raises error when param has wrong type' do
59
+ expect {
60
+ params.require_typed(:age, TA[String].new)
61
+ }.to raise_error(ActionController::BadRequest)
62
+ end
63
+
64
+ it 'raises error when param has wrong complex type' do
65
+ expect {
66
+ params.require_typed(:age, TA[T::Array[String]].new)
67
+ }.to raise_error(ActionController::BadRequest)
68
+ end
69
+ end
70
+
71
+ context 'fetch_typed' do
72
+ it 'gets basic param correctly' do
73
+ val = params.fetch_typed(:age, TA[Integer].new)
74
+ expect(val).to eql(11)
75
+
76
+ val = params.fetch_typed(:name, TA[String].new)
77
+ expect(val).to eql('Harry Potter')
78
+ end
79
+
80
+ it 'gets param object correctly' do
81
+ val = params.fetch_typed(:info, TA[ActionController::Parameters].new)
82
+ expect(val.is_a?(ActionController::Parameters))
83
+ expect(val).to eql(params_info)
84
+
85
+ friends = val.fetch_typed(:friends, TA[T::Array[String]].new)
86
+ expect(friends).to eql([
87
+ 'Hermione',
88
+ 'Ron',
89
+ ])
90
+ end
91
+
92
+ it 'raises error when param doesnt exist' do
93
+ expect {
94
+ val = params.fetch_typed(:nonexistence, TA[String].new)
95
+ }.to raise_error(ActionController::ParameterMissing)
96
+ end
97
+
98
+ it 'raises error when param has wrong type' do
99
+ expect {
100
+ val = params.fetch_typed(:age, TA[String].new)
101
+ }.to raise_error(ActionController::BadRequest)
102
+ end
103
+
104
+ it 'returns nil when param is nil' do
105
+ grandson = params_info.fetch_typed(:grandson, TA[T.nilable(T::Array[String])].new)
106
+ expect(grandson).to eql(nil)
107
+ end
108
+
109
+ context 'when there is a default value' do
110
+ it 'uses default value when param is nil and has a default' do
111
+ fetched = params.fetch_typed(:nonexistence, TA[T::Array[String]].new, [])
112
+ expect(fetched).to eql([])
113
+ end
114
+
115
+ it 'ignores default value when there is a real value' do
116
+ name = params.fetch_typed(:name, TA[String].new, 'John Doe')
117
+ expect(name).to eql('Harry Potter')
118
+ end
119
+
120
+ it 'converts hash default value into a params' do
121
+ # this is `fetch` documented behavior
122
+ fetched = params.fetch_typed(
123
+ :nonexistence,
124
+ TA[ActionController::Parameters].new,
125
+ { unknown: "baby" },
126
+ )
127
+ expect(fetched.is_a?(ActionController::Parameters)).to be(true)
128
+ expect(fetched.permit(:unknown).to_h).to eql({ "unknown" => "baby" })
129
+ end
130
+
131
+ it 'raises error when param is nil and given a wrong default' do
132
+ expect {
133
+ fetched = params.fetch_typed(:nonexistence, TA[T::Array].new, 5)
134
+ }.to raise_error(ActionController::BadRequest)
135
+ end
136
+ end
137
+ end
138
+ end
@@ -170,3 +170,52 @@ if ENV["RAILS_VERSION"] != "4.2"
170
170
  T.assert_type!(wizard.brown_hair?, T::Boolean)
171
171
  end
172
172
 
173
+ # -- Custom ActionController::Parameters Methods
174
+ params = ActionController::Parameters.new({
175
+ age: 11,
176
+ name: 'Harry Potter',
177
+ info: {
178
+ birthday: Date.parse('1980-07-31'),
179
+ friends: [
180
+ 'Hermione',
181
+ 'Ron',
182
+ ],
183
+ grandson: nil,
184
+ },
185
+ })
186
+ # -- require_typed
187
+ T.assert_type!(
188
+ params.require_typed(:age, TA[Integer].new),
189
+ Integer,
190
+ )
191
+ T.assert_type!(
192
+ params.require_typed(:name, TA[String].new),
193
+ String,
194
+ )
195
+ info = params.require_typed(:info, TA[ActionController::Parameters].new)
196
+ T.assert_type!(info, ActionController::Parameters)
197
+ T.assert_type!(
198
+ info.require_typed(:friends, TA[T::Array[String]].new),
199
+ T::Array[String],
200
+ )
201
+ # -- fetch_typed
202
+ T.assert_type!(
203
+ params.fetch_typed(:age, TA[Integer].new),
204
+ Integer,
205
+ )
206
+ T.assert_type!(
207
+ params.fetch_typed(:name, TA[String].new),
208
+ String,
209
+ )
210
+ T.assert_type!(
211
+ params.fetch_typed(:nonexistence, TA[String].new, ''),
212
+ String,
213
+ )
214
+ T.assert_type!(
215
+ params.fetch_typed(:nonexistence, TA[T.nilable(String)].new, nil),
216
+ T.nilable(String),
217
+ )
218
+ T.assert_type!(
219
+ params.fetch_typed(:nonexistence, TA[T::Array[Integer]].new, []),
220
+ T::Array[Integer],
221
+ )
@@ -2,6 +2,9 @@ require 'rails_helper'
2
2
  require 'sorbet-rails/model_rbi_formatter'
3
3
 
4
4
  RSpec.describe SorbetRails::ModelRbiFormatter do
5
+ before(:all) do
6
+ SorbetRails::Utils.rails_eager_load_all!
7
+ end
5
8
 
6
9
  it 'does not throw an error when given an abstract class' do
7
10
  formatter = SorbetRails::ModelRbiFormatter.new(Potion, Set.new(['Potion']))
@@ -13,8 +16,10 @@ RSpec.describe SorbetRails::ModelRbiFormatter do
13
16
 
14
17
  it 'generates correct rbi file for Wizard' do
15
18
  class_set = Set.new(['Wizard', 'Wand', 'SpellBook'])
16
- if ['5.2', '6.0'].include?(ENV['RAILS_VERSION'])
19
+ if Object.const_defined?('ActiveStorage::Attachment')
17
20
  class_set << 'ActiveStorage::Attachment'
21
+ end
22
+ if Object.const_defined?('ActiveStorage::Blob')
18
23
  class_set << 'ActiveStorage::Blob'
19
24
  end
20
25
  formatter = SorbetRails::ModelRbiFormatter.new(Wizard, class_set)
@@ -35,11 +40,13 @@ RSpec.describe SorbetRails::ModelRbiFormatter do
35
40
  context 'there is a hidden model' do
36
41
  it 'fallbacks to use ActiveRecord::Relation' do
37
42
  class_set = Set.new(['Wizard', 'Wand'])
38
- if ['5.2', '6.0'].include?(ENV['RAILS_VERSION'])
43
+ if Object.const_defined?('ActiveStorage::Attachment')
39
44
  class_set << 'ActiveStorage::Attachment'
45
+ end
46
+ if Object.const_defined?('ActiveStorage::Blob')
40
47
  class_set << 'ActiveStorage::Blob'
41
48
  end
42
- formatter = SorbetRails::ModelRbiFormatter.new(Wizard, class_set)
49
+ formatter = SorbetRails::ModelRbiFormatter.new(Wizard, class_set)
43
50
  expect_match_file(
44
51
  formatter.generate_rbi,
45
52
  'expected_wizard_wo_spellbook.rbi',
@@ -53,15 +53,11 @@ RSpec.describe 'sorbet' do
53
53
  'bundle', 'exec', 'srb', 'rbi', 'hidden-definitions',
54
54
  chdir: Rails.root.to_path,
55
55
  )
56
- puts '--- srb rbi hidden-definitions ---'
57
- puts stdout, stderr, status
58
56
 
59
57
  stdout, stderr, status = Open3.capture3(
60
58
  'bundle', 'exec', 'srb', 'rbi', 'todo',
61
59
  chdir: Rails.root.to_path,
62
60
  )
63
- puts '--- srb rbi todo ---'
64
- puts stdout, stderr, status
65
61
  end
66
62
 
67
63
  it 'returns expected sorbet tc result' do
@@ -86,6 +82,6 @@ RSpec.describe 'sorbet' do
86
82
  'bundle', 'exec', 'srb', 'tc', '--lsp',
87
83
  chdir: Rails.root.to_path,
88
84
  )
89
- expect(status.exitstatus).to eql(0)
85
+ expect(status.exitstatus).to eql(10)
90
86
  end
91
87
  end
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: ../../..
3
3
  specs:
4
- sorbet-rails (0.5.3)
5
- parlour (~> 0.6.0)
4
+ sorbet-rails (0.5.5)
5
+ parlour (~> 0.8.0)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
@@ -63,7 +63,7 @@ GEM
63
63
  minitest (5.11.3)
64
64
  nokogiri (1.10.4)
65
65
  mini_portile2 (~> 2.4.0)
66
- parlour (0.6.1)
66
+ parlour (0.8.0)
67
67
  rainbow (~> 3.0.0)
68
68
  sorbet-runtime
69
69
  rack (1.6.11)