cache_method 0.0.3 → 0.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/lib/cache_method/cached_result.rb +8 -3
- data/lib/cache_method/epoch.rb +7 -4
- data/lib/cache_method/version.rb +1 -1
- data/lib/cache_method.rb +2 -10
- data/test/helper.rb +26 -2
- data/test/test_cache_method.rb +68 -8
- metadata +3 -3
@@ -19,6 +19,7 @@ module CacheMethod
|
|
19
19
|
attr_reader :original_method_id
|
20
20
|
attr_reader :args
|
21
21
|
|
22
|
+
# Store things wrapped in an Array so that nil is accepted
|
22
23
|
def fetch
|
23
24
|
if v = Config.instance.storage.get(cache_key) and v.is_a?(::Array)
|
24
25
|
v[0]
|
@@ -34,7 +35,11 @@ module CacheMethod
|
|
34
35
|
end
|
35
36
|
|
36
37
|
def cache_key
|
37
|
-
|
38
|
+
if obj.is_a? ::Class
|
39
|
+
[ 'CacheMethod', 'CachedResult', method_signature, current_epoch, args_digest ].join ','
|
40
|
+
else
|
41
|
+
[ 'CacheMethod', 'CachedResult', method_signature, obj_hash, current_epoch, args_digest ].join ','
|
42
|
+
end
|
38
43
|
end
|
39
44
|
|
40
45
|
def method_signature
|
@@ -42,11 +47,11 @@ module CacheMethod
|
|
42
47
|
end
|
43
48
|
|
44
49
|
def obj_hash
|
45
|
-
@obj_hash ||=
|
50
|
+
@obj_hash ||= obj.hash
|
46
51
|
end
|
47
52
|
|
48
53
|
def args_digest
|
49
|
-
@args_digest ||= ::Digest::MD5.hexdigest(args.
|
54
|
+
@args_digest ||= args.empty? ? 'empty' : ::Digest::MD5.hexdigest(args.join)
|
50
55
|
end
|
51
56
|
|
52
57
|
def current_epoch
|
data/lib/cache_method/epoch.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'digest/md5'
|
2
1
|
module CacheMethod
|
3
2
|
class Epoch #:nodoc: all
|
4
3
|
class << self
|
@@ -13,7 +12,7 @@ module CacheMethod
|
|
13
12
|
end
|
14
13
|
|
15
14
|
def random_name
|
16
|
-
|
15
|
+
rand(1_000_000).to_s
|
17
16
|
end
|
18
17
|
end
|
19
18
|
|
@@ -31,11 +30,15 @@ module CacheMethod
|
|
31
30
|
end
|
32
31
|
|
33
32
|
def obj_hash
|
34
|
-
@obj_hash ||=
|
33
|
+
@obj_hash ||= obj.hash
|
35
34
|
end
|
36
35
|
|
37
36
|
def cache_key
|
38
|
-
|
37
|
+
if obj.is_a? ::Class
|
38
|
+
[ 'CacheMethod', 'Epoch', method_signature ].join ','
|
39
|
+
else
|
40
|
+
[ 'CacheMethod', 'Epoch', method_signature, obj_hash ].join ','
|
41
|
+
end
|
39
42
|
end
|
40
43
|
|
41
44
|
def current
|
data/lib/cache_method/version.rb
CHANGED
data/lib/cache_method.rb
CHANGED
@@ -20,15 +20,7 @@ module CacheMethod
|
|
20
20
|
def self.method_signature(obj, method_id) #:nodoc:
|
21
21
|
[ klass_name(obj), method_id ].join method_delimiter(obj)
|
22
22
|
end
|
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
|
-
|
23
|
+
|
32
24
|
# All Objects, including instances and Classes, get the <tt>#clear_method_cache</tt> method.
|
33
25
|
module InstanceMethods
|
34
26
|
# Clear the cache for a particular method.
|
@@ -65,7 +57,7 @@ module CacheMethod
|
|
65
57
|
original_method_id = "_uncached_#{method_id}"
|
66
58
|
alias_method original_method_id, method_id
|
67
59
|
define_method method_id do |*args|
|
68
|
-
::CacheMethod::CachedResult.fetch :obj => self, :method_id => method_id, :original_method_id => original_method_id, :
|
60
|
+
::CacheMethod::CachedResult.fetch :obj => self, :method_id => method_id, :original_method_id => original_method_id, :ttl => ttl, :args => args
|
69
61
|
end
|
70
62
|
end
|
71
63
|
end
|
data/test/helper.rb
CHANGED
@@ -19,9 +19,23 @@ class CopyCat1
|
|
19
19
|
def echo_count
|
20
20
|
@echo_count ||= 0
|
21
21
|
end
|
22
|
+
# http://www.ruby-forum.com/topic/98106
|
23
|
+
# matz: "In 1.9, values (i.e. result of splat) are always represented by array,
|
24
|
+
# so that we won't confuse array as an value with array as values
|
25
|
+
# representation."
|
22
26
|
def echo(*args)
|
23
27
|
self.echo_count += 1
|
24
|
-
|
28
|
+
if RUBY_VERSION >= '1.9'
|
29
|
+
if args.empty?
|
30
|
+
return nil
|
31
|
+
elsif args.length == 1
|
32
|
+
return args[0]
|
33
|
+
else
|
34
|
+
return args
|
35
|
+
end
|
36
|
+
else
|
37
|
+
return *args
|
38
|
+
end
|
25
39
|
end
|
26
40
|
def hash
|
27
41
|
name.hash
|
@@ -37,7 +51,17 @@ class CopyCat2
|
|
37
51
|
end
|
38
52
|
def echo(*args)
|
39
53
|
self.echo_count += 1
|
40
|
-
|
54
|
+
if RUBY_VERSION >= '1.9'
|
55
|
+
if args.empty?
|
56
|
+
return nil
|
57
|
+
elsif args.length == 1
|
58
|
+
return args[0]
|
59
|
+
else
|
60
|
+
return args
|
61
|
+
end
|
62
|
+
else
|
63
|
+
return *args
|
64
|
+
end
|
41
65
|
end
|
42
66
|
cache_method :echo
|
43
67
|
end
|
data/test/test_cache_method.rb
CHANGED
@@ -6,14 +6,39 @@ class TestCacheMethod < Test::Unit::TestCase
|
|
6
6
|
def setup
|
7
7
|
Blog2.request_count = 0
|
8
8
|
CopyCat2.echo_count = 0
|
9
|
-
my_cache = Memcached.new '127.0.0.1:11211'
|
10
|
-
CacheMethod.config.storage = my_cache
|
9
|
+
my_cache = Memcached.new '127.0.0.1:11211', :binary => false
|
11
10
|
my_cache.flush
|
11
|
+
CacheMethod.config.storage = my_cache
|
12
12
|
end
|
13
13
|
|
14
14
|
def test_cache_instance_method_with_args
|
15
15
|
a = CopyCat1.new 'mimo'
|
16
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
|
+
end
|
23
|
+
|
24
|
+
def test_cache_instance_method_with_nil_args
|
25
|
+
a = CopyCat1.new 'mimo'
|
26
|
+
assert_equal nil, a.echo
|
27
|
+
assert_equal 1, a.echo_count
|
28
|
+
|
29
|
+
assert_equal nil, a.echo
|
30
|
+
assert_equal 1, a.echo_count
|
31
|
+
|
32
|
+
assert_equal nil, a.echo(nil)
|
33
|
+
assert_equal 2, a.echo_count
|
34
|
+
|
35
|
+
assert_equal nil, a.echo(nil)
|
36
|
+
assert_equal 2, a.echo_count
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_cache_instance_method_with_array_args
|
40
|
+
a = CopyCat1.new 'mimo'
|
41
|
+
|
17
42
|
assert_equal ['hi'], a.echo(['hi'])
|
18
43
|
assert_equal 1, a.echo_count
|
19
44
|
|
@@ -26,14 +51,43 @@ class TestCacheMethod < Test::Unit::TestCase
|
|
26
51
|
assert_equal ['bye'], a.echo(['bye'])
|
27
52
|
assert_equal 2, a.echo_count
|
28
53
|
|
29
|
-
assert_equal
|
54
|
+
assert_equal ['hi', 'there'], a.echo(['hi', 'there'])
|
30
55
|
assert_equal 3, a.echo_count
|
31
56
|
|
32
|
-
|
57
|
+
# same as previous
|
58
|
+
assert_equal ['hi', 'there'], a.echo('hi', 'there')
|
33
59
|
assert_equal 3, a.echo_count
|
60
|
+
|
61
|
+
assert_equal [], a.echo([])
|
62
|
+
assert_equal 4, a.echo_count
|
63
|
+
|
64
|
+
assert_equal [], a.echo([])
|
65
|
+
assert_equal 4, a.echo_count
|
34
66
|
end
|
35
|
-
|
67
|
+
|
36
68
|
def test_cache_class_method_with_args
|
69
|
+
assert_equal 'hi', CopyCat2.echo('hi')
|
70
|
+
assert_equal 1, CopyCat2.echo_count
|
71
|
+
|
72
|
+
assert_equal 'hi', CopyCat2.echo('hi')
|
73
|
+
assert_equal 1, CopyCat2.echo_count
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_cache_class_method_with_nil_args
|
77
|
+
assert_equal nil, CopyCat2.echo
|
78
|
+
assert_equal 1, CopyCat2.echo_count
|
79
|
+
|
80
|
+
assert_equal nil, CopyCat2.echo
|
81
|
+
assert_equal 1, CopyCat2.echo_count
|
82
|
+
|
83
|
+
assert_equal nil, CopyCat2.echo(nil)
|
84
|
+
assert_equal 2, CopyCat2.echo_count
|
85
|
+
|
86
|
+
assert_equal nil, CopyCat2.echo(nil)
|
87
|
+
assert_equal 2, CopyCat2.echo_count
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_cache_class_method_with_array_args
|
37
91
|
assert_equal ['hi'], CopyCat2.echo(['hi'])
|
38
92
|
assert_equal 1, CopyCat2.echo_count
|
39
93
|
|
@@ -46,13 +100,19 @@ class TestCacheMethod < Test::Unit::TestCase
|
|
46
100
|
assert_equal ['bye'], CopyCat2.echo(['bye'])
|
47
101
|
assert_equal 2, CopyCat2.echo_count
|
48
102
|
|
49
|
-
assert_equal
|
103
|
+
assert_equal ['hi', 'there'], CopyCat2.echo(['hi', 'there'])
|
50
104
|
assert_equal 3, CopyCat2.echo_count
|
51
105
|
|
52
|
-
assert_equal
|
106
|
+
assert_equal ['hi', 'there'], CopyCat2.echo('hi', 'there')
|
53
107
|
assert_equal 3, CopyCat2.echo_count
|
108
|
+
|
109
|
+
assert_equal [], CopyCat2.echo([])
|
110
|
+
assert_equal 4, CopyCat2.echo_count
|
111
|
+
|
112
|
+
assert_equal [], CopyCat2.echo([])
|
113
|
+
assert_equal 4, CopyCat2.echo_count
|
54
114
|
end
|
55
|
-
|
115
|
+
|
56
116
|
def test_cache_instance_method
|
57
117
|
a = new_instance_of_my_blog
|
58
118
|
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:
|
4
|
+
hash: 27
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
+
- 1
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 0.0.3
|
10
|
+
version: 0.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Seamus Abshere
|