tapioca 0.11.9 → 0.11.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d9a73b205d42dc103e1e4816c7915a3b4764cdeb6894f384a66e500e95bfbc5a
4
- data.tar.gz: ff14910658ef17ebe542f8adb67c70e24ed755b41f31860071425d95917c9172
3
+ metadata.gz: dd1124c2c3feac470d361a45577dc6384e85873e93f19a2bea4eb91b01da593c
4
+ data.tar.gz: 0d6a664089314ff666abd93615dae440274af183b0a7ef2d60035cee73299de9
5
5
  SHA512:
6
- metadata.gz: 34217744dc8a5ae07940fbd4c6a6c6f1a513d6d6169d9fb9ff1785c9bced7b57022cc4573857f70cbbe24b744915e019ad57bdffe349c981a4bc2e675ab23bc6
7
- data.tar.gz: 141e26b30087b8573d13b739e52ad5dd9b4934d14dcb1870135e4b91efcc1e3205410e6b625b295be879d6c230a44d95b0a495a8a0bffa7b208d2d6c4efd1df1
6
+ metadata.gz: b599a8e5a0dbee29e0e64ff458eb7a6e7c85c3beb0ffae20ae3487fb1d080714e80490d0e0c089bc32ab9dd33670901692396fc2d25c2064d0ab8012158dbb4b
7
+ data.tar.gz: b2a58b28c77a0b33c9f83f48f2663c106b9dc465ae137c6f71ac04601dbf3ec63ca8c6b7fde45820577c2d0bd237a65ce07a45f440195b5514a20614f33e80e5
@@ -73,20 +73,17 @@ module Tapioca
73
73
  sig { returns(T::Class[ActiveRecord::TestFixtures]) }
74
74
  def fixture_loader
75
75
  @fixture_loader ||= T.let(
76
- T.cast(
77
- Class.new do
78
- T.unsafe(self).include(ActiveRecord::TestFixtures)
79
-
80
- T.unsafe(self).fixture_path = Rails.root.join("test", "fixtures")
81
- # https://github.com/rails/rails/blob/7c70791470fc517deb7c640bead9f1b47efb5539/activerecord/lib/active_record/test_fixtures.rb#L46
82
- singleton_class.define_method(:file_fixture_path) do
83
- Rails.root.join("test", "fixtures", "files")
84
- end
85
-
86
- T.unsafe(self).fixtures(:all)
87
- end,
88
- T::Class[ActiveRecord::TestFixtures],
89
- ),
76
+ Class.new do
77
+ T.unsafe(self).include(ActiveRecord::TestFixtures)
78
+
79
+ T.unsafe(self).fixture_path = Rails.root.join("test", "fixtures")
80
+ # https://github.com/rails/rails/blob/7c70791470fc517deb7c640bead9f1b47efb5539/activerecord/lib/active_record/test_fixtures.rb#L46
81
+ singleton_class.define_method(:file_fixture_path) do
82
+ Rails.root.join("test", "fixtures", "files")
83
+ end
84
+
85
+ T.unsafe(self).fixtures(:all)
86
+ end,
90
87
  T.nilable(T::Class[ActiveRecord::TestFixtures]),
91
88
  )
92
89
  end
@@ -0,0 +1,149 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ begin
5
+ require "active_record"
6
+ rescue LoadError
7
+ return
8
+ end
9
+
10
+ require "tapioca/dsl/helpers/active_record_constants_helper"
11
+
12
+ module Tapioca
13
+ module Dsl
14
+ module Compilers
15
+ # `Tapioca::Dsl::Compilers::ActiveRecordStore` decorates RBI files for all
16
+ # classes that use [`ActiveRecord::Store`](https://api.rubyonrails.org/classes/ActiveRecord/Store.html).
17
+ #
18
+ # For example, with the following class:
19
+ #
20
+ # ~~~rb
21
+ # class User < ActiveRecord::Base
22
+ # store :settings, accessors: :theme
23
+ # store_accessor :settings, :power_source, prefix: :prefs
24
+ # end
25
+ # ~~~
26
+ #
27
+ # this compiler will produce an RBI file with the following content:
28
+ # ~~~rbi
29
+ # # typed: true
30
+ #
31
+ # class User
32
+ # include GeneratedStoredAttributesMethods
33
+ #
34
+ # module GeneratedStoredAttributesMethods
35
+ # sig { returns(T.untyped) }
36
+ # def prefs_power_source; end
37
+ #
38
+ # sig { params(value: T.untyped).returns(T.untyped) }
39
+ # def prefs_power_source=(value); end
40
+ #
41
+ # sig { returns(T.untyped) }
42
+ # def prefs_power_source_before_last_save; end
43
+ #
44
+ # sig { returns(T.untyped) }
45
+ # def prefs_power_source_change; end
46
+ #
47
+ # sig { returns(T::Boolean) }
48
+ # def prefs_power_source_changed?; end
49
+ #
50
+ # sig { returns(T.untyped) }
51
+ # def prefs_power_source_was; end
52
+ #
53
+ # sig { returns(T.untyped) }
54
+ # def saved_change_to_prefs_power_source; end
55
+ #
56
+ # sig { returns(T::Boolean) }
57
+ # def saved_change_to_prefs_power_source?; end
58
+ #
59
+ # sig { returns(T.untyped) }
60
+ # def saved_change_to_theme; end
61
+ #
62
+ # sig { returns(T::Boolean) }
63
+ # def saved_change_to_theme?; end
64
+ #
65
+ # sig { returns(T.untyped) }
66
+ # def theme; end
67
+ #
68
+ # sig { params(value: T.untyped).returns(T.untyped) }
69
+ # def theme=(value); end
70
+ #
71
+ # sig { returns(T.untyped) }
72
+ # def theme_before_last_save; end
73
+ #
74
+ # sig { returns(T.untyped) }
75
+ # def theme_change; end
76
+ #
77
+ # sig { returns(T::Boolean) }
78
+ # def theme_changed?; end
79
+ #
80
+ # sig { returns(T.untyped) }
81
+ # def theme_was; end
82
+ # end
83
+ # end
84
+ # ~~~
85
+ class ActiveRecordStore < Compiler
86
+ extend T::Sig
87
+ include Helpers::ActiveRecordConstantsHelper
88
+
89
+ ConstantType = type_member { { fixed: T.all(T.class_of(ActiveRecord::Base), Extensions::ActiveRecord) } }
90
+
91
+ sig { override.void }
92
+ def decorate
93
+ return if constant.__tapioca_stored_attributes.nil?
94
+
95
+ root.create_path(constant) do |klass|
96
+ klass.create_module(StoredAttributesModuleName) do |mod|
97
+ constant.__tapioca_stored_attributes.each do |store_attribute, keys, prefix, suffix|
98
+ accessor_prefix =
99
+ case prefix
100
+ when String, Symbol
101
+ "#{prefix}_"
102
+ when TrueClass
103
+ "#{store_attribute}_"
104
+ else
105
+ ""
106
+ end
107
+ accessor_suffix =
108
+ case suffix
109
+ when String, Symbol
110
+ "_#{suffix}"
111
+ when TrueClass
112
+ "_#{store_attribute}"
113
+ else
114
+ ""
115
+ end
116
+
117
+ keys.flatten.map { |key| "#{accessor_prefix}#{key}#{accessor_suffix}" }.each do |accessor_key|
118
+ mod.create_method(
119
+ "#{accessor_key}=",
120
+ parameters: [create_param("value", type: "T.untyped")],
121
+ return_type: "T.untyped",
122
+ )
123
+ mod.create_method(accessor_key, return_type: "T.untyped")
124
+ mod.create_method("#{accessor_key}_changed?", return_type: "T::Boolean")
125
+ mod.create_method("#{accessor_key}_change", return_type: "T.untyped")
126
+ mod.create_method("#{accessor_key}_was", return_type: "T.untyped")
127
+ mod.create_method("saved_change_to_#{accessor_key}?", return_type: "T::Boolean")
128
+ mod.create_method("saved_change_to_#{accessor_key}", return_type: "T.untyped")
129
+ mod.create_method("#{accessor_key}_before_last_save", return_type: "T.untyped")
130
+ end
131
+ end
132
+ end
133
+
134
+ klass.create_include(StoredAttributesModuleName)
135
+ end
136
+ end
137
+
138
+ class << self
139
+ extend T::Sig
140
+
141
+ sig { override.returns(T::Enumerable[Module]) }
142
+ def gather_constants
143
+ descendants_of(::ActiveRecord::Base).reject(&:abstract_class?)
144
+ end
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end
@@ -30,6 +30,15 @@ module Tapioca
30
30
  super
31
31
  end
32
32
 
33
+ attr_reader :__tapioca_stored_attributes
34
+
35
+ def store_accessor(store_attribute, *keys, prefix: nil, suffix: nil)
36
+ @__tapioca_stored_attributes ||= []
37
+ @__tapioca_stored_attributes << [store_attribute, keys, prefix, suffix]
38
+
39
+ super
40
+ end
41
+
33
42
  ::ActiveRecord::Base.singleton_class.prepend(self)
34
43
  end
35
44
  end
@@ -85,6 +85,9 @@ module Tapioca
85
85
  "::String"
86
86
  when ActiveRecord::Type::Serialized
87
87
  serialized_column_type(column_type)
88
+ when defined?(ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Uuid) &&
89
+ ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Uuid
90
+ "::String"
88
91
  when defined?(ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Hstore) &&
89
92
  ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Hstore
90
93
  "T::Hash[::String, ::String]"
@@ -15,6 +15,7 @@ module Tapioca
15
15
  AssociationMethodsModuleName = T.let("GeneratedAssociationMethods", String)
16
16
  DelegatedTypesModuleName = T.let("GeneratedDelegatedTypeMethods", String)
17
17
  SecureTokensModuleName = T.let("GeneratedSecureTokenMethods", String)
18
+ StoredAttributesModuleName = T.let("GeneratedStoredAttributesMethods", String)
18
19
 
19
20
  RelationMethodsModuleName = T.let("GeneratedRelationMethods", String)
20
21
  AssociationRelationMethodsModuleName = T.let("GeneratedAssociationRelationMethods", String)
@@ -47,8 +47,6 @@ module Tapioca
47
47
  end
48
48
  when GraphQL::Schema::InputObject.singleton_class
49
49
  type_for_constant(unwrapped_type)
50
- when GraphQL::Schema::NonNull.singleton_class
51
- type_for(unwrapped_type.of_type)
52
50
  when Module
53
51
  Runtime::Reflection.qualified_name_of(unwrapped_type) || "T.untyped"
54
52
  else
@@ -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
@@ -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
 
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Tapioca
5
- VERSION = "0.11.9"
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.9
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-09-13 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
@@ -185,6 +185,7 @@ files:
185
185
  - lib/tapioca/dsl/compilers/active_record_relations.rb
186
186
  - lib/tapioca/dsl/compilers/active_record_scope.rb
187
187
  - lib/tapioca/dsl/compilers/active_record_secure_token.rb
188
+ - lib/tapioca/dsl/compilers/active_record_store.rb
188
189
  - lib/tapioca/dsl/compilers/active_record_typed_store.rb
189
190
  - lib/tapioca/dsl/compilers/active_resource.rb
190
191
  - lib/tapioca/dsl/compilers/active_storage.rb
@@ -292,7 +293,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
292
293
  - !ruby/object:Gem::Version
293
294
  version: '0'
294
295
  requirements: []
295
- rubygems_version: 3.4.19
296
+ rubygems_version: 3.4.21
296
297
  signing_key:
297
298
  specification_version: 4
298
299
  summary: A Ruby Interface file generator for gems, core types and the Ruby standard