method_cache 0.6.4 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ pkg
2
+ *~
3
+ *.swp
4
+ Gemfile.lock
data/.rbenv-gemsets ADDED
@@ -0,0 +1 @@
1
+ method_cache
data/.rbenv-version ADDED
@@ -0,0 +1 @@
1
+ ree-1.8.7-2012.02
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://www.rubygems.org"
2
+
3
+ gemspec
data/Rakefile CHANGED
@@ -1,45 +1,10 @@
1
- require 'rake'
2
1
  require 'rake/testtask'
3
- require 'rake/rdoctask'
4
-
5
- begin
6
- require 'jeweler'
7
- Jeweler::Tasks.new do |s|
8
- s.name = "method_cache"
9
- s.summary = %Q{Simple memcache-based memoization library for Ruby}
10
- s.email = "code@justinbalthrop.com"
11
- s.homepage = "http://github.com/ninjudd/method_cache"
12
- s.description = "Simple memcache-based memoization library for Ruby"
13
- s.authors = ["Justin Balthrop"]
14
- s.add_dependency('memcache', '>= 1.0.0')
15
- end
16
- Jeweler::GemcutterTasks.new
17
- rescue LoadError
18
- puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
19
- end
2
+ require 'bundler/gem_tasks'
20
3
 
21
4
  Rake::TestTask.new do |t|
22
- t.libs << 'lib'
5
+ t.libs = ['lib', 'test']
23
6
  t.pattern = 'test/**/*_test.rb'
24
7
  t.verbose = false
25
8
  end
26
9
 
27
- Rake::RDocTask.new do |rdoc|
28
- rdoc.rdoc_dir = 'rdoc'
29
- rdoc.title = 'method_cache'
30
- rdoc.options << '--line-numbers' << '--inline-source'
31
- rdoc.rdoc_files.include('README*')
32
- rdoc.rdoc_files.include('lib/**/*.rb')
33
- end
34
-
35
- begin
36
- require 'rcov/rcovtask'
37
- Rcov::RcovTask.new do |t|
38
- t.libs << 'test'
39
- t.test_files = FileList['test/**/*_test.rb']
40
- t.verbose = true
41
- end
42
- rescue LoadError
43
- end
44
-
45
10
  task :default => :test
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.0
@@ -0,0 +1,67 @@
1
+ module MethodCache
2
+ class LocalCache
3
+ def initialize
4
+ clear
5
+ end
6
+
7
+ def clear
8
+ @data = {}
9
+ @cached_at = {}
10
+ @expires_at = {}
11
+ end
12
+
13
+ def get(key)
14
+ if expires = expires_at(key)
15
+ delete(key) if expires <= Time.now
16
+ end
17
+ @data[key]
18
+ end
19
+ alias [] get
20
+
21
+ def count(key)
22
+ get(key).to_i
23
+ end
24
+
25
+ def set(key, value, expiry)
26
+ @cached_at[key] = Time.now
27
+ @expires_at[key] = expiry_to_time(expiry)
28
+ @data[key] = value
29
+ end
30
+ alias []= set
31
+ alias write set
32
+
33
+ def delete(key)
34
+ @cached_at.delete(key)
35
+ @expires_at.delete(key)
36
+ @data.delete(key)
37
+ end
38
+
39
+ def incr(key, amount)
40
+ @data[key] = count(key) + amount
41
+ end
42
+
43
+ def decr(key, amount)
44
+ incr(key, -amount)
45
+ end
46
+
47
+ def expires_at(key)
48
+ @expires_at[key]
49
+ end
50
+
51
+ def cached_at(key)
52
+ @cached_at[key]
53
+ end
54
+
55
+ private
56
+
57
+ def expiry_to_time(expiry)
58
+ expiry = Time.at(expiry) if expiry > 60*60*24*30
59
+ if expiry.kind_of?(Time)
60
+ expiry
61
+ else
62
+ expiry = expiry.to_i
63
+ expiry == 0 ? nil : Time.now + expiry
64
+ end
65
+ end
66
+ end
67
+ end
@@ -1,5 +1,9 @@
1
1
  require 'digest/sha1'
2
2
 
3
+ class Object
4
+ def metaclass; class << self; self; end; end
5
+ end
6
+
3
7
  module MethodCache
4
8
  class Proxy
5
9
  attr_reader :method_name, :opts, :args, :target
@@ -44,13 +48,22 @@ module MethodCache
44
48
  end
45
49
 
46
50
  def update
47
- value = block_given? ? yield(cache[key]) : target.send(method_name_without_caching, *args)
48
- write_to_cache(key, value)
49
- value
51
+ if block_given?
52
+ old_value = read_from_cache(key)
53
+ return if old_value.nil?
54
+
55
+ old_value = nil if old_value == NULL
56
+ new_value = yield(old_value)
57
+ return if old_value == new_value
58
+ else
59
+ new_value = target.send(method_name_without_caching, *args)
60
+ end
61
+ write_to_cache(key, new_value)
62
+ new_value
50
63
  end
51
64
 
52
65
  def value
53
- value = opts[:counter] ? cache.count(key) : cache[key] unless MethodCache.disabled?
66
+ value = read_from_cache(key)
54
67
  value = nil unless valid?(:load, value)
55
68
 
56
69
  if value.nil?
@@ -59,6 +72,11 @@ module MethodCache
59
72
  write_to_cache(key, value) if valid?(:save, value)
60
73
  end
61
74
 
75
+ if opts[:counter]
76
+ value = [value, opts[:max]].min if opts[:max]
77
+ value = [value, opts[:min]].max if opts[:min]
78
+ end
79
+
62
80
  value = nil if value == NULL
63
81
  if clone? and value
64
82
  value.clone
@@ -98,12 +116,19 @@ module MethodCache
98
116
  if @cache.nil?
99
117
  @cache = opts[:cache] || MethodCache.default_cache
100
118
  @cache = Memcache.pool[@cache] if @cache.kind_of?(Symbol)
119
+ if not @cache.respond_to?(:[]) and @cache.respond_to?(:get)
120
+ @cache.metaclass.module_eval do
121
+ define_method :[] do |key|
122
+ get(key)
123
+ end
124
+ end
125
+ end
101
126
  end
102
127
  @cache
103
128
  end
104
129
 
105
130
  def local?
106
- cache.kind_of?(Hash)
131
+ cache.kind_of?(LocalCache) or cache.kind_of?(Hash)
107
132
  end
108
133
 
109
134
  def clone?
@@ -121,10 +146,23 @@ module MethodCache
121
146
  @key
122
147
  end
123
148
 
149
+ def cached_at
150
+ cache.cached_at(key) if cache.respond_to?(:cached_at)
151
+ end
152
+
153
+ def expires_at
154
+ cache.expires_at(key) if cache.respond_to?(:expires_at)
155
+ end
156
+
124
157
  private
125
158
 
126
159
  def expiry(value)
127
- dynamic_opt(:expiry, value).to_i
160
+ value = dynamic_opt(:expiry, value).to_i
161
+ if defined?(Memcache) and cache.kind_of?(Memcache)
162
+ {:expiry => value}
163
+ else
164
+ value
165
+ end
128
166
  end
129
167
 
130
168
  def valid?(type, value)
@@ -137,12 +175,17 @@ module MethodCache
137
175
 
138
176
  def dynamic_opt(name, value = nil)
139
177
  if opts[name].kind_of?(Proc)
140
- proc = opts[name].bind(target)
178
+ proc = opts[name]
141
179
  case proc.arity
142
- when 0 then proc.call()
143
- when 1 then proc.call(value)
180
+ when 0 then target.instance_exec(&proc)
181
+ when 1 then target.instance_exec(value, &proc)
144
182
  else
145
- proc.call(value, *args)
183
+ meta = {
184
+ :args => args,
185
+ :cached_at => cached_at,
186
+ :expires_at => expires_at,
187
+ }
188
+ target.instance_exec(value, meta, &proc)
146
189
  end
147
190
  else
148
191
  opts[name]
@@ -150,18 +193,25 @@ module MethodCache
150
193
  end
151
194
 
152
195
  def write_to_cache(key, value)
196
+ unless opts[:counter]
197
+ value = value.nil? ? NULL : value
198
+ end
153
199
  if cache.kind_of?(Hash)
154
200
  raise 'expiry not permitted when cache is a Hash' if opts[:expiry]
155
201
  raise 'counter cache not permitted when cache is a Hash' if opts[:counter]
156
202
  cache[key] = value
157
203
  elsif opts[:counter]
158
- cache.write(key, value.to_s, :expiry => expiry(value))
204
+ cache.write(key, value.to_s, expiry(value))
159
205
  else
160
- value = value.nil? ? NULL : value
161
- cache.set(key, value, :expiry => expiry(value))
206
+ cache.set(key, value, expiry(value))
162
207
  end
163
208
  end
164
209
 
210
+ def read_from_cache(key)
211
+ return if MethodCache.disabled?
212
+ opts[:counter] ? cache.count(key) : cache[key]
213
+ end
214
+
165
215
  def increment(amount)
166
216
  raise "cannot increment non-counter method" unless opts[:counter]
167
217
  cache.incr(key, amount)
@@ -190,8 +240,12 @@ module MethodCache
190
240
  when defined?(ActiveRecord::Base) && ActiveRecord::Base
191
241
  "#{class_key(arg.class)}-#{arg.id}"
192
242
  else
193
- hash = local? ? arg.hash : Marshal.dump(arg).hash
194
- "#{class_key(arg.class)}-#{hash}"
243
+ if arg.respond_to?(:method_cache_key)
244
+ arg.method_cache_key
245
+ else
246
+ hash = local? ? arg.hash : Marshal.dump(arg).hash
247
+ "#{class_key(arg.class)}-#{hash}"
248
+ end
195
249
  end
196
250
  end
197
251
 
data/lib/method_cache.rb CHANGED
@@ -1,6 +1,5 @@
1
- require 'memcache'
2
-
3
1
  $:.unshift(File.dirname(__FILE__))
2
+ require 'method_cache/local_cache'
4
3
  require 'method_cache/proxy'
5
4
 
6
5
  module MethodCache
@@ -12,7 +11,7 @@ module MethodCache
12
11
  return if instance_methods.include?(proxy.method_name_without_caching)
13
12
 
14
13
  if cached_instance_methods.empty?
15
- include(InvalidationMethods)
14
+ include(HelperMethods)
16
15
  extend(MethodAdded)
17
16
  end
18
17
 
@@ -43,7 +42,7 @@ module MethodCache
43
42
  return if methods.include?(proxy.method_name_without_caching)
44
43
 
45
44
  if cached_class_methods.empty?
46
- extend(InvalidationMethods)
45
+ extend(HelperMethods)
47
46
  extend(SingletonMethodAdded)
48
47
  end
49
48
 
@@ -72,7 +71,7 @@ module MethodCache
72
71
  end
73
72
 
74
73
  def self.default_cache
75
- @default_cache ||= {}
74
+ @default_cache ||= LocalCache.new
76
75
  end
77
76
 
78
77
  def cached_instance_methods(method_name = nil)
@@ -111,7 +110,7 @@ module MethodCache
111
110
  end
112
111
  end
113
112
 
114
- def self.disable(&block)
113
+ def self.disable(value = true, &block)
115
114
  @disabled, old = true, @disabled
116
115
  yield
117
116
  ensure
@@ -122,7 +121,7 @@ module MethodCache
122
121
  @disabled
123
122
  end
124
123
 
125
- module InvalidationMethods
124
+ module HelperMethods
126
125
  def invalidate_cached_method(method_name, *args, &block)
127
126
  cached_method(method_name, args).invalidate(&block)
128
127
  end
@@ -135,6 +134,14 @@ module MethodCache
135
134
  cached_method(method_name, args).update(&block)
136
135
  end
137
136
 
137
+ def method_cached_at(method_name, *args)
138
+ cached_method(method_name, args).cached_at
139
+ end
140
+
141
+ def method_expires_at(method_name, *args)
142
+ cached_method(method_name, args).expires_at
143
+ end
144
+
138
145
  def without_method_cache(&block)
139
146
  MethodCache.disable(&block)
140
147
  end
data/method_cache.gemspec CHANGED
@@ -1,47 +1,26 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
- # -*- encoding: utf-8 -*-
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
3
 
6
- Gem::Specification.new do |s|
7
- s.name = %q{method_cache}
8
- s.version = "0.6.4"
4
+ Gem::Specification.new do |gem|
5
+ gem.name = "method_cache"
6
+ gem.version = IO.read('VERSION')
7
+ gem.authors = ["Justin Balthrop"]
8
+ gem.email = ["git@justinbalthrop.com"]
9
+ gem.description = %q{Simple memcache-based memoization library for Ruby}
10
+ gem.summary = gem.description
11
+ gem.homepage = "https://github.com/ninjudd/method_cache"
9
12
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Justin Balthrop"]
12
- s.date = %q{2011-08-23}
13
- s.description = %q{Simple memcache-based memoization library for Ruby}
14
- s.email = %q{code@justinbalthrop.com}
15
- s.extra_rdoc_files = [
16
- "LICENSE",
17
- "README.rdoc"
18
- ]
19
- s.files = [
20
- "LICENSE",
21
- "README.rdoc",
22
- "Rakefile",
23
- "VERSION.yml",
24
- "lib/method_cache.rb",
25
- "lib/method_cache/proxy.rb",
26
- "method_cache.gemspec",
27
- "test/method_cache_test.rb",
28
- "test/test_helper.rb"
29
- ]
30
- s.homepage = %q{http://github.com/ninjudd/method_cache}
31
- s.require_paths = ["lib"]
32
- s.rubygems_version = %q{1.5.2}
33
- s.summary = %q{Simple memcache-based memoization library for Ruby}
13
+ gem.add_development_dependency 'shoulda'
14
+ gem.add_development_dependency 'mocha'
15
+ gem.add_development_dependency 'rake'
16
+ gem.add_development_dependency 'dalli'
17
+ gem.add_development_dependency 'activesupport', '~> 2.3.9'
34
18
 
35
- if s.respond_to? :specification_version then
36
- s.specification_version = 3
37
19
 
38
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
39
- s.add_runtime_dependency(%q<memcache>, [">= 1.0.0"])
40
- else
41
- s.add_dependency(%q<memcache>, [">= 1.0.0"])
42
- end
43
- else
44
- s.add_dependency(%q<memcache>, [">= 1.0.0"])
45
- end
46
- end
20
+ gem.add_dependency 'memcache', '>= 1.0.0'
47
21
 
22
+ gem.files = `git ls-files`.split($/)
23
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
24
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
25
+ gem.require_paths = ["lib"]
26
+ end
@@ -0,0 +1,25 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+ require 'dalli'
3
+
4
+ PORT = 19112
5
+ $client = Dalli::Client.new("localhost:#{PORT}")
6
+
7
+ class FooBar
8
+ extend MethodCache
9
+
10
+ cache_method :foo, :cache => $client
11
+ def foo
12
+ 'bar'
13
+ end
14
+ end
15
+
16
+ class MethodCacheRemoteTest < Test::Unit::TestCase
17
+
18
+ should 'work with dalli client' do
19
+ start_memcache(PORT)
20
+ $client.flush
21
+
22
+ f = FooBar.new
23
+ assert_equal 'bar', f.foo
24
+ end
25
+ end
@@ -1,4 +1,7 @@
1
1
  require File.dirname(__FILE__) + '/test_helper'
2
+ require 'memcache'
3
+
4
+ TEST_EXPIRY = 1
2
5
 
3
6
  class Foo
4
7
  extend MethodCache
@@ -26,11 +29,39 @@ class Foo
26
29
  @i ||= 0
27
30
  @i += i
28
31
  end
29
-
32
+
30
33
  cache_class_method :zap, :counter => true
31
34
  def self.zap
32
35
  0
33
36
  end
37
+
38
+ attr_accessor :z
39
+ def zang
40
+ self.z ||= 1
41
+ self.z += 1
42
+ nil
43
+ end
44
+ cache_method :zang
45
+
46
+ cache_method :pow, :expiry => TEST_EXPIRY
47
+ def pow(ignored)
48
+ Time.now
49
+ end
50
+
51
+ attr_accessor :bam_updated_at
52
+
53
+ cache_method :bam, :load_validation => lambda {|val, meta|
54
+ if bam_updated_at
55
+ meta[:cached_at] > bam_updated_at
56
+ else
57
+ true
58
+ end
59
+ }
60
+
61
+ def bam
62
+ @i ||= 0
63
+ @i += 1
64
+ end
34
65
  end
35
66
 
36
67
  module Bar
@@ -62,13 +93,51 @@ class TestMethodCache < Test::Unit::TestCase
62
93
  assert_equal 1, f1
63
94
  assert_equal 3, f2
64
95
 
65
- assert f1 == a.foo(1)
66
- assert f1 != f2
67
- assert f2 == a.foo(2)
96
+ assert_equal f1, a.foo(1)
97
+ assert_not_equal f1, f2
98
+ assert_equal f2, a.foo(2)
68
99
 
69
100
  b = a.bar
70
- assert b == a.bar
71
- assert b == a.bar
101
+ assert_equal b, a.bar
102
+ assert_equal b, a.bar
103
+ end
104
+
105
+ should 'store cached_at when cached locally' do
106
+ a = Foo.new
107
+ a.foo(1)
108
+
109
+ assert a.method_cached_at(:foo, 1) <= Time.now
110
+ assert_nil a.method_cached_at(:foo, 2)
111
+ end
112
+
113
+ should 'expire and store expires_at when cached locally' do
114
+ a = Foo.new
115
+ t = a.pow(1)
116
+
117
+ assert a.method_expires_at(:pow, 1) >= Time.now
118
+ assert_nil a.method_expires_at(:pow, 2)
119
+
120
+ # expire and recalculate
121
+ sleep TEST_EXPIRY
122
+ assert_not_equal t, a.pow(1)
123
+ end
124
+
125
+ should 'pass cached_at to load_validation' do
126
+ a = Foo.new
127
+ i = a.bam
128
+
129
+ assert a.method_cached_at(:bam) <= Time.now
130
+
131
+ # should be cached
132
+ assert_equal i, a.bam
133
+
134
+ # should still be cached
135
+ a.bam_updated_at = Time.now - 100
136
+ assert_equal i, a.bam
137
+
138
+ # should now be invalidated
139
+ a.bam_updated_at = Time.now + 100
140
+ assert_not_equal i, a.bam
72
141
  end
73
142
 
74
143
  should 'disable method_cache' do
@@ -182,4 +251,11 @@ class TestMethodCache < Test::Unit::TestCase
182
251
  assert_equal "m|:baz|Foo-#{a_hash}|{:a=3,:b=[5,6],:c=Object-#{o_hash}}|[false,true,{:o=Object-#{o_hash}}]", key
183
252
  end
184
253
  end
254
+
255
+ should 'cache nil locally' do
256
+ a = Foo.new
257
+ a.zang
258
+ a.zang
259
+ assert_equal 2, a.z
260
+ end
185
261
  end
data/test/test_helper.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'test/unit'
3
3
  require 'shoulda'
4
- require 'mocha'
4
+ require 'mocha/setup'
5
5
  require 'pp'
6
6
 
7
7
  $LOAD_PATH.unshift File.dirname(__FILE__) + "/../lib"
@@ -10,4 +10,9 @@ $LOAD_PATH.unshift File.dirname(__FILE__) + "/../../cache_version/lib"
10
10
  require 'method_cache'
11
11
 
12
12
  class Test::Unit::TestCase
13
+ def start_memcache(port)
14
+ system("memcached -p #{port} -U 0 -d -P /tmp/memcached_#{port}.pid")
15
+ sleep 1
16
+ File.read("/tmp/memcached_#{port}.pid")
17
+ end
13
18
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: method_cache
3
3
  version: !ruby/object:Gem::Version
4
- hash: 15
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
+ - 1
7
8
  - 0
8
- - 6
9
- - 4
10
- version: 0.6.4
9
+ - 0
10
+ version: 1.0.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Justin Balthrop
@@ -15,13 +15,85 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-08-23 00:00:00 -07:00
18
+ date: 2013-07-15 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- name: memcache
22
+ name: shoulda
23
23
  prerelease: false
24
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :development
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: mocha
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :development
48
+ version_requirements: *id002
49
+ - !ruby/object:Gem::Dependency
50
+ name: rake
51
+ prerelease: false
52
+ requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ hash: 3
58
+ segments:
59
+ - 0
60
+ version: "0"
61
+ type: :development
62
+ version_requirements: *id003
63
+ - !ruby/object:Gem::Dependency
64
+ name: dalli
65
+ prerelease: false
66
+ requirement: &id004 !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ hash: 3
72
+ segments:
73
+ - 0
74
+ version: "0"
75
+ type: :development
76
+ version_requirements: *id004
77
+ - !ruby/object:Gem::Dependency
78
+ name: activesupport
79
+ prerelease: false
80
+ requirement: &id005 !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ hash: 17
86
+ segments:
87
+ - 2
88
+ - 3
89
+ - 9
90
+ version: 2.3.9
91
+ type: :development
92
+ version_requirements: *id005
93
+ - !ruby/object:Gem::Dependency
94
+ name: memcache
95
+ prerelease: false
96
+ requirement: &id006 !ruby/object:Gem::Requirement
25
97
  none: false
26
98
  requirements:
27
99
  - - ">="
@@ -33,28 +105,34 @@ dependencies:
33
105
  - 0
34
106
  version: 1.0.0
35
107
  type: :runtime
36
- version_requirements: *id001
108
+ version_requirements: *id006
37
109
  description: Simple memcache-based memoization library for Ruby
38
- email: code@justinbalthrop.com
110
+ email:
111
+ - git@justinbalthrop.com
39
112
  executables: []
40
113
 
41
114
  extensions: []
42
115
 
43
- extra_rdoc_files:
44
- - LICENSE
45
- - README.rdoc
116
+ extra_rdoc_files: []
117
+
46
118
  files:
119
+ - .gitignore
120
+ - .rbenv-gemsets
121
+ - .rbenv-version
122
+ - Gemfile
47
123
  - LICENSE
48
124
  - README.rdoc
49
125
  - Rakefile
50
- - VERSION.yml
126
+ - VERSION
51
127
  - lib/method_cache.rb
128
+ - lib/method_cache/local_cache.rb
52
129
  - lib/method_cache/proxy.rb
53
130
  - method_cache.gemspec
131
+ - test/method_cache_remote_test.rb
54
132
  - test/method_cache_test.rb
55
133
  - test/test_helper.rb
56
134
  has_rdoc: true
57
- homepage: http://github.com/ninjudd/method_cache
135
+ homepage: https://github.com/ninjudd/method_cache
58
136
  licenses: []
59
137
 
60
138
  post_install_message:
@@ -87,5 +165,7 @@ rubygems_version: 1.5.2
87
165
  signing_key:
88
166
  specification_version: 3
89
167
  summary: Simple memcache-based memoization library for Ruby
90
- test_files: []
91
-
168
+ test_files:
169
+ - test/method_cache_remote_test.rb
170
+ - test/method_cache_test.rb
171
+ - test/test_helper.rb
data/VERSION.yml DELETED
@@ -1,5 +0,0 @@
1
- ---
2
- :build:
3
- :minor: 6
4
- :patch: 4
5
- :major: 0