faraday-http-cache 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -109,11 +109,12 @@ module Faraday
109
109
  (expires && (expires - date))
110
110
  end
111
111
 
112
- # Internal: Creates a new 'Faraday::Response'.
112
+ # Internal: Creates a new 'Faraday::Response', merging the stored
113
+ # response with the supplied 'env' object.
113
114
  #
114
115
  # Returns a new instance of a 'Faraday::Response' with the payload.
115
- def to_response
116
- Faraday::Response.new(@payload)
116
+ def to_response(env)
117
+ Faraday::Response.new(env.merge(@payload))
117
118
  end
118
119
 
119
120
  private
@@ -115,14 +115,14 @@ module Faraday
115
115
  #
116
116
  # env - the environment 'Hash' provided from the 'Faraday' stack.
117
117
  #
118
- # Returns the actual 'Faraday::Response' instance to be served.
118
+ # Returns the 'Faraday::Response' instance to be served.
119
119
  def process(env)
120
120
  entry = @storage.read(@request)
121
121
 
122
122
  return fetch(env) if entry.nil?
123
123
 
124
124
  if entry.fresh?
125
- response = entry.to_response
125
+ response = entry.to_response(env)
126
126
  trace :fresh
127
127
  else
128
128
  response = validate(entry, env)
@@ -192,11 +192,21 @@ module Faraday
192
192
  def fetch(env)
193
193
  trace :miss
194
194
  @app.call(env).on_complete do |env|
195
- response = Response.new(env)
195
+ response = Response.new(create_response(env))
196
196
  store(response)
197
197
  end
198
198
  end
199
199
 
200
+ # Internal: Creates a new 'Hash' containing the response information.
201
+ #
202
+ # env - the environment 'Hash' from the Faraday stack.
203
+ #
204
+ # Returns a 'Hash' containing the ':status', ':body' and 'response_headers'
205
+ # entries.
206
+ def create_response(env)
207
+ env.slice(:status, :body, :response_headers)
208
+ end
209
+
200
210
  # Internal: Creates a new 'Hash' containing the request information.
201
211
  #
202
212
  # env - the environment 'Hash' from the Faraday stack.
@@ -204,9 +214,9 @@ module Faraday
204
214
  # Returns a 'Hash' containing the ':method', ':url' and 'request_headers'
205
215
  # entries.
206
216
  def create_request(env)
207
- @request = env.slice(:method, :url)
208
- @request[:request_headers] = env[:request_headers].dup
209
- @request
217
+ request = env.slice(:method, :url)
218
+ request[:request_headers] = env[:request_headers].dup
219
+ request
210
220
  end
211
221
 
212
222
  # Internal: Logs the trace info about the incoming request
data/spec/json_spec.rb ADDED
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe Faraday::HttpCache do
4
+ let(:logger) { double('a Logger object', :debug => nil) }
5
+
6
+ let(:client) do
7
+ Faraday.new(:url => ENV['FARADAY_SERVER']) do |stack|
8
+ stack.response :json, :content_type => /\bjson$/
9
+ stack.use Faraday::HttpCache, :logger => logger
10
+ adapter = ENV['FARADAY_ADAPTER']
11
+ stack.headers['X-Faraday-Adapter'] = adapter
12
+ stack.adapter adapter.to_sym
13
+ end
14
+ end
15
+
16
+ before do
17
+ client.get('clear')
18
+ end
19
+
20
+ it "works fine with other middlewares" do
21
+ client.get('json').body['count'].should == 1
22
+ client.get('json').body['count'].should == 1
23
+ end
24
+ end
@@ -135,7 +135,6 @@ describe Faraday::HttpCache do
135
135
  end
136
136
 
137
137
  it "consumes the 'logger' key" do
138
- logger = double('a logger object')
139
138
  ActiveSupport::Cache.should_receive(:lookup_store).with(:memory_store, {})
140
139
  Faraday::HttpCache.new(app, :memory_store, :logger => logger)
141
140
  end
@@ -1,30 +1,30 @@
1
- require 'spec_helper'
1
+ require "spec_helper"
2
2
 
3
3
  describe Faraday::HttpCache::Response do
4
- describe 'cacheable?' do
5
- it "the response isn't' cacheable if the response is marked as private" do
6
- headers = { 'Cache-Control' => 'private' }
4
+ describe "cacheable?" do
5
+ it "the response isn't cacheable if the response is marked as private" do
6
+ headers = { "Cache-Control" => "private" }
7
7
  response = Faraday::HttpCache::Response.new(:response_headers => headers)
8
8
 
9
9
  response.should_not be_cacheable
10
10
  end
11
11
 
12
- it "the response isn't' cacheable if it shouldn't be stored" do
13
- headers = { 'Cache-Control' => 'no-store' }
12
+ it "the response isn't cacheable if it shouldn't be stored" do
13
+ headers = { "Cache-Control" => "no-store" }
14
14
  response = Faraday::HttpCache::Response.new(:response_headers => headers)
15
15
 
16
16
  response.should_not be_cacheable
17
17
  end
18
18
 
19
19
  it "the response isn't cacheable when the status code isn't acceptable" do
20
- headers = { 'Cache-Control' => 'max-age=400' }
20
+ headers = { "Cache-Control" => "max-age=400" }
21
21
  response = Faraday::HttpCache::Response.new(:status => 503, :response_headers => headers)
22
22
  response.should_not be_cacheable
23
23
  end
24
24
 
25
25
  [200, 203, 300, 301, 302, 404, 410].each do |status|
26
26
  it "the response is cacheable if the status code is #{status} and the response is fresh" do
27
- headers = { 'Cache-Control' => 'max-age=400' }
27
+ headers = { "Cache-Control" => "max-age=400" }
28
28
  response = Faraday::HttpCache::Response.new(:status => status, :response_headers => headers)
29
29
 
30
30
  response.should be_cacheable
@@ -32,10 +32,10 @@ describe Faraday::HttpCache::Response do
32
32
  end
33
33
  end
34
34
 
35
- describe 'freshness' do
35
+ describe "freshness" do
36
36
  it "is fresh if the response still has some time to live" do
37
37
  date = 200.seconds.ago.httpdate
38
- headers = { 'Cache-Control' => 'max-age=400', 'Date' => date }
38
+ headers = { "Cache-Control" => "max-age=400", 'Date' => date }
39
39
  response = Faraday::HttpCache::Response.new(:response_headers => headers)
40
40
 
41
41
  response.should be_fresh
@@ -43,7 +43,7 @@ describe Faraday::HttpCache::Response do
43
43
 
44
44
  it "isn't fresh when the ttl has expired" do
45
45
  date = 500.seconds.ago.httpdate
46
- headers = { 'Cache-Control' => 'max-age=400', 'Date' => date }
46
+ headers = { "Cache-Control" => "max-age=400", 'Date' => date }
47
47
  response = Faraday::HttpCache::Response.new(:response_headers => headers)
48
48
 
49
49
  response.should_not be_fresh
@@ -63,33 +63,32 @@ describe Faraday::HttpCache::Response do
63
63
  end
64
64
 
65
65
  it "returns the 'Last-Modified' header on the #last_modified method" do
66
- headers = { 'Last-Modified' => '123'}
66
+ headers = { "Last-Modified" => "123"}
67
67
  response = Faraday::HttpCache::Response.new(:response_headers => headers)
68
- response.last_modified.should == '123'
68
+ response.last_modified.should == "123"
69
69
  end
70
70
 
71
71
  it "returns the 'ETag' header on the #etag method" do
72
- headers = { 'ETag' => 'tag'}
72
+ headers = { "ETag" => "tag"}
73
73
  response = Faraday::HttpCache::Response.new(:response_headers => headers)
74
- response.etag.should == 'tag'
74
+ response.etag.should == "tag"
75
75
  end
76
76
 
77
- describe 'max age calculation' do
78
-
79
- it 'uses the shared max age directive when present' do
80
- headers = { 'Cache-Control' => 's-maxage=200, max-age=0'}
77
+ describe "max age calculation" do
78
+ it "uses the shared max age directive when present" do
79
+ headers = { "Cache-Control" => "s-maxage=200, max-age=0"}
81
80
  response = Faraday::HttpCache::Response.new(:response_headers => headers)
82
81
  response.max_age.should == 200
83
82
  end
84
83
 
85
- it 'uses the max age directive when present' do
86
- headers = { 'Cache-Control' => 'max-age=200'}
84
+ it "uses the max age directive when present" do
85
+ headers = { "Cache-Control" => "max-age=200"}
87
86
  response = Faraday::HttpCache::Response.new(:response_headers => headers)
88
87
  response.max_age.should == 200
89
88
  end
90
89
 
91
90
  it "fallsback to the expiration date leftovers" do
92
- headers = { 'Expires' => (Time.now + 100).httpdate, 'Date' => Time.now.httpdate }
91
+ headers = { "Expires" => (Time.now + 100).httpdate, 'Date' => Time.now.httpdate }
93
92
  response = Faraday::HttpCache::Response.new(:response_headers => headers)
94
93
  response.max_age.should == 100
95
94
  end
@@ -100,9 +99,9 @@ describe Faraday::HttpCache::Response do
100
99
  end
101
100
  end
102
101
 
103
- describe 'age calculation' do
102
+ describe "age calculation" do
104
103
  it "uses the 'Age' header if it's present" do
105
- response = Faraday::HttpCache::Response.new(:response_headers => { 'Age' => '3' })
104
+ response = Faraday::HttpCache::Response.new(:response_headers => { "Age" => "3" })
106
105
  response.age.should == 3
107
106
  end
108
107
 
@@ -118,32 +117,38 @@ describe Faraday::HttpCache::Response do
118
117
  end
119
118
  end
120
119
 
121
- describe 'time to live calculation' do
120
+ describe "time to live calculation" do
122
121
  it "returns the time to live based on the max age limit" do
123
122
  date = 200.seconds.ago.httpdate
124
- headers = { 'Cache-Control' => 'max-age=400', 'Date' => date }
123
+ headers = { "Cache-Control" => "max-age=400", 'Date' => date }
125
124
  response = Faraday::HttpCache::Response.new(:response_headers => headers)
126
125
  response.ttl.should == 200
127
126
  end
128
127
  end
129
128
 
130
129
  describe "response unboxing" do
131
- subject { described_class.new(:status => 200, :response_headers => {}, :body => 'Hi!') }
132
- let(:response) { subject.to_response }
130
+ subject { described_class.new(:status => 200, :response_headers => {}, :body => "Hi!") }
131
+ let(:env) { { :resquest => mock } }
132
+
133
+ let(:response) { subject.to_response(env) }
134
+
135
+ it "merges the supplied env object with the response data" do
136
+ response.env[:resquest].should be
137
+ end
133
138
 
134
- it 'returns a Faraday::Response' do
139
+ it "returns a Faraday::Response" do
135
140
  response.should be_a Faraday::Response
136
141
  end
137
142
 
138
- it 'merges the status code' do
143
+ it "merges the status code" do
139
144
  response.status.should == 200
140
145
  end
141
146
 
142
- it 'merges the headers' do
147
+ it "merges the headers" do
143
148
  response.headers.should be_a Faraday::Utils::Headers
144
149
  end
145
150
 
146
- it 'merges the body' do
151
+ it "merges the body" do
147
152
  response.body.should == "Hi!"
148
153
  end
149
154
  end
data/spec/spec_helper.rb CHANGED
@@ -2,9 +2,10 @@ require 'uri'
2
2
  require 'socket'
3
3
 
4
4
  require 'faraday-http-cache'
5
+ require 'faraday_middleware'
5
6
  require 'active_support/core_ext/date/calculations'
6
7
  require 'active_support/core_ext/numeric/time'
7
- require 'yajl'
8
+ require 'json'
8
9
 
9
10
  require 'support/test_app'
10
11
  require 'support/test_server'
@@ -20,6 +20,11 @@ class TestApp < Sinatra::Base
20
20
  status 204
21
21
  end
22
22
 
23
+ get '/json' do
24
+ json = MultiJson.encode(:count => settings.requests += 1)
25
+ [200, { 'Cache-Control' => 'max-age=400', 'Content-Type' => 'application/json' }, json]
26
+ end
27
+
23
28
  post '/post' do
24
29
  [200, { 'Cache-Control' => 'max-age=400' }, "#{settings.requests += 1}"]
25
30
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: faraday-http-cache
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-03 00:00:00.000000000 Z
12
+ date: 2012-12-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -59,86 +59,6 @@ dependencies:
59
59
  - - ~>
60
60
  - !ruby/object:Gem::Version
61
61
  version: '1.3'
62
- - !ruby/object:Gem::Dependency
63
- name: rake
64
- requirement: !ruby/object:Gem::Requirement
65
- none: false
66
- requirements:
67
- - - ! '>='
68
- - !ruby/object:Gem::Version
69
- version: '0'
70
- type: :development
71
- prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
75
- - - ! '>='
76
- - !ruby/object:Gem::Version
77
- version: '0'
78
- - !ruby/object:Gem::Dependency
79
- name: rspec
80
- requirement: !ruby/object:Gem::Requirement
81
- none: false
82
- requirements:
83
- - - ~>
84
- - !ruby/object:Gem::Version
85
- version: '2.0'
86
- type: :development
87
- prerelease: false
88
- version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
- requirements:
91
- - - ~>
92
- - !ruby/object:Gem::Version
93
- version: '2.0'
94
- - !ruby/object:Gem::Dependency
95
- name: em-http-request
96
- requirement: !ruby/object:Gem::Requirement
97
- none: false
98
- requirements:
99
- - - ~>
100
- - !ruby/object:Gem::Version
101
- version: 1.0.2
102
- type: :development
103
- prerelease: false
104
- version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
- requirements:
107
- - - ~>
108
- - !ruby/object:Gem::Version
109
- version: 1.0.2
110
- - !ruby/object:Gem::Dependency
111
- name: sinatra
112
- requirement: !ruby/object:Gem::Requirement
113
- none: false
114
- requirements:
115
- - - ! '>='
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
- requirements:
123
- - - ! '>='
124
- - !ruby/object:Gem::Version
125
- version: '0'
126
- - !ruby/object:Gem::Dependency
127
- name: yajl-ruby
128
- requirement: !ruby/object:Gem::Requirement
129
- none: false
130
- requirements:
131
- - - ! '>='
132
- - !ruby/object:Gem::Version
133
- version: '0'
134
- type: :development
135
- prerelease: false
136
- version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
- requirements:
139
- - - ! '>='
140
- - !ruby/object:Gem::Version
141
- version: '0'
142
62
  description: Middleware to handle HTTP caching
143
63
  email:
144
64
  - contact@plataformatec.com.br
@@ -154,6 +74,7 @@ files:
154
74
  - lib/faraday/http_cache.rb
155
75
  - lib/faraday-http-cache.rb
156
76
  - spec/cache_control_spec.rb
77
+ - spec/json_spec.rb
157
78
  - spec/middleware_spec.rb
158
79
  - spec/response_spec.rb
159
80
  - spec/spec_helper.rb
@@ -172,12 +93,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
172
93
  - - ! '>='
173
94
  - !ruby/object:Gem::Version
174
95
  version: '0'
96
+ segments:
97
+ - 0
98
+ hash: -4216884502397664395
175
99
  required_rubygems_version: !ruby/object:Gem::Requirement
176
100
  none: false
177
101
  requirements:
178
102
  - - ! '>='
179
103
  - !ruby/object:Gem::Version
180
104
  version: '0'
105
+ segments:
106
+ - 0
107
+ hash: -4216884502397664395
181
108
  requirements: []
182
109
  rubyforge_project:
183
110
  rubygems_version: 1.8.24
@@ -186,10 +113,10 @@ specification_version: 3
186
113
  summary: A Faraday middleware that stores and validates cache expiration.
187
114
  test_files:
188
115
  - spec/cache_control_spec.rb
116
+ - spec/json_spec.rb
189
117
  - spec/middleware_spec.rb
190
118
  - spec/response_spec.rb
191
119
  - spec/spec_helper.rb
192
120
  - spec/storage_spec.rb
193
121
  - spec/support/test_app.rb
194
122
  - spec/support/test_server.rb
195
- has_rdoc: