sorbet-rails 0.6.5.1 → 0.7.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (199) 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 +66 -13
  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/bundled_rbi/typed_enum.rbi +7 -0
  10. data/lib/sorbet-rails.rb +1 -3
  11. data/lib/sorbet-rails/active_record_rbi_formatter.rb +6 -6
  12. data/lib/sorbet-rails/config.rb +12 -0
  13. data/lib/sorbet-rails/dependent_gem_rbis/activerecord.rbi +3 -0
  14. data/lib/sorbet-rails/dependent_gem_rbis/parlour.rbi +1896 -0
  15. data/lib/sorbet-rails/deprecation.rb +1 -0
  16. data/lib/sorbet-rails/gem_plugins/attr_json_plugin.rb +137 -0
  17. data/lib/sorbet-rails/gem_plugins/flag_shih_tzu_plugin.rb +201 -0
  18. data/lib/sorbet-rails/gem_plugins/kaminari_plugin.rb +28 -0
  19. data/lib/sorbet-rails/gem_plugins/shrine_plugin.rb +1 -1
  20. data/lib/sorbet-rails/helper_rbi_formatter.rb +1 -1
  21. data/lib/sorbet-rails/job_rbi_formatter.rb +75 -62
  22. data/lib/sorbet-rails/mailer_rbi_formatter.rb +40 -27
  23. data/lib/sorbet-rails/model_column_utils.rb +129 -0
  24. data/lib/sorbet-rails/model_plugins/active_record_assoc.rb +40 -1
  25. data/lib/sorbet-rails/model_plugins/active_record_attribute.rb +12 -112
  26. data/lib/sorbet-rails/model_plugins/active_record_serialized_attribute.rb +68 -0
  27. data/lib/sorbet-rails/model_plugins/base.rb +6 -8
  28. data/lib/sorbet-rails/model_plugins/plugins.rb +9 -0
  29. data/lib/sorbet-rails/model_rbi_formatter.rb +3 -3
  30. data/lib/sorbet-rails/model_utils.rb +5 -2
  31. data/lib/sorbet-rails/rails_mixins/generated_url_helpers.rb +2 -3
  32. data/lib/sorbet-rails/rails_mixins/pluck_to_tstruct.rb +54 -7
  33. data/lib/sorbet-rails/railtie.rb +0 -2
  34. data/lib/sorbet-rails/routes_rbi_formatter.rb +6 -2
  35. data/lib/sorbet-rails/sorbet_utils.rb +152 -150
  36. data/lib/sorbet-rails/tasks/rails_rbi.rake +9 -8
  37. data/sorbet-rails.gemspec +2 -2
  38. data/spec/bin/run_spec.sh +1 -1
  39. data/spec/generators/rails-template.rb +16 -0
  40. data/spec/generators/sorbet_test_cases.rb +28 -56
  41. data/spec/job_rbi_formatter_spec.rb +1 -1
  42. data/spec/pluck_to_tstruct_spec.rb +115 -16
  43. data/spec/rails_helper.rb +3 -7
  44. data/spec/rake_rails_rbi_jobs_spec.rb +20 -0
  45. data/spec/rake_rails_rbi_mailers_spec.rb +21 -0
  46. data/spec/sorbet_spec.rb +5 -5
  47. data/spec/support/v5.0/Gemfile +1 -1
  48. data/spec/support/v5.0/Gemfile.lock +23 -19
  49. data/spec/support/v5.0/app/controllers/application_controller.rb +1 -1
  50. data/spec/support/v5.0/app/models/headmaster.rb +1 -1
  51. data/spec/support/v5.0/app/models/potion.rb +1 -1
  52. data/spec/support/v5.0/app/models/robe.rb +1 -1
  53. data/spec/support/v5.0/app/models/school.rb +1 -1
  54. data/spec/support/v5.0/app/models/spell.rb +1 -1
  55. data/spec/support/v5.0/app/models/subject.rb +1 -1
  56. data/spec/support/v5.0/app/models/wizard.rb +5 -0
  57. data/spec/support/v5.0/config/environments/development.rb +1 -1
  58. data/spec/support/v5.0/config/environments/production.rb +1 -1
  59. data/spec/support/v5.0/config/environments/test.rb +1 -1
  60. data/spec/support/v5.0/config/routes.rb +1 -1
  61. data/spec/support/v5.0/db/migrate/20190620000015_add_serialized_to_wizards.rb +9 -0
  62. data/spec/support/v5.0/db/schema.rb +8 -4
  63. data/spec/support/v5.0/sorbet_test_cases.rb +28 -56
  64. data/spec/support/v5.1/Gemfile.lock +21 -17
  65. data/spec/support/v5.1/app/controllers/application_controller.rb +1 -1
  66. data/spec/support/v5.1/app/models/headmaster.rb +1 -1
  67. data/spec/support/v5.1/app/models/school.rb +1 -1
  68. data/spec/support/v5.1/app/models/wizard.rb +5 -0
  69. data/spec/support/v5.1/config/environments/production.rb +1 -1
  70. data/spec/support/v5.1/config/routes.rb +1 -1
  71. data/spec/support/v5.1/db/migrate/20190620000015_add_serialized_to_wizards.rb +9 -0
  72. data/spec/support/v5.1/db/schema.rb +5 -1
  73. data/spec/support/v5.1/sorbet_test_cases.rb +28 -56
  74. data/spec/support/v5.2/Gemfile +1 -1
  75. data/spec/support/v5.2/Gemfile.lock +23 -19
  76. data/spec/support/v5.2/app/models/headmaster.rb +1 -1
  77. data/spec/support/v5.2/app/models/school.rb +1 -1
  78. data/spec/support/v5.2/app/models/wizard.rb +5 -0
  79. data/spec/support/v5.2/config/environments/development.rb +1 -1
  80. data/spec/support/v5.2/config/environments/production.rb +1 -1
  81. data/spec/support/v5.2/config/environments/test.rb +1 -1
  82. data/spec/support/v5.2/config/routes.rb +1 -1
  83. data/spec/support/v5.2/db/migrate/20190620000015_add_serialized_to_wizards.rb +9 -0
  84. data/spec/support/v5.2/db/schema.rb +5 -1
  85. data/spec/support/v5.2/sorbet_test_cases.rb +28 -56
  86. data/spec/support/v6.0/.gitignore +6 -0
  87. data/spec/support/v6.0/Gemfile +3 -3
  88. data/spec/support/v6.0/Gemfile.lock +89 -84
  89. data/spec/support/v6.0/app/models/wizard.rb +5 -0
  90. data/spec/support/v6.0/bin/bundle +22 -13
  91. data/spec/support/v6.0/config/environments/development.rb +1 -1
  92. data/spec/support/v6.0/config/environments/production.rb +1 -1
  93. data/spec/support/v6.0/config/environments/test.rb +2 -2
  94. data/spec/support/v6.0/config/routes.rb +1 -1
  95. data/spec/support/v6.0/db/migrate/20190620000015_add_serialized_to_wizards.rb +9 -0
  96. data/spec/support/v6.0/db/schema.rb +5 -1
  97. data/spec/support/v6.0/sorbet_test_cases.rb +28 -56
  98. data/spec/support/v6.0/tmp/pids/.keep +0 -0
  99. data/spec/test_data/v5.0/expected_active_record_relation.rbi +0 -1
  100. data/spec/test_data/v5.0/expected_application_job.rbi +2 -2
  101. data/spec/test_data/v5.0/expected_award_house_point_hourglasses.rbi +2 -2
  102. data/spec/test_data/v5.0/expected_custom_application_job.rbi +21 -0
  103. data/spec/test_data/v5.0/expected_custom_application_mailer.rbi +6 -0
  104. data/spec/test_data/v5.0/expected_custom_award_house_point_hourglasses.rbi +21 -0
  105. data/spec/test_data/v5.0/expected_custom_daily_prophet_mailer.rbi +8 -0
  106. data/spec/test_data/v5.0/expected_custom_hogwarts_acceptance_mailer.rbi +21 -0
  107. data/spec/test_data/v5.0/expected_headmaster.rbi +24 -0
  108. data/spec/test_data/v5.0/expected_potion.rbi +12 -0
  109. data/spec/test_data/v5.0/expected_robe.rbi +12 -0
  110. data/spec/test_data/v5.0/expected_routes.rbi +4 -0
  111. data/spec/test_data/v5.0/expected_school.rbi +12 -0
  112. data/spec/test_data/v5.0/expected_spell/habtm_spell_books.rbi +24 -0
  113. data/spec/test_data/v5.0/expected_spell_book.rbi +21 -9
  114. data/spec/test_data/v5.0/expected_spell_book/habtm_spells.rbi +24 -0
  115. data/spec/test_data/v5.0/expected_squib.rbi +63 -0
  116. data/spec/test_data/v5.0/expected_subject/habtm_wizards.rbi +24 -0
  117. data/spec/test_data/v5.0/expected_wand.rbi +22 -10
  118. data/spec/test_data/v5.0/expected_wizard.rbi +121 -58
  119. data/spec/test_data/v5.0/expected_wizard/habtm_subjects.rbi +24 -0
  120. data/spec/test_data/v5.0/expected_wizard_wo_spellbook.rbi +121 -58
  121. data/spec/test_data/v5.1/expected_active_record_relation.rbi +0 -1
  122. data/spec/test_data/v5.1/expected_application_job.rbi +2 -2
  123. data/spec/test_data/v5.1/expected_award_house_point_hourglasses.rbi +2 -2
  124. data/spec/test_data/v5.1/expected_custom_application_job.rbi +21 -0
  125. data/spec/test_data/v5.1/expected_custom_application_mailer.rbi +6 -0
  126. data/spec/test_data/v5.1/expected_custom_award_house_point_hourglasses.rbi +21 -0
  127. data/spec/test_data/v5.1/expected_custom_daily_prophet_mailer.rbi +8 -0
  128. data/spec/test_data/v5.1/expected_custom_hogwarts_acceptance_mailer.rbi +21 -0
  129. data/spec/test_data/v5.1/expected_headmaster.rbi +24 -0
  130. data/spec/test_data/v5.1/expected_potion.rbi +12 -0
  131. data/spec/test_data/v5.1/expected_robe.rbi +12 -0
  132. data/spec/test_data/v5.1/expected_routes.rbi +4 -0
  133. data/spec/test_data/v5.1/expected_school.rbi +12 -0
  134. data/spec/test_data/v5.1/expected_spell/habtm_spell_books.rbi +24 -0
  135. data/spec/test_data/v5.1/expected_spell_book.rbi +21 -9
  136. data/spec/test_data/v5.1/expected_spell_book/habtm_spells.rbi +24 -0
  137. data/spec/test_data/v5.1/expected_squib.rbi +63 -0
  138. data/spec/test_data/v5.1/expected_subject/habtm_wizards.rbi +24 -0
  139. data/spec/test_data/v5.1/expected_wand.rbi +22 -10
  140. data/spec/test_data/v5.1/expected_wizard.rbi +121 -58
  141. data/spec/test_data/v5.1/expected_wizard/habtm_subjects.rbi +24 -0
  142. data/spec/test_data/v5.1/expected_wizard_wo_spellbook.rbi +121 -58
  143. data/spec/test_data/v5.2/expected_active_record_relation.rbi +0 -1
  144. data/spec/test_data/v5.2/expected_application_job.rbi +2 -2
  145. data/spec/test_data/v5.2/expected_attachment.rbi +24 -0
  146. data/spec/test_data/v5.2/expected_award_house_point_hourglasses.rbi +2 -2
  147. data/spec/test_data/v5.2/expected_blob.rbi +25 -1
  148. data/spec/test_data/v5.2/expected_custom_application_job.rbi +21 -0
  149. data/spec/test_data/v5.2/expected_custom_application_mailer.rbi +6 -0
  150. data/spec/test_data/v5.2/expected_custom_award_house_point_hourglasses.rbi +21 -0
  151. data/spec/test_data/v5.2/expected_custom_daily_prophet_mailer.rbi +8 -0
  152. data/spec/test_data/v5.2/expected_custom_hogwarts_acceptance_mailer.rbi +21 -0
  153. data/spec/test_data/v5.2/expected_headmaster.rbi +24 -0
  154. data/spec/test_data/v5.2/expected_potion.rbi +12 -0
  155. data/spec/test_data/v5.2/expected_robe.rbi +12 -0
  156. data/spec/test_data/v5.2/expected_routes.rbi +4 -0
  157. data/spec/test_data/v5.2/expected_school.rbi +12 -0
  158. data/spec/test_data/v5.2/expected_spell/habtm_spell_books.rbi +24 -0
  159. data/spec/test_data/v5.2/expected_spell_book.rbi +21 -9
  160. data/spec/test_data/v5.2/expected_spell_book/habtm_spells.rbi +24 -0
  161. data/spec/test_data/v5.2/expected_squib.rbi +89 -2
  162. data/spec/test_data/v5.2/expected_subject/habtm_wizards.rbi +24 -0
  163. data/spec/test_data/v5.2/expected_wand.rbi +22 -10
  164. data/spec/test_data/v5.2/expected_wizard.rbi +147 -60
  165. data/spec/test_data/v5.2/expected_wizard/habtm_subjects.rbi +24 -0
  166. data/spec/test_data/v5.2/expected_wizard_wo_spellbook.rbi +147 -60
  167. data/spec/test_data/v6.0/expected_active_record_relation.rbi +0 -1
  168. data/spec/test_data/v6.0/expected_application_job.rbi +2 -2
  169. data/spec/test_data/v6.0/expected_attachment.rbi +24 -0
  170. data/spec/test_data/v6.0/expected_award_house_point_hourglasses.rbi +2 -2
  171. data/spec/test_data/v6.0/expected_blob.rbi +25 -1
  172. data/spec/test_data/v6.0/expected_custom_application_job.rbi +21 -0
  173. data/spec/test_data/v6.0/expected_custom_application_mailer.rbi +6 -0
  174. data/spec/test_data/v6.0/expected_custom_award_house_point_hourglasses.rbi +21 -0
  175. data/spec/test_data/v6.0/expected_custom_daily_prophet_mailer.rbi +8 -0
  176. data/spec/test_data/v6.0/expected_custom_hogwarts_acceptance_mailer.rbi +21 -0
  177. data/spec/test_data/v6.0/expected_headmaster.rbi +24 -0
  178. data/spec/test_data/v6.0/expected_potion.rbi +12 -0
  179. data/spec/test_data/v6.0/expected_robe.rbi +12 -0
  180. data/spec/test_data/v6.0/expected_routes.rbi +4 -0
  181. data/spec/test_data/v6.0/expected_school.rbi +12 -0
  182. data/spec/test_data/v6.0/expected_spell/habtm_spell_books.rbi +24 -0
  183. data/spec/test_data/v6.0/expected_spell_book.rbi +21 -9
  184. data/spec/test_data/v6.0/expected_spell_book/habtm_spells.rbi +24 -0
  185. data/spec/test_data/v6.0/expected_squib.rbi +89 -2
  186. data/spec/test_data/v6.0/expected_subject/habtm_wizards.rbi +24 -0
  187. data/spec/test_data/v6.0/expected_wand.rbi +22 -10
  188. data/spec/test_data/v6.0/expected_wizard.rbi +147 -60
  189. data/spec/test_data/v6.0/expected_wizard/habtm_subjects.rbi +24 -0
  190. data/spec/test_data/v6.0/expected_wizard_wo_spellbook.rbi +147 -60
  191. data/spec/tstruct_comparable.rb +13 -0
  192. metadata +64 -15
  193. data/lib/bundled_rbi/parameters.rbi +0 -28
  194. data/lib/sorbet-rails/custom_types/boolean_string.rb +0 -42
  195. data/lib/sorbet-rails/custom_types/integer_string.rb +0 -45
  196. data/lib/sorbet-rails/rails_mixins/custom_params_methods.rb +0 -57
  197. data/spec/boolean_string_spec.rb +0 -59
  198. data/spec/custom_params_methods_spec.rb +0 -138
  199. data/spec/integer_string_spec.rb +0 -46
@@ -3,6 +3,13 @@ require 'rails_helper'
3
3
  RSpec.describe 'rake rails_rbi:jobs', type: :task do
4
4
  let!(:generated_dir_path) { Rails.root.join("sorbet", "rails-rbi", "jobs") }
5
5
 
6
+ class CustomJobRbiGenerator < SorbetRails::JobRbiFormatter
7
+ def populate_rbi
8
+ rbi_generator.root.add_comment("== Custom Generator ==")
9
+ super
10
+ end
11
+ end
12
+
6
13
  it "preloads the Rails environment" do
7
14
  expect(task.prerequisites).to include("environment")
8
15
  end
@@ -17,4 +24,17 @@ RSpec.describe 'rake rails_rbi:jobs', type: :task do
17
24
  ],
18
25
  )
19
26
  end
27
+
28
+ it "generates custom jobs rbi correctly" do
29
+ ::SorbetRails.config.job_generator_class = CustomJobRbiGenerator
30
+ task.invoke
31
+ expect_files(
32
+ base_dir: generated_dir_path,
33
+ files: [
34
+ "application_job.rbi",
35
+ "award_house_point_hourglasses.rbi",
36
+ ],
37
+ expected_file_prefix: "expected_custom",
38
+ )
39
+ end
20
40
  end
@@ -3,6 +3,13 @@ require 'rails_helper'
3
3
  RSpec.describe 'rake rails_rbi:mailers', type: :task do
4
4
  let!(:generated_dir_path) { Rails.root.join("sorbet", "rails-rbi", "mailers") }
5
5
 
6
+ class CustomMailerRbiGenerator < SorbetRails::MailerRbiFormatter
7
+ def populate_rbi
8
+ rbi_generator.root.add_comment("== Custom Generator ==")
9
+ super
10
+ end
11
+ end
12
+
6
13
  it "preloads the Rails environment" do
7
14
  expect(task.prerequisites).to include("environment")
8
15
  end
@@ -18,4 +25,18 @@ RSpec.describe 'rake rails_rbi:mailers', type: :task do
18
25
  ],
19
26
  )
20
27
  end
28
+
29
+ it "generates custom mailers rbi correctly" do
30
+ ::SorbetRails.config.mailer_generator_class = CustomMailerRbiGenerator
31
+ task.invoke
32
+ expect_files(
33
+ base_dir: generated_dir_path,
34
+ files: [
35
+ "application_mailer.rbi",
36
+ "daily_prophet_mailer.rbi",
37
+ "hogwarts_acceptance_mailer.rbi",
38
+ ],
39
+ expected_file_prefix: "expected_custom",
40
+ )
41
+ end
21
42
  end
data/spec/sorbet_spec.rb CHANGED
@@ -42,11 +42,6 @@ RSpec.describe 'sorbet' do
42
42
  chdir: Rails.root.to_path,
43
43
  )
44
44
 
45
- stdout, stderr, status = Open3.capture3(
46
- 'bundle', 'exec', 'srb', 'tc',
47
- chdir: Rails.root.to_path,
48
- )
49
-
50
45
  if status != 0
51
46
  puts "================================="
52
47
  puts "stdout #{stdout}"
@@ -55,6 +50,11 @@ RSpec.describe 'sorbet' do
55
50
  puts "================================="
56
51
  end
57
52
 
53
+ stdout, stderr, status = Open3.capture3(
54
+ 'bundle', 'exec', 'srb', 'tc',
55
+ chdir: Rails.root.to_path,
56
+ )
57
+
58
58
  # Ensure sorbet_test_cases.rb is set to `typed: true` since srb init may
59
59
  # set it to false.
60
60
  sorbet_test_cases_path = Rails.root.join('sorbet_test_cases.rb')
@@ -11,7 +11,7 @@ gem 'rails', '~> 5.0.7'
11
11
  # Use sqlite3 as the database for Active Record
12
12
  gem 'sqlite3', '~> 1.3.6'
13
13
  # Use Puma as the app server
14
- gem 'puma', '~> 3.0'
14
+ gem 'puma', '~> 3.12'
15
15
  # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
16
16
  gem 'jbuilder', '~> 2.5'
17
17
  # Use ActiveModel has_secure_password
@@ -1,9 +1,9 @@
1
1
  PATH
2
2
  remote: ../../..
3
3
  specs:
4
- sorbet-rails (0.6.5.1)
4
+ sorbet-rails (0.7.4)
5
5
  method_source (>= 0.9.2)
6
- parlour (~> 2.0)
6
+ parlour (>= 4.0.1)
7
7
  parser (>= 2.7)
8
8
  sorbet-coerce (>= 0.2.6)
9
9
  sorbet-runtime (>= 0.5)
@@ -49,10 +49,10 @@ GEM
49
49
  minitest (~> 5.1)
50
50
  tzinfo (~> 1.1)
51
51
  arel (7.1.4)
52
- ast (2.4.0)
52
+ ast (2.4.2)
53
53
  builder (3.2.4)
54
54
  byebug (11.1.1)
55
- commander (4.5.2)
55
+ commander (4.6.0)
56
56
  highline (~> 2.0.0)
57
57
  concurrent-ruby (1.1.6)
58
58
  crass (1.0.6)
@@ -71,21 +71,25 @@ GEM
71
71
  mini_mime (>= 0.1.1)
72
72
  method_source (1.0.0)
73
73
  mini_mime (1.0.2)
74
- mini_portile2 (2.4.0)
74
+ mini_portile2 (2.5.0)
75
75
  minitest (5.14.0)
76
76
  nio4r (2.5.2)
77
- nokogiri (1.10.9)
78
- mini_portile2 (~> 2.4.0)
79
- parlour (2.1.0)
77
+ nokogiri (1.11.1)
78
+ mini_portile2 (~> 2.5.0)
79
+ racc (~> 1.4)
80
+ nokogiri (1.11.1-x86_64-darwin)
81
+ racc (~> 1.4)
82
+ parlour (6.0.0)
80
83
  commander (~> 4.5)
81
84
  parser
82
85
  rainbow (~> 3.0)
83
86
  sorbet-runtime (>= 0.5)
84
- parser (2.7.1.2)
85
- ast (~> 2.4.0)
86
- polyfill (1.8.0)
87
- puma (3.12.4)
88
- rack (2.2.2)
87
+ parser (3.0.1.1)
88
+ ast (~> 2.4.1)
89
+ polyfill (1.9.0)
90
+ puma (3.12.6)
91
+ racc (1.5.2)
92
+ rack (2.2.3)
89
93
  rack-test (0.6.3)
90
94
  rack (>= 1.0)
91
95
  rails (5.0.7.2)
@@ -116,13 +120,12 @@ GEM
116
120
  safe_type (1.1.1)
117
121
  sorbet (0.5.5480)
118
122
  sorbet-static (= 0.5.5480)
119
- sorbet-coerce (0.2.7)
123
+ sorbet-coerce (0.4.0)
120
124
  polyfill (~> 1.8)
121
125
  safe_type (~> 1.1, >= 1.1.1)
122
- sorbet (>= 0.4.4704)
123
126
  sorbet-runtime (>= 0.4.4704)
124
127
  sorbet-runtime (0.5.5480)
125
- sorbet-static (0.5.5480-universal-darwin-14)
128
+ sorbet-static (0.5.5480-universal-darwin-19)
126
129
  sprockets (4.0.0)
127
130
  concurrent-ruby (~> 1.0)
128
131
  rack (> 1, < 3)
@@ -137,15 +140,16 @@ GEM
137
140
  thread_safe (~> 0.1)
138
141
  websocket-driver (0.6.5)
139
142
  websocket-extensions (>= 0.1.0)
140
- websocket-extensions (0.1.4)
143
+ websocket-extensions (0.1.5)
141
144
 
142
145
  PLATFORMS
143
146
  ruby
147
+ x86_64-darwin-19
144
148
 
145
149
  DEPENDENCIES
146
150
  byebug
147
151
  jbuilder (~> 2.5)
148
- puma (~> 3.0)
152
+ puma (~> 3.12)
149
153
  rails (~> 5.0.7)
150
154
  sorbet
151
155
  sorbet-rails!
@@ -154,4 +158,4 @@ DEPENDENCIES
154
158
  tzinfo-data
155
159
 
156
160
  BUNDLED WITH
157
- 2.0.2
161
+ 2.2.0
@@ -1,4 +1,4 @@
1
- # typed: strong
1
+ # typed: strict
2
2
  class ApplicationController < ActionController::Base
3
3
  protect_from_forgery with: :exception
4
4
  end
@@ -1,4 +1,4 @@
1
- # typed: strong
1
+ # typed: strict
2
2
  class Headmaster < ApplicationRecord
3
3
  belongs_to :school, required: false
4
4
  belongs_to :wizard, optional: true
@@ -1,4 +1,4 @@
1
- # typed: strong
1
+ # typed: strict
2
2
  # an abstract class that has no table
3
3
  class Potion < ApplicationRecord
4
4
  self.abstract_class = true
@@ -1,4 +1,4 @@
1
- # typed: strong
1
+ # typed: strict
2
2
  class Robe < ApplicationRecord
3
3
  belongs_to :wizard, required: false
4
4
  end
@@ -1,4 +1,4 @@
1
- # typed: strong
1
+ # typed: strict
2
2
  class School < ApplicationRecord
3
3
  has_one :headmaster
4
4
  validates :headmaster, presence: true
@@ -1,4 +1,4 @@
1
- # typed: strong
1
+ # typed: strict
2
2
  class Spell < ApplicationRecord
3
3
  # habtm enforced at the DB level
4
4
  has_and_belongs_to_many :spell_books
@@ -1,4 +1,4 @@
1
- # typed: strong
1
+ # typed: strict
2
2
  class Subject < ApplicationRecord
3
3
  # habtm which is optional at the db level
4
4
  has_and_belongs_to_many :wizards
@@ -47,6 +47,11 @@ class Wizard < ApplicationRecord
47
47
  blue: 2,
48
48
  }, _prefix: :color, _suffix: :eyes
49
49
 
50
+ serialize :owl_results, Hash
51
+ serialize :newt_subjects # no specific data type, uses the default YAML Object coder
52
+ serialize :pets, Array
53
+ serialize :patronus_characteristics, JSON
54
+
50
55
  has_one :wand
51
56
  has_many :spell_books
52
57
  # habtm which is optional at the db level
@@ -1,4 +1,4 @@
1
- # typed: strict
1
+ # typed: false
2
2
  Rails.application.configure do
3
3
  # Settings specified here will take precedence over those in config/application.rb.
4
4
 
@@ -1,4 +1,4 @@
1
- # typed: strict
1
+ # typed: false
2
2
  Rails.application.configure do
3
3
  # Settings specified here will take precedence over those in config/application.rb.
4
4
 
@@ -1,4 +1,4 @@
1
- # typed: strict
1
+ # typed: false
2
2
  Rails.application.configure do
3
3
  # Settings specified here will take precedence over those in config/application.rb.
4
4
 
@@ -1,4 +1,4 @@
1
- # typed: strict
1
+ # typed: false
2
2
  Rails.application.routes.draw do
3
3
  get 'test/index' => 'test#index'
4
4
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
@@ -0,0 +1,9 @@
1
+ # typed: false
2
+ class AddSerializedToWizards < ActiveRecord::Migration[5.0]
3
+ def change
4
+ add_column :wizards, :owl_results, :text # Hash
5
+ add_column :wizards, :newt_subjects, :text # generic
6
+ add_column :wizards, :pets, :text # Array
7
+ add_column :wizards, :patronus_characteristics, :text # serialized as JSON, but not a JSON column type
8
+ end
9
+ end
@@ -11,7 +11,7 @@
11
11
  #
12
12
  # It's strongly recommended that you check this file into your version control system.
13
13
 
14
- ActiveRecord::Schema.define(version: 20190620000014) do
14
+ ActiveRecord::Schema.define(version: 20190620000015) do
15
15
 
16
16
  create_table "headmasters", force: :cascade do |t|
17
17
  t.integer "school_id"
@@ -78,15 +78,19 @@ ActiveRecord::Schema.define(version: 20190620000014) do
78
78
  t.integer "professor"
79
79
  t.string "parent_email"
80
80
  t.text "notes"
81
- t.datetime "created_at", null: false
82
- t.datetime "updated_at", null: false
81
+ t.datetime "created_at", null: false
82
+ t.datetime "updated_at", null: false
83
83
  t.string "broom"
84
84
  t.integer "quidditch_position"
85
85
  t.integer "hair_color"
86
86
  t.integer "eye_color"
87
87
  t.integer "hair_length"
88
- t.string "type", default: "Wizard", null: false
88
+ t.string "type", default: "Wizard", null: false
89
89
  t.integer "school_id"
90
+ t.text "owl_results"
91
+ t.text "newt_subjects"
92
+ t.text "pets"
93
+ t.text "patronus_characteristics"
90
94
  end
91
95
 
92
96
  end
@@ -305,6 +305,21 @@ T.assert_type!(Wizard::House::Hufflepuff, Wizard::House)
305
305
  T.assert_type!(Wizard::House::Ravenclaw, Wizard::House)
306
306
  T.assert_type!(Wizard::House::Slytherin, Wizard::House)
307
307
 
308
+ # Serialization
309
+ T.assert_type!(
310
+ wizard.owl_results,
311
+ T.nilable(T::Hash[T.untyped, T.untyped])
312
+ )
313
+ T.assert_type!(
314
+ wizard.newt_subjects,
315
+ T.nilable(T.any(T::Array[T.untyped], T::Boolean, Float, T::Hash[T.untyped, T.untyped], Integer, String))
316
+ )
317
+ T.assert_type!(
318
+ wizard.patronus_characteristics,
319
+ T.nilable(T.any(T::Array[T.untyped], T::Boolean, Float, T::Hash[String, T.untyped], Integer, String))
320
+ )
321
+ T.assert_type!(wizard.pets, T.nilable(T::Array[T.untyped]))
322
+
308
323
  # Mythical plugin
309
324
  T.assert_type!(Wand.mythicals, T::Array[Wand])
310
325
 
@@ -312,7 +327,10 @@ T.assert_type!(Wand.mythicals, T::Array[Wand])
312
327
  T.assert_type!(HogwartsAcceptanceMailer.notify(wizard), ActionMailer::MessageDelivery)
313
328
 
314
329
  # Jobs
315
- AwardHousePointHourglasses.perform_later(student: wizard, point: 10)
330
+ T.assert_type!(
331
+ AwardHousePointHourglasses.perform_later(student: wizard, point: 10),
332
+ AwardHousePointHourglasses
333
+ )
316
334
  AwardHousePointHourglasses.perform_now(student: wizard, point: 10)
317
335
  AwardHousePointHourglasses.
318
336
  set(queue: :daily, wait: 5.minutes).
@@ -321,7 +339,6 @@ AwardHousePointHourglasses.
321
339
  set(priority: 10, wait_until: Time.now.tomorrow).
322
340
  perform_later(student: wizard, point: 10)
323
341
 
324
-
325
342
  T.assert_type!(wizard.broom_nimbus?, T::Boolean)
326
343
  T.assert_type!(wizard.color_brown_eyes?, T::Boolean)
327
344
  T.assert_type!(wizard.quidditch_keeper?, T::Boolean)
@@ -361,44 +378,6 @@ params = ActionController::Parameters.new({
361
378
  typed_params = TypedParams[MyActionParams].new.extract!(params)
362
379
  T.assert_type!(typed_params, MyActionParams)
363
380
 
364
- # -- require_typed
365
- T.assert_type!(
366
- params.require_typed(:age, TA[Integer].new),
367
- Integer,
368
- )
369
- T.assert_type!(
370
- params.require_typed(:name, TA[String].new),
371
- String,
372
- )
373
- info = params.require_typed(:info, TA[ActionController::Parameters].new)
374
- T.assert_type!(info, ActionController::Parameters)
375
- T.assert_type!(
376
- info.require_typed(:friends, TA[T::Array[String]].new),
377
- T::Array[String],
378
- )
379
- # -- fetch_typed
380
- T.assert_type!(
381
- params.fetch_typed(:age, TA[Integer].new),
382
- Integer,
383
- )
384
- T.assert_type!(
385
- params.fetch_typed(:name, TA[String].new),
386
- String,
387
- )
388
- T.assert_type!(
389
- params.fetch_typed(:nonexistence, TA[String].new, ''),
390
- String,
391
- )
392
- T.assert_type!(
393
- params.fetch_typed(:nonexistence, TA[T.nilable(String)].new, nil),
394
- T.nilable(String),
395
- )
396
- T.assert_type!(
397
- params.fetch_typed(:nonexistence, TA[T::Array[Integer]].new, []),
398
- T::Array[Integer],
399
- )
400
-
401
-
402
381
  # -- pluck to tstruct
403
382
  class WizardStruct < T::Struct
404
383
  const :name, String
@@ -415,23 +394,16 @@ Wizard.all.pluck_to_tstruct(TA[WizardStruct].new).each do |row|
415
394
  T.assert_type!(row, WizardStruct)
416
395
  end
417
396
 
418
-
419
397
  # -- GeneratedUrlHelpers
420
398
  class TestHelper
421
399
  include GeneratedUrlHelpers
422
-
423
- # need to implement this for the url
424
- def default_url_options
425
- {
426
- protocol: 'http',
427
- host: 'localhost',
428
- port: 3000,
429
- }
430
- end
431
-
432
- def test_url_helper
433
- T.assert_type!(test_index_path, String)
434
- T.assert_type!(test_index_url, String)
435
- end
436
400
  end
437
- TestHelper.new.test_url_helper
401
+
402
+ T.assert_type!(TestHelper.new.test_index_path, String)
403
+ # need to set this config for _url methods
404
+ Rails.application.routes.default_url_options = {
405
+ protocol: 'http',
406
+ host: 'localhost',
407
+ port: 3000,
408
+ }
409
+ T.assert_type!(TestHelper.new.test_index_url, String)