cache_method 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ 0.2.1 / 2012-03-01
2
+
3
+ * Enhancements
4
+
5
+ * Use user-defined #as_cache_key for both obj and args digests (cache keys); previously it was only used for obj
6
+
1
7
  0.2.0 / 2012-02-29
2
8
 
3
9
  * API changes:
@@ -1,6 +1,26 @@
1
1
  require 'digest/sha1'
2
2
  module CacheMethod
3
3
  class CachedResult #:nodoc: all
4
+ class << self
5
+ def resolve_cache_key(obj)
6
+ case obj
7
+ when ::Array
8
+ obj.map do |v|
9
+ resolve_cache_key v
10
+ end
11
+ when ::Hash
12
+ obj.inject({}) do |memo, (k, v)|
13
+ kk = resolve_cache_key k
14
+ vv = resolve_cache_key v
15
+ memo[kk] = vv
16
+ memo
17
+ end
18
+ else
19
+ obj.respond_to?(:as_cache_key) ? obj.as_cache_key : obj
20
+ end
21
+ end
22
+ end
23
+
4
24
  CACHE_KEY_JOINER = ','
5
25
 
6
26
  def initialize(obj, method_id, original_method_id, ttl, args)
@@ -44,11 +64,11 @@ module CacheMethod
44
64
  end
45
65
 
46
66
  def obj_digest
47
- @obj_digest ||= ::Digest::SHA1.hexdigest(::Marshal.dump(obj.respond_to?(:as_cache_key) ? obj.as_cache_key : obj))
67
+ @obj_digest ||= ::Digest::SHA1.hexdigest(::Marshal.dump(CachedResult.resolve_cache_key(obj)))
48
68
  end
49
69
 
50
70
  def args_digest
51
- @args_digest ||= args.empty? ? 'empty' : ::Digest::SHA1.hexdigest(::Marshal.dump(args))
71
+ @args_digest ||= args.empty? ? 'empty' : ::Digest::SHA1.hexdigest(::Marshal.dump(CachedResult.resolve_cache_key(args)))
52
72
  end
53
73
 
54
74
  def current_generation
@@ -56,9 +76,5 @@ module CacheMethod
56
76
  @current_generation ||= Generation.new(obj, method_id).current
57
77
  end
58
78
  end
59
-
60
- def arity
61
- @arity ||= obj.method(original_method_id).arity
62
- end
63
79
  end
64
80
  end
@@ -1,3 +1,3 @@
1
1
  module CacheMethod
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
data/test/helper.rb CHANGED
@@ -2,7 +2,11 @@ require 'rubygems'
2
2
  require 'bundler'
3
3
  Bundler.setup
4
4
  require 'test/unit'
5
- # require 'ruby-debug'
5
+
6
+ if ::Bundler.definition.specs['ruby-debug19'].first or ::Bundler.definition.specs['ruby-debug'].first
7
+ require 'ruby-debug'
8
+ end
9
+
6
10
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
7
11
  $LOAD_PATH.unshift(File.dirname(__FILE__))
8
12
  require 'cache_method'
@@ -27,6 +31,14 @@ class CopyCat1
27
31
  self.echo_count += 1
28
32
  return *args
29
33
  end
34
+ attr_writer :ack_count
35
+ def ack_count
36
+ @ack_count ||= 0
37
+ end
38
+ def ack(*args)
39
+ self.ack_count += 1
40
+ 'ACK'
41
+ end
30
42
  def marshal_dump
31
43
  raise "Used marshal_dump"
32
44
  end
@@ -34,6 +46,7 @@ class CopyCat1
34
46
  name
35
47
  end
36
48
  cache_method :echo
49
+ cache_method :ack
37
50
  end
38
51
 
39
52
  class CopyCat1a < CopyCat1
@@ -151,6 +164,21 @@ CopyCat1.send :include, Say
151
164
 
152
165
  class DontStringifyMe < Struct.new(:message)
153
166
  def to_s
154
- "Don't stringify me, read my message!"
167
+ raise "Don't stringify me, read my message!"
168
+ end
169
+ alias :inspect :to_s
170
+ end
171
+
172
+ class DontMarshalMe < Struct.new(:message)
173
+ def marshal_dump
174
+ raise "Don't marshal dump me!"
175
+ end
176
+
177
+ def marshal_load(src)
178
+ raise "Don't marshal load me! Maybe I'm a HASH WITH A DEFAULT PROC!"
179
+ end
180
+
181
+ def as_cache_key
182
+ message
155
183
  end
156
184
  end
@@ -402,4 +402,38 @@ class TestCacheMethod < Test::Unit::TestCase
402
402
  a.echo(world)
403
403
  assert_equal 2, a.echo_count
404
404
  end
405
+
406
+ def test_doesnt_marshal_if_as_cache_key_defined
407
+ hello = DontMarshalMe.new("hello")
408
+ world = DontMarshalMe.new("world")
409
+
410
+ a = CopyCat1.new 'mimo'
411
+ ack_count = 0
412
+
413
+ [
414
+ hello,
415
+ world,
416
+ [hello],
417
+ [world],
418
+ [[hello]],
419
+ [[world]],
420
+ { hello => world },
421
+ { world => hello },
422
+ [{hello => world}],
423
+ [{world => hello}],
424
+ [[{hello => world}]],
425
+ [[{world => hello}]],
426
+ {hello => [{hello => world}]},
427
+ {world => [{hello => world}]},
428
+ ].each do |nasty|
429
+ ack_count += 1
430
+ 5.times do
431
+ a.ack(nasty)
432
+ assert_equal ack_count, a.ack_count
433
+
434
+ a.ack(nasty)
435
+ assert_equal ack_count, a.ack_count
436
+ end
437
+ end
438
+ end
405
439
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cache_method
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-03-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: cache
16
- requirement: &2156275580 !ruby/object:Gem::Requirement
16
+ requirement: &2153251040 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,7 +21,7 @@ dependencies:
21
21
  version: 0.2.1
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2156275580
24
+ version_requirements: *2153251040
25
25
  description: Like alias_method, but it's cache_method!
26
26
  email:
27
27
  - seamus@abshere.net