goldiloader 3.1.0 → 4.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 +5 -5
- data/lib/goldiloader.rb +34 -0
- data/lib/goldiloader/active_record_patches.rb +28 -45
- data/lib/goldiloader/association_loader.rb +5 -11
- data/lib/goldiloader/association_options.rb +1 -5
- data/lib/goldiloader/compatibility.rb +4 -21
- data/lib/goldiloader/scope_info.rb +1 -5
- data/lib/goldiloader/version.rb +1 -1
- metadata +40 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: d30741df3c728239a50f4668f908f40cb0be785d5403848648faccc32b329d9d
|
4
|
+
data.tar.gz: 7032140f7401f0e47ac717b48d1089a6211d1ea7c78c3c64a1c0879882a47fbc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b9ae29eddaba860fa1a9075aae6788629f56e2d47bb71afef20dc39f587070c8572820694d1650a50d625d142739de419c7c9617a6cae6b6a4257fd753a3b2a8
|
7
|
+
data.tar.gz: cf79ee0b429d1716371ae655cae72dc811fec672d53c69409f24a46301326e90c5a2c02f60332b7ec3e4581c7a984e2cfbdb658fdbca11c8df340e53f9c217bc
|
data/lib/goldiloader.rb
CHANGED
@@ -8,3 +8,37 @@ require 'goldiloader/scope_info'
|
|
8
8
|
require 'goldiloader/association_options'
|
9
9
|
require 'goldiloader/association_loader'
|
10
10
|
require 'goldiloader/active_record_patches'
|
11
|
+
|
12
|
+
module Goldiloader
|
13
|
+
class << self
|
14
|
+
|
15
|
+
# Sets the process-wide enabled status
|
16
|
+
attr_accessor :globally_enabled
|
17
|
+
|
18
|
+
def enabled?
|
19
|
+
Thread.current.fetch(:goldiloader_enabled, globally_enabled)
|
20
|
+
end
|
21
|
+
|
22
|
+
def enabled=(val)
|
23
|
+
Thread.current[:goldiloader_enabled] = val
|
24
|
+
end
|
25
|
+
|
26
|
+
def enabled
|
27
|
+
old_enabled = enabled?
|
28
|
+
self.enabled = true
|
29
|
+
yield
|
30
|
+
ensure
|
31
|
+
self.enabled = old_enabled
|
32
|
+
end
|
33
|
+
|
34
|
+
def disabled
|
35
|
+
old_enabled = enabled?
|
36
|
+
self.enabled = false
|
37
|
+
yield
|
38
|
+
ensure
|
39
|
+
self.enabled = old_enabled
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
self.globally_enabled = true
|
44
|
+
end
|
@@ -47,21 +47,12 @@ module Goldiloader
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def auto_include_value
|
50
|
-
# Note: Don't use get_value because that doesn't work properly with defaulting boolean values
|
51
50
|
@values.fetch(:auto_include, true)
|
52
51
|
end
|
53
52
|
|
54
53
|
def auto_include_value=(value)
|
55
|
-
|
56
|
-
|
57
|
-
check_cached_relation
|
58
|
-
@values[:auto_include] = value
|
59
|
-
elsif Goldiloader::Compatibility.rails_5_0?
|
60
|
-
assert_mutability!
|
61
|
-
@values[:auto_include] = value
|
62
|
-
else
|
63
|
-
set_value(:auto_include, value)
|
64
|
-
end
|
54
|
+
assert_mutability!
|
55
|
+
@values[:auto_include] = value
|
65
56
|
end
|
66
57
|
end
|
67
58
|
::ActiveRecord::Relation.prepend(::Goldiloader::RelationPatch)
|
@@ -77,29 +68,26 @@ module Goldiloader
|
|
77
68
|
ActiveRecord::Relation::Merger.prepend(::Goldiloader::MergerPatch)
|
78
69
|
|
79
70
|
module AssociationReflectionPatch
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
@
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
(::Goldiloader::Compatibility.group_eager_loadable? || !scope_info.group?) &&
|
101
|
-
(::Goldiloader::Compatibility.from_eager_loadable? || !scope_info.from?)
|
102
|
-
end
|
71
|
+
# Note we need to pass the association's target class as an argument since it won't be known
|
72
|
+
# outside the context of an association instance for polymorphic associations.
|
73
|
+
def eager_loadable?(target_klass)
|
74
|
+
@eager_loadable_cache ||= Hash.new do |cache, target_klass_key|
|
75
|
+
cache[target_klass_key] = if scope.nil?
|
76
|
+
# Associations without any scoping options are eager loadable
|
77
|
+
true
|
78
|
+
elsif scope.arity > 0
|
79
|
+
# The scope will be evaluated for every model instance so it can't
|
80
|
+
# be eager loaded
|
81
|
+
false
|
82
|
+
else
|
83
|
+
scope_info = Goldiloader::ScopeInfo.new(scope_for(target_klass_key.unscoped))
|
84
|
+
scope_info.auto_include? &&
|
85
|
+
!scope_info.limit? &&
|
86
|
+
!scope_info.offset? &&
|
87
|
+
(!has_one? || !scope_info.order?)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
@eager_loadable_cache[target_klass]
|
103
91
|
end
|
104
92
|
end
|
105
93
|
ActiveRecord::Reflection::AssociationReflection.include(::Goldiloader::AssociationReflectionPatch)
|
@@ -126,11 +114,13 @@ module Goldiloader
|
|
126
114
|
private
|
127
115
|
|
128
116
|
def eager_loadable?
|
129
|
-
reflection.eager_loadable? &&
|
117
|
+
klass && reflection.eager_loadable?(klass) &&
|
130
118
|
(::Goldiloader::Compatibility.destroyed_model_associations_eager_loadable? || !owner.destroyed?)
|
131
119
|
end
|
132
120
|
|
133
121
|
def load_with_auto_include
|
122
|
+
return yield unless Goldiloader.enabled?
|
123
|
+
|
134
124
|
if loaded? && !stale_target?
|
135
125
|
target
|
136
126
|
elsif !auto_include?
|
@@ -162,12 +152,7 @@ module Goldiloader
|
|
162
152
|
|
163
153
|
module CollectionAssociationPatch
|
164
154
|
# Force these methods to load the entire association for fully_load associations
|
165
|
-
|
166
|
-
if Goldiloader::Compatibility::ACTIVE_RECORD_VERSION < ::Gem::Version.new('5.1')
|
167
|
-
association_methods.concat([:first, :second, :third, :fourth, :fifth, :last])
|
168
|
-
end
|
169
|
-
|
170
|
-
association_methods.each do |method|
|
155
|
+
[:size, :ids_reader, :empty?].each do |method|
|
171
156
|
define_method(method) do |*args, &block|
|
172
157
|
load_target if fully_load?
|
173
158
|
super(*args, &block)
|
@@ -178,10 +163,8 @@ module Goldiloader
|
|
178
163
|
load_with_auto_include { super }
|
179
164
|
end
|
180
165
|
|
181
|
-
|
182
|
-
|
183
|
-
fully_load? || super
|
184
|
-
end
|
166
|
+
def find_from_target?
|
167
|
+
fully_load? || super
|
185
168
|
end
|
186
169
|
end
|
187
170
|
::ActiveRecord::Associations::CollectionAssociation.prepend(::Goldiloader::CollectionAssociationPatch)
|
@@ -15,17 +15,11 @@ module Goldiloader
|
|
15
15
|
private
|
16
16
|
|
17
17
|
def eager_load(models, association_name)
|
18
|
-
::
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
def associated_models(models, association_name)
|
26
|
-
# We can't just do model.send(association_name) because the association method may have been
|
27
|
-
# overridden
|
28
|
-
models.map { |model| model.association(association_name).target }.flatten.compact.uniq
|
18
|
+
if Goldiloader::Compatibility.pre_rails_6_2?
|
19
|
+
::ActiveRecord::Associations::Preloader.new.preload(models, [association_name])
|
20
|
+
else
|
21
|
+
::ActiveRecord::Associations::Preloader.new(records: models, associations: [association_name]).call
|
22
|
+
end
|
29
23
|
end
|
30
24
|
|
31
25
|
def load?(model, association_name)
|
@@ -18,11 +18,7 @@ module Goldiloader
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def register
|
21
|
-
|
22
|
-
ActiveRecord::Associations::Builder::Association.valid_options.concat(OPTIONS)
|
23
|
-
else
|
24
|
-
ActiveRecord::Associations::Builder::Association.extensions << AssociationBuilderExtension
|
25
|
-
end
|
21
|
+
ActiveRecord::Associations::Builder::Association.extensions << AssociationBuilderExtension
|
26
22
|
end
|
27
23
|
end
|
28
24
|
end
|
@@ -2,34 +2,17 @@
|
|
2
2
|
|
3
3
|
module Goldiloader
|
4
4
|
module Compatibility
|
5
|
-
ACTIVE_RECORD_VERSION = ::Gem::Version.new(::ActiveRecord::VERSION::STRING)
|
5
|
+
ACTIVE_RECORD_VERSION = ::Gem::Version.new(::ActiveRecord::VERSION::STRING).release
|
6
|
+
PRE_RAILS_6_2 = ACTIVE_RECORD_VERSION < ::Gem::Version.new('6.2.0')
|
6
7
|
RAILS_5_2_0 = ACTIVE_RECORD_VERSION == ::Gem::Version.new('5.2.0')
|
7
|
-
PRE_RAILS_5_2 = ACTIVE_RECORD_VERSION < ::Gem::Version.new('5.2.0')
|
8
|
-
POST_RAILS_5_1_4 = ACTIVE_RECORD_VERSION > ::Gem::Version.new('5.1.5')
|
9
|
-
PRE_RAILS_5_1_5 = ACTIVE_RECORD_VERSION < ::Gem::Version.new('5.1.5')
|
10
|
-
FROM_EAGER_LOADABLE = ACTIVE_RECORD_VERSION >= ::Gem::Version.new('5.1.5') ||
|
11
|
-
(ACTIVE_RECORD_VERSION >= ::Gem::Version.new('5.0.7') && ACTIVE_RECORD_VERSION < ::Gem::Version.new('5.1.0'))
|
12
|
-
GROUP_EAGER_LOADABLE = FROM_EAGER_LOADABLE
|
13
8
|
|
14
|
-
def self.
|
15
|
-
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.rails_5_0?
|
19
|
-
::ActiveRecord::VERSION::MAJOR == 5 && ::ActiveRecord::VERSION::MINOR == 0
|
9
|
+
def self.pre_rails_6_2?
|
10
|
+
PRE_RAILS_6_2
|
20
11
|
end
|
21
12
|
|
22
13
|
# See https://github.com/rails/rails/pull/32375
|
23
14
|
def self.destroyed_model_associations_eager_loadable?
|
24
15
|
!RAILS_5_2_0
|
25
16
|
end
|
26
|
-
|
27
|
-
def self.from_eager_loadable?
|
28
|
-
FROM_EAGER_LOADABLE
|
29
|
-
end
|
30
|
-
|
31
|
-
def self.group_eager_loadable?
|
32
|
-
GROUP_EAGER_LOADABLE
|
33
|
-
end
|
34
17
|
end
|
35
18
|
end
|
data/lib/goldiloader/version.rb
CHANGED
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
|
+
version: 4.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joel Turkel
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-05-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -16,40 +16,40 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '5.2'
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '
|
22
|
+
version: '7.1'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: '
|
29
|
+
version: '5.2'
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
32
|
+
version: '7.1'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: activesupport
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
37
|
- - ">="
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version: '
|
39
|
+
version: '5.2'
|
40
40
|
- - "<"
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: '
|
42
|
+
version: '7.1'
|
43
43
|
type: :runtime
|
44
44
|
prerelease: false
|
45
45
|
version_requirements: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
47
|
- - ">="
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version: '
|
49
|
+
version: '5.2'
|
50
50
|
- - "<"
|
51
51
|
- !ruby/object:Gem::Version
|
52
|
-
version: '
|
52
|
+
version: '7.1'
|
53
53
|
- !ruby/object:Gem::Dependency
|
54
54
|
name: appraisal
|
55
55
|
requirement: !ruby/object:Gem::Requirement
|
@@ -79,19 +79,19 @@ dependencies:
|
|
79
79
|
- !ruby/object:Gem::Version
|
80
80
|
version: '0'
|
81
81
|
- !ruby/object:Gem::Dependency
|
82
|
-
name:
|
82
|
+
name: coveralls_reborn
|
83
83
|
requirement: !ruby/object:Gem::Requirement
|
84
84
|
requirements:
|
85
85
|
- - ">="
|
86
86
|
- !ruby/object:Gem::Version
|
87
|
-
version:
|
87
|
+
version: 0.18.0
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
90
|
version_requirements: !ruby/object:Gem::Requirement
|
91
91
|
requirements:
|
92
92
|
- - ">="
|
93
93
|
- !ruby/object:Gem::Version
|
94
|
-
version:
|
94
|
+
version: 0.18.0
|
95
95
|
- !ruby/object:Gem::Dependency
|
96
96
|
name: database_cleaner
|
97
97
|
requirement: !ruby/object:Gem::Requirement
|
@@ -148,20 +148,34 @@ dependencies:
|
|
148
148
|
- - "~>"
|
149
149
|
- !ruby/object:Gem::Version
|
150
150
|
version: '3'
|
151
|
+
- !ruby/object:Gem::Dependency
|
152
|
+
name: rspec_junit_formatter
|
153
|
+
requirement: !ruby/object:Gem::Requirement
|
154
|
+
requirements:
|
155
|
+
- - ">="
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
158
|
+
type: :development
|
159
|
+
prerelease: false
|
160
|
+
version_requirements: !ruby/object:Gem::Requirement
|
161
|
+
requirements:
|
162
|
+
- - ">="
|
163
|
+
- !ruby/object:Gem::Version
|
164
|
+
version: '0'
|
151
165
|
- !ruby/object:Gem::Dependency
|
152
166
|
name: salsify_rubocop
|
153
167
|
requirement: !ruby/object:Gem::Requirement
|
154
168
|
requirements:
|
155
|
-
- -
|
169
|
+
- - "~>"
|
156
170
|
- !ruby/object:Gem::Version
|
157
|
-
version: 0.
|
171
|
+
version: 1.0.1
|
158
172
|
type: :development
|
159
173
|
prerelease: false
|
160
174
|
version_requirements: !ruby/object:Gem::Requirement
|
161
175
|
requirements:
|
162
|
-
- -
|
176
|
+
- - "~>"
|
163
177
|
- !ruby/object:Gem::Version
|
164
|
-
version: 0.
|
178
|
+
version: 1.0.1
|
165
179
|
- !ruby/object:Gem::Dependency
|
166
180
|
name: simplecov
|
167
181
|
requirement: !ruby/object:Gem::Requirement
|
@@ -180,16 +194,16 @@ dependencies:
|
|
180
194
|
name: sqlite3
|
181
195
|
requirement: !ruby/object:Gem::Requirement
|
182
196
|
requirements:
|
183
|
-
- - "
|
197
|
+
- - "~>"
|
184
198
|
- !ruby/object:Gem::Version
|
185
|
-
version: '
|
199
|
+
version: '1.3'
|
186
200
|
type: :development
|
187
201
|
prerelease: false
|
188
202
|
version_requirements: !ruby/object:Gem::Requirement
|
189
203
|
requirements:
|
190
|
-
- - "
|
204
|
+
- - "~>"
|
191
205
|
- !ruby/object:Gem::Version
|
192
|
-
version: '
|
206
|
+
version: '1.3'
|
193
207
|
description: Automatically eager loads Rails associations as associations are traversed
|
194
208
|
email:
|
195
209
|
- jturkel@salsify.com
|
@@ -214,7 +228,7 @@ metadata:
|
|
214
228
|
changelog_uri: https://github.com/salsify/goldiloader/blob/master/CHANGELOG.md
|
215
229
|
source_code_uri: https://github.com/salsify/goldiloader/
|
216
230
|
bug_tracker_uri: https://github.com/salsify/goldiloader/issues
|
217
|
-
post_install_message:
|
231
|
+
post_install_message:
|
218
232
|
rdoc_options: []
|
219
233
|
require_paths:
|
220
234
|
- lib
|
@@ -222,16 +236,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
222
236
|
requirements:
|
223
237
|
- - ">="
|
224
238
|
- !ruby/object:Gem::Version
|
225
|
-
version: '2.
|
239
|
+
version: '2.6'
|
226
240
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
227
241
|
requirements:
|
228
242
|
- - ">="
|
229
243
|
- !ruby/object:Gem::Version
|
230
244
|
version: '0'
|
231
245
|
requirements: []
|
232
|
-
|
233
|
-
|
234
|
-
signing_key:
|
246
|
+
rubygems_version: 3.1.4
|
247
|
+
signing_key:
|
235
248
|
specification_version: 4
|
236
249
|
summary: Automatic Rails association eager loading
|
237
250
|
test_files: []
|