simple_cacheable 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -6,6 +6,11 @@ extracted from [rails-bestpractices.com][1].
6
6
 
7
7
  it supports activerecord >= 3.0.0
8
8
 
9
+ Introduction
10
+ ------------
11
+
12
+ Here is a blog post to introduce simple_cacheable gem, <http://rails-bestpractices.com/blog/posts/24-simple_cacheable>
13
+
9
14
  Usage
10
15
  -----
11
16
 
@@ -13,11 +18,13 @@ Usage
13
18
  include Cacheable
14
19
 
15
20
  has_many :posts
21
+ has_one :account
16
22
 
17
23
  model_cache do
18
- with_key # User.find_cached(1)
19
- with_attribute :login # User.find_by_login('flyerhzm')
20
- with_method :last_post # user.cached_last_post
24
+ with_key # User.find_cached(1)
25
+ with_attribute :login # User.find_cached_by_login('flyerhzm')
26
+ with_method :last_post # user.cached_last_post
27
+ with_association :posts, :account # user.cached_posts, user.cached_account
21
28
  end
22
29
 
23
30
  def last_post
@@ -25,6 +32,10 @@ Usage
25
32
  end
26
33
  end
27
34
 
35
+ class Account < ActiveRecord::Base
36
+ belongs_to :user
37
+ end
38
+
28
39
  class Post < ActiveRecord::Base
29
40
  include Cacheable
30
41
 
@@ -32,8 +43,8 @@ Usage
32
43
  has_many :comments, :as => :commentable
33
44
 
34
45
  model_cache do
35
- with_key # post.find_cached(1)
36
- with_association :user # post.cached_user
46
+ with_key # post.find_cached(1)
47
+ with_association :user, :comments # post.cached_user, post.cached_comments
37
48
  end
38
49
  end
39
50
 
@@ -47,5 +58,15 @@ Usage
47
58
  end
48
59
  end
49
60
 
61
+ Install
62
+ -------
63
+
64
+ add the following code to your Gemfile
65
+
66
+ gem "simple_cacheable", :require => "cacheable"
67
+
68
+
69
+ Copyright © 2011 Richard Huang (flyerhzm@gmail.com), released under the MIT license
70
+
50
71
 
51
72
  [1]:https://github.com/flyerhzm/rails-bestpractices.com
data/Rakefile CHANGED
@@ -1,2 +1,4 @@
1
1
  require 'bundler'
2
+
3
+ include Rake::DSL
2
4
  Bundler::GemHelper.install_tasks
@@ -1,3 +1,3 @@
1
1
  module Cacheable
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
data/lib/cacheable.rb CHANGED
@@ -63,7 +63,31 @@ module Cacheable
63
63
  polymorphic = association.options[:polymorphic]
64
64
  class_eval <<-EOF
65
65
  def cached_#{association_name}
66
- Rails.cache.fetch association_cache_key("#{association_name}", #{polymorphic}) do
66
+ Rails.cache.fetch belong_association_cache_key("#{association_name}", #{polymorphic}) do
67
+ #{association_name}
68
+ end
69
+ end
70
+ EOF
71
+ else
72
+ reverse_association = association.klass.reflect_on_all_associations(:belongs_to).find { |reverse_association|
73
+ reverse_association.options[:polymorphic] ? reverse_association.name == association.options[:as] : reverse_association.klass == self
74
+ }
75
+ association.klass.class_eval <<-EOF
76
+ after_save :expire_#{association_name}_cache
77
+ after_destroy :expire_#{association_name}_cache
78
+
79
+ def expire_#{association_name}_cache
80
+ if respond_to? :cached_#{reverse_association.name}
81
+ cached_#{reverse_association.name}.expire_association_cache(:#{association_name})
82
+ else
83
+ #{reverse_association.name}.expire_association_cache(:#{association_name})
84
+ end
85
+ end
86
+ EOF
87
+
88
+ class_eval <<-EOF
89
+ def cached_#{association_name}
90
+ Rails.cache.fetch have_association_cache_key("#{association_name}") do
67
91
  #{association_name}
68
92
  end
69
93
  end
@@ -107,6 +131,10 @@ module Cacheable
107
131
  end
108
132
  end
109
133
 
134
+ def expire_association_cache(name)
135
+ Rails.cache.delete have_association_cache_key(name)
136
+ end
137
+
110
138
  def model_cache_key
111
139
  "#{self.class.name.tableize}/#{self.id.to_i}"
112
140
  end
@@ -115,11 +143,15 @@ module Cacheable
115
143
  "#{model_cache_key}/method/#{meth}"
116
144
  end
117
145
 
118
- def association_cache_key(name, polymorphic=nil)
146
+ def belong_association_cache_key(name, polymorphic=nil)
119
147
  if polymorphic
120
148
  "#{self.send("#{name}_type").tableize}/#{self.send("#{name}_id")}"
121
149
  else
122
150
  "#{name.tableize}/#{self.send(name + "_id")}"
123
151
  end
124
152
  end
153
+
154
+ def have_association_cache_key(name)
155
+ "#{model_cache_key}/association/#{name}"
156
+ end
125
157
  end
@@ -5,13 +5,14 @@ describe Cacheable do
5
5
 
6
6
  before :all do
7
7
  @user = User.create(:login => 'flyerhzm')
8
+ @account = @user.create_account
8
9
  @post1 = @user.posts.create(:title => 'post1')
9
10
  @post2 = @user.posts.create(:title => 'post2')
10
11
  @comment1 = @post1.comments.create
11
- @comment2 = @post2.comments.create
12
+ @comment2 = @post1.comments.create
12
13
  end
13
14
 
14
- after :each do
15
+ before :each do
15
16
  cache.clear
16
17
  end
17
18
 
@@ -64,24 +65,74 @@ describe Cacheable do
64
65
  end
65
66
 
66
67
  context "with_association" do
67
- it "should not cache association" do
68
- cache.data["users/#{@user.id}"].should be_nil
69
- end
70
-
71
- it "should cache Post#user" do
72
- @post1.cached_user.should == @user
73
- cache.data["users/#{@user.id}"].should == @user
74
- end
75
-
76
- it "should cache Post#user multiple times" do
77
- @post1.cached_user
78
- @post1.cached_user.should == @user
79
- end
80
-
81
- it "should cache Comment#commentable with polymorphic" do
82
- cache.data["posts/#{@post1.id}"].should be_nil
83
- @comment1.cached_commentable.should == @post1
84
- cache.data["posts/#{@post1.id}"].should == @post1
68
+ context "belongs_to" do
69
+ it "should not cache association" do
70
+ cache.data["users/#{@user.id}"].should be_nil
71
+ end
72
+
73
+ it "should cache Post#user" do
74
+ @post1.cached_user.should == @user
75
+ cache.data["users/#{@user.id}"].should == @user
76
+ end
77
+
78
+ it "should cache Post#user multiple times" do
79
+ @post1.cached_user
80
+ @post1.cached_user.should == @user
81
+ end
82
+
83
+ it "should cache Comment#commentable with polymorphic" do
84
+ cache.data["posts/#{@post1.id}"].should be_nil
85
+ @comment1.cached_commentable.should == @post1
86
+ cache.data["posts/#{@post1.id}"].should == @post1
87
+ end
88
+ end
89
+
90
+ context "has_many" do
91
+ it "should not cache associations" do
92
+ cache.data["users/#{@user.id}/association/posts"].should be_nil
93
+ end
94
+
95
+ it "should cache User#posts" do
96
+ @user.cached_posts.should == [@post1, @post2]
97
+ cache.data["users/#{@user.id}/association/posts"].should == [@post1, @post2]
98
+ end
99
+
100
+ it "should cache User#posts multiple times" do
101
+ @user.cached_posts
102
+ @user.cached_posts.should == [@post1, @post2]
103
+ end
104
+ end
105
+
106
+ context "has_many with polymorphic" do
107
+ it "should not cache associations" do
108
+ cache.data["posts/#{@post1.id}/association/comments"].should be_nil
109
+ end
110
+
111
+ it "should cache Post#comments" do
112
+ @post1.cached_comments.should == [@comment1, @comment2]
113
+ cache.data["posts/#{@post1.id}/association/comments"].should == [@comment1, @comment2]
114
+ end
115
+
116
+ it "should cache Post#comments multiple times" do
117
+ @post1.cached_comments
118
+ @post1.cached_comments.should == [@comment1, @comment2]
119
+ end
120
+ end
121
+
122
+ context "has_one" do
123
+ it "should not cache associations" do
124
+ cache.data["users/#{@user.id}/association/account"].should be_nil
125
+ end
126
+
127
+ it "should cache User#posts" do
128
+ @user.cached_account.should == @account
129
+ cache.data["users/#{@user.id}/association/account"].should == @account
130
+ end
131
+
132
+ it "should cache User#posts multiple times" do
133
+ @user.cached_account
134
+ @user.cached_account.should == @account
135
+ end
85
136
  end
86
137
  end
87
138
 
@@ -106,5 +157,26 @@ describe Cacheable do
106
157
  @user.expire_model_cache
107
158
  cache.data["users/#{@user.id}/method/last_post"].should be_nil
108
159
  end
160
+
161
+ it "should delete has_many with_association cache" do
162
+ @user.cached_posts
163
+ cache.data["users/#{@user.id}/association/posts"].should_not be_nil
164
+ @post1.save
165
+ cache.data["users/#{@user.id}/association/posts"].should be_nil
166
+ end
167
+
168
+ it "should delete has_many with polymorphic with_association cache" do
169
+ @post1.cached_comments
170
+ cache.data["posts/#{@post1.id}/association/comments"].should_not be_nil
171
+ @comment1.save
172
+ cache.data["posts/#{@post1.id}/association/comments"].should be_nil
173
+ end
174
+
175
+ it "should delete has_one with_association cache" do
176
+ @user.cached_account
177
+ cache.data["users/#{@user.id}/association/account"].should_not be_nil
178
+ @account.save
179
+ cache.data["users/#{@user.id}/association/account"].should be_nil
180
+ end
109
181
  end
110
182
  end
@@ -0,0 +1,3 @@
1
+ class Account < ActiveRecord::Base
2
+ belongs_to :user
3
+ end
data/spec/models/post.rb CHANGED
@@ -6,6 +6,6 @@ class Post < ActiveRecord::Base
6
6
 
7
7
  model_cache do
8
8
  with_key
9
- with_association :user
9
+ with_association :user, :comments
10
10
  end
11
11
  end
data/spec/models/user.rb CHANGED
@@ -2,11 +2,13 @@ class User < ActiveRecord::Base
2
2
  include Cacheable
3
3
 
4
4
  has_many :posts
5
+ has_one :account
5
6
 
6
7
  model_cache do
7
8
  with_key
8
9
  with_attribute :login
9
10
  with_method :last_post
11
+ with_association :posts, :account
10
12
  end
11
13
 
12
14
  def last_post
data/spec/spec_helper.rb CHANGED
@@ -65,6 +65,10 @@ RSpec.configure do |config|
65
65
  t.string :login
66
66
  end
67
67
 
68
+ create_table :accounts do |t|
69
+ t.integer :user_id
70
+ end
71
+
68
72
  create_table :posts do |t|
69
73
  t.integer :user_id
70
74
  t.string :title
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: simple_cacheable
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.0.0
5
+ version: 1.1.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Richard Huang
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-10-05 00:00:00 +08:00
13
+ date: 2011-10-06 00:00:00 +08:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -77,6 +77,7 @@ files:
77
77
  - lib/cacheable.rb
78
78
  - lib/cacheable/version.rb
79
79
  - spec/cacheable_spec.rb
80
+ - spec/models/account.rb
80
81
  - spec/models/comment.rb
81
82
  - spec/models/post.rb
82
83
  - spec/models/user.rb
@@ -111,6 +112,7 @@ specification_version: 3
111
112
  summary: a simple cache implementation based on activerecord
112
113
  test_files:
113
114
  - spec/cacheable_spec.rb
115
+ - spec/models/account.rb
114
116
  - spec/models/comment.rb
115
117
  - spec/models/post.rb
116
118
  - spec/models/user.rb