tapioca 0.11.8 → 0.11.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +116 -49
  3. data/lib/tapioca/cli.rb +76 -67
  4. data/lib/tapioca/commands/{dsl.rb → abstract_dsl.rb} +32 -78
  5. data/lib/tapioca/commands/{gem.rb → abstract_gem.rb} +26 -93
  6. data/lib/tapioca/commands/annotations.rb +9 -7
  7. data/lib/tapioca/commands/check_shims.rb +2 -0
  8. data/lib/tapioca/commands/command.rb +9 -2
  9. data/lib/tapioca/commands/configure.rb +2 -2
  10. data/lib/tapioca/commands/dsl_compiler_list.rb +31 -0
  11. data/lib/tapioca/commands/dsl_generate.rb +40 -0
  12. data/lib/tapioca/commands/dsl_verify.rb +25 -0
  13. data/lib/tapioca/commands/gem_generate.rb +51 -0
  14. data/lib/tapioca/commands/gem_sync.rb +37 -0
  15. data/lib/tapioca/commands/gem_verify.rb +36 -0
  16. data/lib/tapioca/commands/require.rb +2 -0
  17. data/lib/tapioca/commands/todo.rb +21 -2
  18. data/lib/tapioca/commands.rb +8 -2
  19. data/lib/tapioca/dsl/compiler.rb +8 -4
  20. data/lib/tapioca/dsl/compilers/action_controller_helpers.rb +3 -1
  21. data/lib/tapioca/dsl/compilers/active_model_validations_confirmation.rb +94 -0
  22. data/lib/tapioca/dsl/compilers/active_record_columns.rb +19 -9
  23. data/lib/tapioca/dsl/compilers/active_record_fixtures.rb +11 -14
  24. data/lib/tapioca/dsl/compilers/active_record_store.rb +149 -0
  25. data/lib/tapioca/dsl/compilers/active_record_typed_store.rb +3 -2
  26. data/lib/tapioca/dsl/compilers/active_support_concern.rb +1 -1
  27. data/lib/tapioca/dsl/compilers/graphql_input_object.rb +1 -1
  28. data/lib/tapioca/dsl/compilers/graphql_mutation.rb +9 -2
  29. data/lib/tapioca/dsl/compilers/json_api_client_resource.rb +208 -0
  30. data/lib/tapioca/dsl/extensions/active_record.rb +9 -0
  31. data/lib/tapioca/dsl/helpers/active_record_column_type_helper.rb +23 -4
  32. data/lib/tapioca/dsl/helpers/active_record_constants_helper.rb +1 -0
  33. data/lib/tapioca/dsl/helpers/graphql_type_helper.rb +18 -3
  34. data/lib/tapioca/dsl/pipeline.rb +6 -4
  35. data/lib/tapioca/gem/pipeline.rb +103 -36
  36. data/lib/tapioca/gemfile.rb +13 -7
  37. data/lib/tapioca/helpers/git_attributes.rb +34 -0
  38. data/lib/tapioca/helpers/test/template.rb +4 -4
  39. data/lib/tapioca/internal.rb +1 -0
  40. data/lib/tapioca/loaders/dsl.rb +11 -1
  41. data/lib/tapioca/loaders/loader.rb +17 -2
  42. data/lib/tapioca/sorbet_ext/generic_name_patch.rb +0 -27
  43. data/lib/tapioca/static/symbol_loader.rb +10 -9
  44. data/lib/tapioca/version.rb +1 -1
  45. metadata +20 -10
@@ -28,6 +28,7 @@ require "yard-sorbet"
28
28
  require "tapioca/runtime/dynamic_mixin_compiler"
29
29
  require "tapioca/helpers/gem_helper"
30
30
 
31
+ require "tapioca/helpers/git_attributes"
31
32
  require "tapioca/helpers/sorbet_helper"
32
33
  require "tapioca/helpers/rbi_helper"
33
34
  require "tapioca/sorbet_ext/backcompat_patches"
@@ -46,7 +46,17 @@ module Tapioca
46
46
 
47
47
  sig { void }
48
48
  def load_dsl_extensions
49
- Dir["#{__dir__}/../dsl/extensions/*.rb"].sort.each { |f| require(f) }
49
+ say("Loading DSL extension classes... ")
50
+
51
+ Dir.glob(["#{@tapioca_path}/extensions/**/*.rb"]).each do |extension|
52
+ require File.expand_path(extension)
53
+ end
54
+
55
+ ::Gem.find_files("tapioca/dsl/extensions/*.rb").each do |extension|
56
+ require File.expand_path(extension)
57
+ end
58
+
59
+ say("Done", :green)
50
60
  end
51
61
 
52
62
  sig { void }
@@ -80,6 +80,8 @@ module Tapioca
80
80
  def load_rails_engines
81
81
  return if engines.empty?
82
82
 
83
+ normalize_eager_load_paths_configuration!
84
+
83
85
  with_rails_application do
84
86
  run_initializers
85
87
 
@@ -110,7 +112,7 @@ module Tapioca
110
112
  autoloader = Zeitwerk::Loader.new
111
113
 
112
114
  engines.each do |engine|
113
- engine.config.eager_load_paths.each do |path|
115
+ engine.config.all_eager_load_paths.each do |path|
114
116
  # Zeitwerk only accepts existing directories in `push_dir`.
115
117
  next unless File.directory?(path)
116
118
  # We should not add directories that are already managed by a Zeitwerk loader.
@@ -131,7 +133,7 @@ module Tapioca
131
133
  # We can't use `Rails::Engine#eager_load!` directly because it will raise as soon as it encounters
132
134
  # an error, which is not what we want. We want to try to load as much as we can.
133
135
  engines.each do |engine|
134
- engine.config.eager_load_paths.each do |load_path|
136
+ engine.config.all_eager_load_paths.each do |load_path|
135
137
  Dir.glob("#{load_path}/**/*.rb").sort.each do |file|
136
138
  require_dependency file
137
139
  end
@@ -179,6 +181,19 @@ module Tapioca
179
181
  .reject { |engine| gem_in_app_dir?(project_path, engine.config.root.to_path) }
180
182
  end
181
183
 
184
+ # Rails 7.2 renamed `eager_load_paths` to `all_eager_load_paths`, which maintains the same original functionality.
185
+ # The `eager_load_paths` method still exists, but doesn't return all paths anymore and causes Tapioca to miss some
186
+ # engine paths. The following commit is the change:
187
+ # https://github.com/rails/rails/commit/ebfca905db14020589c22e6937382e6f8f687664
188
+ #
189
+ # Here we make sure that the new `all_eager_load_paths` is always defined for every Rails version below 7.2, so
190
+ # that we can use it everywhere
191
+ def normalize_eager_load_paths_configuration!
192
+ return if Rails::VERSION::MAJOR >= 7 && Rails::VERSION::MINOR >= 2
193
+
194
+ engines.each { |e| e.config.all_eager_load_paths = e.config.eager_load_paths }
195
+ end
196
+
182
197
  sig { params(path: String).void }
183
198
  def safe_require(path)
184
199
  require path
@@ -191,19 +191,6 @@ module Tapioca
191
191
  sig { returns(T.nilable(String)) }
192
192
  def name
193
193
  constant_name = super
194
-
195
- # This is a hack to work around modules under anonymous modules not having
196
- # names in 2.7: https://bugs.ruby-lang.org/issues/14895
197
- #
198
- # This happens when a type variable is declared under `class << self`, for
199
- # example.
200
- #
201
- # The workaround is to give the parent context a name, at which point, our
202
- # module gets bound to a name under that name, as well.
203
- unless constant_name
204
- constant_name = with_bound_name_pre_3_0 { super }
205
- end
206
-
207
194
  constant_name&.split("::")&.last
208
195
  end
209
196
 
@@ -247,20 +234,6 @@ module Tapioca
247
234
  -> { bounds }
248
235
  end
249
236
 
250
- sig do
251
- type_parameters(:Result)
252
- .params(block: T.proc.returns(T.type_parameter(:Result)))
253
- .returns(T.type_parameter(:Result))
254
- end
255
- def with_bound_name_pre_3_0(&block)
256
- require "securerandom"
257
- temp_name = "TYPE_VARIABLE_TRACKING_#{SecureRandom.hex}"
258
- self.class.const_set(temp_name, @context)
259
- block.call
260
- ensure
261
- self.class.send(:remove_const, temp_name) if temp_name
262
- end
263
-
264
237
  sig { returns(T::Hash[Symbol, T.untyped]) }
265
238
  def bounds
266
239
  @bounds ||= @bounds_proc.call
@@ -27,7 +27,7 @@ module Tapioca
27
27
 
28
28
  return Set.new unless gem_engine
29
29
 
30
- paths = gem_engine.config.eager_load_paths.flat_map do |load_path|
30
+ paths = gem_engine.config.all_eager_load_paths.flat_map do |load_path|
31
31
  Pathname.glob("#{load_path}/**/*.rb")
32
32
  end
33
33
 
@@ -59,14 +59,15 @@ module Tapioca
59
59
 
60
60
  sig { returns(T::Array[T.class_of(Rails::Engine)]) }
61
61
  def engines
62
- @engines = T.let(@engines, T.nilable(T::Array[T.class_of(Rails::Engine)]))
63
-
64
- @engines ||= if Object.const_defined?("Rails::Engine")
65
- descendants_of(Object.const_get("Rails::Engine"))
66
- .reject(&:abstract_railtie?)
67
- else
68
- []
69
- end
62
+ @engines ||= T.let(
63
+ if Object.const_defined?("Rails::Engine")
64
+ descendants_of(Object.const_get("Rails::Engine"))
65
+ .reject(&:abstract_railtie?)
66
+ else
67
+ []
68
+ end,
69
+ T.nilable(T::Array[T.class_of(Rails::Engine)]),
70
+ )
70
71
  end
71
72
 
72
73
  sig { params(input: String, table_type: String).returns(String) }
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Tapioca
5
- VERSION = "0.11.8"
5
+ VERSION = "0.11.10"
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tapioca
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.8
4
+ version: 0.11.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ufuk Kayserilioglu
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: exe
13
13
  cert_chain: []
14
- date: 2023-07-12 00:00:00.000000000 Z
14
+ date: 2023-10-31 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: bundler
@@ -61,20 +61,20 @@ dependencies:
61
61
  requirements:
62
62
  - - "~>"
63
63
  - !ruby/object:Gem::Version
64
- version: 0.0.0
64
+ version: 0.1.0
65
65
  - - ">="
66
66
  - !ruby/object:Gem::Version
67
- version: 0.0.16
67
+ version: 0.1.0
68
68
  type: :runtime
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: 0.0.0
74
+ version: 0.1.0
75
75
  - - ">="
76
76
  - !ruby/object:Gem::Version
77
- version: 0.0.16
77
+ version: 0.1.0
78
78
  - !ruby/object:Gem::Dependency
79
79
  name: sorbet-static-and-runtime
80
80
  requirement: !ruby/object:Gem::Requirement
@@ -152,13 +152,19 @@ files:
152
152
  - lib/tapioca/bundler_ext/auto_require_hook.rb
153
153
  - lib/tapioca/cli.rb
154
154
  - lib/tapioca/commands.rb
155
+ - lib/tapioca/commands/abstract_dsl.rb
156
+ - lib/tapioca/commands/abstract_gem.rb
155
157
  - lib/tapioca/commands/annotations.rb
156
158
  - lib/tapioca/commands/check_shims.rb
157
159
  - lib/tapioca/commands/command.rb
158
160
  - lib/tapioca/commands/command_without_tracker.rb
159
161
  - lib/tapioca/commands/configure.rb
160
- - lib/tapioca/commands/dsl.rb
161
- - lib/tapioca/commands/gem.rb
162
+ - lib/tapioca/commands/dsl_compiler_list.rb
163
+ - lib/tapioca/commands/dsl_generate.rb
164
+ - lib/tapioca/commands/dsl_verify.rb
165
+ - lib/tapioca/commands/gem_generate.rb
166
+ - lib/tapioca/commands/gem_sync.rb
167
+ - lib/tapioca/commands/gem_verify.rb
162
168
  - lib/tapioca/commands/require.rb
163
169
  - lib/tapioca/commands/todo.rb
164
170
  - lib/tapioca/dsl.rb
@@ -170,6 +176,7 @@ files:
170
176
  - lib/tapioca/dsl/compilers/active_job.rb
171
177
  - lib/tapioca/dsl/compilers/active_model_attributes.rb
172
178
  - lib/tapioca/dsl/compilers/active_model_secure_password.rb
179
+ - lib/tapioca/dsl/compilers/active_model_validations_confirmation.rb
173
180
  - lib/tapioca/dsl/compilers/active_record_associations.rb
174
181
  - lib/tapioca/dsl/compilers/active_record_columns.rb
175
182
  - lib/tapioca/dsl/compilers/active_record_delegated_types.rb
@@ -178,6 +185,7 @@ files:
178
185
  - lib/tapioca/dsl/compilers/active_record_relations.rb
179
186
  - lib/tapioca/dsl/compilers/active_record_scope.rb
180
187
  - lib/tapioca/dsl/compilers/active_record_secure_token.rb
188
+ - lib/tapioca/dsl/compilers/active_record_store.rb
181
189
  - lib/tapioca/dsl/compilers/active_record_typed_store.rb
182
190
  - lib/tapioca/dsl/compilers/active_resource.rb
183
191
  - lib/tapioca/dsl/compilers/active_storage.rb
@@ -188,6 +196,7 @@ files:
188
196
  - lib/tapioca/dsl/compilers/graphql_input_object.rb
189
197
  - lib/tapioca/dsl/compilers/graphql_mutation.rb
190
198
  - lib/tapioca/dsl/compilers/identity_cache.rb
199
+ - lib/tapioca/dsl/compilers/json_api_client_resource.rb
191
200
  - lib/tapioca/dsl/compilers/kredis.rb
192
201
  - lib/tapioca/dsl/compilers/mixed_in_class_attributes.rb
193
202
  - lib/tapioca/dsl/compilers/protobuf.rb
@@ -228,6 +237,7 @@ files:
228
237
  - lib/tapioca/helpers/config_helper.rb
229
238
  - lib/tapioca/helpers/env_helper.rb
230
239
  - lib/tapioca/helpers/gem_helper.rb
240
+ - lib/tapioca/helpers/git_attributes.rb
231
241
  - lib/tapioca/helpers/rbi_files_helper.rb
232
242
  - lib/tapioca/helpers/rbi_helper.rb
233
243
  - lib/tapioca/helpers/sorbet_helper.rb
@@ -276,14 +286,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
276
286
  requirements:
277
287
  - - ">="
278
288
  - !ruby/object:Gem::Version
279
- version: '2.7'
289
+ version: '3.0'
280
290
  required_rubygems_version: !ruby/object:Gem::Requirement
281
291
  requirements:
282
292
  - - ">="
283
293
  - !ruby/object:Gem::Version
284
294
  version: '0'
285
295
  requirements: []
286
- rubygems_version: 3.4.16
296
+ rubygems_version: 3.4.21
287
297
  signing_key:
288
298
  specification_version: 4
289
299
  summary: A Ruby Interface file generator for gems, core types and the Ruby standard