tapioca 0.11.17 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +122 -100
  3. data/lib/tapioca/commands/abstract_dsl.rb +3 -2
  4. data/lib/tapioca/commands/abstract_gem.rb +3 -1
  5. data/lib/tapioca/dsl/compilers/aasm.rb +1 -6
  6. data/lib/tapioca/dsl/compilers/action_controller_helpers.rb +1 -5
  7. data/lib/tapioca/dsl/compilers/action_mailer.rb +1 -5
  8. data/lib/tapioca/dsl/compilers/action_text.rb +1 -5
  9. data/lib/tapioca/dsl/compilers/active_job.rb +1 -5
  10. data/lib/tapioca/dsl/compilers/active_model_attributes.rb +4 -11
  11. data/lib/tapioca/dsl/compilers/active_model_secure_password.rb +10 -6
  12. data/lib/tapioca/dsl/compilers/active_model_validations_confirmation.rb +1 -5
  13. data/lib/tapioca/dsl/compilers/active_record_associations.rb +1 -5
  14. data/lib/tapioca/dsl/compilers/active_record_columns.rb +1 -5
  15. data/lib/tapioca/dsl/compilers/active_record_delegated_types.rb +1 -5
  16. data/lib/tapioca/dsl/compilers/active_record_enum.rb +1 -7
  17. data/lib/tapioca/dsl/compilers/active_record_fixtures.rb +2 -9
  18. data/lib/tapioca/dsl/compilers/active_record_relations.rb +253 -66
  19. data/lib/tapioca/dsl/compilers/active_record_scope.rb +1 -5
  20. data/lib/tapioca/dsl/compilers/active_record_secure_token.rb +1 -5
  21. data/lib/tapioca/dsl/compilers/active_record_store.rb +1 -5
  22. data/lib/tapioca/dsl/compilers/active_record_typed_store.rb +1 -7
  23. data/lib/tapioca/dsl/compilers/active_resource.rb +1 -5
  24. data/lib/tapioca/dsl/compilers/active_storage.rb +1 -6
  25. data/lib/tapioca/dsl/compilers/active_support_concern.rb +1 -5
  26. data/lib/tapioca/dsl/compilers/active_support_current_attributes.rb +6 -16
  27. data/lib/tapioca/dsl/compilers/config.rb +1 -5
  28. data/lib/tapioca/dsl/compilers/frozen_record.rb +1 -5
  29. data/lib/tapioca/dsl/compilers/graphql_input_object.rb +2 -6
  30. data/lib/tapioca/dsl/compilers/graphql_mutation.rb +2 -6
  31. data/lib/tapioca/dsl/compilers/identity_cache.rb +1 -7
  32. data/lib/tapioca/dsl/compilers/json_api_client_resource.rb +1 -7
  33. data/lib/tapioca/dsl/compilers/kredis.rb +1 -5
  34. data/lib/tapioca/dsl/compilers/mixed_in_class_attributes.rb +1 -5
  35. data/lib/tapioca/dsl/compilers/protobuf.rb +8 -5
  36. data/lib/tapioca/dsl/compilers/rails_generators.rb +1 -6
  37. data/lib/tapioca/dsl/compilers/sidekiq_worker.rb +1 -5
  38. data/lib/tapioca/dsl/compilers/smart_properties.rb +1 -7
  39. data/lib/tapioca/dsl/compilers/state_machines.rb +1 -7
  40. data/lib/tapioca/dsl/compilers/url_helpers.rb +17 -16
  41. data/lib/tapioca/dsl/extensions/active_record.rb +4 -2
  42. data/lib/tapioca/dsl/extensions/frozen_record.rb +6 -2
  43. data/lib/tapioca/dsl/extensions/kredis.rb +6 -2
  44. data/lib/tapioca/dsl/helpers/active_model_type_helper.rb +70 -0
  45. data/lib/tapioca/dsl/helpers/active_record_column_type_helper.rb +3 -35
  46. data/lib/tapioca/dsl/helpers/active_record_constants_helper.rb +2 -0
  47. data/lib/tapioca/dsl/pipeline.rb +1 -1
  48. data/lib/tapioca/gem/listeners/sorbet_props.rb +2 -1
  49. data/lib/tapioca/gemfile.rb +12 -1
  50. data/lib/tapioca/rbi_ext/model.rb +38 -6
  51. data/lib/tapioca/version.rb +1 -1
  52. metadata +6 -11
@@ -1,11 +1,7 @@
1
1
  # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
- begin
5
- require "kredis"
6
- rescue LoadError
7
- return
8
- end
4
+ return unless defined?(Kredis::Attributes)
9
5
 
10
6
  module Tapioca
11
7
  module Dsl
@@ -1,11 +1,7 @@
1
1
  # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
- begin
5
- require "active_support/core_ext/class/attribute"
6
- rescue LoadError
7
- return
8
- end
4
+ return unless defined?(ActiveSupport)
9
5
 
10
6
  module Tapioca
11
7
  module Dsl
@@ -1,11 +1,7 @@
1
1
  # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
- begin
5
- require "google/protobuf"
6
- rescue LoadError
7
- return
8
- end
4
+ return unless defined?(Google::Protobuf)
9
5
 
10
6
  module Tapioca
11
7
  module Dsl
@@ -306,6 +302,13 @@ module Tapioca
306
302
  return_type: "void",
307
303
  )
308
304
 
305
+ if desc.has_presence?
306
+ klass.create_method(
307
+ "has_#{field.name}?",
308
+ return_type: "Object",
309
+ )
310
+ end
311
+
309
312
  field
310
313
  end
311
314
 
@@ -1,12 +1,7 @@
1
1
  # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
- begin
5
- require "rails/generators"
6
- require "rails/generators/app_base"
7
- rescue LoadError
8
- return
9
- end
4
+ return unless defined?(Rails::Generators::Base)
10
5
 
11
6
  module Tapioca
12
7
  module Dsl
@@ -1,11 +1,7 @@
1
1
  # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
- begin
5
- require "sidekiq"
6
- rescue LoadError
7
- return
8
- end
4
+ return unless defined?(Sidekiq::Worker)
9
5
 
10
6
  module Tapioca
11
7
  module Dsl
@@ -1,13 +1,7 @@
1
1
  # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
- begin
5
- require "smart_properties"
6
- rescue LoadError
7
- # means SmartProperties is not installed,
8
- # so let's not even define the compiler.
9
- return
10
- end
4
+ return unless defined?(SmartProperties)
11
5
 
12
6
  module Tapioca
13
7
  module Dsl
@@ -1,13 +1,7 @@
1
1
  # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
- begin
5
- require "state_machines"
6
- rescue LoadError
7
- # means StateMachines is not installed,
8
- # so let's not even define the compiler.
9
- return
10
- end
4
+ return unless defined?(StateMachines)
11
5
 
12
6
  module Tapioca
13
7
  module Dsl
@@ -1,13 +1,7 @@
1
1
  # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
- begin
5
- require "rails"
6
- require "action_controller"
7
- require "action_view"
8
- rescue LoadError
9
- return
10
- end
4
+ return unless defined?(Rails) && defined?(ActionDispatch::Routing)
11
5
 
12
6
  module Tapioca
13
7
  module Dsl
@@ -102,19 +96,11 @@ module Tapioca
102
96
  end
103
97
  end
104
98
 
105
- NON_DISCOVERABLE_INCLUDERS = T.let(
106
- [
107
- ActionDispatch::IntegrationTest,
108
- ActionView::Helpers,
109
- ],
110
- T::Array[Module],
111
- )
112
-
113
99
  class << self
114
100
  extend T::Sig
115
101
  sig { override.returns(T::Enumerable[Module]) }
116
102
  def gather_constants
117
- return [] unless Rails.application
103
+ return [] unless defined?(Rails.application) && Rails.application
118
104
 
119
105
  Object.const_set(:GeneratedUrlHelpersModule, Rails.application.routes.named_routes.url_helpers_module)
120
106
  Object.const_set(:GeneratedPathHelpersModule, Rails.application.routes.named_routes.path_helpers_module)
@@ -131,6 +117,19 @@ module Tapioca
131
117
  constants.concat(NON_DISCOVERABLE_INCLUDERS)
132
118
  end
133
119
 
120
+ sig { returns(T::Array[Module]) }
121
+ def gather_non_discoverable_includers
122
+ [].tap do |includers|
123
+ if defined?(ActionController::TemplateAssertions) && defined?(ActionDispatch::IntegrationTest)
124
+ includers << ActionDispatch::IntegrationTest
125
+ end
126
+
127
+ if defined?(ActionView::Helpers)
128
+ includers << ActionView::Helpers
129
+ end
130
+ end.freeze
131
+ end
132
+
134
133
  sig { params(mod: Module, helper: Module).returns(T::Boolean) }
135
134
  private def includes_helper?(mod, helper)
136
135
  superclass_ancestors = []
@@ -145,6 +144,8 @@ module Tapioca
145
144
  end
146
145
  end
147
146
 
147
+ NON_DISCOVERABLE_INCLUDERS = T.let(gather_non_discoverable_includers, T::Array[Module])
148
+
148
149
  private
149
150
 
150
151
  sig { params(root: RBI::Tree, constant: Module).void }
@@ -2,7 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  begin
5
- require "active_record"
5
+ require "active_support"
6
6
  rescue LoadError
7
7
  return
8
8
  end
@@ -39,7 +39,9 @@ module Tapioca
39
39
  super
40
40
  end
41
41
 
42
- ::ActiveRecord::Base.singleton_class.prepend(self)
42
+ ::ActiveSupport.on_load(:active_record) do
43
+ ::ActiveRecord::Base.singleton_class.prepend(::Tapioca::Dsl::Compilers::Extensions::ActiveRecord)
44
+ end
43
45
  end
44
46
  end
45
47
  end
@@ -2,7 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  begin
5
- require "frozen_record"
5
+ require "active_support"
6
6
  rescue LoadError
7
7
  return
8
8
  end
@@ -21,7 +21,11 @@ module Tapioca
21
21
  super
22
22
  end
23
23
 
24
- ::FrozenRecord::Base.singleton_class.prepend(self)
24
+ ::ActiveSupport.on_load(:before_configuration) do
25
+ next unless defined?(::FrozenRecord::Base)
26
+
27
+ ::FrozenRecord::Base.singleton_class.prepend(::Tapioca::Dsl::Compilers::Extensions::FrozenRecord)
28
+ end
25
29
  end
26
30
  end
27
31
  end
@@ -2,7 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  begin
5
- require "kredis"
5
+ require "active_support"
6
6
  rescue LoadError
7
7
  return
8
8
  end
@@ -106,7 +106,11 @@ module Tapioca
106
106
  @__tapioca_kredis_types[method.to_s] = { type: type, values: values }
107
107
  end
108
108
 
109
- ::Kredis::Attributes::ClassMethods.prepend(self)
109
+ ::ActiveSupport.on_load(:before_configuration) do
110
+ next unless defined?(::Kredis::Attributes::ClassMethods)
111
+
112
+ ::Kredis::Attributes::ClassMethods.prepend(::Tapioca::Dsl::Compilers::Extensions::Kredis)
113
+ end
110
114
  end
111
115
  end
112
116
  end
@@ -0,0 +1,70 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Tapioca
5
+ module Dsl
6
+ module Helpers
7
+ module ActiveModelTypeHelper
8
+ class << self
9
+ extend T::Sig
10
+
11
+ # Returns the type indicated by the custom ActiveModel::Type::Value.
12
+ # Accepts subclasses of ActiveModel::Type::Value as well as classes that implement similar methods.
13
+ sig { params(type_value: T.untyped).returns(String) }
14
+ def type_for(type_value)
15
+ return "T.untyped" if Runtime::GenericTypeRegistry.generic_type_instance?(type_value)
16
+
17
+ type = lookup_return_type_of_method(type_value, :deserialize) ||
18
+ lookup_return_type_of_method(type_value, :cast) ||
19
+ lookup_return_type_of_method(type_value, :cast_value) ||
20
+ lookup_arg_type_of_method(type_value, :serialize) ||
21
+ T.untyped
22
+ type.to_s
23
+ end
24
+
25
+ private
26
+
27
+ MEANINGLESS_TYPES = T.let(
28
+ [
29
+ T.untyped,
30
+ T.noreturn,
31
+ T::Private::Types::Void,
32
+ T::Private::Types::NotTyped,
33
+ ].freeze,
34
+ T::Array[Object],
35
+ )
36
+
37
+ sig { params(type: T.untyped).returns(T::Boolean) }
38
+ def meaningful_type?(type)
39
+ !MEANINGLESS_TYPES.include?(type)
40
+ end
41
+
42
+ sig { params(obj: T.untyped, method: Symbol).returns(T.nilable(T::Types::Base)) }
43
+ def lookup_return_type_of_method(obj, method)
44
+ return_type = lookup_signature_of_method(obj, method)&.return_type
45
+ return unless return_type && meaningful_type?(return_type)
46
+
47
+ return_type
48
+ end
49
+
50
+ sig { params(obj: T.untyped, method: Symbol).returns(T.nilable(T::Types::Base)) }
51
+ def lookup_arg_type_of_method(obj, method)
52
+ # Arg types is an array of [name, type] entries, so we dig into first entry (index 0)
53
+ # and then into the type which is the last element (index 1)
54
+ first_arg_type = lookup_signature_of_method(obj, method)&.arg_types&.dig(0, 1)
55
+ return unless first_arg_type && meaningful_type?(first_arg_type)
56
+
57
+ first_arg_type
58
+ end
59
+
60
+ sig { params(obj: T.untyped, method: Symbol).returns(T.untyped) }
61
+ def lookup_signature_of_method(obj, method)
62
+ Runtime::Reflection.signature_of(obj.method(method))
63
+ rescue NameError
64
+ nil
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -1,6 +1,8 @@
1
1
  # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
+ require "tapioca/dsl/helpers/active_model_type_helper"
5
+
4
6
  module Tapioca
5
7
  module Dsl
6
8
  module Helpers
@@ -98,7 +100,7 @@ module Tapioca
98
100
  ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Array
99
101
  "T::Array[#{type_for_activerecord_value(column_type.subtype)}]"
100
102
  else
101
- handle_unknown_type(column_type)
103
+ ActiveModelTypeHelper.type_for(column_type)
102
104
  end
103
105
  end
104
106
 
@@ -108,40 +110,6 @@ module Tapioca
108
110
  !(constant.singleton_class < Object.const_get(:StrongTypeGeneration))
109
111
  end
110
112
 
111
- sig { params(column_type: BasicObject).returns(String) }
112
- def handle_unknown_type(column_type)
113
- return "T.untyped" unless ActiveModel::Type::Value === column_type
114
- return "T.untyped" if Runtime::GenericTypeRegistry.generic_type_instance?(column_type)
115
-
116
- lookup_return_type_of_method(column_type, :deserialize) ||
117
- lookup_return_type_of_method(column_type, :cast) ||
118
- lookup_arg_type_of_method(column_type, :serialize) ||
119
- "T.untyped"
120
- end
121
-
122
- sig { params(column_type: ActiveModel::Type::Value, method: Symbol).returns(T.nilable(String)) }
123
- def lookup_return_type_of_method(column_type, method)
124
- signature = Runtime::Reflection.signature_of(column_type.method(method))
125
- return unless signature
126
-
127
- return_type = signature.return_type
128
- return if return_type == T::Private::Types::Void || return_type == T::Private::Types::NotTyped
129
-
130
- return_type.to_s
131
- end
132
-
133
- sig { params(column_type: ActiveModel::Type::Value, method: Symbol).returns(T.nilable(String)) }
134
- def lookup_arg_type_of_method(column_type, method)
135
- signature = Runtime::Reflection.signature_of(column_type.method(method))
136
- return unless signature
137
-
138
- # Arg types is an array [name, type] entries, so we desctructure the type of
139
- # first argument to get the first argument type
140
- _, first_argument_type = signature.arg_types.first
141
-
142
- first_argument_type.to_s
143
- end
144
-
145
113
  sig { params(column_type: ActiveRecord::Enum::EnumType).returns(String) }
146
114
  def enum_setter_type(column_type)
147
115
  # In Rails < 7 this method is private. When support for that is dropped we can call the method directly
@@ -22,8 +22,10 @@ module Tapioca
22
22
  CommonRelationMethodsModuleName = T.let("CommonRelationMethods", String)
23
23
 
24
24
  RelationClassName = T.let("PrivateRelation", String)
25
+ RelationGroupChainClassName = T.let("PrivateRelationGroupChain", String)
25
26
  RelationWhereChainClassName = T.let("PrivateRelationWhereChain", String)
26
27
  AssociationRelationClassName = T.let("PrivateAssociationRelation", String)
28
+ AssociationRelationGroupChainClassName = T.let("PrivateAssociationRelationGroupChain", String)
27
29
  AssociationRelationWhereChainClassName = T.let("PrivateAssociationRelationWhereChain", String)
28
30
  AssociationsCollectionProxyClassName = T.let("PrivateCollectionProxy", String)
29
31
  end
@@ -61,7 +61,7 @@ module Tapioca
61
61
  .sort_by! { |c| T.must(Runtime::Reflection.name_of(c)) }
62
62
 
63
63
  # It's OK if there are no constants to process if we received a valid file/path.
64
- if constants_to_process.empty? && requested_paths.select { |p| File.exist?(p) }.empty?
64
+ if constants_to_process.empty? && requested_paths.none? { |p| File.exist?(p) }
65
65
  report_error(<<~ERROR)
66
66
  No classes/modules can be matched for RBI generation.
67
67
  Please check that the requested classes/modules include processable DSL methods.
@@ -6,6 +6,7 @@ module Tapioca
6
6
  module Listeners
7
7
  class SorbetProps < Base
8
8
  extend T::Sig
9
+ include RBIHelper
9
10
 
10
11
  private
11
12
 
@@ -17,7 +18,7 @@ module Tapioca
17
18
  return unless T::Props::ClassMethods === constant
18
19
 
19
20
  constant.props.map do |name, prop|
20
- type = prop.fetch(:type_object, "T.untyped").to_s.gsub(".returns(<VOID>)", ".void")
21
+ type = sanitize_signature_types(prop.fetch(:type_object, "T.untyped").to_s)
21
22
 
22
23
  default = prop.key?(:default) || prop.key?(:factory) ? "T.unsafe(nil)" : nil
23
24
  node << if prop.fetch(:immutable, false)
@@ -178,7 +178,18 @@ module Tapioca
178
178
 
179
179
  sig { void }
180
180
  def parse_yard_docs
181
- files.each { |path| YARD.parse(path.to_s, [], Logger::Severity::FATAL) }
181
+ files.each do |path|
182
+ YARD.parse(path.to_s, [], Logger::Severity::FATAL)
183
+ rescue RangeError
184
+ # In some circumstances, YARD will raise an error when parsing a file
185
+ # that is actually valid Ruby. We don't want tapioca to halt in these
186
+ # cases, so we'll rescue the error, pretend like there was no
187
+ # documentation, and move on.
188
+ #
189
+ # This can be removed when https://github.com/lsegal/yard/issues/1536
190
+ # is resolved and released.
191
+ []
192
+ end
182
193
  end
183
194
 
184
195
  sig { returns(T::Array[String]) }
@@ -87,24 +87,56 @@ module RBI
87
87
  ).void
88
88
  end
89
89
  def create_method(name, parameters: [], return_type: "T.untyped", class_method: false, visibility: RBI::Public.new,
90
+ comments: [])
91
+ sig = create_sig(parameters: parameters, return_type: return_type)
92
+ create_method_with_sigs(
93
+ name,
94
+ sigs: [sig],
95
+ parameters: parameters.map(&:param),
96
+ class_method: class_method,
97
+ visibility: visibility,
98
+ comments: comments,
99
+ )
100
+ end
101
+
102
+ sig do
103
+ params(
104
+ name: String,
105
+ sigs: T::Array[RBI::Sig],
106
+ parameters: T::Array[RBI::Param],
107
+ class_method: T::Boolean,
108
+ visibility: RBI::Visibility,
109
+ comments: T::Array[RBI::Comment],
110
+ ).void
111
+ end
112
+ def create_method_with_sigs(name, sigs:, parameters: [], class_method: false, visibility: RBI::Public.new,
90
113
  comments: [])
91
114
  return unless Tapioca::RBIHelper.valid_method_name?(name)
92
115
 
93
- sig = RBI::Sig.new(return_type: return_type)
94
116
  method = RBI::Method.new(
95
117
  name,
96
- sigs: [sig],
118
+ sigs: sigs,
119
+ params: parameters,
97
120
  is_singleton: class_method,
98
121
  visibility: visibility,
99
122
  comments: comments,
100
123
  )
101
- parameters.each do |param|
102
- method << param.param
103
- sig << RBI::SigParam.new(param.param.name, param.type)
104
- end
105
124
  self << method
106
125
  end
107
126
 
127
+ sig do
128
+ params(
129
+ parameters: T::Array[RBI::TypedParam],
130
+ return_type: String,
131
+ ).returns(RBI::Sig)
132
+ end
133
+ def create_sig(parameters: [], return_type: "T.untyped")
134
+ params = parameters.map do |param|
135
+ RBI::SigParam.new(param.param.name, param.type)
136
+ end
137
+ RBI::Sig.new(params: params, return_type: return_type)
138
+ end
139
+
108
140
  private
109
141
 
110
142
  sig { returns(T::Hash[String, RBI::Node]) }
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Tapioca
5
- VERSION = "0.11.17"
5
+ VERSION = "0.13.0"
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.17
4
+ version: 0.13.0
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: 2024-01-15 00:00:00.000000000 Z
14
+ date: 2024-03-25 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: bundler
@@ -81,21 +81,18 @@ dependencies:
81
81
  requirements:
82
82
  - - ">="
83
83
  - !ruby/object:Gem::Version
84
- version: 0.5.10820
84
+ version: 0.5.11087
85
85
  type: :runtime
86
86
  prerelease: false
87
87
  version_requirements: !ruby/object:Gem::Requirement
88
88
  requirements:
89
89
  - - ">="
90
90
  - !ruby/object:Gem::Version
91
- version: 0.5.10820
91
+ version: 0.5.11087
92
92
  - !ruby/object:Gem::Dependency
93
93
  name: spoom
94
94
  requirement: !ruby/object:Gem::Requirement
95
95
  requirements:
96
- - - "~>"
97
- - !ruby/object:Gem::Version
98
- version: 1.2.0
99
96
  - - ">="
100
97
  - !ruby/object:Gem::Version
101
98
  version: 1.2.0
@@ -103,9 +100,6 @@ dependencies:
103
100
  prerelease: false
104
101
  version_requirements: !ruby/object:Gem::Requirement
105
102
  requirements:
106
- - - "~>"
107
- - !ruby/object:Gem::Version
108
- version: 1.2.0
109
103
  - - ">="
110
104
  - !ruby/object:Gem::Version
111
105
  version: 1.2.0
@@ -209,6 +203,7 @@ files:
209
203
  - lib/tapioca/dsl/extensions/active_record.rb
210
204
  - lib/tapioca/dsl/extensions/frozen_record.rb
211
205
  - lib/tapioca/dsl/extensions/kredis.rb
206
+ - lib/tapioca/dsl/helpers/active_model_type_helper.rb
212
207
  - lib/tapioca/dsl/helpers/active_record_column_type_helper.rb
213
208
  - lib/tapioca/dsl/helpers/active_record_constants_helper.rb
214
209
  - lib/tapioca/dsl/helpers/graphql_type_helper.rb
@@ -293,7 +288,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
293
288
  - !ruby/object:Gem::Version
294
289
  version: '0'
295
290
  requirements: []
296
- rubygems_version: 3.5.4
291
+ rubygems_version: 3.5.6
297
292
  signing_key:
298
293
  specification_version: 4
299
294
  summary: A Ruby Interface file generator for gems, core types and the Ruby standard