padrino-cache 0.11.4 → 0.12.0.rc1
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 +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)
|