cache_method 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -40,6 +40,10 @@ And clear them too
40
40
 
41
41
  (which doesn't delete the rest of your cache)
42
42
 
43
+ == Real-world usage
44
+
45
+ In production use at {carbon.brighterplanet.com}[http://carbon.brighterplanet.com], the Brighter Planet emission estimate web service.
46
+
43
47
  == Configuration (and supported cache clients)
44
48
 
45
49
  You need to set where the cache will be stored:
@@ -78,14 +82,13 @@ Ideally, you should try to make a <tt>String</tt> or a <tt>Hash</tt> and call th
78
82
 
79
83
  Note: this is NOT the same thing as <tt>#to_hash</tt>! That returns a <b><tt>Hash</tt></b>. What we want is an integer "hash code."
80
84
 
85
+ == Using #method_cache_hash instead of #hash
86
+
87
+ If you don't want to modify #hash, use #method_cache_hash instead.
88
+
81
89
  == Rationale
82
90
 
83
- * It should be easy to cache a method using memcached.
84
- * The main clients should be supported
85
- * memcache-client (for people who use the Rails default)
86
- * dalli (for people on heroku)
87
- * memcached (for people using Evan Weaver's ultra-fast gem)
88
- * redis (for people who like that sort of thing, but you won't get expiration)
91
+ * It should be easy to cache a method using memcached, dalli (if you're on heroku), redis, etc. (that's why I made the {cache gem}[https://rubygems.org/gems/cache])
89
92
  * It should be easy to uncache a method without clearing the whole cache
90
93
  * It should be easy to cache instance methods
91
94
  * It should be easy to cache methods that depend on object state
data/cache_method.gemspec CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |s|
20
20
 
21
21
  s.add_dependency 'cache', '>=0.2.1'
22
22
  s.add_development_dependency 'memcached'
23
+ s.add_development_dependency 'activesupport'
23
24
  # if RUBY_VERSION >= '1.9'
24
25
  # s.add_development_dependency 'ruby-debug19'
25
26
  # else
@@ -35,7 +35,7 @@ module CacheMethod
35
35
  end
36
36
 
37
37
  def cache_key
38
- if obj.is_a? ::Class
38
+ if obj.is_a? ::Class or obj.is_a? ::Module
39
39
  [ 'CacheMethod', 'CachedResult', method_signature, current_epoch, args_digest ].join ','
40
40
  else
41
41
  [ 'CacheMethod', 'CachedResult', method_signature, obj_hash, current_epoch, args_digest ].join ','
@@ -47,7 +47,7 @@ module CacheMethod
47
47
  end
48
48
 
49
49
  def obj_hash
50
- @obj_hash ||= obj.hash
50
+ @obj_hash ||= obj.respond_to?(:method_cache_hash) ? obj.method_cache_hash : obj.hash
51
51
  end
52
52
 
53
53
  def args_digest
@@ -30,11 +30,11 @@ module CacheMethod
30
30
  end
31
31
 
32
32
  def obj_hash
33
- @obj_hash ||= obj.hash
33
+ @obj_hash ||= obj.respond_to?(:method_cache_hash) ? obj.method_cache_hash : obj.hash
34
34
  end
35
35
 
36
36
  def cache_key
37
- if obj.is_a? ::Class
37
+ if obj.is_a? ::Class or obj.is_a? ::Module
38
38
  [ 'CacheMethod', 'Epoch', method_signature ].join ','
39
39
  else
40
40
  [ 'CacheMethod', 'Epoch', method_signature, obj_hash ].join ','
@@ -1,3 +1,3 @@
1
1
  module CacheMethod
2
- VERSION = "0.1.4"
2
+ VERSION = "0.1.5"
3
3
  end
data/lib/cache_method.rb CHANGED
@@ -10,11 +10,11 @@ module CacheMethod
10
10
  end
11
11
 
12
12
  def self.klass_name(obj) #:nodoc:
13
- obj.is_a?(::Class) ? obj.to_s : obj.class.to_s
13
+ (obj.is_a?(::Class) or obj.is_a?(::Module)) ? obj.to_s : obj.class.to_s
14
14
  end
15
15
 
16
16
  def self.method_delimiter(obj) #:nodoc:
17
- obj.is_a?(::Class) ? '.' : '#'
17
+ (obj.is_a?(::Class) or obj.is_a?(::Module)) ? '.' : '#'
18
18
  end
19
19
 
20
20
  def self.method_signature(obj, method_id) #:nodoc:
@@ -66,4 +66,5 @@ end
66
66
  unless ::Object.method_defined? :cache_method
67
67
  ::Object.send :include, ::CacheMethod::InstanceMethods
68
68
  ::Class.send :include, ::CacheMethod::ClassMethods
69
+ ::Module.send :include, ::CacheMethod::ClassMethods
69
70
  end
data/test/helper.rb CHANGED
@@ -38,11 +38,20 @@ class CopyCat1
38
38
  end
39
39
  end
40
40
  def hash
41
+ raise "Used hash"
42
+ end
43
+ def method_cache_hash
41
44
  name.hash
42
45
  end
43
46
  cache_method :echo
44
47
  end
45
48
 
49
+ class CopyCat1a < CopyCat1
50
+ def method_cache_hash
51
+ raise "Used method_cache_hash"
52
+ end
53
+ end
54
+
46
55
  class CopyCat2
47
56
  class << self
48
57
  attr_writer :echo_count
@@ -112,3 +121,23 @@ class Blog2
112
121
  cache_method :get_latest_entries
113
122
  end
114
123
  end
124
+
125
+ require 'active_support'
126
+ require 'active_support/core_ext/module'
127
+ module BlogM
128
+ # mattr_accessor :request_count
129
+ # self.request_count = 0
130
+ def self.request_count
131
+ @request_count ||= 0
132
+ end
133
+ def self.request_count=(x)
134
+ @request_count = x
135
+ end
136
+ def self.get_latest_entries
137
+ self.request_count += 1
138
+ 'danke schoen'
139
+ end
140
+ class << self
141
+ cache_method :get_latest_entries
142
+ end
143
+ end
@@ -20,7 +20,7 @@ class TestCacheMethod < Test::Unit::TestCase
20
20
  assert_equal 'hi', a.echo('hi')
21
21
  assert_equal 1, a.echo_count
22
22
  end
23
-
23
+
24
24
  def test_cache_instance_method_with_nil_args
25
25
  a = CopyCat1.new 'mimo'
26
26
  assert_equal nil, a.echo
@@ -31,11 +31,11 @@ class TestCacheMethod < Test::Unit::TestCase
31
31
 
32
32
  assert_equal nil, a.echo(nil)
33
33
  assert_equal 2, a.echo_count
34
-
34
+
35
35
  assert_equal nil, a.echo(nil)
36
36
  assert_equal 2, a.echo_count
37
37
  end
38
-
38
+
39
39
  def test_cache_instance_method_with_array_args
40
40
  a = CopyCat1.new 'mimo'
41
41
 
@@ -64,7 +64,7 @@ class TestCacheMethod < Test::Unit::TestCase
64
64
  assert_equal [], a.echo([])
65
65
  assert_equal 4, a.echo_count
66
66
  end
67
-
67
+
68
68
  def test_cache_class_method_with_args
69
69
  assert_equal 'hi', CopyCat2.echo('hi')
70
70
  assert_equal 1, CopyCat2.echo_count
@@ -82,7 +82,7 @@ class TestCacheMethod < Test::Unit::TestCase
82
82
 
83
83
  assert_equal nil, CopyCat2.echo(nil)
84
84
  assert_equal 2, CopyCat2.echo_count
85
-
85
+
86
86
  assert_equal nil, CopyCat2.echo(nil)
87
87
  assert_equal 2, CopyCat2.echo_count
88
88
  end
@@ -218,4 +218,19 @@ class TestCacheMethod < Test::Unit::TestCase
218
218
  assert_equal 'hi', a.echo('hi')
219
219
  assert_equal 1, a.echo_count
220
220
  end
221
+
222
+ def test_cache_module_method
223
+ assert_equal 0, BlogM.request_count
224
+ assert_equal 'danke schoen', BlogM.get_latest_entries
225
+ assert_equal 1, BlogM.request_count
226
+ assert_equal 'danke schoen', BlogM.get_latest_entries
227
+ assert_equal 1, BlogM.request_count
228
+ end
229
+
230
+ def test_method_cache_hash
231
+ assert_raises(RuntimeError, /Used method_cache_hash/) do
232
+ a = CopyCat1a.new 'mimo'
233
+ a.echo 'hi'
234
+ end
235
+ end
221
236
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cache_method
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
5
- prerelease: false
4
+ hash: 17
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 4
10
- version: 0.1.4
9
+ - 5
10
+ version: 0.1.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Seamus Abshere
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-03-07 00:00:00 -06:00
18
+ date: 2011-03-12 23:00:00 -06:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -48,6 +48,20 @@ dependencies:
48
48
  version: "0"
49
49
  type: :development
50
50
  version_requirements: *id002
51
+ - !ruby/object:Gem::Dependency
52
+ name: activesupport
53
+ prerelease: false
54
+ requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ hash: 3
60
+ segments:
61
+ - 0
62
+ version: "0"
63
+ type: :development
64
+ version_requirements: *id003
51
65
  description: Like alias_method, but it's cache_method!
52
66
  email:
53
67
  - seamus@abshere.net
@@ -100,7 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
100
114
  requirements: []
101
115
 
102
116
  rubyforge_project: cache_method
103
- rubygems_version: 1.3.7
117
+ rubygems_version: 1.6.2
104
118
  signing_key:
105
119
  specification_version: 3
106
120
  summary: Lets you cache methods (to memcached, redis, etc.) sort of like you can memoize them