counter-cache 0.0.2 → 0.1.0

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: 005de7af8ad6de2ac4db333a51a0b69037b415da
4
- data.tar.gz: 82e11a2ff62767df0275d60e12ef8f6208f76dc3
3
+ metadata.gz: 65f431cac9a84b8abe458919608c07c66501c68e
4
+ data.tar.gz: c0582fc1f4d829fc50162ce50746b33fdf06f2c8
5
5
  SHA512:
6
- metadata.gz: a19850cde42e9e3d8413bc8d2b0f8ab134736c16df4171c788c2cc611363429d6830191d29027084bd93d2466d64dcda731949d2313d0f07311db87faa96dbce
7
- data.tar.gz: e90d15bae6c2de8781dcb792e90f9b7f1e40fe4fdbefa7d83b9a5bc91515dbc01ced62ff68f3f3450716f0e23319e845a38767528a8e5b3bd221bcbd72da8460
6
+ metadata.gz: db21a9548ac98191ddf559ff962c78f221656998efbe5f1a0c2af14e153e7256647fa3f54bc4f00faa8b3d34b9feabd9f94d6f82410805b241eb3384593ba1a9
7
+ data.tar.gz: 8b4abafb442cbdedef2ddffae83ebc7d71a418dedbef791ad3f963abc7c039b45e44fa8d4d2d992514da60091e8d555932439555c319f33923ac0fc12271f5a4
data/README.md CHANGED
@@ -109,6 +109,20 @@ class Post
109
109
  end
110
110
  ```
111
111
 
112
+ #### To increment dynamically:
113
+
114
+ ```ruby
115
+ class Review
116
+ include Counter::Cache
117
+
118
+ counter_cache_on column: :reviews_sum,
119
+ relation: :product,
120
+ relation_class_name: "Product",
121
+ increment_by: ->(review) { review.score },
122
+ method: :recalculate_reviews_sum, # This is a method on the product.
123
+ end
124
+ ```
125
+
112
126
  #### To control when recalculation happens:
113
127
 
114
128
  ```ruby
@@ -33,11 +33,16 @@ module Counter
33
33
  end
34
34
 
35
35
  def incr
36
- redis.incr(key)
36
+ redis.incr(key, increment_by)
37
37
  end
38
38
 
39
39
  def decr
40
- redis.decr(key)
40
+ redis.decr(key, increment_by)
41
+ end
42
+
43
+ def increment_by
44
+ return options.increment_by.call(source_object) if options.increment_by.is_a?(Proc)
45
+ 1
41
46
  end
42
47
 
43
48
  def key
@@ -29,6 +29,10 @@ module Counter
29
29
  options[:method]
30
30
  end
31
31
 
32
+ def increment_by
33
+ options[:increment_by]
34
+ end
35
+
32
36
  def cached?
33
37
  option_or_true options[:cache]
34
38
  end
@@ -1,15 +1,15 @@
1
1
  module Counter
2
2
  module Cache
3
3
  class Redis
4
- def incr(key)
4
+ def incr(key, val = 1)
5
5
  with_redis do |redis|
6
- redis.incr key
6
+ redis.incrby key, val
7
7
  end
8
8
  end
9
9
 
10
- def decr(key)
10
+ def decr(key, val = 1)
11
11
  with_redis do |redis|
12
- redis.decr(key)
12
+ redis.decrby(key, val)
13
13
  end
14
14
  end
15
15
 
@@ -1,5 +1,5 @@
1
1
  module Counter
2
2
  module Cache
3
- VERSION = "0.0.2"
3
+ VERSION = "0.1.0"
4
4
  end
5
5
  end
@@ -91,5 +91,12 @@ RSpec.describe "Counting" do
91
91
  expect(user.reload.bogus_followed_count).to eq(101)
92
92
  end
93
93
  end
94
+
95
+ describe '#reviews_sum' do
96
+ it 'increments the user review sum by the review score' do
97
+ Review.create(score: 4, user: user)
98
+ expect(user.reload.reviews_sum).to eq(4)
99
+ end
100
+ end
94
101
  end
95
102
 
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe Counter::Cache::Counters::BufferCounter::Updater do
4
- let(:options) { double(relation: "boo", relation_class_name: "Boo", column: "boo", relation_id: nil) }
4
+ let(:options) { double(relation: "boo", relation_class_name: "Boo", column: "boo", relation_id: nil, increment_by: 1) }
5
5
  let(:source_object) { double(boo_id: 1) }
6
6
  let(:updater) { Counter::Cache::Counters::BufferCounter::Updater.new(source_object, options, "Hello") }
7
7
 
@@ -16,16 +16,26 @@ RSpec.describe Counter::Cache::Redis do
16
16
 
17
17
  describe '#decr' do
18
18
  it 'calls decr on redis with the key' do
19
- expect(redis).to receive(:decr).with("hello")
19
+ expect(redis).to receive(:decrby).with("hello", 1)
20
20
  helper.decr("hello")
21
21
  end
22
+
23
+ it 'calls decr on redis with the key and increment value' do
24
+ expect(redis).to receive(:decrby).with("hello", 2)
25
+ helper.decr("hello", 2)
26
+ end
22
27
  end
23
28
 
24
29
  describe '#incr' do
25
30
  it 'calls incr on redis with the key' do
26
- expect(redis).to receive(:incr).with("hello")
31
+ expect(redis).to receive(:incrby).with("hello", 1)
27
32
  helper.incr("hello")
28
33
  end
34
+
35
+ it 'calls incr on redis with the key and increment value' do
36
+ expect(redis).to receive(:incrby).with("hello", 2)
37
+ helper.incr("hello", 2)
38
+ end
29
39
  end
30
40
 
31
41
  describe '#del' do
@@ -12,6 +12,7 @@ class CreateModelsForTest < ActiveRecord::Migration
12
12
  t.integer :followers_count, :default => 0
13
13
  t.integer :users_i_follow_count, :default => 0
14
14
  t.integer :bogus_followed_count, :default => 0
15
+ t.integer :reviews_sum, :default => 0
15
16
  end
16
17
 
17
18
  create_table :follows do |t|
@@ -24,17 +25,24 @@ class CreateModelsForTest < ActiveRecord::Migration
24
25
  t.string :body
25
26
  t.belongs_to :user
26
27
  end
28
+
29
+ create_table :reviews do |t|
30
+ t.integer :score
31
+ t.belongs_to :user
32
+ end
27
33
  end
28
34
 
29
35
  def self.down
30
36
  drop_table(:users)
31
37
  drop_table(:posts)
32
38
  drop_table(:follows)
39
+ drop_table(:reviews)
33
40
  end
34
41
  end
35
42
 
36
43
  class User < ActiveRecord::Base
37
44
  has_many :posts
45
+ has_many :reviews
38
46
 
39
47
  def calculate_posts_count
40
48
  posts.count
@@ -85,3 +93,15 @@ class Post < ActiveRecord::Base
85
93
  relation_class_name: "User",
86
94
  recalculation: false
87
95
  end
96
+
97
+ class Review < ActiveRecord::Base
98
+ belongs_to :user
99
+
100
+ include Counter::Cache
101
+
102
+ counter_cache_on column: :reviews_sum,
103
+ relation: :user,
104
+ increment_by: ->(review) { review.score },
105
+ recalculation: false
106
+
107
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: counter-cache
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Henry & Matt Camuto
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-28 00:00:00.000000000 Z
11
+ date: 2015-11-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -207,7 +207,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
207
207
  version: '0'
208
208
  requirements: []
209
209
  rubyforge_project:
210
- rubygems_version: 2.2.0
210
+ rubygems_version: 2.2.2
211
211
  signing_key:
212
212
  specification_version: 4
213
213
  summary: Counting is hard.
@@ -227,4 +227,3 @@ test_files:
227
227
  - spec/spec_helper.rb
228
228
  - spec/support/models.rb
229
229
  - spec/support/worker_adapter.rb
230
- has_rdoc: