activerecord-precount 0.5.0 → 0.5.1

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: b808e109c4ff4e66a60696bef99eb38a78f2c729
4
- data.tar.gz: abed0c7c35ef630938eec845e4439a7e62f54e90
3
+ metadata.gz: b966bc8459e4470af32e26fa47a9b1c23c0ca2f5
4
+ data.tar.gz: 8a036719d57f1a1e4978c6655473e3c6b8112219
5
5
  SHA512:
6
- metadata.gz: 36e5f8ad70b97aa1d58990791ec8a7de3e075783700d25e8ffc93be693c2d9f39b29da237b46d5159e750654ea3b50b80c99bf32c31118618025e63957aac590
7
- data.tar.gz: c08a6d413c210e044e609e36c1e297803476ff52e6b54c6bd8be48b89c4aeafc3b2d759da86314b84858d18fdf29ecb0c9fda2b1f8403bbdce44dfa829bd5aa0
6
+ metadata.gz: eb7d18f68c02a4c30b33ac1b64ef44f26e430b03ca46a6fe58342220dd3c4f88b1185eab3e1c69dc34169dcbd4f6cc98979a2a7386e118369502706bade6d3dd
7
+ data.tar.gz: ee694266b59423dd92a44600c9588adb26416950211c5e7ccaf8ecc00bda0253f080b73df124c37744cf0d54d08fc576f5e518863ecd6fbdf672252e4e293533
data/.travis.yml CHANGED
@@ -1,6 +1,7 @@
1
1
  script: ci/travis.rb
2
2
  language: ruby
3
3
  sudo: false
4
+ cache: bundler
4
5
  matrix:
5
6
  include:
6
7
  - rvm: 2.0
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency "bundler"
25
25
  spec.add_development_dependency "pry"
26
26
  spec.add_development_dependency "sqlite3"
27
- spec.add_development_dependency "mysql2"
27
+ spec.add_development_dependency "mysql2", ">= 0.3", "< 0.4"
28
28
  spec.add_development_dependency "postgres"
29
29
  spec.add_development_dependency "rbench"
30
30
  spec.add_development_dependency "dalli"
@@ -16,7 +16,7 @@ module ActiveRecord
16
16
  name_with_count = options[:count_loader] if options[:count_loader].is_a?(Symbol)
17
17
 
18
18
  valid_options = options.slice(*Associations::Builder::CountLoader.valid_options)
19
- reflection = Associations::Builder::CountLoader.build(model, name_with_count, nil, valid_options)
19
+ reflection = Associations::Builder::CountLoader.build(model, name_with_count, scope, valid_options)
20
20
  Reflection.add_reflection(model, name_with_count, reflection)
21
21
  end
22
22
  end
@@ -32,8 +32,10 @@ module ActiveRecord
32
32
  raise ArgumentError, "Association named '#{arg}' was not found on #{klass.name}." unless has_reflection?(arg)
33
33
  next if has_reflection?(counter_name = :"#{arg}_count")
34
34
 
35
- options = reflection_for(arg).options.slice(*Associations::Builder::CountLoader.valid_options)
36
- reflection = Associations::Builder::CountLoader.build(klass, counter_name, nil, options)
35
+ original_reflection = reflection_for(arg)
36
+ scope = original_reflection.scope
37
+ options = original_reflection.options.slice(*Associations::Builder::CountLoader.valid_options)
38
+ reflection = Associations::Builder::CountLoader.build(klass, counter_name, scope, options)
37
39
  Reflection.add_reflection(model, counter_name, reflection)
38
40
  end
39
41
  end
@@ -1,5 +1,5 @@
1
1
  module ActiveRecord
2
2
  module Precount
3
- VERSION = "0.5.0"
3
+ VERSION = "0.5.1"
4
4
  end
5
5
  end
@@ -2,9 +2,11 @@ require 'cases/helper'
2
2
 
3
3
  class EagerCountTest < ActiveRecord::CountLoader::TestCase
4
4
  def setup
5
- tweets_count.times.map do |index|
5
+ tweets_count.times do |i|
6
6
  tweet = Tweet.create
7
- index.times { Favorite.create(tweet: tweet) }
7
+ i.times do |j|
8
+ Favorite.create(tweet: tweet, user_id: j + 1)
9
+ end
8
10
  end
9
11
 
10
12
  if Tweet.has_reflection?(:favs_count)
@@ -25,9 +27,9 @@ class EagerCountTest < ActiveRecord::CountLoader::TestCase
25
27
  end
26
28
 
27
29
  def test_eager_count_defines_count_loader
28
- assert_equal(Tweet.has_reflection?(:favs_count), false)
30
+ assert_equal(false, Tweet.has_reflection?(:favs_count))
29
31
  Tweet.eager_count(:favs).map(&:favs_count)
30
- assert_equal(Tweet.has_reflection?(:favs_count), true)
32
+ assert_equal(true, Tweet.has_reflection?(:favs_count))
31
33
  end
32
34
 
33
35
  def test_eager_count_has_many_with_count_loader_does_not_execute_n_1_queries
@@ -39,8 +41,14 @@ class EagerCountTest < ActiveRecord::CountLoader::TestCase
39
41
 
40
42
  def test_eager_count_has_many_counts_properly
41
43
  expected = Tweet.order(id: :asc).map { |t| t.favorites.count }
42
- assert_equal(Tweet.order(id: :asc).map(&:favorites_count), expected)
43
- assert_equal(Tweet.order(id: :asc).eager_count(:favorites).map { |t| t.favorites.count }, expected)
44
- assert_equal(Tweet.order(id: :asc).eager_count(:favorites).map(&:favorites_count), expected)
44
+ assert_equal(expected, Tweet.order(id: :asc).map(&:favorites_count))
45
+ assert_equal(expected, Tweet.order(id: :asc).eager_count(:favorites).map { |t| t.favorites.count })
46
+ assert_equal(expected, Tweet.order(id: :asc).eager_count(:favorites).map(&:favorites_count))
47
+ end
48
+
49
+ def test_eager_count_has_many_with_scope_counts_properly
50
+ expected = Tweet.order(id: :asc).map { |t| t.my_favs.count }
51
+ assert_equal(expected, Tweet.order(id: :asc).eager_count(:my_favs).map { |t| t.my_favs.count })
52
+ assert_equal(expected, Tweet.order(id: :asc).eager_count(:my_favs).map(&:my_favs_count))
45
53
  end
46
54
  end
@@ -4,9 +4,11 @@ require 'models/tweet'
4
4
 
5
5
  class EagerLoadTest < ActiveRecord::CountLoader::TestCase
6
6
  def setup
7
- tweets_count.times.map do |index|
7
+ tweets_count.times do |i|
8
8
  tweet = Tweet.create
9
- index.times { Favorite.create(tweet: tweet) }
9
+ i.times do |j|
10
+ Favorite.create(tweet: tweet, user_id: j + 1)
11
+ end
10
12
  end
11
13
  end
12
14
 
@@ -26,8 +28,14 @@ class EagerLoadTest < ActiveRecord::CountLoader::TestCase
26
28
 
27
29
  def test_eager_loaded_count_loader_counts_properly
28
30
  expected = Tweet.order(id: :asc).map { |t| t.favorites.count }
29
- assert_equal(Tweet.order(id: :asc).map(&:favorites_count), expected)
30
- assert_equal(Tweet.order(id: :asc).eager_load(:favorites_count).map { |t| t.favorites.count }, expected)
31
- assert_equal(Tweet.order(id: :asc).eager_load(:favorites_count).map(&:favorites_count), expected)
31
+ assert_equal(expected, Tweet.order(id: :asc).map(&:favorites_count))
32
+ assert_equal(expected, Tweet.order(id: :asc).eager_load(:favorites_count).map { |t| t.favorites.count })
33
+ assert_equal(expected, Tweet.order(id: :asc).eager_load(:favorites_count).map(&:favorites_count))
34
+ end
35
+
36
+ def test_eager_loaded_count_loader_with_scope_counts_properly
37
+ expected = Tweet.order(id: :asc).map { |t| t.my_favorites.count }
38
+ assert_equal(expected, Tweet.order(id: :asc).eager_load(:my_favorites_count).map { |t| t.my_favorites.count })
39
+ assert_equal(expected, Tweet.order(id: :asc).eager_load(:my_favorites_count).map(&:my_favorites_count))
32
40
  end
33
41
  end
@@ -2,9 +2,11 @@ require 'cases/helper'
2
2
 
3
3
  class IncludesTest < ActiveRecord::CountLoader::TestCase
4
4
  def setup
5
- tweets_count.times.map do |index|
5
+ tweets_count.times do |i|
6
6
  tweet = Tweet.create
7
- index.times { Favorite.create(tweet: tweet) }
7
+ i.times do |j|
8
+ Favorite.create(tweet: tweet, user_id: j + 1)
9
+ end
8
10
  end
9
11
  end
10
12
 
@@ -24,7 +26,13 @@ class IncludesTest < ActiveRecord::CountLoader::TestCase
24
26
 
25
27
  def test_included_count_loader_counts_properly
26
28
  expected = Tweet.all.map { |t| t.favorites.count }
27
- assert_equal(Tweet.all.map(&:favorites_count), expected)
28
- assert_equal(Tweet.includes(:favorites_count).map(&:favorites_count), expected)
29
+ assert_equal(expected, Tweet.all.map(&:favorites_count))
30
+ assert_equal(expected, Tweet.includes(:favorites_count).map(&:favorites_count))
31
+ end
32
+
33
+ def test_included_count_loader_with_scope_counts_properly
34
+ expected = Tweet.all.map { |t| t.my_favorites.count }
35
+ assert_equal(expected, Tweet.all.map(&:my_favorites_count))
36
+ assert_equal(expected, Tweet.includes(:my_favorites_count).map(&:my_favorites_count))
29
37
  end
30
38
  end
@@ -2,9 +2,11 @@ require 'cases/helper'
2
2
 
3
3
  class PrecountTest < ActiveRecord::CountLoader::TestCase
4
4
  def setup
5
- tweets_count.times.map do |index|
5
+ tweets_count.times do |i|
6
6
  tweet = Tweet.create
7
- index.times { Favorite.create(tweet: tweet) }
7
+ i.times do |j|
8
+ Favorite.create(tweet: tweet, user_id: j + 1)
9
+ end
8
10
  end
9
11
 
10
12
  if Tweet.has_reflection?(:favs_count)
@@ -25,9 +27,9 @@ class PrecountTest < ActiveRecord::CountLoader::TestCase
25
27
  end
26
28
 
27
29
  def test_precount_defines_count_loader
28
- assert_equal(Tweet.has_reflection?(:favs_count), false)
30
+ assert_equal(false, Tweet.has_reflection?(:favs_count))
29
31
  Tweet.precount(:favs).map(&:favs_count)
30
- assert_equal(Tweet.has_reflection?(:favs_count), true)
32
+ assert_equal(true, Tweet.has_reflection?(:favs_count))
31
33
  end
32
34
 
33
35
  def test_precount_has_many_with_count_loader_does_not_execute_n_1_queries
@@ -39,8 +41,14 @@ class PrecountTest < ActiveRecord::CountLoader::TestCase
39
41
 
40
42
  def test_precount_has_many_counts_properly
41
43
  expected = Tweet.all.map { |t| t.favorites.count }
42
- assert_equal(Tweet.all.map(&:favorites_count), expected)
43
- assert_equal(Tweet.precount(:favorites).map { |t| t.favorites.count }, expected)
44
- assert_equal(Tweet.precount(:favorites).map(&:favorites_count), expected)
44
+ assert_equal(expected, Tweet.all.map(&:favorites_count))
45
+ assert_equal(expected, Tweet.precount(:favorites).map { |t| t.favorites.count })
46
+ assert_equal(expected, Tweet.precount(:favorites).map(&:favorites_count))
47
+ end
48
+
49
+ def test_precount_has_many_with_scope_counts_properly
50
+ expected = Tweet.all.map { |t| t.my_favs.count }
51
+ assert_equal(expected, Tweet.precount(:my_favs).map { |t| t.my_favs.count })
52
+ assert_equal(expected, Tweet.precount(:my_favs).map(&:my_favs_count))
45
53
  end
46
54
  end
@@ -2,9 +2,11 @@ require 'cases/helper'
2
2
 
3
3
  class PreloadTest < ActiveRecord::CountLoader::TestCase
4
4
  def setup
5
- tweets_count.times.map do |index|
5
+ tweets_count.times do |i|
6
6
  tweet = Tweet.create
7
- index.times { Favorite.create(tweet: tweet) }
7
+ i.times do |j|
8
+ Favorite.create(tweet: tweet, user_id: j + 1)
9
+ end
8
10
  end
9
11
  end
10
12
 
@@ -24,7 +26,13 @@ class PreloadTest < ActiveRecord::CountLoader::TestCase
24
26
 
25
27
  def test_preloaded_count_loader_counts_properly
26
28
  expected = Tweet.all.map { |t| t.favorites.count }
27
- assert_equal(Tweet.all.map(&:favorites_count), expected)
28
- assert_equal(Tweet.preload(:favorites_count).map(&:favorites_count), expected)
29
+ assert_equal(expected, Tweet.all.map(&:favorites_count))
30
+ assert_equal(expected, Tweet.preload(:favorites_count).map(&:favorites_count))
31
+ end
32
+
33
+ def test_preloaded_count_loader_with_scope_counts_properly
34
+ expected = Tweet.all.map { |t| t.my_favorites.count }
35
+ assert_equal(expected, Tweet.all.map(&:my_favorites_count))
36
+ assert_equal(expected, Tweet.preload(:my_favorites_count).map(&:my_favorites_count))
29
37
  end
30
38
  end
data/test/models/tweet.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  class Tweet < ActiveRecord::Base
2
2
  has_many :favorites, count_loader: true
3
3
  has_many :favs, class_name: 'Favorite'
4
+ has_many :my_favorites, -> { where(user_id: 1) }, class_name: 'Favorite', count_loader: true
5
+ has_many :my_favs, -> { where(user_id: 1) }, class_name: 'Favorite'
4
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-precount
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Takashi Kokubun
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-01 00:00:00.000000000 Z
11
+ date: 2015-09-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -114,14 +114,20 @@ dependencies:
114
114
  requirements:
115
115
  - - ">="
116
116
  - !ruby/object:Gem::Version
117
- version: '0'
117
+ version: '0.3'
118
+ - - "<"
119
+ - !ruby/object:Gem::Version
120
+ version: '0.4'
118
121
  type: :development
119
122
  prerelease: false
120
123
  version_requirements: !ruby/object:Gem::Requirement
121
124
  requirements:
122
125
  - - ">="
123
126
  - !ruby/object:Gem::Version
124
- version: '0'
127
+ version: '0.3'
128
+ - - "<"
129
+ - !ruby/object:Gem::Version
130
+ version: '0.4'
125
131
  - !ruby/object:Gem::Dependency
126
132
  name: postgres
127
133
  requirement: !ruby/object:Gem::Requirement
@@ -292,4 +298,3 @@ signing_key:
292
298
  specification_version: 4
293
299
  summary: N+1 count query killer for ActiveRecord
294
300
  test_files: []
295
- has_rdoc: