sorbet-rails 0.7.0 → 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitattributes +1 -2
- data/.gitignore +2 -1
- data/.travis.yml +1 -1
- data/README.md +51 -4
- data/Rakefile +3 -3
- data/lib/bundled_rbi/customizabel_rbi_formatter.rbi +29 -0
- data/lib/bundled_rbi/pluck_to_tstruct.rbi +2 -1
- data/lib/sorbet-rails.rb +1 -1
- data/lib/sorbet-rails/config.rb +11 -0
- data/lib/sorbet-rails/deprecation.rb +1 -0
- data/lib/sorbet-rails/gem_plugins/kaminari_plugin.rb +8 -0
- data/lib/sorbet-rails/job_rbi_formatter.rb +73 -62
- data/lib/sorbet-rails/mailer_rbi_formatter.rb +40 -27
- data/lib/sorbet-rails/model_column_utils.rb +129 -0
- data/lib/sorbet-rails/model_plugins/active_record_assoc.rb +28 -1
- data/lib/sorbet-rails/model_plugins/active_record_attribute.rb +0 -102
- data/lib/sorbet-rails/model_plugins/base.rb +0 -10
- data/lib/sorbet-rails/model_utils.rb +5 -2
- data/lib/sorbet-rails/rails_mixins/pluck_to_tstruct.rb +17 -7
- data/lib/sorbet-rails/sorbet_utils.rb +152 -150
- data/lib/sorbet-rails/tasks/rails_rbi.rake +3 -3
- data/sorbet-rails.gemspec +1 -1
- data/spec/job_rbi_formatter_spec.rb +1 -1
- data/spec/pluck_to_tstruct_spec.rb +74 -1
- data/spec/rails_helper.rb +2 -2
- data/spec/rake_rails_rbi_jobs_spec.rb +20 -0
- data/spec/rake_rails_rbi_mailers_spec.rb +21 -0
- data/spec/support/v5.0/Gemfile +1 -1
- data/spec/support/v5.0/Gemfile.lock +8 -8
- data/spec/support/v5.1/Gemfile.lock +6 -6
- data/spec/support/v5.2/Gemfile +1 -1
- data/spec/support/v5.2/Gemfile.lock +8 -8
- data/spec/support/v6.0/.gitignore +6 -0
- data/spec/support/v6.0/Gemfile +3 -3
- data/spec/support/v6.0/Gemfile.lock +76 -75
- data/spec/support/v6.0/bin/bundle +22 -13
- data/spec/support/v6.0/config/environments/test.rb +1 -1
- data/spec/support/v6.0/tmp/pids/.keep +0 -0
- data/spec/test_data/v5.0/expected_custom_application_job.rbi +21 -0
- data/spec/test_data/v5.0/expected_custom_application_mailer.rbi +6 -0
- data/spec/test_data/v5.0/expected_custom_award_house_point_hourglasses.rbi +21 -0
- data/spec/test_data/v5.0/expected_custom_daily_prophet_mailer.rbi +8 -0
- data/spec/test_data/v5.0/expected_custom_hogwarts_acceptance_mailer.rbi +21 -0
- data/spec/test_data/v5.0/expected_headmaster.rbi +18 -0
- data/spec/test_data/v5.0/expected_potion.rbi +9 -0
- data/spec/test_data/v5.0/expected_robe.rbi +9 -0
- data/spec/test_data/v5.0/expected_school.rbi +9 -0
- data/spec/test_data/v5.0/expected_spell/habtm_spell_books.rbi +18 -0
- data/spec/test_data/v5.0/expected_spell_book.rbi +9 -0
- data/spec/test_data/v5.0/expected_spell_book/habtm_spells.rbi +18 -0
- data/spec/test_data/v5.0/expected_squib.rbi +18 -0
- data/spec/test_data/v5.0/expected_subject/habtm_wizards.rbi +18 -0
- data/spec/test_data/v5.0/expected_wand.rbi +9 -0
- data/spec/test_data/v5.0/expected_wizard.rbi +18 -0
- data/spec/test_data/v5.0/expected_wizard/habtm_subjects.rbi +18 -0
- data/spec/test_data/v5.0/expected_wizard_wo_spellbook.rbi +18 -0
- data/spec/test_data/v5.1/expected_custom_application_job.rbi +21 -0
- data/spec/test_data/v5.1/expected_custom_application_mailer.rbi +6 -0
- data/spec/test_data/v5.1/expected_custom_award_house_point_hourglasses.rbi +21 -0
- data/spec/test_data/v5.1/expected_custom_daily_prophet_mailer.rbi +8 -0
- data/spec/test_data/v5.1/expected_custom_hogwarts_acceptance_mailer.rbi +21 -0
- data/spec/test_data/v5.1/expected_headmaster.rbi +18 -0
- data/spec/test_data/v5.1/expected_potion.rbi +9 -0
- data/spec/test_data/v5.1/expected_robe.rbi +9 -0
- data/spec/test_data/v5.1/expected_school.rbi +9 -0
- data/spec/test_data/v5.1/expected_spell/habtm_spell_books.rbi +18 -0
- data/spec/test_data/v5.1/expected_spell_book.rbi +9 -0
- data/spec/test_data/v5.1/expected_spell_book/habtm_spells.rbi +18 -0
- data/spec/test_data/v5.1/expected_squib.rbi +18 -0
- data/spec/test_data/v5.1/expected_subject/habtm_wizards.rbi +18 -0
- data/spec/test_data/v5.1/expected_wand.rbi +9 -0
- data/spec/test_data/v5.1/expected_wizard.rbi +18 -0
- data/spec/test_data/v5.1/expected_wizard/habtm_subjects.rbi +18 -0
- data/spec/test_data/v5.1/expected_wizard_wo_spellbook.rbi +18 -0
- data/spec/test_data/v5.2/expected_attachment.rbi +18 -0
- data/spec/test_data/v5.2/expected_blob.rbi +19 -1
- data/spec/test_data/v5.2/expected_custom_application_job.rbi +21 -0
- data/spec/test_data/v5.2/expected_custom_application_mailer.rbi +6 -0
- data/spec/test_data/v5.2/expected_custom_award_house_point_hourglasses.rbi +21 -0
- data/spec/test_data/v5.2/expected_custom_daily_prophet_mailer.rbi +8 -0
- data/spec/test_data/v5.2/expected_custom_hogwarts_acceptance_mailer.rbi +21 -0
- data/spec/test_data/v5.2/expected_headmaster.rbi +18 -0
- data/spec/test_data/v5.2/expected_potion.rbi +9 -0
- data/spec/test_data/v5.2/expected_robe.rbi +9 -0
- data/spec/test_data/v5.2/expected_school.rbi +9 -0
- data/spec/test_data/v5.2/expected_spell/habtm_spell_books.rbi +18 -0
- data/spec/test_data/v5.2/expected_spell_book.rbi +9 -0
- data/spec/test_data/v5.2/expected_spell_book/habtm_spells.rbi +18 -0
- data/spec/test_data/v5.2/expected_squib.rbi +38 -2
- data/spec/test_data/v5.2/expected_subject/habtm_wizards.rbi +18 -0
- data/spec/test_data/v5.2/expected_wand.rbi +9 -0
- data/spec/test_data/v5.2/expected_wizard.rbi +38 -2
- data/spec/test_data/v5.2/expected_wizard/habtm_subjects.rbi +18 -0
- data/spec/test_data/v5.2/expected_wizard_wo_spellbook.rbi +38 -2
- data/spec/test_data/v6.0/expected_attachment.rbi +18 -0
- data/spec/test_data/v6.0/expected_blob.rbi +19 -1
- data/spec/test_data/v6.0/expected_custom_application_job.rbi +21 -0
- data/spec/test_data/v6.0/expected_custom_application_mailer.rbi +6 -0
- data/spec/test_data/v6.0/expected_custom_award_house_point_hourglasses.rbi +21 -0
- data/spec/test_data/v6.0/expected_custom_daily_prophet_mailer.rbi +8 -0
- data/spec/test_data/v6.0/expected_custom_hogwarts_acceptance_mailer.rbi +21 -0
- data/spec/test_data/v6.0/expected_headmaster.rbi +18 -0
- data/spec/test_data/v6.0/expected_potion.rbi +9 -0
- data/spec/test_data/v6.0/expected_robe.rbi +9 -0
- data/spec/test_data/v6.0/expected_school.rbi +9 -0
- data/spec/test_data/v6.0/expected_spell/habtm_spell_books.rbi +18 -0
- data/spec/test_data/v6.0/expected_spell_book.rbi +9 -0
- data/spec/test_data/v6.0/expected_spell_book/habtm_spells.rbi +18 -0
- data/spec/test_data/v6.0/expected_squib.rbi +38 -2
- data/spec/test_data/v6.0/expected_subject/habtm_wizards.rbi +18 -0
- data/spec/test_data/v6.0/expected_wand.rbi +9 -0
- data/spec/test_data/v6.0/expected_wizard.rbi +38 -2
- data/spec/test_data/v6.0/expected_wizard/habtm_subjects.rbi +18 -0
- data/spec/test_data/v6.0/expected_wizard_wo_spellbook.rbi +38 -2
- metadata +45 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cc9807ef098eeb05a61378ffe82fa56864f5d0543ba20031153bd86ac604a356
|
4
|
+
data.tar.gz: e9fa8ed4c3390685d352486d3bde21b4301ce3f9d1b600b79198aba797bee560
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0374a3b24474fbf04051edfdf372b11132dcd4293d9cca7a1a692e15e63aad07a55d5f72c10830bb96799aa31d175ffd20584d81c58bbee2b4c293c27ddcc33f
|
7
|
+
data.tar.gz: a8826daddfef144295b9df4438e669e7cf42d494666d47073f7868b6481c329b9e8058cc2d308598c0d34035065d6b2f1c7611113a85c5a0b8912f91af363d3c
|
data/.gitattributes
CHANGED
data/.gitignore
CHANGED
@@ -79,6 +79,7 @@ build-iPhoneSimulator/
|
|
79
79
|
/spec/support/**/config/credentials.yml.enc
|
80
80
|
|
81
81
|
# Ignore sorbet generated files
|
82
|
+
/sorbet/rbi/hidden-definitions/
|
82
83
|
/spec/support/**/sorbet/*
|
83
84
|
/spec/support/**/sorbet/**/*
|
84
85
|
|
@@ -93,7 +94,7 @@ build-iPhoneSimulator/
|
|
93
94
|
*.swl
|
94
95
|
*.swk
|
95
96
|
|
96
|
-
|
97
|
+
sorbet/rbi/hidden-definitions/errors.txt
|
97
98
|
.vscode
|
98
99
|
|
99
100
|
.rake_tasks~
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -94,6 +94,28 @@ Wizard.pluck_to_tstruct(TA[WizardStruct].new) # T::Array[WizardStruct]
|
|
94
94
|
Wizard.all.pluck_to_tstruct(TA[WizardStruct].new) # T::Array[WizardStruct]
|
95
95
|
```
|
96
96
|
|
97
|
+
You can also pass a keyword argument called `associations` that represents a mapping of a `T::Struct`'s keys to an associated table's columns.
|
98
|
+
```ruby
|
99
|
+
# -- API
|
100
|
+
Arel.pluck_to_tstruct(TA[ <TStructSubclass> ].new, associations: < Hash<Symbol, String> >)
|
101
|
+
|
102
|
+
# -- example
|
103
|
+
class WizardWithWandStruct < T::Struct
|
104
|
+
const :name, String
|
105
|
+
const :house, T.nilable(String)
|
106
|
+
const :wand_wood_type, String
|
107
|
+
end
|
108
|
+
|
109
|
+
Wizard.joins(:wand).pluck_to_tstruct(
|
110
|
+
TA[WizardWithWandStruct].new,
|
111
|
+
associations: { wand_wood_type: "wands.wood_type" }
|
112
|
+
)
|
113
|
+
Wizard.all.joins(:wand).pluck_to_tstruct(
|
114
|
+
TA[WizardWithWandStruct].new,
|
115
|
+
associations: { wand_wood_type: "wands.wood_type" }
|
116
|
+
)
|
117
|
+
````
|
118
|
+
|
97
119
|
This method is based on [pluck_to_hash](https://github.com/girishso/pluck_to_hash) gem.
|
98
120
|
|
99
121
|
#### `typed_enum` instead of `enum`
|
@@ -412,11 +434,13 @@ If you run into the following issue when running rspec, it's likely because you'
|
|
412
434
|
if you're really stuck.
|
413
435
|
```
|
414
436
|
|
415
|
-
## Extending
|
437
|
+
## Extending RBI Generation logic
|
438
|
+
|
439
|
+
### Extending Model Generation Task with Custom Plugins
|
416
440
|
|
417
441
|
`sorbet-rails` support a customizable plugin system that you can use to generate additional RBI for each model. This will be useful to generate RBI for methods dynamically added by gems or private concerns. If you write plugins for public gems, please feel free to contribute it to this repo.
|
418
442
|
|
419
|
-
|
443
|
+
#### Defining a Custom `ModelPlugin`
|
420
444
|
|
421
445
|
A custom plugin should be a subclass of `SorbetRails::ModelPlugins::Base`. Each plugin would implement a `generate(root)` method that generate additional rbi for the model.
|
422
446
|
|
@@ -465,14 +489,14 @@ It is also recommended to check if the generated methods are detected by `sorbet
|
|
465
489
|
|
466
490
|
Check out the [plugins](https://github.com/chanzuckerberg/sorbet-rails/tree/master/lib/sorbet-rails/model_plugins) written for `sorbet-rails`'s own model RBI generation logic for examples.
|
467
491
|
|
468
|
-
|
492
|
+
#### Registering new plugins
|
469
493
|
You can register your plugins in an initializer:
|
470
494
|
```ruby
|
471
495
|
# -- config/initializers/sorbet_rails.rb
|
472
496
|
SorbetRails::ModelRbiFormatter.register_plugin(MyCustomPlugin)
|
473
497
|
```
|
474
498
|
|
475
|
-
|
499
|
+
#### Enabling built-in plugins
|
476
500
|
|
477
501
|
sorbet-rails comes with a handful of gem plugins that can be enabled in an initializer. You can pass enabled gem plugins to `config.enabled_gem_plugins`, like so:
|
478
502
|
|
@@ -508,6 +532,29 @@ You can also configure the core model plugins if needed. The default plugins are
|
|
508
532
|
[active_flag]: https://github.com/kenn/active_flag
|
509
533
|
[Paperclip]: https://github.com/thoughtbot/paperclip
|
510
534
|
|
535
|
+
### Customize Generation Class
|
536
|
+
|
537
|
+
For mailer and job rbi generation, you can customize the logic by
|
538
|
+
setting the generation class in the config:
|
539
|
+
|
540
|
+
```ruby
|
541
|
+
SorbetRails.configure do |config|
|
542
|
+
config.job_generator_class = CustomJobRbiGenerator
|
543
|
+
config.mailer_generator_class = CustomMailerRbiGenerator
|
544
|
+
end
|
545
|
+
```
|
546
|
+
|
547
|
+
The custom generator can subclass the [provided generators](lib/bundled_rbi/customizabel_rbi_formatter.rbi) and override the populate_rbi method. For example:
|
548
|
+
|
549
|
+
```ruby
|
550
|
+
class CustomJobRbiGenerator < SorbetRails::JobRbiFormatter
|
551
|
+
def populate_rbi
|
552
|
+
rbi_generator.root.add_comment("== Custom Generator ==")
|
553
|
+
super
|
554
|
+
end
|
555
|
+
end
|
556
|
+
```
|
557
|
+
|
511
558
|
## Contributing
|
512
559
|
|
513
560
|
Contributions and ideas are welcome! Please see [our contributing guide](CONTRIBUTING.md) and don't hesitate to open an issue or send a pull request to improve the functionality of this gem.
|
data/Rakefile
CHANGED
@@ -20,9 +20,9 @@ namespace :update_spec do
|
|
20
20
|
task :v6_0 do |t, args|
|
21
21
|
Bundler.with_clean_env do
|
22
22
|
FileUtils.rm_rf 'spec/support/v6.0' if File.directory?('spec/support/v6.0')
|
23
|
-
system("gem install rails -v 6.0.
|
24
|
-
system("rails _6.0.
|
25
|
-
system("RAILS_VERSION='6.0' rails _6.0.
|
23
|
+
system("gem install rails -v 6.0.3")
|
24
|
+
system("rails _6.0.3_ -v")
|
25
|
+
system("RAILS_VERSION='6.0' rails _6.0.3_ new --template spec/generators/rails-template.rb spec/support/v6.0 --skip-javascript --skip-action-cable --skip-test --skip-sprockets --skip-spring --skip-bootsnap --skip-listen")
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# typed: strong
|
2
|
+
module SorbetRails
|
3
|
+
class MailerRbiFormatter
|
4
|
+
extend T::Sig
|
5
|
+
Parameter = ::Parlour::RbiGenerator::Parameter
|
6
|
+
|
7
|
+
sig { returns(T.class_of(ActionMailer::Base)) }
|
8
|
+
attr_reader :mailer_class
|
9
|
+
|
10
|
+
sig { returns(Parlour::RbiGenerator) }
|
11
|
+
def rbi_generator; end
|
12
|
+
|
13
|
+
sig { void }
|
14
|
+
def populate_rbi; end
|
15
|
+
end
|
16
|
+
|
17
|
+
class JobRbiFormatter
|
18
|
+
Parameter = ::Parlour::RbiGenerator::Parameter
|
19
|
+
|
20
|
+
sig { returns(Parlour::RbiGenerator) }
|
21
|
+
attr_reader :rbi_generator
|
22
|
+
|
23
|
+
sig { returns(T.class_of(ActiveJob::Base)) }
|
24
|
+
attr_reader :job_class
|
25
|
+
|
26
|
+
sig { void }
|
27
|
+
def populate_rbi; end
|
28
|
+
end
|
29
|
+
end
|
@@ -6,10 +6,11 @@ module SorbetRails::PluckToTStruct
|
|
6
6
|
type_parameters(:U).
|
7
7
|
params(
|
8
8
|
ta_struct: ITypeAssert[T.type_parameter(:U)],
|
9
|
+
associations: T::Hash[Symbol, String],
|
9
10
|
).
|
10
11
|
returns(T::Array[T.type_parameter(:U)])
|
11
12
|
}
|
12
|
-
def pluck_to_tstruct(ta_struct,
|
13
|
+
def pluck_to_tstruct(ta_struct, associations: {}); end
|
13
14
|
end
|
14
15
|
|
15
16
|
class ActiveRecord::Base
|
data/lib/sorbet-rails.rb
CHANGED
data/lib/sorbet-rails/config.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
# typed: true
|
2
|
+
require("sorbet-rails/mailer_rbi_formatter")
|
3
|
+
require("sorbet-rails/job_rbi_formatter")
|
4
|
+
|
2
5
|
module SorbetRails
|
3
6
|
class << self
|
4
7
|
extend T::Sig
|
@@ -37,6 +40,12 @@ module SorbetRails
|
|
37
40
|
sig { returns(T::Array[String]) }
|
38
41
|
attr_accessor :extra_helper_includes
|
39
42
|
|
43
|
+
sig { returns(T.class_of(SorbetRails::JobRbiFormatter))}
|
44
|
+
attr_accessor :job_generator_class
|
45
|
+
|
46
|
+
sig { returns(T.class_of(SorbetRails::MailerRbiFormatter))}
|
47
|
+
attr_accessor :mailer_generator_class
|
48
|
+
|
40
49
|
sig { void }
|
41
50
|
def initialize
|
42
51
|
@enabled_gem_plugins = []
|
@@ -52,6 +61,8 @@ module SorbetRails
|
|
52
61
|
]
|
53
62
|
@enabled_model_plugins << :active_storage_methods if defined?(T.unsafe(ActiveStorage))
|
54
63
|
@extra_helper_includes = []
|
64
|
+
@mailer_generator_class = SorbetRails::MailerRbiFormatter
|
65
|
+
@job_generator_class = SorbetRails::JobRbiFormatter
|
55
66
|
end
|
56
67
|
|
57
68
|
sig { returns(T::Array[Symbol]) }
|
@@ -35,5 +35,13 @@ class KaminariPlugin < SorbetRails::ModelPlugins::Base
|
|
35
35
|
Parameter.new('num', type: 'Integer')
|
36
36
|
],
|
37
37
|
)
|
38
|
+
|
39
|
+
# https://github.com/kaminari/kaminari/blob/c5186f5d9b7f23299d115408e62047447fd3189d/kaminari-core/lib/kaminari/models/configuration_methods.rb#L19
|
40
|
+
model_class_rbi = root.create_class(model_class_name)
|
41
|
+
model_class_rbi.create_method(
|
42
|
+
"default_per_page",
|
43
|
+
return_type: "Integer",
|
44
|
+
class_method: true,
|
45
|
+
)
|
38
46
|
end
|
39
47
|
end
|
@@ -2,74 +2,85 @@
|
|
2
2
|
require('parlour')
|
3
3
|
require('sorbet-rails/sorbet_utils.rb')
|
4
4
|
|
5
|
-
|
6
|
-
|
5
|
+
module SorbetRails
|
6
|
+
class JobRbiFormatter
|
7
|
+
extend T::Sig
|
7
8
|
|
8
|
-
|
9
|
+
Parameter = ::Parlour::RbiGenerator::Parameter
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
sig { returns(Parlour::RbiGenerator) }
|
12
|
+
attr_reader :rbi_generator
|
13
|
+
|
14
|
+
sig { returns(T.class_of(ActiveJob::Base)) }
|
15
|
+
attr_reader :job_class
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
|
17
|
+
sig { params(job_class: T.class_of(ActiveJob::Base)).void }
|
18
|
+
def initialize(job_class)
|
19
|
+
@job_class = T.let(job_class, T.class_of(ActiveJob::Base))
|
20
|
+
@rbi_generator = T.let(Parlour::RbiGenerator.new, Parlour::RbiGenerator)
|
21
|
+
end
|
19
22
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
23
|
+
sig { void }
|
24
|
+
def populate_rbi
|
25
|
+
@rbi_generator.root.add_comments([
|
26
|
+
'This is an autogenerated file for Rails\' jobs.',
|
27
|
+
'Please rerun bundle exec rake rails_rbi:jobs to regenerate.'
|
28
|
+
])
|
24
29
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
30
|
+
@rbi_generator.root.create_class(@job_class.name) do |job_rbi|
|
31
|
+
method_def = @job_class.instance_method(:perform)
|
32
|
+
parameters = SorbetRails::SorbetUtils.parameters_from_method_def(method_def)
|
33
|
+
job_rbi.create_method(
|
34
|
+
"perform_later",
|
35
|
+
parameters: parameters,
|
36
|
+
class_method: true,
|
37
|
+
)
|
38
|
+
job_rbi.create_method(
|
39
|
+
"perform_now",
|
40
|
+
parameters: parameters,
|
41
|
+
class_method: true,
|
42
|
+
)
|
43
|
+
# Override the signature for "set" so that we can support it
|
44
|
+
# At run-time, this method returns a `ActiveJob::ConfiguredJob` but
|
45
|
+
# we fake the signature to return "T.self_class" so that
|
46
|
+
# sorbet can type-check when `perform_later` is called on it
|
47
|
+
# See: https://guides.rubyonrails.org/active_job_basics.html#enqueue-the-job
|
48
|
+
job_rbi.create_method(
|
49
|
+
"set",
|
50
|
+
# Documentation: https://api.rubyonrails.org/classes/ActiveJob/Core/ClassMethods.html
|
51
|
+
parameters: [
|
52
|
+
Parameter.new(
|
53
|
+
"wait:",
|
54
|
+
type: "T.nilable(ActiveSupport::Duration)",
|
55
|
+
default: "nil",
|
56
|
+
),
|
57
|
+
Parameter.new(
|
58
|
+
"wait_until:",
|
59
|
+
type: "T.nilable(T.any(ActiveSupport::TimeWithZone, Date, Time))",
|
60
|
+
default: "nil",
|
61
|
+
),
|
62
|
+
Parameter.new(
|
63
|
+
"queue:",
|
64
|
+
type: "T.nilable(T.any(String, Symbol))",
|
65
|
+
default: "nil",
|
66
|
+
),
|
67
|
+
Parameter.new(
|
68
|
+
"priority:",
|
69
|
+
type: "T.nilable(Integer)",
|
70
|
+
default: "nil",
|
71
|
+
),
|
72
|
+
],
|
73
|
+
return_type: "T.self_type",
|
74
|
+
class_method: true,
|
75
|
+
)
|
76
|
+
end
|
71
77
|
end
|
72
78
|
|
73
|
-
|
79
|
+
sig { returns(String) }
|
80
|
+
def generate_rbi
|
81
|
+
puts "-- Generate sigs for mailer #{@job_class.name} --"
|
82
|
+
populate_rbi
|
83
|
+
@rbi_generator.rbi
|
84
|
+
end
|
74
85
|
end
|
75
86
|
end
|
@@ -2,37 +2,50 @@
|
|
2
2
|
require('parlour')
|
3
3
|
require('sorbet-rails/sorbet_utils.rb')
|
4
4
|
|
5
|
-
|
6
|
-
|
5
|
+
module SorbetRails
|
6
|
+
class MailerRbiFormatter
|
7
|
+
extend T::Sig
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
end
|
9
|
+
Parameter = ::Parlour::RbiGenerator::Parameter
|
10
|
+
|
11
|
+
sig { returns(Parlour::RbiGenerator) }
|
12
|
+
attr_reader :rbi_generator
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
14
|
+
sig { returns(T.class_of(ActionMailer::Base)) }
|
15
|
+
attr_reader :mailer_class
|
16
|
+
|
17
|
+
sig { params(mailer_class: T.class_of(ActionMailer::Base)).void }
|
18
|
+
def initialize(mailer_class)
|
19
|
+
@mailer_class = T.let(mailer_class, T.class_of(ActionMailer::Base))
|
20
|
+
@rbi_generator = T.let(Parlour::RbiGenerator.new, Parlour::RbiGenerator)
|
21
|
+
end
|
22
|
+
|
23
|
+
sig { void }
|
24
|
+
def populate_rbi
|
25
|
+
@rbi_generator.root.add_comments([
|
26
|
+
"This is an autogenerated file for Rails' mailers.",
|
27
|
+
'Please rerun bundle exec rake rails_rbi:mailers to regenerate.'
|
28
|
+
])
|
29
|
+
|
30
|
+
@rbi_generator.root.create_class(@mailer_class.name) do |mailer_rbi|
|
31
|
+
@mailer_class.action_methods.to_a.sort.each do |mailer_method|
|
32
|
+
method_def = @mailer_class.instance_method(mailer_method)
|
33
|
+
parameters = SorbetRails::SorbetUtils.parameters_from_method_def(method_def)
|
34
|
+
mailer_rbi.create_method(
|
35
|
+
mailer_method,
|
36
|
+
parameters: parameters,
|
37
|
+
return_type: 'ActionMailer::MessageDelivery',
|
38
|
+
class_method: true,
|
39
|
+
)
|
40
|
+
end
|
33
41
|
end
|
34
42
|
end
|
35
43
|
|
36
|
-
|
44
|
+
sig { returns(String) }
|
45
|
+
def generate_rbi
|
46
|
+
puts "-- Generate sigs for mailer #{@mailer_class.name} --"
|
47
|
+
populate_rbi
|
48
|
+
@rbi_generator.rbi
|
49
|
+
end
|
37
50
|
end
|
38
51
|
end
|