vcr 1.1.2 → 1.2.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/.gitignore +1 -1
- data/.gitmodules +3 -0
- data/CHANGELOG.md +58 -1
- data/Gemfile +2 -4
- data/Gemfile.lock +26 -49
- data/README.md +92 -23
- data/Rakefile +6 -3
- data/features/fixtures/vcr_cassettes/1.9.1/record_all.yml +62 -0
- data/features/fixtures/vcr_cassettes/not_1.9.1/record_all.yml +61 -0
- data/features/http_client.feature +2 -2
- data/features/net_http.feature +15 -4
- data/features/record_response.feature +36 -7
- data/features/replay_recorded_response.feature +8 -8
- data/features/rspec.feature +100 -0
- data/features/step_definitions/net_http_steps.rb +13 -1
- data/features/step_definitions/vcr_steps.rb +26 -16
- data/features/support/env.rb +13 -5
- data/features/webmock.feature +4 -4
- data/lib/vcr.rb +5 -5
- data/lib/vcr/cassette.rb +55 -19
- data/lib/vcr/extensions/net_http.rb +2 -4
- data/lib/vcr/http_stubbing_adapters/fakeweb.rb +0 -4
- data/lib/vcr/http_stubbing_adapters/webmock.rb +2 -9
- data/lib/vcr/internet_connection.rb +13 -0
- data/lib/vcr/ping.rb +26 -0
- data/lib/vcr/rspec.rb +39 -0
- data/lib/vcr/version.rb +1 -1
- data/spec/cassette_spec.rb +160 -69
- data/spec/config_spec.rb +1 -1
- data/spec/cucumber_tags_spec.rb +3 -2
- data/spec/deprecations_spec.rb +1 -1
- data/spec/extensions/net_http_response_spec.rb +2 -4
- data/spec/extensions/net_http_spec.rb +3 -1
- data/spec/fixtures/1.9.1/cassette_spec/with_localhost_requests.yml +23 -0
- data/spec/fixtures/not_1.9.1/cassette_spec/with_localhost_requests.yml +23 -0
- data/spec/http_stubbing_adapters/fakeweb_spec.rb +3 -9
- data/spec/http_stubbing_adapters/webmock_spec.rb +7 -18
- data/spec/internet_connection_spec.rb +19 -0
- data/spec/monkey_patches.rb +45 -6
- data/spec/request_matcher_spec.rb +1 -1
- data/spec/rspec_spec.rb +46 -0
- data/spec/spec_helper.rb +6 -11
- data/spec/structs_spec.rb +1 -1
- data/spec/support/fixnum_extension.rb +10 -0
- data/spec/support/http_library_adapters.rb +31 -2
- data/spec/support/ruby_interpreter.rb +7 -0
- data/spec/support/vcr_localhost_server.rb +86 -44
- data/spec/support/webmock_macros.rb +14 -0
- data/spec/vcr_spec.rb +1 -1
- data/spec/version_spec.rb +1 -1
- data/vcr.gemspec +10 -6
- metadata +155 -39
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
|
1
3
|
module NetHTTPHelpers
|
2
4
|
def perform_net_http_get_with_returning_block(uri, path)
|
3
5
|
Net::HTTP.new(uri.host, uri.port).request(Net::HTTP::Get.new(path, {})) do |response|
|
@@ -34,4 +36,14 @@ When /^I make a returning block Net::HTTP get request to "([^\"]*)"$/ do |url|
|
|
34
36
|
capture_response(url) do |uri, path|
|
35
37
|
perform_net_http_get_with_returning_block(uri, path)
|
36
38
|
end
|
37
|
-
end
|
39
|
+
end
|
40
|
+
|
41
|
+
When /^I make an open uri Net::HTTP get request to "([^"]*)"$/ do |url|
|
42
|
+
capture_response(url) do |uri, path|
|
43
|
+
result = open(url)
|
44
|
+
# #open returns a StringIO rather than a Net::HTTPResponse, so we add #body to make it conform to the same interface
|
45
|
+
def result.body; read; end
|
46
|
+
result
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
@@ -74,9 +74,11 @@ module VCRHelpers
|
|
74
74
|
end
|
75
75
|
|
76
76
|
def recorded_interactions_for(cassette_name)
|
77
|
-
|
78
|
-
|
79
|
-
|
77
|
+
interactions = YAML.load(File.read(file_name(cassette_name)))
|
78
|
+
end
|
79
|
+
|
80
|
+
def file_name(cassette_name)
|
81
|
+
File.join(VCR::Config.cassette_library_dir, "#{cassette_name}.yml")
|
80
82
|
end
|
81
83
|
|
82
84
|
def capture_response(url)
|
@@ -95,12 +97,11 @@ end
|
|
95
97
|
World(VCRHelpers)
|
96
98
|
|
97
99
|
Given /^we do not have a "([^\"]*)" cassette$/ do |cassette_name|
|
98
|
-
|
99
|
-
File.exist?(fixture_file).should be_false
|
100
|
+
File.exist?(file_name(cassette_name)).should be_false
|
100
101
|
end
|
101
102
|
|
102
|
-
Given /^we have a "([^\"]*)" library file with (a|no) previously recorded response for "([^\"]*)"$/ do |
|
103
|
-
fixture_file =
|
103
|
+
Given /^we have a "([^\"]*)" library file with (a|no) previously recorded response for "([^\"]*)"$/ do |cassette_name, a_or_no, url|
|
104
|
+
fixture_file = file_name(cassette_name)
|
104
105
|
File.exist?(fixture_file).should be_true
|
105
106
|
responses = File.open(fixture_file, 'r') { |f| YAML.load(f.read) }
|
106
107
|
should_method = a_or_no == 'a' ? :should : :should_not
|
@@ -154,7 +155,7 @@ When /^I make an HTTP post request to "([^"]*)" with request header "([^"]*)=([^
|
|
154
155
|
end
|
155
156
|
end
|
156
157
|
|
157
|
-
When /^I make (.*) requests? to "([^\"]*)"(?: and "([^\"]*)")?
|
158
|
+
When /^I make (.*) requests? to "([^\"]*)"(?: and "([^\"]*)")? while using the "([^\"]*)" cassette(?: using cassette options: (.*))?$/ do |http_request_type, url1, url2, cassette_name, options|
|
158
159
|
options = options.to_s == '' ? { :record => :new_episodes } : eval(options)
|
159
160
|
urls = [url1, url2].select { |u| u.to_s.size > 0 }
|
160
161
|
VCR.use_cassette(cassette_name, options) do
|
@@ -164,23 +165,24 @@ When /^I make (.*) requests? to "([^\"]*)"(?: and "([^\"]*)")? within the "([^\"
|
|
164
165
|
end
|
165
166
|
end
|
166
167
|
|
167
|
-
When /^I make an HTTP post request to "([^"]*)" with request body "([^"]*)"
|
168
|
+
When /^I make an HTTP post request to "([^"]*)" with request body "([^"]*)" while using the "([^"]*)" cassette(?: using cassette options: (.*))?$/ do |url, request_body, cassette_name, options|
|
168
169
|
options = options.to_s == '' ? { :record => :new_episodes } : eval(options)
|
169
170
|
VCR.use_cassette(cassette_name, options) do
|
170
171
|
When %{I make an HTTP post request to "#{url}" with request body "#{request_body}"}
|
171
172
|
end
|
172
173
|
end
|
173
174
|
|
174
|
-
When /^I make an HTTP post request to "([^"]*)" with request header "([^"]*)=([^"]*)"
|
175
|
+
When /^I make an HTTP post request to "([^"]*)" with request header "([^"]*)=([^"]*)" while using the "([^"]*)" cassette(?: using cassette options: (.*))?$/ do |url, header_key, header_value, cassette_name, options|
|
175
176
|
options = options.to_s == '' ? { :record => :new_episodes } : eval(options)
|
176
177
|
VCR.use_cassette(cassette_name, options) do
|
177
178
|
When %{I make an HTTP post request to "#{url}" with request header "#{header_key}=#{header_value}"}
|
178
179
|
end
|
179
180
|
end
|
180
181
|
|
181
|
-
Then /^the "([^\"]*)" library file should have a response for "([^\"]*)" that matches \/(.+)\/$/ do |cassette_name, url, regex_str|
|
182
|
+
Then /^the "([^\"]*)" library file (should(?: not)?) have a response for "([^\"]*)" that matches \/(.+)\/$/ do |cassette_name, expectation, url, regex_str|
|
183
|
+
expectation = expectation.gsub(' ', '_')
|
182
184
|
interactions = recorded_interactions_for(cassette_name)
|
183
|
-
interactions.
|
185
|
+
interactions.send(expectation, have_expected_response(regex_str, :url => url))
|
184
186
|
end
|
185
187
|
|
186
188
|
Then /^the "([^\"]*)" library file should have exactly (\d+) response$/ do |cassette_name, response_count|
|
@@ -216,8 +218,7 @@ Then /^(?:the )?response(?: (\d+))? for "([^\"]*)" should match \/(.+)\/$/ do |r
|
|
216
218
|
end
|
217
219
|
|
218
220
|
Then /^there should not be a "([^\"]*)" library file$/ do |cassette_name|
|
219
|
-
|
220
|
-
File.exist?(yaml_file).should be_false
|
221
|
+
File.exist?(file_name(cassette_name)).should be_false
|
221
222
|
end
|
222
223
|
|
223
224
|
Given /^the ignore_localhost config setting is set to (true|false)$/ do |value|
|
@@ -228,8 +229,8 @@ Given /^a rack app is running on localhost that returns "([^"]+)" for all reques
|
|
228
229
|
@rack_server = static_rack_server(response_string)
|
229
230
|
end
|
230
231
|
|
231
|
-
When /^I make an HTTP get request to the localhost rack app
|
232
|
-
When %{I make an HTTP get request to "http://localhost:#{@rack_server.port}/"
|
232
|
+
When /^I make an HTTP get request to the localhost rack app while using the "([^\"]*)" cassette$/ do |cassette|
|
233
|
+
When %{I make an HTTP get request to "http://localhost:#{@rack_server.port}/" while using the "#{cassette}" cassette}
|
233
234
|
end
|
234
235
|
|
235
236
|
Then /^the response for the localhost rack app should match \/(.*)\/$/ do |regex|
|
@@ -240,3 +241,12 @@ Given /^the "([^\"]*)" library file has a response for localhost that matches \/
|
|
240
241
|
port = static_rack_server('localhost response').port
|
241
242
|
Given %{the "#{cassette}" library file has a response for "http://localhost:#{port}/" that matches /#{regex}/}
|
242
243
|
end
|
244
|
+
|
245
|
+
Given /^(\d+) days have passed since the "([^"]*)" library file last changed$/ do |day_count, file|
|
246
|
+
last_changed_at = File.new(file_name(file)).mtime
|
247
|
+
Timecop.travel(last_changed_at + day_count.to_i.days)
|
248
|
+
end
|
249
|
+
|
250
|
+
Given /the following files do not exist:/ do |files|
|
251
|
+
check_file_presence(files.raw.map{|file_row| file_row[0]}, false)
|
252
|
+
end
|
data/features/support/env.rb
CHANGED
@@ -19,12 +19,17 @@ World(HTTP_LIBRARY_ADAPTERS[ENV['HTTP_LIB']])
|
|
19
19
|
puts "\n\n---------------- Running features using #{ENV['HTTP_STUBBING_ADAPTER']} and #{ENV['HTTP_LIB']} -----------------\n"
|
20
20
|
|
21
21
|
require 'vcr'
|
22
|
+
require 'ruby_interpreter'
|
22
23
|
require 'vcr_localhost_server'
|
24
|
+
require 'fixnum_extension'
|
23
25
|
|
24
26
|
require 'rubygems'
|
25
27
|
require 'bundler'
|
26
28
|
Bundler.setup
|
27
29
|
|
30
|
+
require 'aruba'
|
31
|
+
require 'timecop'
|
32
|
+
|
28
33
|
begin
|
29
34
|
require 'ruby-debug'
|
30
35
|
Debugger.start
|
@@ -52,6 +57,7 @@ VCR.module_eval do
|
|
52
57
|
end
|
53
58
|
|
54
59
|
After do |scenario|
|
60
|
+
Timecop.return
|
55
61
|
if raised_error = (@http_requests || {}).values.flatten.detect { |result| result.is_a?(Exception) && result.message !~ /VCR/ }
|
56
62
|
raise raised_error
|
57
63
|
end
|
@@ -66,11 +72,13 @@ Before do |scenario|
|
|
66
72
|
FileUtils.rm_rf(temp_dir) if File.exist?(temp_dir)
|
67
73
|
end
|
68
74
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
75
|
+
%w[not_the_real_response record_all].each do |cassette|
|
76
|
+
Before("@copy_#{cassette}_to_temp") do
|
77
|
+
orig_file = File.join(VCR::Config.cassette_library_dir, "#{cassette}.yml")
|
78
|
+
temp_file = File.join(VCR::Config.cassette_library_dir, 'temp', "#{cassette}.yml")
|
79
|
+
FileUtils.mkdir_p(File.join(VCR::Config.cassette_library_dir, 'temp'))
|
80
|
+
FileUtils.cp orig_file, temp_file
|
81
|
+
end
|
74
82
|
end
|
75
83
|
|
76
84
|
Before('@create_replay_localhost_cassette') do
|
data/features/webmock.feature
CHANGED
@@ -6,21 +6,21 @@ Feature: Replay recorded response
|
|
6
6
|
|
7
7
|
Scenario: Use the :match_requests_on option to differentiate requests by request body (for "foo=bar")
|
8
8
|
Given the "match_requests_on" library file has a response for "http://example.com/" with the request body "foo=bar" that matches /foo=bar response/
|
9
|
-
When I make an HTTP post request to "http://example.com/" with request body "foo=bar"
|
9
|
+
When I make an HTTP post request to "http://example.com/" with request body "foo=bar" while using the "match_requests_on" cassette using cassette options: { :match_requests_on => [:uri, :body], :record => :none }
|
10
10
|
Then the response for "http://example.com/" should match /foo=bar response/
|
11
11
|
|
12
12
|
Scenario: Use the :match_requests_on option to differentiate requests by request body (for "bar=bazz")
|
13
13
|
Given the "match_requests_on" library file has a response for "http://example.com/" with the request body "bar=bazz" that matches /bar=bazz response/
|
14
|
-
When I make an HTTP post request to "http://example.com/" with request body "bar=bazz"
|
14
|
+
When I make an HTTP post request to "http://example.com/" with request body "bar=bazz" while using the "match_requests_on" cassette using cassette options: { :match_requests_on => [:uri, :body], :record => :none }
|
15
15
|
Then the response for "http://example.com/" should match /bar=bazz response/
|
16
16
|
|
17
17
|
Scenario: Use the :match_requests_on option to differentiate requests by request header (for "X-HTTP-USER=joe")
|
18
18
|
Given the "match_requests_on" library file has a response for "http://example.com/" with the request header "X-HTTP-USER=joe" that matches /joe response/
|
19
|
-
When I make an HTTP post request to "http://example.com/" with request header "X-HTTP-USER=joe"
|
19
|
+
When I make an HTTP post request to "http://example.com/" with request header "X-HTTP-USER=joe" while using the "match_requests_on" cassette using cassette options: { :match_requests_on => [:uri, :headers], :record => :none }
|
20
20
|
Then the response for "http://example.com/" should match /joe response/
|
21
21
|
|
22
22
|
Scenario: Use the :match_requests_on option to differentiate requests by request header (for "X-HTTP-USER=bob")
|
23
23
|
Given the "match_requests_on" library file has a response for "http://example.com/" with the request header "X-HTTP-USER=bob" that matches /bob response/
|
24
|
-
When I make an HTTP post request to "http://example.com/" with request header "X-HTTP-USER=bob"
|
24
|
+
When I make an HTTP post request to "http://example.com/" with request header "X-HTTP-USER=bob" while using the "match_requests_on" cassette using cassette options: { :match_requests_on => [:uri, :headers], :record => :none }
|
25
25
|
Then the response for "http://example.com/" should match /bob response/
|
26
26
|
|
data/lib/vcr.rb
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
require 'vcr/cassette'
|
2
2
|
require 'vcr/config'
|
3
|
-
require 'vcr/cucumber_tags'
|
4
3
|
require 'vcr/deprecations'
|
5
4
|
require 'vcr/request_matcher'
|
6
5
|
require 'vcr/structs'
|
7
6
|
require 'vcr/version'
|
8
|
-
|
9
|
-
require 'vcr/extensions/net_http_response'
|
10
|
-
|
11
7
|
require 'vcr/http_stubbing_adapters/common'
|
12
8
|
|
13
9
|
module VCR
|
14
10
|
extend self
|
15
11
|
|
16
|
-
|
12
|
+
autoload :CucumberTags, 'vcr/cucumber_tags'
|
13
|
+
autoload :InternetConnection, 'vcr/internet_connection'
|
14
|
+
autoload :RSpec, 'vcr/rspec'
|
15
|
+
|
16
|
+
LOCALHOST_ALIASES = %w( localhost 127.0.0.1 0.0.0.0 )
|
17
17
|
|
18
18
|
def current_cassette
|
19
19
|
cassettes.last
|
data/lib/vcr/cassette.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
require 'yaml'
|
3
3
|
require 'erb'
|
4
|
+
require 'set'
|
4
5
|
|
5
6
|
module VCR
|
6
7
|
class Cassette
|
@@ -12,13 +13,18 @@ module VCR
|
|
12
13
|
|
13
14
|
def initialize(name, options = {})
|
14
15
|
options = VCR::Config.default_cassette_options.merge(options)
|
15
|
-
invalid_options = options.keys - [:record, :erb, :allow_real_http, :match_requests_on]
|
16
|
+
invalid_options = options.keys - [:record, :erb, :allow_real_http, :match_requests_on, :re_record_interval]
|
16
17
|
|
17
18
|
if invalid_options.size > 0
|
18
19
|
raise ArgumentError.new("You passed the following invalid options to VCR::Cassette.new: #{invalid_options.inspect}.")
|
19
20
|
end
|
20
21
|
|
21
|
-
@name
|
22
|
+
@name = name
|
23
|
+
@record_mode = options[:record]
|
24
|
+
@erb = options[:erb]
|
25
|
+
@match_requests_on = options[:match_requests_on]
|
26
|
+
@re_record_interval = options[:re_record_interval]
|
27
|
+
@record_mode = :all if should_re_record?
|
22
28
|
|
23
29
|
deprecate_old_cassette_options(options)
|
24
30
|
raise_error_unless_valid_record_mode(record_mode)
|
@@ -39,7 +45,11 @@ module VCR
|
|
39
45
|
end
|
40
46
|
|
41
47
|
def record_http_interaction(interaction)
|
42
|
-
|
48
|
+
new_recorded_interactions << interaction
|
49
|
+
end
|
50
|
+
|
51
|
+
def new_recorded_interactions
|
52
|
+
@new_recorded_interactions ||= []
|
43
53
|
end
|
44
54
|
|
45
55
|
def file
|
@@ -58,12 +68,23 @@ module VCR
|
|
58
68
|
end
|
59
69
|
end
|
60
70
|
|
61
|
-
def
|
62
|
-
|
71
|
+
def should_re_record?
|
72
|
+
@re_record_interval &&
|
73
|
+
File.exist?(file) &&
|
74
|
+
File.stat(file).mtime + @re_record_interval < Time.now &&
|
75
|
+
InternetConnection.available?
|
63
76
|
end
|
64
77
|
|
65
78
|
def should_allow_http_connections?
|
66
|
-
|
79
|
+
record_mode != :none
|
80
|
+
end
|
81
|
+
|
82
|
+
def should_stub_requests?
|
83
|
+
record_mode != :all
|
84
|
+
end
|
85
|
+
|
86
|
+
def should_remove_matching_existing_interactions?
|
87
|
+
record_mode == :all
|
67
88
|
end
|
68
89
|
|
69
90
|
def set_http_connections_allowed
|
@@ -77,11 +98,9 @@ module VCR
|
|
77
98
|
|
78
99
|
def load_recorded_interactions
|
79
100
|
VCR.http_stubbing_adapter.create_stubs_checkpoint(name)
|
80
|
-
@original_recorded_interactions = []
|
81
|
-
return if record_mode == :all
|
82
101
|
|
83
|
-
if file
|
84
|
-
|
102
|
+
if file && File.exist?(file)
|
103
|
+
begin
|
85
104
|
interactions = YAML.load(raw_yaml_content)
|
86
105
|
|
87
106
|
if VCR.http_stubbing_adapter.ignore_localhost?
|
@@ -90,16 +109,16 @@ module VCR
|
|
90
109
|
end
|
91
110
|
end
|
92
111
|
|
93
|
-
interactions
|
112
|
+
recorded_interactions.replace(interactions)
|
94
113
|
rescue TypeError
|
95
114
|
raise unless raw_yaml_content =~ /VCR::RecordedResponse/
|
96
115
|
raise "The VCR cassette #{sanitized_name}.yml uses an old format that is now deprecated. VCR provides a rake task to migrate your old cassettes to the new format. See http://github.com/myronmarston/vcr/blob/master/CHANGELOG.md for more info."
|
97
|
-
end
|
98
|
-
|
99
|
-
recorded_interactions.replace(@original_recorded_interactions)
|
116
|
+
end
|
100
117
|
end
|
101
118
|
|
102
|
-
|
119
|
+
if should_stub_requests?
|
120
|
+
VCR.http_stubbing_adapter.stub_requests(recorded_interactions, match_requests_on)
|
121
|
+
end
|
103
122
|
end
|
104
123
|
|
105
124
|
@@struct_cache = Hash.new do |hash, attributes|
|
@@ -121,21 +140,38 @@ module VCR
|
|
121
140
|
# instance_eval seems to be the only way to get the binding for ruby 1.9: http://redmine.ruby-lang.org/issues/show/2161
|
122
141
|
template.result(local_variables.instance_eval { binding })
|
123
142
|
rescue NameError => e
|
124
|
-
|
125
|
-
example_hash = (@erb.is_a?(Hash) ? @erb : {}).merge(var_name => 'some value')
|
143
|
+
example_hash = (@erb.is_a?(Hash) ? @erb : {}).merge(e.name => 'some value')
|
126
144
|
|
127
145
|
raise MissingERBVariableError.new(
|
128
|
-
"The ERB in the #{sanitized_name}.yml cassette file references undefined variable #{
|
146
|
+
"The ERB in the #{sanitized_name}.yml cassette file references undefined variable #{e.name}. " +
|
129
147
|
"Pass it to the cassette using :erb => #{ example_hash.inspect }."
|
130
148
|
)
|
131
149
|
end
|
132
150
|
end
|
133
151
|
|
152
|
+
def merged_interactions
|
153
|
+
old_interactions = recorded_interactions
|
154
|
+
|
155
|
+
if should_remove_matching_existing_interactions?
|
156
|
+
match_attributes = match_requests_on
|
157
|
+
|
158
|
+
new_request_matchers = Set.new new_recorded_interactions.map do |i|
|
159
|
+
i.request.matcher(match_attributes)
|
160
|
+
end
|
161
|
+
|
162
|
+
old_interactions = old_interactions.reject do |i|
|
163
|
+
new_request_matchers.include?(i.request.matcher(match_attributes))
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
old_interactions + new_recorded_interactions
|
168
|
+
end
|
169
|
+
|
134
170
|
def write_recorded_interactions_to_disk
|
135
171
|
if VCR::Config.cassette_library_dir && new_recorded_interactions.size > 0
|
136
172
|
directory = File.dirname(file)
|
137
173
|
FileUtils.mkdir_p directory unless File.exist?(directory)
|
138
|
-
File.open(file, 'w') { |f| f.write
|
174
|
+
File.open(file, 'w') { |f| f.write merged_interactions.to_yaml }
|
139
175
|
end
|
140
176
|
end
|
141
177
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'net/http'
|
2
|
+
require 'vcr/extensions/net_http_response'
|
2
3
|
|
3
4
|
module Net
|
4
5
|
class HTTP
|
@@ -9,10 +10,7 @@ module Net
|
|
9
10
|
match_attributes = (cass = VCR.current_cassette) ? cass.match_requests_on : VCR::RequestMatcher::DEFAULT_MATCH_ATTRIBUTES
|
10
11
|
if started? && !VCR.http_stubbing_adapter.request_stubbed?(vcr_request, match_attributes)
|
11
12
|
VCR.record_http_interaction VCR::HTTPInteraction.new(vcr_request, VCR::Response.from_net_http_response(response))
|
12
|
-
|
13
|
-
if VCR.http_stubbing_adapter.should_unwind_response?(response)
|
14
|
-
response.extend VCR::Net::HTTPResponse # "unwind" the response
|
15
|
-
end
|
13
|
+
response.extend VCR::Net::HTTPResponse # "unwind" the response
|
16
14
|
end
|
17
15
|
|
18
16
|
yield response if block_given?
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'webmock'
|
2
|
-
require 'vcr/extensions/net_http'
|
3
2
|
|
4
3
|
module VCR
|
5
4
|
module HttpStubbingAdapters
|
@@ -7,7 +6,7 @@ module VCR
|
|
7
6
|
include VCR::HttpStubbingAdapters::Common
|
8
7
|
extend self
|
9
8
|
|
10
|
-
VERSION_REQUIREMENT = '1.
|
9
|
+
VERSION_REQUIREMENT = '1.4.0'
|
11
10
|
|
12
11
|
def http_connections_allowed?
|
13
12
|
::WebMock::Config.instance.allow_net_connect
|
@@ -59,12 +58,6 @@ module VCR
|
|
59
58
|
::WebMock::Config.instance.allow_localhost
|
60
59
|
end
|
61
60
|
|
62
|
-
def should_unwind_response?(response)
|
63
|
-
class << response
|
64
|
-
!ancestors.include?(::WebMock::Net::HTTPResponse)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
61
|
private
|
69
62
|
|
70
63
|
def version
|
@@ -93,7 +86,7 @@ module VCR
|
|
93
86
|
end
|
94
87
|
end
|
95
88
|
|
96
|
-
WebMock.after_request(:
|
89
|
+
WebMock.after_request(:real_requests_only => true) do |request, response|
|
97
90
|
http_interaction = VCR::HTTPInteraction.new(
|
98
91
|
VCR::Request.new(
|
99
92
|
request.method,
|