padrino-cache 0.11.2 → 0.11.3
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/padrino-cache/helpers/fragment.rb +1 -1
- data/lib/padrino-cache/helpers/page.rb +28 -9
- data/lib/padrino-cache/store/base.rb +16 -0
- data/lib/padrino-cache/store/file.rb +3 -10
- data/lib/padrino-cache/store/memcache.rb +2 -7
- data/lib/padrino-cache/store/memory.rb +4 -12
- data/lib/padrino-cache/store/mongo.rb +9 -9
- data/lib/padrino-cache/store/redis.rb +3 -4
- data/test/helper.rb +20 -0
- data/test/stores/shared.rb +58 -0
- data/test/stores/test_dalli.rb +28 -0
- data/test/stores/test_file.rb +18 -0
- data/test/stores/test_memcache.rb +22 -0
- data/test/stores/test_memory.rb +19 -0
- data/test/stores/test_mongo.rb +32 -0
- data/test/stores/test_redis.rb +30 -0
- data/test/test_padrino_cache.rb +36 -0
- metadata +20 -13
- data/test/shared.rb +0 -37
- data/test/test_stores.rb +0 -136
|
@@ -53,7 +53,7 @@ module Padrino
|
|
|
53
53
|
began_at = Time.now
|
|
54
54
|
if value = settings.cache.get(key.to_s)
|
|
55
55
|
logger.debug "GET Fragment", began_at, key.to_s if defined?(logger)
|
|
56
|
-
concat_content(value)
|
|
56
|
+
concat_content(value.html_safe)
|
|
57
57
|
else
|
|
58
58
|
value = capture_html(&block)
|
|
59
59
|
settings.cache.set(key.to_s, value, opts)
|
|
@@ -70,6 +70,8 @@ module Padrino
|
|
|
70
70
|
#
|
|
71
71
|
# @param [Symbol] name
|
|
72
72
|
# cache key
|
|
73
|
+
# @param [Proc] block
|
|
74
|
+
# block to be evaluated to cache key
|
|
73
75
|
#
|
|
74
76
|
# @example
|
|
75
77
|
# controller '/blog', :cache => true do
|
|
@@ -80,9 +82,17 @@ module Padrino
|
|
|
80
82
|
# end
|
|
81
83
|
# end
|
|
82
84
|
#
|
|
85
|
+
# @example
|
|
86
|
+
# get '/foo', :cache => true do
|
|
87
|
+
# cache_key { param[:id] }
|
|
88
|
+
# "my id is #{param[:id}"
|
|
89
|
+
# end
|
|
90
|
+
# end
|
|
91
|
+
#
|
|
83
92
|
# @api public
|
|
84
|
-
def cache_key(name)
|
|
85
|
-
|
|
93
|
+
def cache_key(name = nil, &block)
|
|
94
|
+
raise "Can not provide both cache_key and a block" if name && block
|
|
95
|
+
@route.cache_key = block_given? ? block : name
|
|
86
96
|
end
|
|
87
97
|
|
|
88
98
|
# @private
|
|
@@ -90,8 +100,9 @@ module Padrino
|
|
|
90
100
|
if route.cache and %w(GET HEAD).include?(verb)
|
|
91
101
|
route.before_filters do
|
|
92
102
|
if settings.caching?
|
|
93
|
-
began_at
|
|
94
|
-
|
|
103
|
+
began_at = Time.now
|
|
104
|
+
|
|
105
|
+
value = settings.cache.get(resolve_cache_key || env['PATH_INFO'])
|
|
95
106
|
logger.debug "GET Cache", began_at, @route.cache_key || env['PATH_INFO'] if defined?(logger) && value
|
|
96
107
|
|
|
97
108
|
if value
|
|
@@ -103,15 +114,14 @@ module Padrino
|
|
|
103
114
|
|
|
104
115
|
route.after_filters do
|
|
105
116
|
if settings.caching? && @_response_buffer.kind_of?(String)
|
|
106
|
-
began_at
|
|
107
|
-
|
|
108
|
-
content = @_response_buffer
|
|
117
|
+
began_at = Time.now
|
|
118
|
+
content = @_response_buffer
|
|
109
119
|
|
|
110
120
|
if @_last_expires_in
|
|
111
|
-
settings.cache.set(
|
|
121
|
+
settings.cache.set(resolve_cache_key || env['PATH_INFO'], content, :expires_in => @_last_expires_in)
|
|
112
122
|
@_last_expires_in = nil
|
|
113
123
|
else
|
|
114
|
-
settings.cache.set(
|
|
124
|
+
settings.cache.set(resolve_cache_key || env['PATH_INFO'], content)
|
|
115
125
|
end
|
|
116
126
|
|
|
117
127
|
logger.debug "SET Cache", began_at, @route.cache_key || env['PATH_INFO'] if defined?(logger)
|
|
@@ -119,6 +129,15 @@ module Padrino
|
|
|
119
129
|
end
|
|
120
130
|
end
|
|
121
131
|
end
|
|
132
|
+
|
|
133
|
+
private
|
|
134
|
+
##
|
|
135
|
+
# Resolve the cache_key when it's a block in the correct context
|
|
136
|
+
#@api private
|
|
137
|
+
def resolve_cache_key
|
|
138
|
+
@route.cache_key.is_a?(Proc) ? instance_eval(&@route.cache_key) : @route.cache_key
|
|
139
|
+
end
|
|
140
|
+
|
|
122
141
|
end # Page
|
|
123
142
|
end # Helpers
|
|
124
143
|
end # Cache
|
|
@@ -53,9 +53,25 @@ module Padrino
|
|
|
53
53
|
|
|
54
54
|
# @private
|
|
55
55
|
def initialize(options={})
|
|
56
|
+
@never = -1
|
|
56
57
|
self.parser = options[:parser] || :plain
|
|
57
58
|
end
|
|
58
59
|
|
|
60
|
+
private
|
|
61
|
+
|
|
62
|
+
def get_expiry( opts )
|
|
63
|
+
if opts && opts[:expires_in] && opts[:expires_in] != -1
|
|
64
|
+
expires_in = opts[:expires_in].to_i
|
|
65
|
+
expires_in = EXPIRES_EDGE if expires_in > EXPIRES_EDGE
|
|
66
|
+
Time.now.to_i + expires_in
|
|
67
|
+
else
|
|
68
|
+
@never
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def now_before?( expiry )
|
|
73
|
+
expiry.to_i == @never || expiry.to_i > Time.now.to_i
|
|
74
|
+
end
|
|
59
75
|
end # Base
|
|
60
76
|
end # Store
|
|
61
77
|
end # Cache
|
|
@@ -40,9 +40,8 @@ module Padrino
|
|
|
40
40
|
if ::File.exist?(path_for_key(key))
|
|
41
41
|
read_method = ::File.respond_to?(:binread) ? :binread : :read
|
|
42
42
|
contents = ::File.send(read_method, path_for_key(key))
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if expires_in == -1 or Time.new.to_i < expires_in
|
|
43
|
+
expiry, body = contents.split("\n", 2)
|
|
44
|
+
if now_before? expiry
|
|
46
45
|
parser.decode(body) if body
|
|
47
46
|
else # expire the key
|
|
48
47
|
delete(key)
|
|
@@ -69,14 +68,8 @@ module Padrino
|
|
|
69
68
|
# @api public
|
|
70
69
|
def set(key, value, opts = nil)
|
|
71
70
|
init
|
|
72
|
-
if opts && opts[:expires_in]
|
|
73
|
-
expires_in = opts[:expires_in].to_i
|
|
74
|
-
expires_in = Time.new.to_i + expires_in if expires_in < EXPIRES_EDGE
|
|
75
|
-
else
|
|
76
|
-
expires_in = -1
|
|
77
|
-
end
|
|
78
71
|
value = parser.encode(value) if value
|
|
79
|
-
::File.open(path_for_key(key), 'wb') { |f| f <<
|
|
72
|
+
::File.open(path_for_key(key), 'wb') { |f| f << get_expiry(opts).to_s << "\n" << value } if value
|
|
80
73
|
end
|
|
81
74
|
|
|
82
75
|
##
|
|
@@ -22,6 +22,7 @@ module Padrino
|
|
|
22
22
|
def initialize(client, options={})
|
|
23
23
|
@backend = client
|
|
24
24
|
super(options)
|
|
25
|
+
@never = 0 # never TTL in Memcache is 0
|
|
25
26
|
end
|
|
26
27
|
|
|
27
28
|
##
|
|
@@ -56,13 +57,7 @@ module Padrino
|
|
|
56
57
|
#
|
|
57
58
|
# @api public
|
|
58
59
|
def set(key, value, opts = nil)
|
|
59
|
-
|
|
60
|
-
expires_in = opts[:expires_in].to_i
|
|
61
|
-
expires_in = (@backend.class.name == "MemCache" ? expires_in : Time.new.to_i + expires_in) if expires_in < EXPIRES_EDGE
|
|
62
|
-
@backend.set(key, value, expires_in)
|
|
63
|
-
else
|
|
64
|
-
@backend.set(key, value)
|
|
65
|
-
end
|
|
60
|
+
@backend.set(key, value, get_expiry(opts))
|
|
66
61
|
end
|
|
67
62
|
|
|
68
63
|
##
|
|
@@ -35,9 +35,8 @@ module Padrino
|
|
|
35
35
|
# @api public
|
|
36
36
|
def get(key)
|
|
37
37
|
if @index.key?(key) and value = @index[key]
|
|
38
|
-
|
|
39
|
-
if
|
|
40
|
-
set(key, body, :expires_in => expires_in)
|
|
38
|
+
expiry, body = value
|
|
39
|
+
if now_before? expiry
|
|
41
40
|
body
|
|
42
41
|
else
|
|
43
42
|
delete(key)
|
|
@@ -63,16 +62,9 @@ module Padrino
|
|
|
63
62
|
#
|
|
64
63
|
# @api public
|
|
65
64
|
def set(key, value, opts = nil)
|
|
66
|
-
delete(key)
|
|
67
|
-
if opts && opts[:expires_in]
|
|
68
|
-
expires_in = opts[:expires_in].to_i
|
|
69
|
-
expires_in = Time.new.to_i + expires_in if expires_in < EXPIRES_EDGE
|
|
70
|
-
else
|
|
71
|
-
expires_in = -1
|
|
72
|
-
end
|
|
65
|
+
delete(key)
|
|
73
66
|
@entries.push(key)
|
|
74
|
-
@index[key] = [
|
|
75
|
-
|
|
67
|
+
@index[key] = [get_expiry(opts), value]
|
|
76
68
|
while @entries.size > @size
|
|
77
69
|
delete(@entries.shift)
|
|
78
70
|
end
|
|
@@ -48,9 +48,15 @@ module Padrino
|
|
|
48
48
|
# MyApp.cache.get('records')
|
|
49
49
|
#
|
|
50
50
|
def get(key)
|
|
51
|
-
doc = @backend.find_one(:_id => key, :
|
|
51
|
+
doc = @backend.find_one( :_id => key, '$or' => [ { :expires_at => { '$gt' => Time.now.to_i } }, { :expires_at => -1 } ] )
|
|
52
52
|
return nil if doc.nil?
|
|
53
|
-
|
|
53
|
+
expiry = doc['expires_at']
|
|
54
|
+
if now_before? expiry
|
|
55
|
+
parser.decode(doc['value'].to_s)
|
|
56
|
+
else
|
|
57
|
+
delete(key)
|
|
58
|
+
nil
|
|
59
|
+
end
|
|
54
60
|
end
|
|
55
61
|
|
|
56
62
|
##
|
|
@@ -70,15 +76,9 @@ module Padrino
|
|
|
70
76
|
def set(key, value, opts = nil)
|
|
71
77
|
key = key.to_s
|
|
72
78
|
value = BSON::Binary.new(parser.encode(value)) if value
|
|
73
|
-
if opts && opts[:expires_in]
|
|
74
|
-
expires_in = opts[:expires_in].to_i
|
|
75
|
-
expires_in = Time.now.utc + expires_in if expires_in < EXPIRES_EDGE
|
|
76
|
-
else
|
|
77
|
-
expires_in = Time.now.utc + EXPIRES_EDGE
|
|
78
|
-
end
|
|
79
79
|
@backend.update(
|
|
80
80
|
{:_id => key},
|
|
81
|
-
{:_id => key, :value => value, :
|
|
81
|
+
{:_id => key, :value => value, :expires_at => get_expiry(opts) },
|
|
82
82
|
{:upsert => true}
|
|
83
83
|
)
|
|
84
84
|
end
|
|
@@ -57,10 +57,9 @@ module Padrino
|
|
|
57
57
|
# @api public
|
|
58
58
|
def set(key, value, opts = nil)
|
|
59
59
|
value = parser.encode(value)
|
|
60
|
-
if opts && opts[:expires_in]
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
@backend.setex(key, expires_in, value)
|
|
60
|
+
if opts && opts[:expires_in] && opts[:expires_in] >= 0
|
|
61
|
+
@backend.set(key, value)
|
|
62
|
+
@backend.expireat(key, get_expiry(opts))
|
|
64
63
|
else
|
|
65
64
|
@backend.set(key, value)
|
|
66
65
|
end
|
data/test/helper.rb
CHANGED
|
@@ -22,3 +22,23 @@ class MiniTest::Spec
|
|
|
22
22
|
|
|
23
23
|
end
|
|
24
24
|
end
|
|
25
|
+
|
|
26
|
+
MiniTest::Spec.class_eval do
|
|
27
|
+
def self.shared_examples
|
|
28
|
+
@shared_examples ||= {}
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
module MiniTest::Spec::SharedExamples
|
|
33
|
+
def shared_examples_for(desc, &block)
|
|
34
|
+
MiniTest::Spec.shared_examples[desc] = block
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def it_behaves_like(desc)
|
|
38
|
+
self.instance_eval do
|
|
39
|
+
MiniTest::Spec.shared_examples[desc].call
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
Object.class_eval { include(MiniTest::Spec::SharedExamples) }
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
require 'minitest/autorun'
|
|
2
|
+
require 'minitest/spec'
|
|
3
|
+
|
|
4
|
+
class BaseTest < MiniTest::Spec
|
|
5
|
+
def load_store; true; end
|
|
6
|
+
|
|
7
|
+
def should_skip?
|
|
8
|
+
@skip ||= load_store
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
shared_examples_for :cacheable do
|
|
13
|
+
describe 'Cache' do
|
|
14
|
+
|
|
15
|
+
class Foo
|
|
16
|
+
def bar; "bar"; end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "return nil trying to get a value that doesn't exist" do
|
|
20
|
+
Padrino.cache.flush
|
|
21
|
+
assert_equal nil, Padrino.cache.get(@test_key)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it 'set and get an object w/marshal' do
|
|
25
|
+
Padrino.cache.parser = :marshal
|
|
26
|
+
Padrino.cache.set(@test_key, Foo.new)
|
|
27
|
+
assert_equal "bar", Padrino.cache.get(@test_key).bar
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it 'set and get a nil value' do
|
|
31
|
+
Padrino.cache.set(@test_key, nil)
|
|
32
|
+
assert_equal '', Padrino.cache.get(@test_key).to_s
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it 'set and get a raw value' do
|
|
36
|
+
Padrino.cache.set(@test_key, 'foo')
|
|
37
|
+
assert_equal 'foo', Padrino.cache.get(@test_key)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "set a value that expires" do
|
|
41
|
+
init_time = ( Time.now - 20 )
|
|
42
|
+
Time.stub(:now, init_time) { Padrino.cache.set(@test_key, 'test', :expires_in => 1) }
|
|
43
|
+
Time.stub(:now, init_time + 20) { assert_equal nil, Padrino.cache.get(@test_key) }
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "be able to cache forever" do
|
|
47
|
+
Padrino.cache.set('forever', 'cached', :expires_in => -1)
|
|
48
|
+
2.times { |i| assert_equal 'cached', Padrino.cache.get('forever') }
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it 'delete a value' do
|
|
52
|
+
Padrino.cache.set(@test_key, 'test')
|
|
53
|
+
assert_equal 'test', Padrino.cache.get(@test_key)
|
|
54
|
+
Padrino.cache.delete(@test_key)
|
|
55
|
+
assert_equal nil, Padrino.cache.get(@test_key)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require File.expand_path('../../helper', __FILE__)
|
|
2
|
+
require File.expand_path('../shared', __FILE__)
|
|
3
|
+
|
|
4
|
+
class DalliTest < BaseTest
|
|
5
|
+
def load_store
|
|
6
|
+
require 'dalli'
|
|
7
|
+
connection = ::Dalli::Client.new('127.0.0.1:11211', :exception_retry_limit => 1)
|
|
8
|
+
connection.set('ping','alive')
|
|
9
|
+
Padrino::Cache::Store::Memcache.new(connection)
|
|
10
|
+
false
|
|
11
|
+
rescue LoadError
|
|
12
|
+
true
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
before do
|
|
16
|
+
skip if should_skip?
|
|
17
|
+
connection = ::Dalli::Client.new('127.0.0.1:11211', :exception_retry_limit => 1)
|
|
18
|
+
Padrino.cache = Padrino::Cache::Store::Memcache.new(connection)
|
|
19
|
+
Padrino.cache.flush
|
|
20
|
+
@test_key = "val_#{Time.now.to_i}"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
after do
|
|
24
|
+
Padrino.cache.flush
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it_behaves_like :cacheable
|
|
28
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require File.expand_path('../../helper', __FILE__)
|
|
2
|
+
require File.expand_path('../shared', __FILE__)
|
|
3
|
+
|
|
4
|
+
class FileStoreTest < BaseTest
|
|
5
|
+
before do
|
|
6
|
+
@apptmp = "#{Dir.tmpdir}/padrino-tests/#{UUID.new.generate}"
|
|
7
|
+
FileUtils.mkdir_p(@apptmp)
|
|
8
|
+
Padrino.cache = Padrino::Cache::Store::File.new(@apptmp)
|
|
9
|
+
@test_key = "val_#{Time.now.to_i}"
|
|
10
|
+
Padrino.cache.flush
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
after do
|
|
14
|
+
Padrino.cache.flush
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it_behaves_like :cacheable
|
|
18
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
require File.expand_path('../../helper', __FILE__)
|
|
2
|
+
require File.expand_path('../shared', __FILE__)
|
|
3
|
+
|
|
4
|
+
class MemcachedTest < BaseTest
|
|
5
|
+
def load_store
|
|
6
|
+
require 'memcached'
|
|
7
|
+
connection = ::Memcached.new('127.0.0.1:11211', :exception_retry_limit => 1)
|
|
8
|
+
Padrino::Cache::Store::Memcache.new(connection).set('ping','alive')
|
|
9
|
+
@test_key = "val_#{Time.now.to_i}"
|
|
10
|
+
false
|
|
11
|
+
rescue LoadError
|
|
12
|
+
true
|
|
13
|
+
rescue Memcached::SystemError
|
|
14
|
+
true
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
before do
|
|
18
|
+
Padrino.cache.flush
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it_behaves_like :cacheable
|
|
22
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require File.expand_path('../../helper', __FILE__)
|
|
2
|
+
require File.expand_path('../shared', __FILE__)
|
|
3
|
+
|
|
4
|
+
class InMemoryStoreTest < BaseTest
|
|
5
|
+
before :each do
|
|
6
|
+
Padrino.cache = Padrino::Cache::Store::Memory.new(50)
|
|
7
|
+
@test_key = "val_#{Time.now.to_i}"
|
|
8
|
+
Padrino.cache.flush
|
|
9
|
+
end
|
|
10
|
+
after(:each) { Padrino.cache.flush }
|
|
11
|
+
|
|
12
|
+
it_behaves_like :cacheable
|
|
13
|
+
|
|
14
|
+
it "only store 50 entries" do
|
|
15
|
+
51.times { |i| Padrino.cache.set(i.to_s, i.to_s) }
|
|
16
|
+
assert_equal nil, Padrino.cache.get('0')
|
|
17
|
+
assert_equal '1', Padrino.cache.get('1')
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require File.expand_path('../../helper', __FILE__)
|
|
2
|
+
require File.expand_path('../shared', __FILE__)
|
|
3
|
+
|
|
4
|
+
class MongoTest < BaseTest
|
|
5
|
+
def load_store
|
|
6
|
+
require 'mongo'
|
|
7
|
+
if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
|
|
8
|
+
fail NotImplementedError, "Skipping mongo test for rbx"
|
|
9
|
+
end
|
|
10
|
+
connection = ::Mongo::Connection.new('127.0.0.1', 27017).db('padrino-cache_test')
|
|
11
|
+
Padrino::Cache::Store::Mongo.new(connection)
|
|
12
|
+
false
|
|
13
|
+
rescue LoadError, Mongo::ConnectionFailure, NotImplementedError => e
|
|
14
|
+
true
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
before do
|
|
18
|
+
skip if should_skip?
|
|
19
|
+
connection = ::Mongo::Connection.new('127.0.0.1', 27017).db('padrino-cache_test')
|
|
20
|
+
config = {:size => 10, :collection => 'cache'}
|
|
21
|
+
Padrino.cache = Padrino::Cache::Store::Mongo.new(connection, config)
|
|
22
|
+
Padrino.cache.flush
|
|
23
|
+
@test_key = "val_#{Time.now.to_i}"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
after do
|
|
27
|
+
Padrino.cache.flush
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it_behaves_like :cacheable
|
|
31
|
+
|
|
32
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require File.expand_path('../../helper', __FILE__)
|
|
2
|
+
require File.expand_path('../shared', __FILE__)
|
|
3
|
+
|
|
4
|
+
class RedisTest < BaseTest
|
|
5
|
+
|
|
6
|
+
def load_store
|
|
7
|
+
require 'redis'
|
|
8
|
+
store_config = {:host => '127.0.0.1',
|
|
9
|
+
:port => 6379,
|
|
10
|
+
:db => 0}
|
|
11
|
+
Padrino::Cache::Store::Redis.new(::Redis.new(store_config).set('ping','alive'))
|
|
12
|
+
false
|
|
13
|
+
rescue LoadError, Redis::CannotConnectError
|
|
14
|
+
true
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
before do
|
|
18
|
+
skip if should_skip?
|
|
19
|
+
require 'redis' unless defined?(Redis)
|
|
20
|
+
Padrino.cache = Padrino::Cache::Store::Redis.new(::Redis.new(:host => '127.0.0.1', :port => 6379, :db => 0))
|
|
21
|
+
Padrino.cache.flush
|
|
22
|
+
@test_key = "val_#{Time.now.to_i}"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
after do
|
|
26
|
+
Padrino.cache.flush
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it_behaves_like :cacheable
|
|
30
|
+
end
|
data/test/test_padrino_cache.rb
CHANGED
|
@@ -270,4 +270,40 @@ describe "PadrinoCache" do
|
|
|
270
270
|
assert_equal 'foo?yes', body
|
|
271
271
|
assert_equal 2, call_count
|
|
272
272
|
end
|
|
273
|
+
|
|
274
|
+
should 'resolve block cache keys' do
|
|
275
|
+
call_count = 0
|
|
276
|
+
mock_app do
|
|
277
|
+
register Padrino::Cache
|
|
278
|
+
enable :caching
|
|
279
|
+
|
|
280
|
+
get '/foo', :cache => true do
|
|
281
|
+
cache_key { "key #{params[:id]}" }
|
|
282
|
+
call_count += 1
|
|
283
|
+
params[:id]
|
|
284
|
+
end
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
get '/foo?id=1'
|
|
288
|
+
get '/foo?id=2'
|
|
289
|
+
get '/foo?id=2'
|
|
290
|
+
get '/foo?id=1&something_else=42'
|
|
291
|
+
get '/foo?id=3&something_else=42'
|
|
292
|
+
|
|
293
|
+
assert_equal 3, call_count
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
should 'raise an error if providing both a cache_key and block' do
|
|
297
|
+
mock_app do
|
|
298
|
+
register Padrino::Cache
|
|
299
|
+
enable :caching
|
|
300
|
+
|
|
301
|
+
get '/foo', :cache => true do
|
|
302
|
+
cache_key(:some_key) { "key #{params[:id]}" }
|
|
303
|
+
end
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
assert_raises(RuntimeError) { get '/foo' }
|
|
307
|
+
end
|
|
308
|
+
|
|
273
309
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: padrino-cache
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.11.
|
|
4
|
+
version: 0.11.3
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -12,7 +12,7 @@ authors:
|
|
|
12
12
|
autorequire:
|
|
13
13
|
bindir: bin
|
|
14
14
|
cert_chain: []
|
|
15
|
-
date: 2013-
|
|
15
|
+
date: 2013-07-29 00:00:00.000000000 Z
|
|
16
16
|
dependencies:
|
|
17
17
|
- !ruby/object:Gem::Dependency
|
|
18
18
|
name: padrino-core
|
|
@@ -21,7 +21,7 @@ dependencies:
|
|
|
21
21
|
requirements:
|
|
22
22
|
- - '='
|
|
23
23
|
- !ruby/object:Gem::Version
|
|
24
|
-
version: 0.11.
|
|
24
|
+
version: 0.11.3
|
|
25
25
|
type: :runtime
|
|
26
26
|
prerelease: false
|
|
27
27
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -29,7 +29,7 @@ dependencies:
|
|
|
29
29
|
requirements:
|
|
30
30
|
- - '='
|
|
31
31
|
- !ruby/object:Gem::Version
|
|
32
|
-
version: 0.11.
|
|
32
|
+
version: 0.11.3
|
|
33
33
|
- !ruby/object:Gem::Dependency
|
|
34
34
|
name: padrino-helpers
|
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -37,7 +37,7 @@ dependencies:
|
|
|
37
37
|
requirements:
|
|
38
38
|
- - '='
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: 0.11.
|
|
40
|
+
version: 0.11.3
|
|
41
41
|
type: :runtime
|
|
42
42
|
prerelease: false
|
|
43
43
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -45,7 +45,7 @@ dependencies:
|
|
|
45
45
|
requirements:
|
|
46
46
|
- - '='
|
|
47
47
|
- !ruby/object:Gem::Version
|
|
48
|
-
version: 0.11.
|
|
48
|
+
version: 0.11.3
|
|
49
49
|
description: Caching support for memcached, page and fragment
|
|
50
50
|
email: padrinorb@gmail.com
|
|
51
51
|
executables: []
|
|
@@ -73,9 +73,14 @@ files:
|
|
|
73
73
|
- lib/padrino-cache/store/redis.rb
|
|
74
74
|
- padrino-cache.gemspec
|
|
75
75
|
- test/helper.rb
|
|
76
|
-
- test/shared.rb
|
|
76
|
+
- test/stores/shared.rb
|
|
77
|
+
- test/stores/test_dalli.rb
|
|
78
|
+
- test/stores/test_file.rb
|
|
79
|
+
- test/stores/test_memcache.rb
|
|
80
|
+
- test/stores/test_memory.rb
|
|
81
|
+
- test/stores/test_mongo.rb
|
|
82
|
+
- test/stores/test_redis.rb
|
|
77
83
|
- test/test_padrino_cache.rb
|
|
78
|
-
- test/test_stores.rb
|
|
79
84
|
homepage: http://www.padrinorb.com
|
|
80
85
|
licenses: []
|
|
81
86
|
post_install_message:
|
|
@@ -89,9 +94,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
89
94
|
- - ! '>='
|
|
90
95
|
- !ruby/object:Gem::Version
|
|
91
96
|
version: '0'
|
|
92
|
-
segments:
|
|
93
|
-
- 0
|
|
94
|
-
hash: 503192052381123808
|
|
95
97
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
96
98
|
none: false
|
|
97
99
|
requirements:
|
|
@@ -106,7 +108,12 @@ specification_version: 3
|
|
|
106
108
|
summary: Page and fragment caching for Padrino
|
|
107
109
|
test_files:
|
|
108
110
|
- test/helper.rb
|
|
109
|
-
- test/shared.rb
|
|
111
|
+
- test/stores/shared.rb
|
|
112
|
+
- test/stores/test_dalli.rb
|
|
113
|
+
- test/stores/test_file.rb
|
|
114
|
+
- test/stores/test_memcache.rb
|
|
115
|
+
- test/stores/test_memory.rb
|
|
116
|
+
- test/stores/test_mongo.rb
|
|
117
|
+
- test/stores/test_redis.rb
|
|
110
118
|
- test/test_padrino_cache.rb
|
|
111
|
-
- test/test_stores.rb
|
|
112
119
|
has_rdoc:
|
data/test/shared.rb
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
class Foo
|
|
2
|
-
def bar; "bar"; end
|
|
3
|
-
end
|
|
4
|
-
|
|
5
|
-
should "return nil trying to get a value that doesn't exist" do
|
|
6
|
-
assert_equal nil, Padrino.cache.get(@test_key)
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
should 'set and get an object w/marshal' do
|
|
10
|
-
Padrino.cache.parser = :marshal
|
|
11
|
-
Padrino.cache.set(@test_key, Foo.new)
|
|
12
|
-
assert_equal "bar", Padrino.cache.get(@test_key).bar
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
should 'set and get a nil value' do
|
|
16
|
-
Padrino.cache.set(@test_key, nil)
|
|
17
|
-
assert_equal '', Padrino.cache.get(@test_key).to_s
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
should 'set and get a raw value' do
|
|
21
|
-
Padrino.cache.set(@test_key, 'foo')
|
|
22
|
-
assert_equal 'foo', Padrino.cache.get(@test_key)
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
should "set a value that expires" do
|
|
26
|
-
Padrino.cache.set(@test_key, 'test', :expires_in => 1)
|
|
27
|
-
# assert_equal 'test', Padrino.cache.get(@test_key) # Fails on race condition
|
|
28
|
-
sleep 2
|
|
29
|
-
assert_equal nil, Padrino.cache.get(@test_key)
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
should 'delete a value' do
|
|
33
|
-
Padrino.cache.set(@test_key, 'test')
|
|
34
|
-
assert_equal 'test', Padrino.cache.get(@test_key)
|
|
35
|
-
Padrino.cache.delete(@test_key)
|
|
36
|
-
assert_equal nil, Padrino.cache.get(@test_key)
|
|
37
|
-
end
|
data/test/test_stores.rb
DELETED
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
require File.expand_path('../helper', __FILE__)
|
|
2
|
-
|
|
3
|
-
Shared = File.read File.expand_path('../shared.rb', __FILE__)
|
|
4
|
-
|
|
5
|
-
begin
|
|
6
|
-
require 'memcached'
|
|
7
|
-
# we're just going to assume memcached is running on the default port
|
|
8
|
-
Padrino::Cache::Store::Memcache.new(::Memcached.new('127.0.0.1:11211', :exception_retry_limit => 1)).set('ping','alive')
|
|
9
|
-
rescue LoadError
|
|
10
|
-
warn "Skipping memcache with memcached library tests"
|
|
11
|
-
rescue Memcached::SystemError
|
|
12
|
-
warn "Skipping memcache with memcached server tests"
|
|
13
|
-
else
|
|
14
|
-
describe "MemcacheStore" do
|
|
15
|
-
def setup
|
|
16
|
-
Padrino.cache = Padrino::Cache::Store::Memcache.new(::Memcached.new('127.0.0.1:11211', :exception_retry_limit => 1))
|
|
17
|
-
Padrino.cache.flush
|
|
18
|
-
@test_key = "val_#{Time.now.to_i}"
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def teardown
|
|
22
|
-
Padrino.cache.flush
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
eval Shared
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
begin
|
|
30
|
-
require 'dalli'
|
|
31
|
-
# we're just going to assume memcached is running on the default port
|
|
32
|
-
Padrino::Cache::Store::Memcache.new(::Dalli::Client.new('127.0.0.1:11211', :exception_retry_limit => 1).set('ping','alive'))
|
|
33
|
-
|
|
34
|
-
describe "MemcacheWithDalliStore" do
|
|
35
|
-
def setup
|
|
36
|
-
Padrino.cache = Padrino::Cache::Store::Memcache.new(::Dalli::Client.new('127.0.0.1:11211', :exception_retry_limit => 1))
|
|
37
|
-
Padrino.cache.flush
|
|
38
|
-
@test_key = "val_#{Time.now.to_i}"
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def teardown
|
|
42
|
-
Padrino.cache.flush
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
eval Shared
|
|
46
|
-
end
|
|
47
|
-
rescue LoadError
|
|
48
|
-
warn "Skipping memcache with dalli library tests"
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
begin
|
|
52
|
-
require 'redis'
|
|
53
|
-
Padrino::Cache::Store::Redis.new(::Redis.new(:host => '127.0.0.1', :port => 6379, :db => 0).set('ping','alive'))
|
|
54
|
-
rescue LoadError
|
|
55
|
-
warn "Skipping redis with redis library tests"
|
|
56
|
-
rescue Redis::CannotConnectError
|
|
57
|
-
warn "Skipping redis with redis server tests"
|
|
58
|
-
else
|
|
59
|
-
describe "RedisStore" do
|
|
60
|
-
def setup
|
|
61
|
-
Padrino.cache = Padrino::Cache::Store::Redis.new(::Redis.new(:host => '127.0.0.1', :port => 6379, :db => 0))
|
|
62
|
-
Padrino.cache.flush
|
|
63
|
-
@test_key = "val_#{Time.now.to_i}"
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
def teardown
|
|
67
|
-
Padrino.cache.flush
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
eval <<-REDIS_TEST
|
|
71
|
-
should 'add a value to a list' do
|
|
72
|
-
Padrino.cache.lpush(@test_key, "test")
|
|
73
|
-
assert_equal "test", Padrino.cache.lpop(@test_key)
|
|
74
|
-
end
|
|
75
|
-
REDIS_TEST
|
|
76
|
-
|
|
77
|
-
eval Shared
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
begin
|
|
82
|
-
require 'mongo'
|
|
83
|
-
Padrino::Cache::Store::Mongo.new(::Mongo::Connection.new('127.0.0.1', 27017).db('padrino-cache_test'))
|
|
84
|
-
rescue LoadError
|
|
85
|
-
warn "Skipping Mongo tests with Mongo library tests"
|
|
86
|
-
rescue Mongo::ConnectionFailure
|
|
87
|
-
warn "Skipping Mongo with server tests"
|
|
88
|
-
else
|
|
89
|
-
describe "MongoStore" do
|
|
90
|
-
def setup
|
|
91
|
-
Padrino.cache = Padrino::Cache::Store::Mongo.new(::Mongo::Connection.new('127.0.0.1', 27017).db('padrino-cache_test'), {:size => 10, :collection => 'cache'})
|
|
92
|
-
Padrino.cache.flush
|
|
93
|
-
@test_key = "val_#{Time.now.to_i}"
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
def teardown
|
|
97
|
-
Padrino.cache.flush
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
eval Shared
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
describe "FileStore" do
|
|
105
|
-
def setup
|
|
106
|
-
@apptmp = "#{Dir.tmpdir}/padrino-tests/#{UUID.new.generate}"
|
|
107
|
-
FileUtils.mkdir_p(@apptmp)
|
|
108
|
-
Padrino.cache = Padrino::Cache::Store::File.new(@apptmp)
|
|
109
|
-
@test_key = "val_#{Time.now.to_i}"
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
def teardown
|
|
113
|
-
Padrino.cache.flush
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
eval Shared
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
describe "InMemoryStore" do
|
|
120
|
-
def setup
|
|
121
|
-
Padrino.cache = Padrino::Cache::Store::Memory.new(50)
|
|
122
|
-
@test_key = "val_#{Time.now.to_i}"
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
def teardown
|
|
126
|
-
Padrino.cache.flush
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
eval Shared
|
|
130
|
-
|
|
131
|
-
should "only store 50 entries" do
|
|
132
|
-
51.times { |i| Padrino.cache.set(i.to_s, i.to_s) }
|
|
133
|
-
assert_equal nil, Padrino.cache.get('0')
|
|
134
|
-
assert_equal '1', Padrino.cache.get('1')
|
|
135
|
-
end
|
|
136
|
-
end
|