goldiloader 4.2.0 → 5.1.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 60dd6e4947b269049f3a3348487771468d5dd5d9dc3a1029022ddbe88cc8ec37
4
- data.tar.gz: 4b064ab04a026f86e68cda4d196b128b175b4fa85ce16c2bcc6026a87f52aa62
3
+ metadata.gz: 4b14210a0559e4703e779410d7381cd84f4e25d808107ea4558bff158320ad66
4
+ data.tar.gz: 74bd3fc10220916fe12e8394731f0e4846ae157bd24922ca434f83800ee56cfc
5
5
  SHA512:
6
- metadata.gz: 7da14e3c1d7c8c2ce7d824bb3af676b7edd0dd5399889242c3cab874d26e957b8d9a3bcd6b2f29a6fb0aa88498d447538e1a5620f691a38b1dfa78b69dd6837a
7
- data.tar.gz: a124830cd0f6a34def8d4d59daabce9889d89da6840eeb5adff5b4f6266b159cb2b785c949c31a6f96d407319fdee3b777d96ddaba1b26e04094dc8e843dd642
6
+ metadata.gz: b8c6f697034dab771dec9391aba56c647631f96f942165adae988803f74c59a7dca7515360349d0193f0d66a60f8fc9d19da1288613562de8b13b6f23b329961
7
+ data.tar.gz: ed6feff242aedac8add87e36d0863f34e3d6dcc00405f0a98dc6cb803b3d75451f228839e2cff251b5d9a58d0fa1b019e55f73d5d2689f957e11a4d517843389
@@ -25,6 +25,11 @@ module Goldiloader
25
25
  @auto_include_context = nil
26
26
  super
27
27
  end
28
+
29
+ def goldiload(cache_name = nil, key: self.class.primary_key, &block)
30
+ cache_name ||= block.source_location.join(':')
31
+ auto_include_context.preloaded(self, cache_name: cache_name, key: key, &block)
32
+ end
28
33
  end
29
34
  ::ActiveRecord::Base.include(::Goldiloader::BasePatch)
30
35
 
@@ -114,8 +119,7 @@ module Goldiloader
114
119
  private
115
120
 
116
121
  def eager_loadable?
117
- klass && reflection.eager_loadable?(klass) &&
118
- (::Goldiloader::Compatibility.destroyed_model_associations_eager_loadable? || !owner.destroyed?)
122
+ klass && reflection.eager_loadable?(klass)
119
123
  end
120
124
 
121
125
  def load_with_auto_include
@@ -51,5 +51,7 @@ module Goldiloader
51
51
  end
52
52
 
53
53
  alias_method :register_model, :register_models
54
+
55
+ prepend Goldiloader::CustomPreloads
54
56
  end
55
57
  end
@@ -3,16 +3,11 @@
3
3
  module Goldiloader
4
4
  module Compatibility
5
5
  ACTIVE_RECORD_VERSION = ::Gem::Version.new(::ActiveRecord::VERSION::STRING).release
6
- RAILS_5_2_0 = ACTIVE_RECORD_VERSION == ::Gem::Version.new('5.2.0')
7
6
 
8
7
  def self.pre_rails_7?
9
8
  ::ActiveRecord::VERSION::MAJOR < 7
10
9
  end
11
10
 
12
- def self.rails_5_2?
13
- ::ActiveRecord::VERSION::MAJOR == 5 && ::ActiveRecord::VERSION::MINOR == 2
14
- end
15
-
16
11
  def self.rails_6_1?
17
12
  ::ActiveRecord::VERSION::MAJOR == 6 && ::ActiveRecord::VERSION::MINOR == 1
18
13
  end
@@ -20,10 +15,5 @@ module Goldiloader
20
15
  def self.rails_6_1_or_greater?
21
16
  ::ActiveRecord::VERSION::MAJOR > 6 || rails_6_1?
22
17
  end
23
-
24
- # See https://github.com/rails/rails/pull/32375
25
- def self.destroyed_model_associations_eager_loadable?
26
- !RAILS_5_2_0
27
- end
28
18
  end
29
19
  end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Goldiloader
4
+ module CustomPreloads
5
+ def initialize
6
+ super
7
+ @custom_preloads = nil
8
+ end
9
+
10
+ def preloaded(model, cache_name:, key:, &block)
11
+ unless preloaded?(cache_name)
12
+ ids = models.map do |record|
13
+ record.public_send(key)
14
+ end
15
+
16
+ # We're using instance_exec instead of a simple yield to make sure that the
17
+ # given block does not have any references to the model instance as this might
18
+ # lead to unexpected results. The block will be executed in the context of the
19
+ # class of the model instead.
20
+ block_context = models.first.class
21
+ preloaded_hash = block_context.instance_exec(ids, &block)
22
+ store_preloaded(cache_name, preloaded_hash)
23
+ end
24
+ fetch_preloaded(cache_name, model, key: key)
25
+ end
26
+
27
+ private
28
+
29
+ def store_preloaded(cache_name, preloaded_hash)
30
+ @custom_preloads ||= {}
31
+ @custom_preloads[cache_name] = preloaded_hash
32
+ end
33
+
34
+ def fetch_preloaded(cache_name, instance, key:)
35
+ @custom_preloads&.dig(cache_name, instance.public_send(key))
36
+ end
37
+
38
+ def preloaded?(cache_name)
39
+ @custom_preloads&.key?(cache_name)
40
+ end
41
+ end
42
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Goldiloader
4
- VERSION = '4.2.0'
4
+ VERSION = '5.1.0'
5
5
  end
data/lib/goldiloader.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require 'active_support/all'
4
4
  require 'active_record'
5
5
  require 'goldiloader/compatibility'
6
+ require 'goldiloader/custom_preloads'
6
7
  require 'goldiloader/auto_include_context'
7
8
  require 'goldiloader/scope_info'
8
9
  require 'goldiloader/association_options'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: goldiloader
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.2.0
4
+ version: 5.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joel Turkel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-14 00:00:00.000000000 Z
11
+ date: 2023-11-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,7 +16,7 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '5.2'
19
+ version: '6.1'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
22
  version: '7.2'
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: '5.2'
29
+ version: '6.1'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: '7.2'
@@ -36,7 +36,7 @@ dependencies:
36
36
  requirements:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
- version: '5.2'
39
+ version: '6.1'
40
40
  - - "<"
41
41
  - !ruby/object:Gem::Version
42
42
  version: '7.2'
@@ -46,32 +46,26 @@ dependencies:
46
46
  requirements:
47
47
  - - ">="
48
48
  - !ruby/object:Gem::Version
49
- version: '5.2'
49
+ version: '6.1'
50
50
  - - "<"
51
51
  - !ruby/object:Gem::Version
52
52
  version: '7.2'
53
53
  - !ruby/object:Gem::Dependency
54
- name: activestorage
54
+ name: appraisal
55
55
  requirement: !ruby/object:Gem::Requirement
56
56
  requirements:
57
57
  - - ">="
58
58
  - !ruby/object:Gem::Version
59
- version: '5.2'
60
- - - "<"
61
- - !ruby/object:Gem::Version
62
- version: '7.2'
59
+ version: '0'
63
60
  type: :development
64
61
  prerelease: false
65
62
  version_requirements: !ruby/object:Gem::Requirement
66
63
  requirements:
67
64
  - - ">="
68
65
  - !ruby/object:Gem::Version
69
- version: '5.2'
70
- - - "<"
71
- - !ruby/object:Gem::Version
72
- version: '7.2'
66
+ version: '0'
73
67
  - !ruby/object:Gem::Dependency
74
- name: appraisal
68
+ name: benchmark-ips
75
69
  requirement: !ruby/object:Gem::Requirement
76
70
  requirements:
77
71
  - - ">="
@@ -85,19 +79,19 @@ dependencies:
85
79
  - !ruby/object:Gem::Version
86
80
  version: '0'
87
81
  - !ruby/object:Gem::Dependency
88
- name: benchmark-ips
82
+ name: combustion
89
83
  requirement: !ruby/object:Gem::Requirement
90
84
  requirements:
91
- - - ">="
85
+ - - "~>"
92
86
  - !ruby/object:Gem::Version
93
- version: '0'
87
+ version: '1.3'
94
88
  type: :development
95
89
  prerelease: false
96
90
  version_requirements: !ruby/object:Gem::Requirement
97
91
  requirements:
98
- - - ">="
92
+ - - "~>"
99
93
  - !ruby/object:Gem::Version
100
- version: '0'
94
+ version: '1.3'
101
95
  - !ruby/object:Gem::Dependency
102
96
  name: coveralls_reborn
103
97
  requirement: !ruby/object:Gem::Requirement
@@ -113,21 +107,27 @@ dependencies:
113
107
  - !ruby/object:Gem::Version
114
108
  version: 0.18.0
115
109
  - !ruby/object:Gem::Dependency
116
- name: database_cleaner
110
+ name: rails
117
111
  requirement: !ruby/object:Gem::Requirement
118
112
  requirements:
119
113
  - - ">="
120
114
  - !ruby/object:Gem::Version
121
- version: '1.2'
115
+ version: '6.1'
116
+ - - "<"
117
+ - !ruby/object:Gem::Version
118
+ version: '7.2'
122
119
  type: :development
123
120
  prerelease: false
124
121
  version_requirements: !ruby/object:Gem::Requirement
125
122
  requirements:
126
123
  - - ">="
127
124
  - !ruby/object:Gem::Version
128
- version: '1.2'
125
+ version: '6.1'
126
+ - - "<"
127
+ - !ruby/object:Gem::Version
128
+ version: '7.2'
129
129
  - !ruby/object:Gem::Dependency
130
- name: mime-types
130
+ name: rake
131
131
  requirement: !ruby/object:Gem::Requirement
132
132
  requirements:
133
133
  - - ">="
@@ -141,35 +141,35 @@ dependencies:
141
141
  - !ruby/object:Gem::Version
142
142
  version: '0'
143
143
  - !ruby/object:Gem::Dependency
144
- name: rake
144
+ name: rspec
145
145
  requirement: !ruby/object:Gem::Requirement
146
146
  requirements:
147
- - - ">="
147
+ - - "~>"
148
148
  - !ruby/object:Gem::Version
149
- version: '0'
149
+ version: '3'
150
150
  type: :development
151
151
  prerelease: false
152
152
  version_requirements: !ruby/object:Gem::Requirement
153
153
  requirements:
154
- - - ">="
154
+ - - "~>"
155
155
  - !ruby/object:Gem::Version
156
- version: '0'
156
+ version: '3'
157
157
  - !ruby/object:Gem::Dependency
158
- name: rspec
158
+ name: rspec_junit_formatter
159
159
  requirement: !ruby/object:Gem::Requirement
160
160
  requirements:
161
- - - "~>"
161
+ - - ">="
162
162
  - !ruby/object:Gem::Version
163
- version: '3'
163
+ version: '0'
164
164
  type: :development
165
165
  prerelease: false
166
166
  version_requirements: !ruby/object:Gem::Requirement
167
167
  requirements:
168
- - - "~>"
168
+ - - ">="
169
169
  - !ruby/object:Gem::Version
170
- version: '3'
170
+ version: '0'
171
171
  - !ruby/object:Gem::Dependency
172
- name: rspec_junit_formatter
172
+ name: rspec-rails
173
173
  requirement: !ruby/object:Gem::Requirement
174
174
  requirements:
175
175
  - - ">="
@@ -214,16 +214,16 @@ dependencies:
214
214
  name: sqlite3
215
215
  requirement: !ruby/object:Gem::Requirement
216
216
  requirements:
217
- - - "~>"
217
+ - - ">="
218
218
  - !ruby/object:Gem::Version
219
- version: '1.3'
219
+ version: '0'
220
220
  type: :development
221
221
  prerelease: false
222
222
  version_requirements: !ruby/object:Gem::Requirement
223
223
  requirements:
224
- - - "~>"
224
+ - - ">="
225
225
  - !ruby/object:Gem::Version
226
- version: '1.3'
226
+ version: '0'
227
227
  description: Automatically eager loads Rails associations as associations are traversed
228
228
  email:
229
229
  - jturkel@salsify.com
@@ -238,6 +238,7 @@ files:
238
238
  - lib/goldiloader/association_options.rb
239
239
  - lib/goldiloader/auto_include_context.rb
240
240
  - lib/goldiloader/compatibility.rb
241
+ - lib/goldiloader/custom_preloads.rb
241
242
  - lib/goldiloader/scope_info.rb
242
243
  - lib/goldiloader/version.rb
243
244
  homepage: https://github.com/salsify/goldiloader
@@ -258,14 +259,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
258
259
  requirements:
259
260
  - - ">="
260
261
  - !ruby/object:Gem::Version
261
- version: '2.6'
262
+ version: '3.0'
262
263
  required_rubygems_version: !ruby/object:Gem::Requirement
263
264
  requirements:
264
265
  - - ">="
265
266
  - !ruby/object:Gem::Version
266
267
  version: '0'
267
268
  requirements: []
268
- rubygems_version: 3.2.22
269
+ rubygems_version: 3.3.26
269
270
  signing_key:
270
271
  specification_version: 4
271
272
  summary: Automatic Rails association eager loading