padrino-cache 0.11.4 → 0.12.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.rdoc +39 -32
- data/lib/padrino-cache.rb +48 -29
- data/lib/padrino-cache/helpers/cache_store.rb +1 -0
- data/lib/padrino-cache/helpers/fragment.rb +6 -5
- data/lib/padrino-cache/helpers/page.rb +25 -14
- data/lib/padrino-cache/legacy_store.rb +68 -0
- data/padrino-cache.gemspec +2 -0
- data/test/helper.rb +0 -37
- data/test/test_legacy_store.rb +53 -0
- data/test/test_moneta_store.rb +53 -0
- data/test/test_padrino_cache.rb +37 -12
- metadata +29 -31
- data/lib/padrino-cache/parser.rb +0 -36
- data/lib/padrino-cache/store.rb +0 -18
- data/lib/padrino-cache/store/base.rb +0 -76
- data/lib/padrino-cache/store/file.rb +0 -112
- data/lib/padrino-cache/store/memcache.rb +0 -85
- data/lib/padrino-cache/store/memory.rb +0 -95
- data/lib/padrino-cache/store/mongo.rb +0 -127
- data/lib/padrino-cache/store/redis.rb +0 -105
- data/test/stores/shared.rb +0 -58
- data/test/stores/test_dalli.rb +0 -28
- data/test/stores/test_file.rb +0 -18
- data/test/stores/test_memcache.rb +0 -22
- data/test/stores/test_memory.rb +0 -19
- data/test/stores/test_mongo.rb +0 -32
- data/test/stores/test_redis.rb +0 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 638e5c5671b96bfdddd92ec93bf3883209c47461
|
4
|
+
data.tar.gz: 6d4bbaed06c182dcfc7357078e24db6264c2b001
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 149147b7332bc70ac260cb4c5e75691262f71f6526cbe3d98361d421fc01df118328f844281a67faea933eab099621f1e0d1b68a5f5367a5a3bcfa23c1d14d7e
|
7
|
+
data.tar.gz: 2b6840b7d90f6cb19405b8bfb250b6595a1fb927cbcdf4c0a8142d190c3c05df8cdb6393ebfe32436b8d5b7c17c049d329e4dc62f8e5fd336ec2c8f0a5607619
|
data/README.rdoc
CHANGED
@@ -5,7 +5,8 @@
|
|
5
5
|
This component enables caching of an application's response contents on
|
6
6
|
both page- and fragment-levels. Output cached in this manner is
|
7
7
|
persisted, until it expires or is actively expired, in a configurable store
|
8
|
-
of your choosing.
|
8
|
+
of your choosing. Most popular key/value stores work out of the box. Take a look
|
9
|
+
at the [Moneta documentation](http://rubydoc.info/gems/moneta) for a list of all supported stores.
|
9
10
|
|
10
11
|
== Caching Quickstart
|
11
12
|
|
@@ -26,7 +27,7 @@ your needs, you can enable it very easily:
|
|
26
27
|
enable :caching
|
27
28
|
|
28
29
|
get '/foo', :cache => true do
|
29
|
-
|
30
|
+
expires 30 # expire cached version at least every 30 seconds
|
30
31
|
'Hello world'
|
31
32
|
end
|
32
33
|
end
|
@@ -44,7 +45,7 @@ You can also cache on a controller-wide basis:
|
|
44
45
|
|
45
46
|
# Requests to routes within '/admin'
|
46
47
|
controller '/admin', :cache => true do
|
47
|
-
|
48
|
+
expires 60
|
48
49
|
|
49
50
|
get '/foo' do
|
50
51
|
'Url is /admin/foo'
|
@@ -75,9 +76,9 @@ You can also provide a custom <tt>cache_key</tt> in any route:
|
|
75
76
|
In this way you can manually expire cache with CachedApp.cache.delete(:my_name)
|
76
77
|
for example from the Post model after an update.
|
77
78
|
|
78
|
-
If you specify <tt>:cache => true</tt> but do not invoke <tt>
|
79
|
+
If you specify <tt>:cache => true</tt> but do not invoke <tt>expires</tt>,
|
79
80
|
the response will be cached indefinitely. Most of the time, you will want to
|
80
|
-
specify the expiry of a cache entry by <tt>
|
81
|
+
specify the expiry of a cache entry by <tt>expires</tt>. Even a relatively
|
81
82
|
low value--1 or 2 seconds--can greatly increase application efficiency, especially
|
82
83
|
when enabled on a very active part of your domain.
|
83
84
|
|
@@ -110,7 +111,7 @@ easy to integrate into your application. To turn it on, simply provide the
|
|
110
111
|
By default, cached content is persisted with a "file store"--that is, in a
|
111
112
|
subdirectory of your application root.
|
112
113
|
|
113
|
-
==== <tt>
|
114
|
+
==== <tt>expires( seconds )</tt>
|
114
115
|
|
115
116
|
This helper is used within a controller or route to indicate how often cached
|
116
117
|
<em>page-level</em> content should persist in the cache.
|
@@ -126,7 +127,7 @@ be executed; rather, its previous output will be sent to the client with a
|
|
126
127
|
enable :caching # turns on caching
|
127
128
|
|
128
129
|
controller '/blog', :cache => true do
|
129
|
-
|
130
|
+
expires 15
|
130
131
|
|
131
132
|
get '/entries' do
|
132
133
|
'just broke up eating twinkies lol'
|
@@ -134,7 +135,7 @@ be executed; rather, its previous output will be sent to the client with a
|
|
134
135
|
end
|
135
136
|
end
|
136
137
|
|
137
|
-
Note that the "latest" method call to <tt>
|
138
|
+
Note that the "latest" method call to <tt>expires</tt> determines its value: if
|
138
139
|
called within a route, as opposed to a controller definition, the route's
|
139
140
|
value will be assumed.
|
140
141
|
|
@@ -165,7 +166,7 @@ to be cached. It can be used in within a route:
|
|
165
166
|
get :feed, :map => '/:username' do
|
166
167
|
username = params[:username]
|
167
168
|
|
168
|
-
@feed = cache( "feed_for_#{username}", :
|
169
|
+
@feed = cache( "feed_for_#{username}", :expires => 3 ) do
|
169
170
|
@tweets = Tweet.all( :username => username )
|
170
171
|
render 'partials/feedcontent'
|
171
172
|
end
|
@@ -192,7 +193,7 @@ Note that any other action will reference the same content if it uses the same k
|
|
192
193
|
get :feed, :map => '/:username' do
|
193
194
|
username = params[:username]
|
194
195
|
|
195
|
-
@feed = cache( "feed_for_#{username}", :
|
196
|
+
@feed = cache( "feed_for_#{username}", :expires => 3 ) do
|
196
197
|
@tweets = Tweet.all( :username => username )
|
197
198
|
render 'partials/feedcontent'
|
198
199
|
end
|
@@ -204,7 +205,7 @@ Note that any other action will reference the same content if it uses the same k
|
|
204
205
|
get :mobile_feed, :map => '/:username.iphone' do
|
205
206
|
username = params[:username]
|
206
207
|
|
207
|
-
@feed = cache( "feed_for_#{username}", :
|
208
|
+
@feed = cache( "feed_for_#{username}", :expires => 3 ) do
|
208
209
|
@tweets = Tweet.all( :username => username )
|
209
210
|
render 'partials/feedcontent'
|
210
211
|
end
|
@@ -214,7 +215,8 @@ Note that any other action will reference the same content if it uses the same k
|
|
214
215
|
end
|
215
216
|
end
|
216
217
|
|
217
|
-
The <tt>opts</tt> argument is actually passed to the underlying store.
|
218
|
+
The <tt>opts</tt> argument is actually passed to the underlying store. The stores support the <tt>:expires</tt> option out of the box or
|
219
|
+
are enhanced by Moneta to support it.
|
218
220
|
|
219
221
|
Finally, to DRY up things a bit, we might do:
|
220
222
|
|
@@ -226,7 +228,7 @@ Finally, to DRY up things a bit, we might do:
|
|
226
228
|
controller :tweets do
|
227
229
|
# This works because all routes in this controller specify :username
|
228
230
|
before do
|
229
|
-
@feed = cache( "feed_for_#{params[:username]}", :
|
231
|
+
@feed = cache( "feed_for_#{params[:username]}", :expires => 3 ) do
|
230
232
|
@tweets = Tweet.all( :username => params[:username] )
|
231
233
|
render 'partials/feedcontent'
|
232
234
|
end
|
@@ -253,35 +255,40 @@ You can set a global caching option or a per app caching options.
|
|
253
255
|
|
254
256
|
=== Global Caching Options
|
255
257
|
|
256
|
-
Padrino.cache = Padrino::Cache
|
257
|
-
Padrino.cache = Padrino::Cache
|
258
|
-
Padrino.cache = Padrino::Cache
|
259
|
-
Padrino.cache = Padrino::Cache
|
260
|
-
Padrino.cache = Padrino::Cache
|
261
|
-
Padrino.cache = Padrino::Cache
|
258
|
+
Padrino.cache = Padrino::Cache.new(:LRUHash) # Keeps cached values in memory
|
259
|
+
Padrino.cache = Padrino::Cache.new(:Memcached) # Uses default server at localhost
|
260
|
+
Padrino.cache = Padrino::Cache.new(:Memcached, '127.0.0.1:11211', :exception_retry_limit => 1)
|
261
|
+
Padrino.cache = Padrino::Cache.new(:Memcached, :backend => memcached_or_dalli_instance)
|
262
|
+
Padrino.cache = Padrino::Cache.new(:Redis) # Uses default server at localhost
|
263
|
+
Padrino.cache = Padrino::Cache.new(:Redis, :host => '127.0.0.1', :port => 6379, :db => 0)
|
264
|
+
Padrino.cache = Padrino::Cache.new(:Redis, :backend => redis_instance)
|
265
|
+
Padrino.cache = Padrino::Cache.new(:Mongo) # Uses default server at localhost
|
266
|
+
Padrino.cache = Padrino::Cache.new(:Mongo, :backend => mongo_client_instance)
|
267
|
+
Padrino.cache = Padrino::Cache.new(:File, :dir => Padrino.root('tmp', app_name.to_s, 'cache')) # default choice
|
262
268
|
|
263
269
|
You can manage your cache from anywhere in your app:
|
264
270
|
|
265
|
-
Padrino.cache
|
266
|
-
Padrino.cache
|
271
|
+
Padrino.cache['val'] = 'test'
|
272
|
+
Padrino.cache['val'] # => 'test'
|
267
273
|
Padrino.cache.delete('val')
|
268
|
-
Padrino.cache.
|
274
|
+
Padrino.cache.clear
|
275
|
+
|
276
|
+
The Padrino cache constructor `Padrino::Cache.new` calls `Moneta.new` to create a cache instance. Please refer to the [Moneta documentation](http://rubydoc.info/gems/moneta) if you
|
277
|
+
have special requirements, for example if you want to configure the marshalling mechanism or use a more exotic backend.
|
269
278
|
|
270
279
|
==== Application Caching Options
|
271
280
|
|
272
|
-
set :cache, Padrino::Cache
|
273
|
-
set :cache, Padrino::Cache
|
274
|
-
set :cache, Padrino::Cache
|
275
|
-
set :cache, Padrino::Cache
|
276
|
-
set :cache, Padrino::Cache::Store::Memory.new(50)
|
277
|
-
set :cache, Padrino::Cache::Store::File.new(Padrino.root('tmp', app_name, 'cache') # default choice
|
281
|
+
set :cache, Padrino::Cache.new(:LRUHash)
|
282
|
+
set :cache, Padrino::Cache.new(:Memcached)
|
283
|
+
set :cache, Padrino::Cache.new(:Redis)
|
284
|
+
set :cache, Padrino::Cache.new(:File, :dir => Padrino.root('tmp', app_name.to_s, 'cache')) # default choice
|
278
285
|
|
279
286
|
You can manage your cache from anywhere in your app:
|
280
287
|
|
281
|
-
MyApp.cache
|
282
|
-
MyApp.cache
|
288
|
+
MyApp.cache['val'] = 'test'
|
289
|
+
MyApp.cache['val'] # => 'test'
|
283
290
|
MyApp.cache.delete('val')
|
284
|
-
MyApp.cache.
|
291
|
+
MyApp.cache.clear
|
285
292
|
|
286
293
|
== Expiring Cached Content
|
287
294
|
|
@@ -316,7 +323,7 @@ do our user a favor and instantly re-render the feed.
|
|
316
323
|
expire( "feed since #{last_visit}" ) if @tweets.any? { |t| t.deleted_since?( last_visit ) }
|
317
324
|
|
318
325
|
session[:last_visit] = Time.now
|
319
|
-
@feed = cache( "feed since #{last_visit}", :
|
326
|
+
@feed = cache( "feed since #{last_visit}", :expires => 60 ) do
|
320
327
|
@tweets = @tweets.find_all { |t| !t.deleted? }
|
321
328
|
render 'partials/feedcontent'
|
322
329
|
end
|
data/lib/padrino-cache.rb
CHANGED
@@ -2,6 +2,8 @@ require 'fileutils' unless defined?(FileUtils)
|
|
2
2
|
require 'padrino-core'
|
3
3
|
require 'padrino-helpers'
|
4
4
|
FileSet.glob_require('padrino-cache/{helpers}/*.rb', __FILE__)
|
5
|
+
require 'moneta'
|
6
|
+
require 'padrino-cache/legacy_store'
|
5
7
|
|
6
8
|
module Padrino
|
7
9
|
class << self
|
@@ -9,11 +11,11 @@ module Padrino
|
|
9
11
|
# Returns the caching engine.
|
10
12
|
#
|
11
13
|
# @example
|
12
|
-
# # with: Padrino.cache = Padrino::Cache
|
13
|
-
# Padrino.cache
|
14
|
-
# Padrino.cache
|
14
|
+
# # with: Padrino.cache = Padrino::Cache.new(:File, :dir => /my/cache/path)
|
15
|
+
# Padrino.cache['val'] = 'test'
|
16
|
+
# Padrino.cache['val'] # => 'test'
|
15
17
|
# Padrino.cache.delete('val')
|
16
|
-
# Padrino.cache.
|
18
|
+
# Padrino.cache.clear
|
17
19
|
#
|
18
20
|
def cache
|
19
21
|
@_cache
|
@@ -23,22 +25,26 @@ module Padrino
|
|
23
25
|
# Set the caching engine.
|
24
26
|
#
|
25
27
|
# @param value
|
26
|
-
# Instance of
|
28
|
+
# Instance of Moneta store
|
27
29
|
#
|
28
30
|
# @example
|
29
|
-
# Padrino.cache = Padrino::Cache
|
30
|
-
# Padrino.cache = Padrino::Cache
|
31
|
-
# Padrino.cache = Padrino::Cache
|
32
|
-
# Padrino.cache = Padrino::Cache
|
33
|
-
# Padrino.cache = Padrino::Cache
|
34
|
-
# Padrino.cache = Padrino::Cache
|
31
|
+
# Padrino.cache = Padrino::Cache.new(:File, :dir => Padrino.root('tmp', app_name.to_s, 'cache')) # default choice
|
32
|
+
# Padrino.cache = Padrino::Cache.new(:LRUHash) # Keeps cached values in memory
|
33
|
+
# Padrino.cache = Padrino::Cache.new(:Memcached) # Uses default server at localhost
|
34
|
+
# Padrino.cache = Padrino::Cache.new(:Memcached, '127.0.0.1:11211', :exception_retry_limit => 1)
|
35
|
+
# Padrino.cache = Padrino::Cache.new(:Memcached, :backend => memcached_or_dalli_instance)
|
36
|
+
# Padrino.cache = Padrino::Cache.new(:Redis) # Uses default server at localhost
|
37
|
+
# Padrino.cache = Padrino::Cache.new(:Redis, :host => '127.0.0.1', :port => 6379, :db => 0)
|
38
|
+
# Padrino.cache = Padrino::Cache.new(:Redis, :backend => redis_instance)
|
39
|
+
# Padrino.cache = Padrino::Cache.new(:Mongo) # Uses default server at localhost
|
40
|
+
# Padrino.cache = Padrino::Cache.new(:Mongo, :backend => mongo_client_instance)
|
35
41
|
#
|
36
42
|
# # You can manage your cache from anywhere in your app:
|
37
43
|
#
|
38
|
-
# Padrino.cache
|
39
|
-
# Padrino.cache
|
44
|
+
# Padrino.cache['val'] = 'test'
|
45
|
+
# Padrino.cache['val'] # => 'test'
|
40
46
|
# Padrino.cache.delete('val')
|
41
|
-
# Padrino.cache.
|
47
|
+
# Padrino.cache.clear
|
42
48
|
#
|
43
49
|
def cache=(value)
|
44
50
|
@_cache= value
|
@@ -52,9 +58,6 @@ module Padrino
|
|
52
58
|
# of your choosing. Several common caching stores are supported out of the box.
|
53
59
|
#
|
54
60
|
module Cache
|
55
|
-
autoload :Store, 'padrino-cache/store'
|
56
|
-
autoload :Parser, 'padrino-cache/parser'
|
57
|
-
|
58
61
|
class << self
|
59
62
|
##
|
60
63
|
# Register these helpers:
|
@@ -67,29 +70,34 @@ module Padrino
|
|
67
70
|
#
|
68
71
|
# By default we use FileStore as showed below:
|
69
72
|
#
|
70
|
-
# set :cache, Padrino::Cache
|
73
|
+
# set :cache, Padrino::Cache.new(:File, :dir => Padrino.root('tmp', app_name.to_s, 'cache'))
|
71
74
|
#
|
72
75
|
# However, you can also change the file store easily in your app.rb:
|
73
76
|
#
|
74
|
-
# set :cache, Padrino::Cache
|
75
|
-
# set :cache, Padrino::Cache
|
76
|
-
# set :cache, Padrino::Cache
|
77
|
-
# set :cache, Padrino::Cache
|
78
|
-
# set :cache, Padrino::Cache
|
79
|
-
# set :cache, Padrino::Cache
|
77
|
+
# set :cache, Padrino::Cache.new(:LRUHash) # Keeps cached values in memory
|
78
|
+
# set :cache, Padrino::Cache.new(:Memcached) # Uses default server at localhost
|
79
|
+
# set :cache, Padrino::Cache.new(:Memcached, '127.0.0.1:11211', :exception_retry_limit => 1)
|
80
|
+
# set :cache, Padrino::Cache.new(:Memcached, :backend => memcached_or_dalli_instance)
|
81
|
+
# set :cache, Padrino::Cache.new(:Redis) # Uses default server at localhost
|
82
|
+
# set :cache, Padrino::Cache.new(:Redis, :host => '127.0.0.1', :port => 6379, :db => 0)
|
83
|
+
# set :cache, Padrino::Cache.new(:Redis, :backend => redis_instance)
|
84
|
+
# set :cache, Padrino::Cache.new(:Mongo) # Uses default server at localhost
|
85
|
+
# set :cache, Padrino::Cache.new(:Mongo, :backend => mongo_client_instance)
|
86
|
+
# set :cache, Padrino::Cache.new(:File, :dir => Padrino.root('tmp', app_name.to_s, 'cache')) # default choice
|
80
87
|
#
|
81
88
|
# You can manage your cache from anywhere in your app:
|
82
89
|
#
|
83
|
-
# MyApp.cache
|
84
|
-
# MyApp.cache
|
90
|
+
# MyApp.cache['val'] = 'test'
|
91
|
+
# MyApp.cache['val'] # => 'test'
|
85
92
|
# MyApp.cache.delete('val')
|
86
|
-
# MyApp.cache.
|
93
|
+
# MyApp.cache.clear
|
87
94
|
#
|
88
95
|
def registered(app)
|
89
96
|
app.helpers Padrino::Cache::Helpers::CacheStore
|
90
97
|
app.helpers Padrino::Cache::Helpers::Fragment
|
91
98
|
app.helpers Padrino::Cache::Helpers::Page
|
92
|
-
app.set :cache, Padrino::Cache
|
99
|
+
app.set :cache, Padrino::Cache.new(:File,
|
100
|
+
:dir => Padrino.root('tmp', defined?(app.app_name) ? app.app_name.to_s : '', 'cache'))
|
93
101
|
app.disable :caching
|
94
102
|
end
|
95
103
|
alias :included :registered
|
@@ -99,6 +107,17 @@ module Padrino
|
|
99
107
|
end
|
100
108
|
end
|
101
109
|
|
102
|
-
|
110
|
+
def self.new(name, options = {})
|
111
|
+
# Activate expiration by default
|
112
|
+
options[:expires] = true unless options.include?(:expires)
|
113
|
+
a = Moneta.new(name, options)
|
114
|
+
Moneta.build do
|
115
|
+
# Use proxy to support deprecated Padrino interface
|
116
|
+
use LegacyStore
|
117
|
+
adapter a
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
Padrino.cache = Padrino::Cache.new(:LRUHash)
|
103
122
|
end
|
104
123
|
end
|
@@ -23,7 +23,7 @@ module Padrino
|
|
23
23
|
# @param [String] key
|
24
24
|
# cache key
|
25
25
|
# @param [Hash] opts
|
26
|
-
# cache options, e.g :
|
26
|
+
# cache options, e.g :expires
|
27
27
|
# @param [Proc]
|
28
28
|
# Execution result to store in the cache
|
29
29
|
#
|
@@ -36,7 +36,7 @@ module Padrino
|
|
36
36
|
# get :feed, :map => '/:username' do
|
37
37
|
# username = params[:username]
|
38
38
|
#
|
39
|
-
# @feed = cache( "feed_for_#{username}", :
|
39
|
+
# @feed = cache( "feed_for_#{username}", :expires => 3 ) do
|
40
40
|
# @tweets = Tweet.all( :username => username )
|
41
41
|
# render 'partials/feedcontent'
|
42
42
|
# end
|
@@ -47,15 +47,16 @@ module Padrino
|
|
47
47
|
# end
|
48
48
|
# end
|
49
49
|
#
|
50
|
-
|
50
|
+
# @api public
|
51
|
+
def cache(key, opts = {}, &block)
|
51
52
|
if settings.caching?
|
52
53
|
began_at = Time.now
|
53
|
-
if value = settings.cache
|
54
|
+
if value = settings.cache[key.to_s]
|
54
55
|
logger.debug "GET Fragment", began_at, key.to_s if defined?(logger)
|
55
56
|
concat_content(value.html_safe)
|
56
57
|
else
|
57
58
|
value = capture_html(&block)
|
58
|
-
settings.cache.
|
59
|
+
settings.cache.store(key.to_s, value, opts)
|
59
60
|
logger.debug "SET Fragment", began_at, key.to_s if defined?(logger)
|
60
61
|
concat_content(value)
|
61
62
|
end
|
@@ -16,10 +16,10 @@ module Padrino
|
|
16
16
|
# enable :caching # turns on caching mechanism
|
17
17
|
#
|
18
18
|
# controller '/blog', :cache => true do
|
19
|
-
#
|
19
|
+
# expires 15
|
20
20
|
#
|
21
21
|
# get '/entries' do
|
22
|
-
# #
|
22
|
+
# # expires 15 => can also be defined inside a single route
|
23
23
|
# 'Just broke up eating twinkies, lol'
|
24
24
|
# end
|
25
25
|
#
|
@@ -32,7 +32,7 @@ module Padrino
|
|
32
32
|
#
|
33
33
|
# You can manually expire cache with CachedApp.cache.delete(:my_name)
|
34
34
|
#
|
35
|
-
# Note that the "latest" method call to <tt>
|
35
|
+
# Note that the "latest" method call to <tt>expires</tt> determines its value: if
|
36
36
|
# called within a route, as opposed to a controller definition, the route's
|
37
37
|
# value will be assumed.
|
38
38
|
#
|
@@ -51,17 +51,22 @@ module Padrino
|
|
51
51
|
#
|
52
52
|
# @example
|
53
53
|
# controller '/blog', :cache => true do
|
54
|
-
#
|
54
|
+
# expires 15
|
55
55
|
#
|
56
56
|
# get '/entries' do
|
57
|
-
# # expires_in 15 => can also be defined inside a single route
|
58
57
|
# 'Just broke up eating twinkies, lol'
|
59
58
|
# end
|
60
59
|
# end
|
61
60
|
#
|
61
|
+
# @api public
|
62
|
+
def expires(time)
|
63
|
+
@route.cache_expires = time if @route
|
64
|
+
@_last_expires = time
|
65
|
+
end
|
66
|
+
|
62
67
|
def expires_in(time)
|
63
|
-
|
64
|
-
|
68
|
+
warn 'expires_in has been deprecated in favour of expires'
|
69
|
+
expires(time)
|
65
70
|
end
|
66
71
|
|
67
72
|
##
|
@@ -99,10 +104,13 @@ module Padrino
|
|
99
104
|
if settings.caching?
|
100
105
|
began_at = Time.now
|
101
106
|
|
102
|
-
value = settings.cache
|
107
|
+
value = settings.cache[resolve_cache_key || env['PATH_INFO']]
|
103
108
|
logger.debug "GET Cache", began_at, @route.cache_key || env['PATH_INFO'] if defined?(logger) && value
|
104
109
|
|
105
|
-
if value
|
110
|
+
if value.kind_of?(Hash)
|
111
|
+
content_type value[:content_type]
|
112
|
+
halt 200, value[:body]
|
113
|
+
elsif value
|
106
114
|
halt 200, value
|
107
115
|
end
|
108
116
|
end
|
@@ -111,13 +119,16 @@ module Padrino
|
|
111
119
|
route.after_filters do
|
112
120
|
if settings.caching? && @_response_buffer.kind_of?(String)
|
113
121
|
began_at = Time.now
|
114
|
-
content
|
122
|
+
content = {
|
123
|
+
:body => @_response_buffer,
|
124
|
+
:content_type => @_content_type
|
125
|
+
}
|
115
126
|
|
116
|
-
if @
|
117
|
-
settings.cache.
|
118
|
-
@
|
127
|
+
if @_last_expires
|
128
|
+
settings.cache.store(resolve_cache_key || env['PATH_INFO'], content, :expires => @_last_expires)
|
129
|
+
@_last_expires = nil
|
119
130
|
else
|
120
|
-
settings.cache.
|
131
|
+
settings.cache.store(resolve_cache_key || env['PATH_INFO'], content)
|
121
132
|
end
|
122
133
|
|
123
134
|
logger.debug "SET Cache", began_at, @route.cache_key || env['PATH_INFO'] if defined?(logger)
|