goldiloader 0.0.6 → 0.0.7

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
  SHA1:
3
- metadata.gz: 5e5d374d8cba8f3ed0e484f0030a896af17c6315
4
- data.tar.gz: 0749a259d93c68ff35c45207edfc7d87648b70c5
3
+ metadata.gz: 0abf48daca16a3eb1ee9eef6a059d1ff3eb77153
4
+ data.tar.gz: 06b4f7f3d16be572b0981c579141de46f363d28b
5
5
  SHA512:
6
- metadata.gz: 436cb0208f7cba5db8779af7ef9ad3d539ed988a2e48db1d8cbd3735885330afccba1844f8bbe8f540d5c37fc652cfe59c4edae7dc0c68cbc7282e153a209880
7
- data.tar.gz: 41c5e5916200de2d44aa8228d18aa2ddc01a2e38dd29b4526212c51a3a27dae028602866e815baeb889a6277c4d1a9ac000c4f96b876b51592152060b27ae85a
6
+ metadata.gz: 5fd2ab09fd21e0f18aa97210d9c3f6696bf96a4fa4d07bd5a163237431e24019641ab5586c42b59219f31b0827481364dea662f86c8c50c72e3f34eca5be2c3a
7
+ data.tar.gz: bcf2dbf9cc413af86f6dcd0cffafcc435fd52bde9b8e6c9752abe38b5dcae34b42b2952b53dc5af45fbc04ab229f7e13c04a1c6e5728225029bcd4619a543d9d
data/.travis.yml CHANGED
@@ -1,11 +1,16 @@
1
1
  language: ruby
2
2
  env:
3
- matrix:
4
- - RAILS_VERSION="~> 3.2.19" JRUBY_OPTS="$JRUBY_OPTS --debug"
5
- - RAILS_VERSION="~> 4.0.10" JRUBY_OPTS="$JRUBY_OPTS --debug"
6
- - RAILS_VERSION="~> 4.1.6" JRUBY_OPTS="$JRUBY_OPTS --debug"
3
+ - RAILS_VERSION="~> 3.2.19" JRUBY_OPTS="$JRUBY_OPTS --debug"
4
+ - RAILS_VERSION="~> 4.0.10" JRUBY_OPTS="$JRUBY_OPTS --debug"
5
+ - RAILS_VERSION="~> 4.1.6" JRUBY_OPTS="$JRUBY_OPTS --debug"
6
+ - RAILS_VERSION="~> 4.2.0.beta2" JRUBY_OPTS="$JRUBY_OPTS --debug"
7
7
  rvm:
8
8
  - 1.9.3
9
9
  - 2.0.0
10
10
  - 2.1.0
11
11
  - jruby-19mode
12
+ matrix:
13
+ exclude:
14
+ # See https://github.com/salsify/goldiloader/issues/22
15
+ - rvm: jruby-19mode
16
+ env: RAILS_VERSION="~> 4.2.0.beta2" JRUBY_OPTS="$JRUBY_OPTS --debug"
data/CHANGELOG.md CHANGED
@@ -1,6 +1,14 @@
1
1
  # Changelog
2
2
 
3
- ### 0.0.6 (unreleased)
3
+ ### 0.0.7
4
+ * Fix [issue 20](https://github.com/salsify/goldiloader/issues/20) by not auto-eager loading
5
+ associations that are instance dependent. Eager loading these associations produces potentially
6
+ incorrect results and leads to a deprecation warning in Rails 4.2.
7
+ * Fix [issue 21](https://github.com/salsify/goldiloader/issues/21) - Handle explicit eager loads
8
+ of singular associations that are nil.
9
+ * Rails 4.2 support.
10
+
11
+ ### 0.0.6
4
12
  * Workaround [issue 16](https://github.com/salsify/goldiloader/issues/16) by not auto-eager loading
5
13
  has_and_belongs_to_many associations with a uniq in Rails 3.2 since Rails doesn't eager load them
6
14
  properly.
data/goldiloader.gemspec CHANGED
@@ -17,8 +17,8 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = Dir.glob('spec/**/*')
18
18
  spec.require_paths = ['lib']
19
19
 
20
- spec.add_dependency 'activerecord', ENV.fetch('RAILS_VERSION', ['>= 3.2', '< 4.2'])
21
- spec.add_dependency 'activesupport', ENV.fetch('RAILS_VERSION', ['>= 3.2', '< 4.2'])
20
+ spec.add_dependency 'activerecord', ENV.fetch('RAILS_VERSION', ['>= 3.2', '< 4.3'])
21
+ spec.add_dependency 'activesupport', ENV.fetch('RAILS_VERSION', ['>= 3.2', '< 4.3'])
22
22
 
23
23
  spec.add_development_dependency 'coveralls'
24
24
  spec.add_development_dependency 'database_cleaner', '>= 1.2'
@@ -67,7 +67,8 @@ ActiveRecord::Associations::Association.class_eval do
67
67
  # Joins not properly eager loaded - See https://github.com/salsify/goldiloader/issues/11
68
68
  !association_info.joins? &&
69
69
  # Unscope not properly eager loaded - See https://github.com/salsify/goldiloader/issues/13
70
- !association_info.unscope?
70
+ !association_info.unscope? &&
71
+ !association_info.instance_dependent?
71
72
  end
72
73
 
73
74
  def load_with_auto_include(load_method, *args)
@@ -7,44 +7,50 @@ module Goldiloader
7
7
  @association = association
8
8
  end
9
9
 
10
- def unscope?
11
- Goldiloader::Compatibility.unscope_query_method_enabled? &&
12
- @association.association_scope.unscope_values.present?
13
- end
14
-
15
10
  def finder_sql?
16
11
  Goldiloader::Compatibility.association_finder_sql_enabled? &&
17
- @association.options[:finder_sql].present?
12
+ association_options[:finder_sql].present?
18
13
  end
19
14
 
20
15
  if ActiveRecord::VERSION::MAJOR >= 4
16
+ delegate :association_scope, :reflection, to: :@association
17
+
21
18
  def read_only?
22
- @association.association_scope.readonly_value.present?
19
+ association_scope.readonly_value.present?
23
20
  end
24
21
 
25
22
  def offset?
26
- @association.association_scope.offset_value.present?
23
+ association_scope.offset_value.present?
27
24
  end
28
25
 
29
26
  def limit?
30
- @association.association_scope.limit_value.present?
27
+ association_scope.limit_value.present?
31
28
  end
32
29
 
33
30
  def from?
34
- @association.association_scope.from_value.present?
31
+ association_scope.from_value.present?
35
32
  end
36
33
 
37
34
  def group?
38
- @association.association_scope.group_values.present?
35
+ association_scope.group_values.present?
39
36
  end
40
37
 
41
38
  def joins?
42
39
  # Yuck - Through associations will always have a join for *each* 'through' table
43
- (@association.association_scope.joins_values.size - num_through_joins) > 0
40
+ (association_scope.joins_values.size - num_through_joins) > 0
44
41
  end
45
42
 
46
43
  def uniq?
47
- @association.association_scope.uniq_value
44
+ association_scope.uniq_value
45
+ end
46
+
47
+ def instance_dependent?
48
+ reflection.scope.present? && reflection.scope.arity > 0
49
+ end
50
+
51
+ def unscope?
52
+ Goldiloader::Compatibility.unscope_query_method_enabled? &&
53
+ association_scope.unscope_values.present?
48
54
  end
49
55
 
50
56
  private
@@ -60,15 +66,15 @@ module Goldiloader
60
66
  end
61
67
  else
62
68
  def read_only?
63
- @association.options[:readonly].present?
69
+ association_options[:readonly].present?
64
70
  end
65
71
 
66
72
  def offset?
67
- @association.options[:offset].present?
73
+ association_options[:offset].present?
68
74
  end
69
75
 
70
76
  def limit?
71
- @association.options[:limit].present?
77
+ association_options[:limit].present?
72
78
  end
73
79
 
74
80
  def from?
@@ -76,7 +82,7 @@ module Goldiloader
76
82
  end
77
83
 
78
84
  def group?
79
- @association.options[:group].present?
85
+ association_options[:group].present?
80
86
  end
81
87
 
82
88
  def joins?
@@ -85,9 +91,24 @@ module Goldiloader
85
91
  end
86
92
 
87
93
  def uniq?
88
- @association.options[:uniq]
94
+ association_options[:uniq]
95
+ end
96
+
97
+ def instance_dependent?
98
+ # Rails 3 didn't support this
99
+ false
100
+ end
101
+
102
+ def unscope?
103
+ # Rails 3 didn't support this
104
+ false
89
105
  end
90
106
  end
91
107
 
108
+ private
109
+
110
+ def association_options
111
+ @association.options
112
+ end
92
113
  end
93
114
  end
@@ -21,7 +21,7 @@ module Goldiloader
21
21
  associations.each do |association|
22
22
  nested_models = models.flat_map do |model|
23
23
  model.association(association).target
24
- end
24
+ end.compact
25
25
 
26
26
  register_models(nested_models, nested_associations[association])
27
27
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Goldiloader
4
- VERSION = '0.0.6'
4
+ VERSION = '0.0.7'
5
5
  end
data/spec/db/schema.rb CHANGED
@@ -67,6 +67,7 @@ class Blog < ActiveRecord::Base
67
67
  has_many :grouped_posts, -> { group(:blog_id) }, class_name: 'Post'
68
68
  has_many :offset_posts, -> { offset(2) }, class_name: 'Post'
69
69
  has_many :from_posts, -> { from('(select distinct blog_id from posts) as posts') }, class_name: 'Post'
70
+ has_many :instance_dependent_posts, ->(instance) { Post.where(blog_id: instance.id) }, class_name: 'Post'
70
71
 
71
72
  has_many :posts_ordered_by_author, -> { joins(:author).order('users.name') }, class_name: 'Post'
72
73
 
@@ -114,6 +114,37 @@ describe Goldiloader::AutoIncludeContext do
114
114
  end
115
115
  end
116
116
 
117
+ context "when nested associations are nil" do
118
+ let!(:roots) do
119
+ [
120
+ create_mock_model(car: cars.first),
121
+ create_mock_model(car: nil),
122
+ create_mock_model(car: cars.last)
123
+ ]
124
+ end
125
+
126
+ let!(:cars) do
127
+ [
128
+ create_mock_model,
129
+ create_mock_model
130
+ ]
131
+ end
132
+
133
+ before do
134
+ Goldiloader::AutoIncludeContext.register_models(roots, :car)
135
+ end
136
+
137
+ it "sets the AutoIncludeContext for roots" do
138
+ expect(roots.map(&:auto_include_context).uniq.size).to eq 1
139
+ expect(roots.first.auto_include_context.models).to match_array(roots)
140
+ end
141
+
142
+ it "sets the AutoIncludeContext for child nested associations" do
143
+ expect(cars.map(&:auto_include_context).uniq.size).to eq 1
144
+ expect(cars.first.auto_include_context.models).to match_array(cars)
145
+ end
146
+ end
147
+
117
148
  def create_mock_models(num)
118
149
  num.times.map { create_mock_model }
119
150
  end
@@ -440,6 +440,20 @@ describe Goldiloader do
440
440
  end
441
441
  end
442
442
  end
443
+
444
+ if ActiveRecord::VERSION::MAJOR >= 4
445
+ context "associations with an instance dependent scope" do
446
+ before do
447
+ blogs.first.instance_dependent_posts.to_a
448
+ end
449
+
450
+ it "applies the scope correctly" do
451
+ expect(blogs.first.instance_dependent_posts.to_a).to match_array(blogs.first.posts)
452
+ end
453
+
454
+ it_behaves_like "it doesn't auto eager the association", :instance_dependent_posts
455
+ end
456
+ end
443
457
  end
444
458
 
445
459
  context "associations with a uniq" do
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: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joel Turkel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-15 00:00:00.000000000 Z
11
+ date: 2014-10-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: '3.2'
20
20
  - - <
21
21
  - !ruby/object:Gem::Version
22
- version: '4.2'
22
+ version: '4.3'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,7 @@ dependencies:
29
29
  version: '3.2'
30
30
  - - <
31
31
  - !ruby/object:Gem::Version
32
- version: '4.2'
32
+ version: '4.3'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: activesupport
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -39,7 +39,7 @@ dependencies:
39
39
  version: '3.2'
40
40
  - - <
41
41
  - !ruby/object:Gem::Version
42
- version: '4.2'
42
+ version: '4.3'
43
43
  type: :runtime
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
@@ -49,7 +49,7 @@ dependencies:
49
49
  version: '3.2'
50
50
  - - <
51
51
  - !ruby/object:Gem::Version
52
- version: '4.2'
52
+ version: '4.3'
53
53
  - !ruby/object:Gem::Dependency
54
54
  name: coveralls
55
55
  requirement: !ruby/object:Gem::Requirement