faraday-http-cache 0.1.0 → 0.1.1

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.
@@ -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: