cache_method 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -34,7 +34,7 @@ module CacheMethod
34
34
  end
35
35
 
36
36
  def cache_key
37
- [ method_signature, current_epoch, obj_hash, args_digest ].join ','
37
+ [ 'CacheMethod', 'CachedResult', method_signature, current_epoch, obj_hash, args_digest ].join ','
38
38
  end
39
39
 
40
40
  def method_signature
@@ -42,7 +42,7 @@ module CacheMethod
42
42
  end
43
43
 
44
44
  def obj_hash
45
- @obj_hash ||= obj.hash
45
+ @obj_hash ||= ::CacheMethod.hashcode(obj)
46
46
  end
47
47
 
48
48
  def args_digest
@@ -1,3 +1,4 @@
1
+ require 'digest/md5'
1
2
  module CacheMethod
2
3
  class Epoch #:nodoc: all
3
4
  class << self
@@ -10,6 +11,10 @@ module CacheMethod
10
11
  epoch = new options
11
12
  epoch.mark_passing
12
13
  end
14
+
15
+ def random_name
16
+ ::Digest::MD5.hexdigest rand.to_s
17
+ end
13
18
  end
14
19
 
15
20
  def initialize(options = {})
@@ -26,19 +31,25 @@ module CacheMethod
26
31
  end
27
32
 
28
33
  def obj_hash
29
- @obj_hash ||= obj.hash
34
+ @obj_hash ||= ::CacheMethod.hashcode(obj)
30
35
  end
31
36
 
32
37
  def cache_key
33
- [ 'CacheMethod', method_signature, obj_hash ].join ','
38
+ [ 'CacheMethod', 'Epoch', method_signature, obj_hash ].join ','
34
39
  end
35
40
 
36
41
  def current
37
- Config.instance.storage.get(cache_key).to_i
42
+ if cached_v = Config.instance.storage.get(cache_key)
43
+ cached_v
44
+ else
45
+ v = Epoch.random_name
46
+ Config.instance.storage.set cache_key, v
47
+ v
48
+ end
38
49
  end
39
50
 
40
51
  def mark_passing
41
- Config.instance.storage.set cache_key, (current+1), 0
52
+ Config.instance.storage.delete cache_key
42
53
  end
43
54
  end
44
55
  end
@@ -1,3 +1,3 @@
1
1
  module CacheMethod
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
data/lib/cache_method.rb CHANGED
@@ -21,6 +21,14 @@ module CacheMethod
21
21
  [ klass_name(obj), method_id ].join method_delimiter(obj)
22
22
  end
23
23
 
24
+ # What gets called to determine the hashcode of an object.
25
+ #
26
+ # * If the object is a Class, then it just does Class.to_s (otherwise Class hash codes change too often)
27
+ # * Otherwise, call #hash
28
+ def self.hashcode(obj)
29
+ obj.is_a?(::Class) ? obj.to_s : obj.hash
30
+ end
31
+
24
32
  # All Objects, including instances and Classes, get the <tt>#clear_method_cache</tt> method.
25
33
  module InstanceMethods
26
34
  # Clear the cache for a particular method.
data/test/helper.rb CHANGED
@@ -10,6 +10,39 @@ require 'cache_method'
10
10
  class Test::Unit::TestCase
11
11
  end
12
12
 
13
+ class CopyCat1
14
+ attr_reader :name
15
+ def initialize(name)
16
+ @name = name
17
+ end
18
+ attr_writer :echo_count
19
+ def echo_count
20
+ @echo_count ||= 0
21
+ end
22
+ def echo(*args)
23
+ self.echo_count += 1
24
+ return *args
25
+ end
26
+ def hash
27
+ name.hash
28
+ end
29
+ cache_method :echo
30
+ end
31
+
32
+ class CopyCat2
33
+ class << self
34
+ attr_writer :echo_count
35
+ def echo_count
36
+ @echo_count ||= 0
37
+ end
38
+ def echo(*args)
39
+ self.echo_count += 1
40
+ return *args
41
+ end
42
+ cache_method :echo
43
+ end
44
+ end
45
+
13
46
  class Blog1
14
47
  attr_reader :name
15
48
  attr_reader :url
@@ -5,11 +5,54 @@ require 'memcached'
5
5
  class TestCacheMethod < Test::Unit::TestCase
6
6
  def setup
7
7
  Blog2.request_count = 0
8
+ CopyCat2.echo_count = 0
8
9
  my_cache = Memcached.new '127.0.0.1:11211'
9
10
  CacheMethod.config.storage = my_cache
10
11
  my_cache.flush
11
12
  end
12
13
 
14
+ def test_cache_instance_method_with_args
15
+ a = CopyCat1.new 'mimo'
16
+
17
+ assert_equal ['hi'], a.echo(['hi'])
18
+ assert_equal 1, a.echo_count
19
+
20
+ assert_equal ['hi'], a.echo(['hi'])
21
+ assert_equal 1, a.echo_count
22
+
23
+ assert_equal ['bye'], a.echo(['bye'])
24
+ assert_equal 2, a.echo_count
25
+
26
+ assert_equal ['bye'], a.echo(['bye'])
27
+ assert_equal 2, a.echo_count
28
+
29
+ assert_equal nil, a.echo
30
+ assert_equal 3, a.echo_count
31
+
32
+ assert_equal nil, a.echo
33
+ assert_equal 3, a.echo_count
34
+ end
35
+
36
+ def test_cache_class_method_with_args
37
+ assert_equal ['hi'], CopyCat2.echo(['hi'])
38
+ assert_equal 1, CopyCat2.echo_count
39
+
40
+ assert_equal ['hi'], CopyCat2.echo(['hi'])
41
+ assert_equal 1, CopyCat2.echo_count
42
+
43
+ assert_equal ['bye'], CopyCat2.echo(['bye'])
44
+ assert_equal 2, CopyCat2.echo_count
45
+
46
+ assert_equal ['bye'], CopyCat2.echo(['bye'])
47
+ assert_equal 2, CopyCat2.echo_count
48
+
49
+ assert_equal nil, CopyCat2.echo
50
+ assert_equal 3, CopyCat2.echo_count
51
+
52
+ assert_equal nil, CopyCat2.echo
53
+ assert_equal 3, CopyCat2.echo_count
54
+ end
55
+
13
56
  def test_cache_instance_method
14
57
  a = new_instance_of_my_blog
15
58
  assert_equal ["hello from #{a.name}"], a.get_latest_entries
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: 27
4
+ hash: 25
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
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-02-17 00:00:00 -06:00
18
+ date: 2011-02-21 00:00:00 -06:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency