padrino-cache 0.12.2 → 0.12.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.
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