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.
Files changed (116) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +1 -2
  3. data/.gitignore +2 -1
  4. data/.travis.yml +1 -1
  5. data/README.md +51 -4
  6. data/Rakefile +3 -3
  7. data/lib/bundled_rbi/customizabel_rbi_formatter.rbi +29 -0
  8. data/lib/bundled_rbi/pluck_to_tstruct.rbi +2 -1
  9. data/lib/sorbet-rails.rb +1 -1
  10. data/lib/sorbet-rails/config.rb +11 -0
  11. data/lib/sorbet-rails/deprecation.rb +1 -0
  12. data/lib/sorbet-rails/gem_plugins/kaminari_plugin.rb +8 -0
  13. data/lib/sorbet-rails/job_rbi_formatter.rb +73 -62
  14. data/lib/sorbet-rails/mailer_rbi_formatter.rb +40 -27
  15. data/lib/sorbet-rails/model_column_utils.rb +129 -0
  16. data/lib/sorbet-rails/model_plugins/active_record_assoc.rb +28 -1
  17. data/lib/sorbet-rails/model_plugins/active_record_attribute.rb +0 -102
  18. data/lib/sorbet-rails/model_plugins/base.rb +0 -10
  19. data/lib/sorbet-rails/model_utils.rb +5 -2
  20. data/lib/sorbet-rails/rails_mixins/pluck_to_tstruct.rb +17 -7
  21. data/lib/sorbet-rails/sorbet_utils.rb +152 -150
  22. data/lib/sorbet-rails/tasks/rails_rbi.rake +3 -3
  23. data/sorbet-rails.gemspec +1 -1
  24. data/spec/job_rbi_formatter_spec.rb +1 -1
  25. data/spec/pluck_to_tstruct_spec.rb +74 -1
  26. data/spec/rails_helper.rb +2 -2
  27. data/spec/rake_rails_rbi_jobs_spec.rb +20 -0
  28. data/spec/rake_rails_rbi_mailers_spec.rb +21 -0
  29. data/spec/support/v5.0/Gemfile +1 -1
  30. data/spec/support/v5.0/Gemfile.lock +8 -8
  31. data/spec/support/v5.1/Gemfile.lock +6 -6
  32. data/spec/support/v5.2/Gemfile +1 -1
  33. data/spec/support/v5.2/Gemfile.lock +8 -8
  34. data/spec/support/v6.0/.gitignore +6 -0
  35. data/spec/support/v6.0/Gemfile +3 -3
  36. data/spec/support/v6.0/Gemfile.lock +76 -75
  37. data/spec/support/v6.0/bin/bundle +22 -13
  38. data/spec/support/v6.0/config/environments/test.rb +1 -1
  39. data/spec/support/v6.0/tmp/pids/.keep +0 -0
  40. data/spec/test_data/v5.0/expected_custom_application_job.rbi +21 -0
  41. data/spec/test_data/v5.0/expected_custom_application_mailer.rbi +6 -0
  42. data/spec/test_data/v5.0/expected_custom_award_house_point_hourglasses.rbi +21 -0
  43. data/spec/test_data/v5.0/expected_custom_daily_prophet_mailer.rbi +8 -0
  44. data/spec/test_data/v5.0/expected_custom_hogwarts_acceptance_mailer.rbi +21 -0
  45. data/spec/test_data/v5.0/expected_headmaster.rbi +18 -0
  46. data/spec/test_data/v5.0/expected_potion.rbi +9 -0
  47. data/spec/test_data/v5.0/expected_robe.rbi +9 -0
  48. data/spec/test_data/v5.0/expected_school.rbi +9 -0
  49. data/spec/test_data/v5.0/expected_spell/habtm_spell_books.rbi +18 -0
  50. data/spec/test_data/v5.0/expected_spell_book.rbi +9 -0
  51. data/spec/test_data/v5.0/expected_spell_book/habtm_spells.rbi +18 -0
  52. data/spec/test_data/v5.0/expected_squib.rbi +18 -0
  53. data/spec/test_data/v5.0/expected_subject/habtm_wizards.rbi +18 -0
  54. data/spec/test_data/v5.0/expected_wand.rbi +9 -0
  55. data/spec/test_data/v5.0/expected_wizard.rbi +18 -0
  56. data/spec/test_data/v5.0/expected_wizard/habtm_subjects.rbi +18 -0
  57. data/spec/test_data/v5.0/expected_wizard_wo_spellbook.rbi +18 -0
  58. data/spec/test_data/v5.1/expected_custom_application_job.rbi +21 -0
  59. data/spec/test_data/v5.1/expected_custom_application_mailer.rbi +6 -0
  60. data/spec/test_data/v5.1/expected_custom_award_house_point_hourglasses.rbi +21 -0
  61. data/spec/test_data/v5.1/expected_custom_daily_prophet_mailer.rbi +8 -0
  62. data/spec/test_data/v5.1/expected_custom_hogwarts_acceptance_mailer.rbi +21 -0
  63. data/spec/test_data/v5.1/expected_headmaster.rbi +18 -0
  64. data/spec/test_data/v5.1/expected_potion.rbi +9 -0
  65. data/spec/test_data/v5.1/expected_robe.rbi +9 -0
  66. data/spec/test_data/v5.1/expected_school.rbi +9 -0
  67. data/spec/test_data/v5.1/expected_spell/habtm_spell_books.rbi +18 -0
  68. data/spec/test_data/v5.1/expected_spell_book.rbi +9 -0
  69. data/spec/test_data/v5.1/expected_spell_book/habtm_spells.rbi +18 -0
  70. data/spec/test_data/v5.1/expected_squib.rbi +18 -0
  71. data/spec/test_data/v5.1/expected_subject/habtm_wizards.rbi +18 -0
  72. data/spec/test_data/v5.1/expected_wand.rbi +9 -0
  73. data/spec/test_data/v5.1/expected_wizard.rbi +18 -0
  74. data/spec/test_data/v5.1/expected_wizard/habtm_subjects.rbi +18 -0
  75. data/spec/test_data/v5.1/expected_wizard_wo_spellbook.rbi +18 -0
  76. data/spec/test_data/v5.2/expected_attachment.rbi +18 -0
  77. data/spec/test_data/v5.2/expected_blob.rbi +19 -1
  78. data/spec/test_data/v5.2/expected_custom_application_job.rbi +21 -0
  79. data/spec/test_data/v5.2/expected_custom_application_mailer.rbi +6 -0
  80. data/spec/test_data/v5.2/expected_custom_award_house_point_hourglasses.rbi +21 -0
  81. data/spec/test_data/v5.2/expected_custom_daily_prophet_mailer.rbi +8 -0
  82. data/spec/test_data/v5.2/expected_custom_hogwarts_acceptance_mailer.rbi +21 -0
  83. data/spec/test_data/v5.2/expected_headmaster.rbi +18 -0
  84. data/spec/test_data/v5.2/expected_potion.rbi +9 -0
  85. data/spec/test_data/v5.2/expected_robe.rbi +9 -0
  86. data/spec/test_data/v5.2/expected_school.rbi +9 -0
  87. data/spec/test_data/v5.2/expected_spell/habtm_spell_books.rbi +18 -0
  88. data/spec/test_data/v5.2/expected_spell_book.rbi +9 -0
  89. data/spec/test_data/v5.2/expected_spell_book/habtm_spells.rbi +18 -0
  90. data/spec/test_data/v5.2/expected_squib.rbi +38 -2
  91. data/spec/test_data/v5.2/expected_subject/habtm_wizards.rbi +18 -0
  92. data/spec/test_data/v5.2/expected_wand.rbi +9 -0
  93. data/spec/test_data/v5.2/expected_wizard.rbi +38 -2
  94. data/spec/test_data/v5.2/expected_wizard/habtm_subjects.rbi +18 -0
  95. data/spec/test_data/v5.2/expected_wizard_wo_spellbook.rbi +38 -2
  96. data/spec/test_data/v6.0/expected_attachment.rbi +18 -0
  97. data/spec/test_data/v6.0/expected_blob.rbi +19 -1
  98. data/spec/test_data/v6.0/expected_custom_application_job.rbi +21 -0
  99. data/spec/test_data/v6.0/expected_custom_application_mailer.rbi +6 -0
  100. data/spec/test_data/v6.0/expected_custom_award_house_point_hourglasses.rbi +21 -0
  101. data/spec/test_data/v6.0/expected_custom_daily_prophet_mailer.rbi +8 -0
  102. data/spec/test_data/v6.0/expected_custom_hogwarts_acceptance_mailer.rbi +21 -0
  103. data/spec/test_data/v6.0/expected_headmaster.rbi +18 -0
  104. data/spec/test_data/v6.0/expected_potion.rbi +9 -0
  105. data/spec/test_data/v6.0/expected_robe.rbi +9 -0
  106. data/spec/test_data/v6.0/expected_school.rbi +9 -0
  107. data/spec/test_data/v6.0/expected_spell/habtm_spell_books.rbi +18 -0
  108. data/spec/test_data/v6.0/expected_spell_book.rbi +9 -0
  109. data/spec/test_data/v6.0/expected_spell_book/habtm_spells.rbi +18 -0
  110. data/spec/test_data/v6.0/expected_squib.rbi +38 -2
  111. data/spec/test_data/v6.0/expected_subject/habtm_wizards.rbi +18 -0
  112. data/spec/test_data/v6.0/expected_wand.rbi +9 -0
  113. data/spec/test_data/v6.0/expected_wizard.rbi +38 -2
  114. data/spec/test_data/v6.0/expected_wizard/habtm_subjects.rbi +18 -0
  115. data/spec/test_data/v6.0/expected_wizard_wo_spellbook.rbi +38 -2
  116. metadata +45 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 573cda715fb4ceb9881c61dce1f346499a60202ac181548727d7519f8f1b24fe
4
- data.tar.gz: ba219d4d0ec79076e4a93cf2b6c0eb40272489fb4b71d42eea881c6c7c124b6e
3
+ metadata.gz: cc9807ef098eeb05a61378ffe82fa56864f5d0543ba20031153bd86ac604a356
4
+ data.tar.gz: e9fa8ed4c3390685d352486d3bde21b4301ce3f9d1b600b79198aba797bee560
5
5
  SHA512:
6
- metadata.gz: e6d81c40b7c86667834b5063637e9ed29204fda6494aaeccd59781ae481849d7e90b4f5edf678b6727197e6f194c3b06bc87c276e7801013343f2e698c904e3e
7
- data.tar.gz: 11b034a0b6691ae3d9baf8a2c285b3277c99aa25d280eba8bf12bc78b5a443a4d5d502e814edf1eb576c1bbc108301cfcc0b240cff354a03163497e109ca403c
6
+ metadata.gz: 0374a3b24474fbf04051edfdf372b11132dcd4293d9cca7a1a692e15e63aad07a55d5f72c10830bb96799aa31d175ffd20584d81c58bbee2b4c293c27ddcc33f
7
+ data.tar.gz: a8826daddfef144295b9df4438e669e7cf42d494666d47073f7868b6481c329b9e8058cc2d308598c0d34035065d6b2f1c7611113a85c5a0b8912f91af363d3c
@@ -1,4 +1,3 @@
1
- lib/sorbet/* linguist-generated
2
1
  spec/test_data/* linguist-generated
3
2
  spec/support/* linguist-generated
4
-
3
+ sorbet/* linguist-generated
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
- lib/sorbet/rbi/hidden-definitions/errors.txt
97
+ sorbet/rbi/hidden-definitions/errors.txt
97
98
  .vscode
98
99
 
99
100
  .rake_tasks~
@@ -16,7 +16,7 @@ rvm:
16
16
  matrix:
17
17
  include:
18
18
  - rvm: 2.5
19
- env: RAILS_VERSION=5.2 SORBET_VERSION=0.5.5400
19
+ env: RAILS_VERSION=5.2 SORBET_VERSION=0.5.5737
20
20
  exclude:
21
21
  - rvm: 2.3
22
22
  env: RAILS_VERSION=6.0
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 Model Generation Task with Custom Plugins
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
- ### Defining a Custom `ModelPlugin`
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
- ### Registering new plugins
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
- ### Enabling built-in plugins
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.0")
24
- system("rails _6.0.0_ -v")
25
- system("RAILS_VERSION='6.0' rails _6.0.0_ 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")
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, &blk); end
13
+ def pluck_to_tstruct(ta_struct, associations: {}); end
13
14
  end
14
15
 
15
16
  class ActiveRecord::Base
@@ -1,4 +1,4 @@
1
- # typed: strong
1
+ # typed: strict
2
2
  module SorbetRails
3
3
  if defined?(Rails)
4
4
  require 'sorbet-rails/railtie'
@@ -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]) }
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  require 'active_support/deprecation'
2
3
 
3
4
  module SorbetRails
@@ -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
- class SorbetRails::JobRbiFormatter
6
- extend T::Sig
5
+ module SorbetRails
6
+ class JobRbiFormatter
7
+ extend T::Sig
7
8
 
8
- Parameter = ::Parlour::RbiGenerator::Parameter
9
+ Parameter = ::Parlour::RbiGenerator::Parameter
9
10
 
10
- sig { params(job_class: T.class_of(ActiveJob::Base)).void }
11
- def initialize(job_class)
12
- @job_class = T.let(job_class, T.class_of(ActiveJob::Base))
13
- @parlour = T.let(Parlour::RbiGenerator.new, Parlour::RbiGenerator)
14
- end
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
- sig {returns(String)}
17
- def generate_rbi
18
- puts "-- Generate sigs for mailer #{@job_class.name} --"
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
- @parlour.root.add_comments([
21
- 'This is an autogenerated file for Rails\' jobs.',
22
- 'Please rerun bundle exec rake rails_rbi:jobs to regenerate.'
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
- @parlour.root.create_class(@job_class.name) do |job_rbi|
26
- method_def = @job_class.instance_method(:perform)
27
- parameters = SorbetRails::SorbetUtils.parameters_from_method_def(method_def)
28
- job_rbi.create_method(
29
- "perform_later",
30
- parameters: parameters,
31
- class_method: true,
32
- )
33
- job_rbi.create_method(
34
- "perform_now",
35
- parameters: parameters,
36
- class_method: true,
37
- )
38
- # Override the signature for "set" so that we can support it
39
- # At run-time, this method returns a `ActiveJob::ConfiguredJob` but
40
- # we fake the signature to return "T.self_class" so that
41
- # sorbet can type-check when `perform_later` is called on it
42
- # See: https://guides.rubyonrails.org/active_job_basics.html#enqueue-the-job
43
- job_rbi.create_method(
44
- "set",
45
- # Documentation: https://api.rubyonrails.org/classes/ActiveJob/Core/ClassMethods.html
46
- parameters: [
47
- Parameter.new(
48
- "wait:",
49
- type: "T.nilable(ActiveSupport::Duration)",
50
- default: "nil",
51
- ),
52
- Parameter.new(
53
- "wait_until:",
54
- type: "T.nilable(T.any(ActiveSupport::TimeWithZone, Date, Time))",
55
- default: "nil",
56
- ),
57
- Parameter.new(
58
- "queue:",
59
- type: "T.nilable(T.any(String, Symbol))",
60
- default: "nil",
61
- ),
62
- Parameter.new(
63
- "priority:",
64
- type: "T.nilable(Integer)",
65
- default: "nil",
66
- ),
67
- ],
68
- return_type: "T.self_type",
69
- class_method: true,
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
- @parlour.rbi
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
- class SorbetRails::MailerRbiFormatter
6
- extend T::Sig
5
+ module SorbetRails
6
+ class MailerRbiFormatter
7
+ extend T::Sig
7
8
 
8
- sig { params(mailer_class: T.class_of(ActionMailer::Base)).void }
9
- def initialize(mailer_class)
10
- @mailer_class = T.let(mailer_class, T.class_of(ActionMailer::Base))
11
- @parlour = T.let(Parlour::RbiGenerator.new, Parlour::RbiGenerator)
12
- end
9
+ Parameter = ::Parlour::RbiGenerator::Parameter
10
+
11
+ sig { returns(Parlour::RbiGenerator) }
12
+ attr_reader :rbi_generator
13
13
 
14
- sig {returns(String)}
15
- def generate_rbi
16
- puts "-- Generate sigs for mailer #{@mailer_class.name} --"
17
-
18
- @parlour.root.add_comments([
19
- "This is an autogenerated file for Rails' mailers.",
20
- 'Please rerun bundle exec rake rails_rbi:mailers to regenerate.'
21
- ])
22
-
23
- @parlour.root.create_class(@mailer_class.name) do |mailer_rbi|
24
- @mailer_class.action_methods.to_a.sort.each do |mailer_method|
25
- method_def = @mailer_class.instance_method(mailer_method)
26
- parameters = SorbetRails::SorbetUtils.parameters_from_method_def(method_def)
27
- mailer_rbi.create_method(
28
- mailer_method,
29
- parameters: parameters,
30
- return_type: 'ActionMailer::MessageDelivery',
31
- class_method: true,
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
- @parlour.rbi
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