custom_counter_cache 0.1.4 → 0.1.5

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: e16038b77238baabc391d19e164da1d310e8994a
4
- data.tar.gz: a7a55ac0ec831e3ac147ee49e590c202af470bcf
3
+ metadata.gz: 182f8ab75fb7fc29e78199d05904ac3a8b432b20
4
+ data.tar.gz: 7bae0ad737c88fd4bfc682e212c3c87de790ccb9
5
5
  SHA512:
6
- metadata.gz: ac5ecba570c52c9a56734588f102d9264487a550906d665d361d6ef126a48ab5b8831802d84a38641bc8e140c7354234be39195663bac46ab3d0e878f2a4c1fd
7
- data.tar.gz: a5f7d3147b895a5c1317c50915915928514ffbd70944704773f1452be65fc7d670ccb4803fc18d02445464e0b6fc8dfe7227e57da03ee5a47b2fc09bd1efd6c5
6
+ metadata.gz: 434dafe982b66628bf6562cb9cad6a873677fc599042b516a3d12a3e84b55352954c7d26c8989c433123fc23223bf53b4e9f5b65835d4f1cc6fbdf06861b0de3
7
+ data.tar.gz: 20192d909056d15648e7960d60d13de4c8ca2f6f33cb9ed171f35cfeaa11386ade1dc5433fcdcc416a18be45f0f35f2ac18952585033ecc16a9c9a622c06e6f0
@@ -1,3 +1,4 @@
1
+ require 'custom_counter_cache/model'
2
+
1
3
  module CustomCounterCache
2
- require 'custom_counter_cache/model'
3
4
  end
@@ -1,17 +1,15 @@
1
- module CustomCounterCache::Model
2
-
3
- def self.included(base)
4
- base.extend ActsAsMethods
5
- end
1
+ require 'active_support/concern'
6
2
 
7
- module ActsAsMethods
3
+ module CustomCounterCache::Model
4
+ extend ActiveSupport::Concern
8
5
 
6
+ module ClassMethods
9
7
  def define_counter_cache(cache_column, &block)
10
8
  return unless table_exists?
11
9
 
12
10
  # counter accessors
13
11
  unless column_names.include?(cache_column.to_s)
14
- has_many :counters, :as => :countable, :dependent => :destroy
12
+ has_many :counters, as: :countable, dependent: :destroy
15
13
  define_method "#{cache_column}" do
16
14
  # check if the counter is loaded
17
15
  if counters.loaded? && counter = counters.detect{|c| c.key == cache_column.to_s }
@@ -24,7 +22,7 @@ module CustomCounterCache::Model
24
22
  if ( counter = counters.find_by_key(cache_column.to_s) )
25
23
  counter.update_attribute :value, count.to_i
26
24
  else
27
- counters.create :key => cache_column.to_s, :value => count.to_i
25
+ counters.create key: cache_column.to_s, value: count.to_i
28
26
  end
29
27
  end
30
28
  end
@@ -46,7 +44,7 @@ module CustomCounterCache::Model
46
44
  cache_column = cache_column.to_sym
47
45
  method_name = "callback_#{cache_column}".to_sym
48
46
  reflection = reflect_on_association(association)
49
- foreign_key = reflection.options[:foreign_key] || reflection.association_foreign_key
47
+ foreign_key = reflection.try(:foreign_key) || reflection.association_foreign_key
50
48
 
51
49
  # define callback
52
50
  define_method method_name do
@@ -73,9 +71,7 @@ module CustomCounterCache::Model
73
71
  after_update method_name, options
74
72
  after_destroy method_name, options
75
73
  end
76
-
77
74
  end
78
-
79
75
  end
80
76
 
81
77
  ActiveRecord::Base.send :include, CustomCounterCache::Model
@@ -1,5 +1,5 @@
1
1
  module CustomCounterCache
2
2
 
3
- VERSION = '0.1.4'
3
+ VERSION = '0.1.5'
4
4
 
5
5
  end
data/test/counter_test.rb CHANGED
@@ -14,44 +14,65 @@ class CounterTest < MiniTest::Unit::TestCase
14
14
  end
15
15
 
16
16
  def test_create_and_destroy_counter
17
- @user.articles.create(:state => 'published')
17
+ @user.articles.create(state: 'published')
18
18
  assert_equal 1, Counter.count
19
19
  @user.destroy
20
20
  assert_equal 0, Counter.count
21
21
  end
22
22
 
23
+ def test_create_and_destroy_polymorphic_association_counter
24
+ @article = @user.articles.create(state: "published")
25
+ assert_equal 0, @article.comments.size
26
+ @comment = @article.comments.create(state: "published")
27
+ assert_equal 1, @article.comments.size
28
+ @article.destroy
29
+ assert_equal 0, @article.comments.size
30
+ end
31
+
23
32
  def test_increment_and_decrement_counter_with_conditions
24
- @article = @user.articles.create(:state => 'unpublished')
33
+ @article = @user.articles.create(state: 'unpublished')
25
34
  assert_equal 0, @user.published_count
26
35
  @article.update_attribute :state, 'published'
27
36
  assert_equal 1, @user.published_count
28
- 3.times { |i| @user.articles.create(:state => 'published') }
37
+ 3.times { |i| @user.articles.create(state: 'published') }
29
38
  assert_equal 4, @user.published_count
30
- @user.articles.each {|a| a.update_attributes(:state => 'unpublished') }
39
+ @user.articles.each {|a| a.update_attributes(state: 'unpublished') }
31
40
  assert_equal 0, @user.published_count
32
41
  end
33
42
 
43
+ def test_increment_and_decrement_polymorphic_counter_with_conditions
44
+ @article = @user.articles.create(state: "published")
45
+ @comment = @article.comments.create(state: "unpublished")
46
+ assert_equal 0, @article.comments_count
47
+ @comment.update_attribute :state, "published"
48
+ assert_equal 1, @article.comments_count
49
+ 3.times { |i| @article.comments.create(state: "published") }
50
+ assert_equal 4, @article.comments_count
51
+ @article.comments.each { |c| c.update_attributes(state: "unpublished") }
52
+ assert_equal 0, @article.comments_count
53
+ end
54
+
34
55
  def test_increment_and_decrement_counter_with_conditions_on_model_with_counter_column
35
- @ball = @box.balls.create(:color => 'red')
56
+ @ball = @box.balls.create(color: 'red')
36
57
  assert_equal 0, @box.reload.green_balls_count
37
58
  @ball.update_attribute :color, 'green'
38
59
  assert_equal 1, @box.reload.green_balls_count
39
- 3.times { |i| @box.balls.create(:color => 'green') }
60
+ 3.times { |i| @box.balls.create(color: 'green') }
40
61
  assert_equal 4, @box.reload.green_balls_count
41
- @box.balls.each {|b| b.update_attributes(:color => 'red') }
62
+ @box.balls.each {|b| b.update_attributes(color: 'red') }
42
63
  assert_equal 0, @box.reload.green_balls_count
43
64
  end
44
65
 
45
66
  # Test that an eager loaded
46
67
  def test_eager_loading_with_no_counter
47
- @article = @user.articles.create(:state => 'unpublished')
68
+ @article = @user.articles.create(state: 'unpublished')
48
69
  user = User.includes(:counters).first
49
70
  assert_equal 0, user.published_count
50
71
 
51
72
  end
52
73
 
53
74
  def test_eager_loading_with_counter
54
- @article = @user.articles.create(:state => 'published')
75
+ @article = @user.articles.create(state: 'published')
55
76
  @user = User.includes(:counters).find(@user.id)
56
77
  assert_equal 1, @user.published_count
57
78
  end
data/test/test_helper.rb CHANGED
@@ -5,45 +5,63 @@ require 'action_view'
5
5
  require 'active_record'
6
6
  require 'custom_counter_cache'
7
7
 
8
- ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
8
+ ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
9
9
 
10
- ActiveRecord::Schema.define(:version => 1) do
10
+ ActiveRecord::Schema.define(version: 1) do
11
11
  create_table :users do |t|
12
12
  end
13
+
13
14
  create_table :articles do |t|
14
15
  t.belongs_to :user
15
- t.string :state, :default => 'unpublished'
16
+ t.string :state, default: 'unpublished'
16
17
  end
18
+
19
+ create_table :comments do |t|
20
+ t.belongs_to :user
21
+ t.references :commentable, polymorphic: true
22
+ t.string :state, default: "unpublished"
23
+ end
24
+
17
25
  create_table :counters do |t|
18
- t.references :countable, :polymorphic => true
19
- t.string :key, :null => false
20
- t.integer :value, :null => false, :default => 0
26
+ t.references :countable, polymorphic: true
27
+ t.string :key, null: false
28
+ t.integer :value, null: false, default: 0
21
29
  end
22
- add_index :counters, [ :countable_id, :countable_type, :key ], :unique => true
30
+ add_index :counters, [ :countable_id, :countable_type, :key ], unique: true
23
31
 
24
32
  create_table :boxes do |t|
25
- t.integer :green_balls_count, :default => 0
33
+ t.integer :green_balls_count, default: 0
26
34
  end
35
+
27
36
  create_table :balls do |t|
28
37
  t.belongs_to :box
29
- t.string :color, :default => 'red'
38
+ t.string :color, default: 'red'
30
39
  end
31
40
  end
32
41
 
33
42
  class User < ActiveRecord::Base
34
- has_many :articles
43
+ has_many :articles, dependent: :destroy
35
44
  define_counter_cache :published_count do |user|
36
- user.articles.where(:articles => { :state => 'published' }).count
45
+ user.articles.where(articles: { state: 'published' }).count
37
46
  end
38
47
  end
39
48
 
40
49
  class Article < ActiveRecord::Base
41
50
  belongs_to :user
42
- update_counter_cache :user, :published_count, :if => Proc.new { |article| article.state_changed? }
51
+ update_counter_cache :user, :published_count, if: Proc.new { |article| article.state_changed? }
52
+ has_many :comments, as: :commentable, dependent: :destroy
53
+ define_counter_cache :comments_count do |article|
54
+ article.comments.where(state: "published").count
55
+ end
56
+ end
57
+
58
+ class Comment < ActiveRecord::Base
59
+ belongs_to :commentable, polymorphic: true
60
+ update_counter_cache :commentable, :comments_count, if: Proc.new { |comment| comment.state_changed? }
43
61
  end
44
62
 
45
63
  class Counter < ActiveRecord::Base
46
- belongs_to :countable, :polymorphic => true
64
+ belongs_to :countable, polymorphic: true
47
65
  end
48
66
 
49
67
  class Box < ActiveRecord::Base
@@ -55,6 +73,6 @@ end
55
73
 
56
74
  class Ball < ActiveRecord::Base
57
75
  belongs_to :box
58
- scope :green, lambda { where(:color => 'green') }
59
- update_counter_cache :box, :green_balls_count, :if => Proc.new { |ball| ball.color_changed? }
76
+ scope :green, lambda { where(color: 'green') }
77
+ update_counter_cache :box, :green_balls_count, if: Proc.new { |ball| ball.color_changed? }
60
78
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: custom_counter_cache
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cedric Howe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-09 00:00:00.000000000 Z
11
+ date: 2015-08-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails