padrino-cache 0.12.2 → 0.12.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 90a12b145c168c1bf06eed80003c8a2192ea4da8
4
- data.tar.gz: d7037b8f473894021d164bf29a78b477b38f915d
3
+ metadata.gz: 1e64349dade4e85cb293e1b2de5381bf21d7f45c
4
+ data.tar.gz: 6fa8e3ab11b1ba47667497d81937e629eea2dcda
5
5
  SHA512:
6
- metadata.gz: 465103c327fef8882fbbf3365976eb4ca2c4da7522cef9106d187a255df2bf0baea14ef9d656eb24245370c5c1644aaac27834fe6fb86b0d14426183a490d75e
7
- data.tar.gz: 5dac09e66c5faa7732d3b77f695508be00a0aa5a761d74de881e3c9f7f3a002db765bb90d7c5e32285ae95980ee05488f2a329c36a1a3e6ef955dddb254b7881
6
+ metadata.gz: 0f408303e59ce1e0dbd4cf3f99fcfa42d0e8a3e1e3c007834066bcaf10793b961e4161332536ba6baac59683a50bec95f73b8cad9c177fea3ee86567b37e23a3
7
+ data.tar.gz: dfabcbecfa9dcb42c1f20af48209247bc0f785e2e97a417618f229393948f0e015a0e3f54e5aa11834698a89d1ba94f5ca9ec6fb60a0b457a62904d99d7ff551
data/lib/padrino-cache.rb CHANGED
@@ -101,8 +101,12 @@ module Padrino
101
101
  app.set :cache, Padrino::Cache.new(:File,
102
102
  :dir => Padrino.root('tmp', defined?(app.app_name) ? app.app_name.to_s : '', 'cache'))
103
103
  app.disable :caching
104
+ included(app)
105
+ end
106
+
107
+ def included(base)
108
+ base.extend Padrino::Cache::Helpers::Page::ClassMethods
104
109
  end
105
- alias :included :registered
106
110
 
107
111
  def padrino_route_added(route, verb, path, args, options, block)
108
112
  Padrino::Cache::Helpers::Page.padrino_route_added(route, verb, path, args, options, block)
@@ -60,8 +60,7 @@ module Padrino
60
60
  #
61
61
  # @api public
62
62
  def expires(time)
63
- @route.cache_expires = time if @route
64
- @_last_expires = time
63
+ @route.cache_expires = time
65
64
  end
66
65
 
67
66
  def expires_in(time)
@@ -94,55 +93,80 @@ module Padrino
94
93
  # end
95
94
  #
96
95
  def cache_key(name = nil, &block)
97
- raise "Can not provide both cache_key and a block" if name && block
98
- @route.cache_key = block_given? ? block : name
96
+ fail "Can not provide both cache_key and a block" if name && block
97
+ @route.cache_key = name || block
99
98
  end
100
99
 
101
- def self.padrino_route_added(route, verb, path, args, options, block)
102
- if route.cache and %w(GET HEAD).include?(verb)
103
- route.before_filters do
104
- if settings.caching?
105
- began_at = Time.now
106
-
107
- value = settings.cache[resolve_cache_key || env['PATH_INFO']]
108
- logger.debug "GET Cache", began_at, @route.cache_key || env['PATH_INFO'] if defined?(logger) && value
109
-
110
- if value.kind_of?(Hash)
111
- content_type value[:content_type]
112
- halt 200, value[:body]
113
- elsif value
114
- halt 200, value
115
- end
116
- end
117
- end
100
+ CACHED_VERBS = { 'GET' => true, 'HEAD' => true }.freeze
101
+
102
+ def self.padrino_route_added(route, verb, *)
103
+ return unless route.cache && CACHED_VERBS[verb]
118
104
 
119
- route.after_filters do
120
- if settings.caching? && @_response_buffer.kind_of?(String)
121
- began_at = Time.now
122
- content = {
123
- :body => @_response_buffer,
124
- :content_type => @_content_type
125
- }
126
-
127
- if @_last_expires
128
- settings.cache.store(resolve_cache_key || env['PATH_INFO'], content, :expires => @_last_expires)
129
- @_last_expires = nil
130
- else
131
- settings.cache.store(resolve_cache_key || env['PATH_INFO'], content)
132
- end
133
-
134
- logger.debug "SET Cache", began_at, @route.cache_key || env['PATH_INFO'] if defined?(logger)
135
- end
105
+ route.before_filters do
106
+ next unless settings.caching?
107
+ if cached_response = load_cached_response
108
+ content_type cached_response[:content_type]
109
+ halt 200, cached_response[:body]
136
110
  end
137
111
  end
112
+
113
+ route.after_filters do
114
+ save_cached_response(route.cache_expires) if settings.caching?
115
+ end
138
116
  end
139
117
 
140
118
  private
119
+
120
+ def load_cached_response
121
+ began_at = Time.now
122
+ route_cache_key = resolve_cache_key || env['PATH_INFO']
123
+
124
+ value = settings.cache[route_cache_key]
125
+ logger.debug "GET Cache", began_at, route_cache_key if defined?(logger) && value
126
+
127
+ value
128
+ end
129
+
130
+ def save_cached_response(cache_expires)
131
+ return unless @_response_buffer.kind_of?(String)
132
+
133
+ began_at = Time.now
134
+ route_cache_key = resolve_cache_key || env['PATH_INFO']
135
+
136
+ content = {
137
+ :body => @_response_buffer,
138
+ :content_type => @_content_type
139
+ }
140
+
141
+ settings.cache.store(route_cache_key, content, :expires => cache_expires)
142
+
143
+ logger.debug "SET Cache", began_at, route_cache_key if defined?(logger)
144
+ end
145
+
141
146
  ##
142
147
  # Resolve the cache_key when it's a block in the correct context.
143
148
  #
144
149
  def resolve_cache_key
145
- @route.cache_key.is_a?(Proc) ? instance_eval(&@route.cache_key) : @route.cache_key
150
+ key = @route.cache_key
151
+ key.is_a?(Proc) ? instance_eval(&key) : key
152
+ end
153
+
154
+ module ClassMethods
155
+ ##
156
+ # A method to set `expires` time inside `controller` blocks.
157
+ #
158
+ # @example
159
+ # controller :users do
160
+ # expires 15
161
+ #
162
+ # get :show do
163
+ # 'shown'
164
+ # end
165
+ # end
166
+ #
167
+ def expires(time)
168
+ @_expires = time
169
+ end
146
170
  end
147
171
  end
148
172
  end
@@ -38,6 +38,57 @@ describe "PadrinoCache" do
38
38
  refute_equal false, called
39
39
  end
40
40
 
41
+ it 'should cache HEAD verb' do
42
+ called_times = 0
43
+ mock_app do
44
+ register Padrino::Cache
45
+ enable :caching
46
+ get('/foo', :cache => true){ called_times += 1; called_times.to_s }
47
+ end
48
+ head "/foo"
49
+ head "/foo"
50
+ assert_equal 1, called_times
51
+ end
52
+
53
+ it 'should not cache POST verb' do
54
+ called_times = 0
55
+ mock_app do
56
+ register Padrino::Cache
57
+ enable :caching
58
+ post('/foo', :cache => true){ called_times += 1; called_times.to_s }
59
+ end
60
+ post "/foo"
61
+ assert_equal 1, called_times
62
+ post "/foo"
63
+ assert_equal 2, called_times
64
+ end
65
+
66
+ it 'should not cache DELETE verb' do
67
+ called_times = 0
68
+ mock_app do
69
+ register Padrino::Cache
70
+ enable :caching
71
+ delete('/foo', :cache => true){ called_times += 1; called_times.to_s }
72
+ end
73
+ delete "/foo"
74
+ assert_equal 1, called_times
75
+ delete "/foo"
76
+ assert_equal 2, called_times
77
+ end
78
+
79
+ it 'should not cache PUT verb' do
80
+ called_times = 0
81
+ mock_app do
82
+ register Padrino::Cache
83
+ enable :caching
84
+ put('/foo', :cache => true){ called_times += 1; called_times.to_s }
85
+ end
86
+ put "/foo"
87
+ assert_equal 1, called_times
88
+ put "/foo"
89
+ assert_equal 2, called_times
90
+ end
91
+
41
92
  it 'should delete from the cache' do
42
93
  called = false
43
94
  mock_app do
@@ -115,7 +166,7 @@ describe "PadrinoCache" do
115
166
  assert_equal 'test page again', body
116
167
  end
117
168
 
118
- it 'should accept allow controller-wide caching' do
169
+ it 'should allow controller-wide caching' do
119
170
  called = false
120
171
  mock_app do
121
172
  controller :cache => true do
@@ -132,6 +183,26 @@ describe "PadrinoCache" do
132
183
  assert_equal 'test', body
133
184
  end
134
185
 
186
+ it 'should allow controller-wide expires' do
187
+ called = false
188
+ mock_app do
189
+ register Padrino::Cache
190
+ controller :cache => true do
191
+ enable :caching
192
+ expires 1
193
+ get("/foo"){ called ? halt(500) : (called = 'test') }
194
+ end
195
+ end
196
+ get "/foo"
197
+ assert_equal 200, status
198
+ assert_equal 'test', body
199
+ get "/foo"
200
+ assert_equal 200, status
201
+ assert_equal 'test', body
202
+ Time.stub(:now, Time.now + 2) { get "/foo" }
203
+ assert_equal 500, status
204
+ end
205
+
135
206
  it 'should allow cache disabling on a per route basis' do
136
207
  called = false
137
208
  mock_app do
@@ -346,4 +417,44 @@ describe "PadrinoCache" do
346
417
  assert_equal 'bar', body
347
418
  assert_equal 1, counter
348
419
  end
420
+
421
+ it 'should allow different expiring times for different pages' do
422
+ skip
423
+ called_times_a = 0
424
+ called_times_b = 0
425
+ mock_app do
426
+ register Padrino::Cache
427
+ enable :caching
428
+ controller :cache => true do
429
+ get("/foo") do
430
+ expires 1
431
+ called_times_a += 1
432
+ called_times_b.to_s
433
+ end
434
+ get("/bar") do
435
+ expires 3
436
+ called_times_b += 1
437
+ called_times_b.to_s
438
+ end
439
+ end
440
+ end
441
+ Time.stub(:now, Time.now) { get "/foo"; get "/bar" }
442
+ assert_equal 1, called_times_a
443
+ assert_equal 1, called_times_b
444
+ Time.stub(:now, Time.now + 0.5) { get "/foo"; get "/bar" }
445
+ assert_equal 1, called_times_a
446
+ assert_equal 1, called_times_b
447
+ Time.stub(:now, Time.now + 2) { get "/foo"; get "/bar" }
448
+ assert_equal 2, called_times_a
449
+ assert_equal 1, called_times_b
450
+ Time.stub(:now, Time.now + 2.5) { get "/foo"; get "/bar" }
451
+ assert_equal 2, called_times_a
452
+ assert_equal 1, called_times_b
453
+ Time.stub(:now, Time.now + 4) { get "/foo"; get "/bar" }
454
+ assert_equal 3, called_times_a
455
+ assert_equal 2, called_times_b
456
+ Time.stub(:now, Time.now + 5.5) { get "/foo"; get "/bar" }
457
+ assert_equal 4, called_times_a
458
+ assert_equal 2, called_times_b
459
+ end
349
460
  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.12.2
4
+ version: 0.12.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Padrino Team
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2014-05-12 00:00:00.000000000 Z
14
+ date: 2014-08-13 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: padrino-core
@@ -19,28 +19,28 @@ dependencies:
19
19
  requirements:
20
20
  - - '='
21
21
  - !ruby/object:Gem::Version
22
- version: 0.12.2
22
+ version: 0.12.3
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - '='
28
28
  - !ruby/object:Gem::Version
29
- version: 0.12.2
29
+ version: 0.12.3
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: padrino-helpers
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  requirements:
34
34
  - - '='
35
35
  - !ruby/object:Gem::Version
36
- version: 0.12.2
36
+ version: 0.12.3
37
37
  type: :runtime
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
41
  - - '='
42
42
  - !ruby/object:Gem::Version
43
- version: 0.12.2
43
+ version: 0.12.3
44
44
  - !ruby/object:Gem::Dependency
45
45
  name: moneta
46
46
  requirement: !ruby/object:Gem::Requirement