simple_cacheable 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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