cache_method 0.2.5 → 0.2.6
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.
- checksums.yaml +15 -0
- data/CHANGELOG +7 -0
- data/Gemfile +1 -8
- data/README.markdown +19 -2
- data/cache_method.gemspec +10 -3
- data/lib/cache_method.rb +28 -4
- data/lib/cache_method/debug.rb +16 -6
- data/lib/cache_method/version.rb +1 -1
- data/test/helper.rb +13 -8
- data/test/test_cache_method.rb +14 -0
- metadata +75 -9
checksums.yaml
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
!binary "U0hBMQ==":
|
|
3
|
+
metadata.gz: !binary |-
|
|
4
|
+
YjczZDg5NDE3MTY2MGMxMTMwNGI3OWFhOTZhMGM1NzE5YTQzZDkzYQ==
|
|
5
|
+
data.tar.gz: !binary |-
|
|
6
|
+
OGZhNzRiM2JhMTQ3NjA3MzllOTc0NDEyOGZlZGI5OTg4MWNkYTM4MA==
|
|
7
|
+
!binary "U0hBNTEy":
|
|
8
|
+
metadata.gz: !binary |-
|
|
9
|
+
NmQ1MTIxOTJkZTZjZjFjODRlMDM5MjNmOGU0N2YwN2M0NzIwYWEwYzAyMTAw
|
|
10
|
+
YTM2MDAwMGI0OWZhZmVlOWE5ODY2ZjhhZjlkNGE5MTliYmFjNTU1YzA2MjA3
|
|
11
|
+
YWM3YWFhODY1MTBiMGFmNWI5YmIxOTc3MWQ2MmM2YmRlNjYxOTI=
|
|
12
|
+
data.tar.gz: !binary |-
|
|
13
|
+
NTQ5ZDBkYjViNGIxYjk0MDE4MTY0ZGRmNTFlNTI0NTcwMDFiN2NmZmZmNThk
|
|
14
|
+
ODdlYWVkNDcyZjlmODVjNTNjYzI1OGUzNjJiNDg2YjhjZDIxODc2ODhlYzg5
|
|
15
|
+
YzUzZDMzNmIzNmNkNWQyNGEyMTA5OWFjNzU4MGU4ZjhhODViOTE=
|
data/CHANGELOG
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
0.2.6 / 2013-05-13
|
|
2
|
+
|
|
3
|
+
* Enhancements
|
|
4
|
+
|
|
5
|
+
* cache_method_clear_on - for when a cache should be cleared whenever another method is called - thanks @rubemz ! https://github.com/seamusabshere/cache_method/pull/4
|
|
6
|
+
* hypothetically more useful output when you require 'cache_method/debug'
|
|
7
|
+
|
|
1
8
|
0.2.5 / 2012-04-24
|
|
2
9
|
|
|
3
10
|
* Enhancements
|
data/Gemfile
CHANGED
data/README.markdown
CHANGED
|
@@ -24,17 +24,29 @@ We use `cache_method` for [data science at Brighter Planet](http://brighterplane
|
|
|
24
24
|
|
|
25
25
|
require 'cache_method'
|
|
26
26
|
class Blog
|
|
27
|
+
|
|
27
28
|
attr_reader :name, :url
|
|
29
|
+
|
|
28
30
|
def initialize(name, url)
|
|
29
31
|
@name = name
|
|
30
32
|
@url = url
|
|
31
33
|
end
|
|
32
|
-
|
|
34
|
+
|
|
33
35
|
def entries(date)
|
|
34
36
|
# ...
|
|
35
37
|
end
|
|
38
|
+
|
|
39
|
+
# cache that slow method!
|
|
36
40
|
cache_method :entries
|
|
37
|
-
|
|
41
|
+
|
|
42
|
+
def update(stuff)
|
|
43
|
+
# ...
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# automatically clear cache for #entries when #update is called...
|
|
47
|
+
cache_method_clear_on :update, :entries
|
|
48
|
+
|
|
49
|
+
# custom cache key - not always required!
|
|
38
50
|
def as_cache_key
|
|
39
51
|
{ :name => name, :url => url }
|
|
40
52
|
end
|
|
@@ -221,6 +233,11 @@ Rest assured that `Tiger.my_module_method` and `Lion.my_module_method` will be c
|
|
|
221
233
|
# cache_method :my_module_method
|
|
222
234
|
end
|
|
223
235
|
|
|
236
|
+
## Contributors
|
|
237
|
+
|
|
238
|
+
* [Seamus Abshere](https://github.com/seamusabshere)
|
|
239
|
+
* [Rubem Nakamura](https://github.com/rubemz)
|
|
240
|
+
|
|
224
241
|
## Copyright
|
|
225
242
|
|
|
226
243
|
Copyright 2012 Seamus Abshere
|
data/cache_method.gemspec
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
|
2
|
-
|
|
3
|
-
require "cache_method/version"
|
|
2
|
+
require File.expand_path("../lib/cache_method/version", __FILE__)
|
|
4
3
|
|
|
5
4
|
Gem::Specification.new do |s|
|
|
6
5
|
s.name = "cache_method"
|
|
@@ -17,5 +16,13 @@ Gem::Specification.new do |s|
|
|
|
17
16
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
18
17
|
s.require_paths = ["lib"]
|
|
19
18
|
|
|
20
|
-
s.
|
|
19
|
+
s.add_runtime_dependency 'cache', '>=0.2.1'
|
|
20
|
+
|
|
21
|
+
s.add_development_dependency 'activesupport'
|
|
22
|
+
s.add_development_dependency 'dalli'
|
|
23
|
+
s.add_development_dependency 'yard'
|
|
24
|
+
s.add_development_dependency 'minitest'
|
|
25
|
+
if RUBY_VERSION >= '1.9'
|
|
26
|
+
s.add_development_dependency 'minitest-reporters'
|
|
27
|
+
end
|
|
21
28
|
end
|
data/lib/cache_method.rb
CHANGED
|
@@ -14,15 +14,15 @@ module CacheMethod
|
|
|
14
14
|
@config ||= Config.new
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
|
-
|
|
17
|
+
|
|
18
18
|
def CacheMethod.klass_name(obj) #:nodoc:
|
|
19
19
|
(obj.is_a?(::Class) or obj.is_a?(::Module)) ? obj.to_s : obj.class.to_s
|
|
20
20
|
end
|
|
21
|
-
|
|
21
|
+
|
|
22
22
|
def CacheMethod.method_delimiter(obj) #:nodoc:
|
|
23
23
|
(obj.is_a?(::Class) or obj.is_a?(::Module)) ? '.' : '#'
|
|
24
24
|
end
|
|
25
|
-
|
|
25
|
+
|
|
26
26
|
def CacheMethod.method_signature(obj, method_id) #:nodoc:
|
|
27
27
|
[ klass_name(obj), method_id ].join method_delimiter(obj)
|
|
28
28
|
end
|
|
@@ -55,7 +55,7 @@ module CacheMethod
|
|
|
55
55
|
def CacheMethod.digest(obj)
|
|
56
56
|
::Digest::SHA1.hexdigest ::Marshal.dump(resolve_cache_key(obj))
|
|
57
57
|
end
|
|
58
|
-
|
|
58
|
+
|
|
59
59
|
# All Objects, including instances and Classes, get the <tt>#cache_method_clear</tt> method.
|
|
60
60
|
module InstanceMethods
|
|
61
61
|
# Clear the cache for a particular method.
|
|
@@ -99,6 +99,30 @@ module CacheMethod
|
|
|
99
99
|
::CacheMethod::CachedResult.new(self, method_id, original_method_id, ttl, args, &blk).fetch
|
|
100
100
|
end
|
|
101
101
|
end
|
|
102
|
+
|
|
103
|
+
# Clear a cache method once another method is called. Useful in situations where
|
|
104
|
+
# you want to clear a cache whenever another method is callled, commonly
|
|
105
|
+
# an update.
|
|
106
|
+
#
|
|
107
|
+
# Example:
|
|
108
|
+
# class Blog
|
|
109
|
+
# def get_latest_entries
|
|
110
|
+
# # [...]
|
|
111
|
+
# end
|
|
112
|
+
# def update_entries
|
|
113
|
+
# # update happens
|
|
114
|
+
# end
|
|
115
|
+
# cache_method_clear_on :update_entries, :get_latest_entries
|
|
116
|
+
# end
|
|
117
|
+
def cache_method_clear_on(method_id, cache_method_clear_id)
|
|
118
|
+
original_method_id = "_original_#{method_id}"
|
|
119
|
+
alias_method original_method_id, method_id
|
|
120
|
+
|
|
121
|
+
define_method method_id do |*args, &blk|
|
|
122
|
+
cache_method_clear cache_method_clear_id
|
|
123
|
+
send(original_method_id, *args, &blk)
|
|
124
|
+
end
|
|
125
|
+
end
|
|
102
126
|
end
|
|
103
127
|
end
|
|
104
128
|
|
data/lib/cache_method/debug.rb
CHANGED
|
@@ -1,18 +1,25 @@
|
|
|
1
1
|
module CacheMethod
|
|
2
2
|
def CacheMethod.digest(obj)
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
cache_key = resolve_cache_key obj
|
|
4
|
+
m = Marshal.dump cache_key
|
|
5
|
+
if m.length > 1000
|
|
6
|
+
$stderr.puts
|
|
7
|
+
$stderr.puts "[cache_method] DIGEST (#{'X' * (m.length / 1024)}): #{cache_key.inspect}"
|
|
5
8
|
end
|
|
6
|
-
::Digest::SHA1.hexdigest
|
|
9
|
+
::Digest::SHA1.hexdigest m
|
|
7
10
|
end
|
|
8
11
|
|
|
9
12
|
class CachedResult
|
|
10
13
|
def debug_get_wrapped
|
|
11
14
|
retval = original_get_wrapped
|
|
12
15
|
if retval
|
|
16
|
+
# $stderr.puts
|
|
13
17
|
# $stderr.puts "[cache_method] GET: #{method_signature}(#{args.inspect})"
|
|
14
18
|
else
|
|
15
|
-
|
|
19
|
+
cache_key = CacheMethod.resolve_cache_key obj
|
|
20
|
+
m = Marshal.dump cache_key
|
|
21
|
+
$stderr.puts
|
|
22
|
+
$stderr.puts "[cache_method] GET (miss!): #{method_signature}(#{args.inspect}) - #{::Digest::SHA1.hexdigest(m)} - #{cache_key.inspect}"
|
|
16
23
|
end
|
|
17
24
|
retval
|
|
18
25
|
end
|
|
@@ -21,9 +28,12 @@ module CacheMethod
|
|
|
21
28
|
|
|
22
29
|
def debug_set_wrapped
|
|
23
30
|
retval = original_set_wrapped
|
|
24
|
-
|
|
25
|
-
|
|
31
|
+
m = Marshal.dump retval
|
|
32
|
+
if m.length > 1000
|
|
33
|
+
$stderr.puts
|
|
34
|
+
$stderr.puts "[cache_method] SET (#{'X' * (m.length / 1024)}): #{method_signature}(#{args.inspect}) -> #{retval.inspect}"
|
|
26
35
|
else
|
|
36
|
+
# $stderr.puts
|
|
27
37
|
# $stderr.puts "[cache_method] SET: #{method_signature}(#{args.inspect})"
|
|
28
38
|
end
|
|
29
39
|
retval
|
data/lib/cache_method/version.rb
CHANGED
data/test/helper.rb
CHANGED
|
@@ -2,12 +2,9 @@ require 'rubygems'
|
|
|
2
2
|
require 'bundler/setup'
|
|
3
3
|
require 'minitest/spec'
|
|
4
4
|
require 'minitest/autorun'
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
MiniTest::
|
|
8
|
-
|
|
9
|
-
if ::Bundler.definition.specs['ruby-debug19'].first or ::Bundler.definition.specs['ruby-debug'].first
|
|
10
|
-
require 'ruby-debug'
|
|
5
|
+
if RUBY_VERSION >= '1.9'
|
|
6
|
+
require 'minitest/reporters'
|
|
7
|
+
MiniTest::Reporters.use! MiniTest::Reporters::SpecReporter.new
|
|
11
8
|
end
|
|
12
9
|
|
|
13
10
|
require 'cache_method'
|
|
@@ -66,11 +63,11 @@ module Say
|
|
|
66
63
|
def say_count
|
|
67
64
|
@say_count ||= 0
|
|
68
65
|
end
|
|
69
|
-
|
|
66
|
+
|
|
70
67
|
def say_count=(x)
|
|
71
68
|
@say_count = x
|
|
72
69
|
end
|
|
73
|
-
|
|
70
|
+
|
|
74
71
|
def say(msg)
|
|
75
72
|
self.say_count += 1
|
|
76
73
|
msg
|
|
@@ -123,6 +120,14 @@ class Blog1
|
|
|
123
120
|
["voo vaa #{name}"]
|
|
124
121
|
end
|
|
125
122
|
cache_method :get_latest_entries2, 1 # second
|
|
123
|
+
def update_entries param
|
|
124
|
+
if block_given?
|
|
125
|
+
yield param
|
|
126
|
+
else
|
|
127
|
+
param
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
cache_method_clear_on :update_entries, :get_latest_entries
|
|
126
131
|
def as_cache_key
|
|
127
132
|
{ :name => name, :url => url }
|
|
128
133
|
end
|
data/test/test_cache_method.rb
CHANGED
|
@@ -197,11 +197,25 @@ describe CacheMethod do
|
|
|
197
197
|
a = new_instance_of_my_blog
|
|
198
198
|
a.get_latest_entries.must_equal ["hello from #{a.name}"]
|
|
199
199
|
a.request_count.must_equal 1
|
|
200
|
+
a.get_latest_entries.must_equal ["hello from #{a.name}"]
|
|
201
|
+
a.request_count.must_equal 1
|
|
200
202
|
a.cache_method_clear :get_latest_entries
|
|
201
203
|
a.get_latest_entries.must_equal ["hello from #{a.name}"]
|
|
202
204
|
a.request_count.must_equal 2
|
|
203
205
|
end
|
|
204
206
|
|
|
207
|
+
it %{cache_method_clear_on} do
|
|
208
|
+
a = new_instance_of_my_blog
|
|
209
|
+
a.get_latest_entries.must_equal ["hello from #{a.name}"]
|
|
210
|
+
a.request_count.must_equal 1
|
|
211
|
+
a.update_entries("param").must_equal("param")
|
|
212
|
+
a.update_entries(1) {|param| param + 1}.must_equal(2)
|
|
213
|
+
a.get_latest_entries.must_equal ["hello from #{a.name}"]
|
|
214
|
+
a.request_count.must_equal 2
|
|
215
|
+
a.get_latest_entries.must_equal ["hello from #{a.name}"]
|
|
216
|
+
a.request_count.must_equal 2
|
|
217
|
+
end
|
|
218
|
+
|
|
205
219
|
it %{clear_correct_instance_method} do
|
|
206
220
|
a = new_instance_of_my_blog
|
|
207
221
|
a.get_latest_entries.must_equal ["hello from #{a.name}"]
|
metadata
CHANGED
|
@@ -1,20 +1,18 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: cache_method
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
5
|
-
prerelease:
|
|
4
|
+
version: 0.2.6
|
|
6
5
|
platform: ruby
|
|
7
6
|
authors:
|
|
8
7
|
- Seamus Abshere
|
|
9
8
|
autorequire:
|
|
10
9
|
bindir: bin
|
|
11
10
|
cert_chain: []
|
|
12
|
-
date:
|
|
11
|
+
date: 2013-05-13 00:00:00.000000000 Z
|
|
13
12
|
dependencies:
|
|
14
13
|
- !ruby/object:Gem::Dependency
|
|
15
14
|
name: cache
|
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
|
17
|
-
none: false
|
|
18
16
|
requirements:
|
|
19
17
|
- - ! '>='
|
|
20
18
|
- !ruby/object:Gem::Version
|
|
@@ -22,11 +20,80 @@ dependencies:
|
|
|
22
20
|
type: :runtime
|
|
23
21
|
prerelease: false
|
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
-
none: false
|
|
26
23
|
requirements:
|
|
27
24
|
- - ! '>='
|
|
28
25
|
- !ruby/object:Gem::Version
|
|
29
26
|
version: 0.2.1
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: activesupport
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - ! '>='
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '0'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - ! '>='
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: dalli
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ! '>='
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ! '>='
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: yard
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ! '>='
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0'
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ! '>='
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: minitest
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - ! '>='
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '0'
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - ! '>='
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '0'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: minitest-reporters
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - ! '>='
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '0'
|
|
90
|
+
type: :development
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - ! '>='
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '0'
|
|
30
97
|
description: Like alias_method, but it's cache_method!
|
|
31
98
|
email:
|
|
32
99
|
- seamus@abshere.net
|
|
@@ -50,27 +117,26 @@ files:
|
|
|
50
117
|
- test/test_cache_method.rb
|
|
51
118
|
homepage: https://github.com/seamusabshere/cache_method
|
|
52
119
|
licenses: []
|
|
120
|
+
metadata: {}
|
|
53
121
|
post_install_message:
|
|
54
122
|
rdoc_options: []
|
|
55
123
|
require_paths:
|
|
56
124
|
- lib
|
|
57
125
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
58
|
-
none: false
|
|
59
126
|
requirements:
|
|
60
127
|
- - ! '>='
|
|
61
128
|
- !ruby/object:Gem::Version
|
|
62
129
|
version: '0'
|
|
63
130
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
64
|
-
none: false
|
|
65
131
|
requirements:
|
|
66
132
|
- - ! '>='
|
|
67
133
|
- !ruby/object:Gem::Version
|
|
68
134
|
version: '0'
|
|
69
135
|
requirements: []
|
|
70
136
|
rubyforge_project: cache_method
|
|
71
|
-
rubygems_version:
|
|
137
|
+
rubygems_version: 2.0.3
|
|
72
138
|
signing_key:
|
|
73
|
-
specification_version:
|
|
139
|
+
specification_version: 4
|
|
74
140
|
summary: Lets you cache methods (to memcached, redis, etc.) sort of like you can memoize
|
|
75
141
|
them
|
|
76
142
|
test_files:
|