ephemeral_response 0.2.1 → 0.3.0
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.
- data/README.markdown +31 -1
- data/VERSION +1 -1
- data/examples/custom_cache_key.rb +28 -0
- data/lib/ephemeral_response.rb +1 -1
- data/lib/ephemeral_response/configuration.rb +9 -0
- data/lib/ephemeral_response/fixture.rb +9 -11
- data/spec/ephemeral_response/configuration_spec.rb +14 -3
- data/spec/ephemeral_response/fixture_spec.rb +19 -4
- data/spec/integration/custom_identifier_spec.rb +27 -0
- metadata +8 -4
data/README.markdown
CHANGED
@@ -56,6 +56,34 @@ I'd recommend git ignoring this directory to ensure your tests always hit the
|
|
56
56
|
remote service at least once and to prevent credentials (like API keys) from
|
57
57
|
being stored in your repo.
|
58
58
|
|
59
|
+
### Customize how requests get matched by the cache
|
60
|
+
|
61
|
+
For any given host a block of code can be run to determine the cache key for
|
62
|
+
the request. The request object is yielded to the block and can be used to
|
63
|
+
create the unique key for that request. An example may help clear this up.
|
64
|
+
|
65
|
+
EphemeralResponse.configure do |config|
|
66
|
+
config.register('example.com') do |request|
|
67
|
+
"#{request.method}{request.path}"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# This will be cached
|
72
|
+
Net::HTTP.start('example.com') do |http|
|
73
|
+
get = Net::HTTP::Get.new('/')
|
74
|
+
get['Date'] = Time.now.to_s
|
75
|
+
http.request(get)
|
76
|
+
end
|
77
|
+
|
78
|
+
# This will read from the cache even though the date is different
|
79
|
+
Net::HTTP.start('example.com') do |http|
|
80
|
+
get = Net::HTTP::Get.new('/')
|
81
|
+
get['Date'] = "Wed Dec 31 19:00:00 -0500 1969"
|
82
|
+
http.request(get)
|
83
|
+
end
|
84
|
+
|
85
|
+
Take a look in `examples/custom_cache_key.rb` to see this in action.
|
86
|
+
|
59
87
|
### Configuration
|
60
88
|
|
61
89
|
Change the fixture directory; defaults to "spec/fixtures/ephemeral\_response"
|
@@ -73,11 +101,13 @@ method `one_day`
|
|
73
101
|
one_day * 30 # Expire in thirty days: 60 * 60 * 24 * 30
|
74
102
|
end
|
75
103
|
|
104
|
+
#### Selenium
|
105
|
+
|
76
106
|
Always allow requests to be made to a host by adding it to the white list.
|
77
107
|
Helpful when running ephemeral response with selenium which makes requests to
|
78
108
|
the local server.
|
79
109
|
|
80
|
-
EphemeralResponse::Configuration.white_list = "localhost", "
|
110
|
+
EphemeralResponse::Configuration.white_list = "localhost", "127.0.0.1"
|
81
111
|
|
82
112
|
Never let fixtures expire by setting skip\_expiration to true.
|
83
113
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
@@ -0,0 +1,28 @@
|
|
1
|
+
$LOAD_PATH.unshift("lib")
|
2
|
+
require 'rubygems'
|
3
|
+
require 'lib/ephemeral_response'
|
4
|
+
require 'benchmark'
|
5
|
+
|
6
|
+
EphemeralResponse::Configuration.expiration = 15
|
7
|
+
EphemeralResponse.activate
|
8
|
+
|
9
|
+
EphemeralResponse.configure do |config|
|
10
|
+
config.register('example.com') do |request|
|
11
|
+
"#{request.method}#{request.path}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def benchmark_request(number=1)
|
16
|
+
uri = URI.parse('http://example.com/')
|
17
|
+
time = Benchmark.realtime do
|
18
|
+
Net::HTTP.start(uri.host) do |http|
|
19
|
+
get = Net::HTTP::Get.new('/')
|
20
|
+
get['Date'] = Time.now.to_s
|
21
|
+
http.request(get)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
sleep 1
|
25
|
+
puts "Request #{number} took #{time} secs"
|
26
|
+
end
|
27
|
+
|
28
|
+
5.times {|n| benchmark_request n + 1 }
|
data/lib/ephemeral_response.rb
CHANGED
@@ -19,11 +19,20 @@ module EphemeralResponse
|
|
19
19
|
@expiration || one_day
|
20
20
|
end
|
21
21
|
|
22
|
+
def host_registry
|
23
|
+
@host_registry ||= Hash.new(lambda {})
|
24
|
+
end
|
25
|
+
|
26
|
+
def register(host, &block)
|
27
|
+
host_registry[host] = block
|
28
|
+
end
|
29
|
+
|
22
30
|
def reset
|
23
31
|
@expiration = nil
|
24
32
|
@fixture_directory = nil
|
25
33
|
@white_list = nil
|
26
34
|
@skip_expiration = nil
|
35
|
+
@host_registry = nil
|
27
36
|
end
|
28
37
|
|
29
38
|
def skip_expiration
|
@@ -53,12 +53,6 @@ module EphemeralResponse
|
|
53
53
|
yield self if block_given?
|
54
54
|
end
|
55
55
|
|
56
|
-
def ==(other)
|
57
|
-
%w(request_identifier uri_identifier created_at response).all? do |attribute|
|
58
|
-
send(attribute) == other.send(attribute)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
56
|
def expired?
|
63
57
|
!Configuration.skip_expiration && (created_at + Configuration.expiration) < Time.now
|
64
58
|
end
|
@@ -68,7 +62,7 @@ module EphemeralResponse
|
|
68
62
|
end
|
69
63
|
|
70
64
|
def identifier
|
71
|
-
Digest::SHA1.hexdigest(
|
65
|
+
Digest::SHA1.hexdigest(registered_identifier || default_identifier)
|
72
66
|
end
|
73
67
|
|
74
68
|
def method
|
@@ -94,10 +88,6 @@ module EphemeralResponse
|
|
94
88
|
end
|
95
89
|
end
|
96
90
|
|
97
|
-
def request_identifier
|
98
|
-
request.to_yaml.split(//).sort
|
99
|
-
end
|
100
|
-
|
101
91
|
def save
|
102
92
|
FileUtils.mkdir_p Configuration.fixture_directory
|
103
93
|
File.open(path, 'w') do |f|
|
@@ -121,8 +111,16 @@ module EphemeralResponse
|
|
121
111
|
Marshal.load(Marshal.dump(object))
|
122
112
|
end
|
123
113
|
|
114
|
+
def default_identifier
|
115
|
+
"#{uri_identifier}#{request.method}#{request.body}"
|
116
|
+
end
|
117
|
+
|
124
118
|
def generate_file_name
|
125
119
|
"#{normalized_name}_#{identifier[0..6]}.yml"
|
126
120
|
end
|
121
|
+
|
122
|
+
def registered_identifier
|
123
|
+
identity = Configuration.host_registry[uri.host].call(request) and identity.to_s
|
124
|
+
end
|
127
125
|
end
|
128
126
|
end
|
@@ -71,14 +71,17 @@ describe EphemeralResponse::Configuration do
|
|
71
71
|
subject.skip_expiration.should == false
|
72
72
|
end
|
73
73
|
|
74
|
-
it "resets expiration, fixture directory, expiration, and white list to the defaults" do
|
75
|
-
end
|
76
|
-
|
77
74
|
it "resets white list after the default has been modified" do
|
78
75
|
subject.white_list << "localhost"
|
79
76
|
subject.reset
|
80
77
|
subject.white_list.should be_empty
|
81
78
|
end
|
79
|
+
|
80
|
+
it "resets the host_registry" do
|
81
|
+
subject.register('example.com') {}
|
82
|
+
subject.reset
|
83
|
+
subject.host_registry.should be_empty
|
84
|
+
end
|
82
85
|
end
|
83
86
|
|
84
87
|
describe "#white_list" do
|
@@ -116,4 +119,12 @@ describe EphemeralResponse::Configuration do
|
|
116
119
|
subject.skip_expiration.should == false
|
117
120
|
end
|
118
121
|
end
|
122
|
+
|
123
|
+
describe "#register" do
|
124
|
+
it "registers the block for the host" do
|
125
|
+
block = Proc.new {}
|
126
|
+
subject.register('example.com', &block)
|
127
|
+
subject.host_registry['example.com'].should == block
|
128
|
+
end
|
129
|
+
end
|
119
130
|
end
|
@@ -197,10 +197,26 @@ describe EphemeralResponse::Fixture do
|
|
197
197
|
let(:uri) { URI.parse "http://example.com/" }
|
198
198
|
subject { EphemeralResponse::Fixture.new uri, request }
|
199
199
|
|
200
|
-
|
201
|
-
|
202
|
-
|
200
|
+
context "without a registration for the host" do
|
201
|
+
it "hashes the uri_identifier with method and the post body" do
|
202
|
+
Digest::SHA1.should_receive(:hexdigest).with("#{subject.uri_identifier}#{request.method}#{request.body}")
|
203
|
+
subject.identifier
|
204
|
+
end
|
203
205
|
end
|
206
|
+
|
207
|
+
context "with a registration for the host" do
|
208
|
+
|
209
|
+
it "returns the hash of the block's return value as a string" do
|
210
|
+
EphemeralResponse.configure {|c| c.register('example.com') {|request| :identifier } }
|
211
|
+
subject.identifier.should == Digest::SHA1.hexdigest(:identifier.to_s)
|
212
|
+
end
|
213
|
+
|
214
|
+
it "returns the hash of the default identifier when the block returns nil" do
|
215
|
+
EphemeralResponse.configure {|c| c.register('example.com') {|request| } }
|
216
|
+
subject.identifier.should == Digest::SHA1.hexdigest(subject.send(:default_identifier))
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
204
220
|
end
|
205
221
|
|
206
222
|
describe "#uri_identifier" do
|
@@ -322,6 +338,5 @@ describe EphemeralResponse::Fixture do
|
|
322
338
|
end
|
323
339
|
end
|
324
340
|
end
|
325
|
-
|
326
341
|
end
|
327
342
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Custom Identifiers' do
|
4
|
+
let(:uri) { URI.parse("http://localhost:9876/") }
|
5
|
+
let(:http) { Net::HTTP.new uri.host, uri.port }
|
6
|
+
let(:post) { Net::HTTP::Post.new '/' }
|
7
|
+
|
8
|
+
before do
|
9
|
+
clear_fixtures
|
10
|
+
post.set_form_data :same => :new
|
11
|
+
EphemeralResponse.configure do |config|
|
12
|
+
config.register(uri.host) do |request|
|
13
|
+
request.body.split("=").first
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
EphemeralResponse::RackReflector.while_running do
|
18
|
+
@post_response = http.start {|h| h.request(post) }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
it "returns the same fixture when the post data is slightly different" do
|
23
|
+
post.set_form_data :same => :different
|
24
|
+
http.start {|h| h.request(post) }.body.should == @post_response.body
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 3
|
8
|
+
- 0
|
9
|
+
version: 0.3.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Sandro Turriate
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-06-
|
17
|
+
date: 2010-06-29 00:00:00 -04:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -89,6 +89,7 @@ files:
|
|
89
89
|
- README.markdown
|
90
90
|
- Rakefile
|
91
91
|
- VERSION
|
92
|
+
- examples/custom_cache_key.rb
|
92
93
|
- examples/simple_benchmark.rb
|
93
94
|
- examples/white_list.rb
|
94
95
|
- lib/ephemeral_response.rb
|
@@ -99,6 +100,7 @@ files:
|
|
99
100
|
- spec/ephemeral_response/fixture_spec.rb
|
100
101
|
- spec/ephemeral_response/net_http_spec.rb
|
101
102
|
- spec/ephemeral_response_spec.rb
|
103
|
+
- spec/integration/custom_identifier_spec.rb
|
102
104
|
- spec/integration/normal_flow_spec.rb
|
103
105
|
- spec/integration/unique_fixtures_spec.rb
|
104
106
|
- spec/integration/white_list_spec.rb
|
@@ -143,6 +145,7 @@ test_files:
|
|
143
145
|
- spec/ephemeral_response/fixture_spec.rb
|
144
146
|
- spec/ephemeral_response/net_http_spec.rb
|
145
147
|
- spec/ephemeral_response_spec.rb
|
148
|
+
- spec/integration/custom_identifier_spec.rb
|
146
149
|
- spec/integration/normal_flow_spec.rb
|
147
150
|
- spec/integration/unique_fixtures_spec.rb
|
148
151
|
- spec/integration/white_list_spec.rb
|
@@ -151,5 +154,6 @@ test_files:
|
|
151
154
|
- spec/support/fakefs_ext.rb
|
152
155
|
- spec/support/rack_reflector.rb
|
153
156
|
- spec/support/time.rb
|
157
|
+
- examples/custom_cache_key.rb
|
154
158
|
- examples/simple_benchmark.rb
|
155
159
|
- examples/white_list.rb
|