vcr 1.8.0 → 1.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +5 -0
- data/CHANGELOG.md +7 -1
- data/Gemfile +1 -0
- data/README.md +8 -4
- data/Rakefile +1 -0
- data/cucumber.yml +4 -0
- data/features/cassettes/format.feature +1 -0
- data/features/cassettes/no_cassette.feature +1 -0
- data/features/cassettes/request_matching.feature +4 -0
- data/features/configuration/filter_sensitive_data.feature +2 -2
- data/features/configuration/ignore_hosts.feature +1 -0
- data/features/configuration/ignore_localhost.feature +3 -0
- data/features/configuration/stub_with.feature +25 -8
- data/features/http_libraries/em_http_request.feature +1 -1
- data/features/step_definitions/cli_steps.rb +18 -9
- data/features/support/http_lib_filters.rb +18 -0
- data/lib/vcr.rb +3 -2
- data/lib/vcr/http_stubbing_adapters/common.rb +1 -0
- data/lib/vcr/http_stubbing_adapters/excon.rb +221 -0
- data/lib/vcr/version.rb +1 -1
- data/script/full_build +1 -1
- data/script/spec +1 -1
- data/spec/spec_helper.rb +4 -8
- data/spec/support/http_library_adapters.rb +24 -1
- data/spec/support/shared_example_groups/http_library.rb +15 -2
- data/spec/vcr/cassette_spec.rb +1 -2
- data/spec/vcr/config_spec.rb +4 -4
- data/spec/vcr/http_stubbing_adapters/excon_spec.rb +23 -0
- data/spec/vcr/request_matcher_spec.rb +1 -1
- data/spec/vcr_spec.rb +2 -1
- data/vcr.gemspec +1 -0
- metadata +35 -16
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
## In git
|
2
2
|
|
3
|
-
[Full Changelog](http://github.com/myronmarston/vcr/compare/v1.
|
3
|
+
[Full Changelog](http://github.com/myronmarston/vcr/compare/v1.9.0...master)
|
4
|
+
|
5
|
+
## 1.9.0 (April 14, 2011)
|
6
|
+
|
7
|
+
[Full Changelog](http://github.com/myronmarston/vcr/compare/v1.8.0...v1.9.0)
|
8
|
+
|
9
|
+
* Add support for [Excon](https://github.com/geemus/excon).
|
4
10
|
|
5
11
|
## 1.8.0 (March 31, 2011)
|
6
12
|
|
data/Gemfile
CHANGED
@@ -33,6 +33,7 @@ group :extras do
|
|
33
33
|
end
|
34
34
|
|
35
35
|
platforms :mri_19 do
|
36
|
+
gem 'linecache19', '0.5.11' # 0.5.12 cannot install on 1.9.1, and 0.5.11 appears to work with both 1.9.1 & 1.9.2
|
36
37
|
gem 'ruby-debug19'
|
37
38
|
gem 'ruby-debug-base19', RUBY_VERSION == '1.9.1' ? '0.11.23' : '~> 0.11.24'
|
38
39
|
end
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# VCR
|
1
|
+
# VCR
|
2
2
|
|
3
3
|
Record your test suite's HTTP interactions and replay them during future test runs for fast, deterministic, accurate tests.
|
4
4
|
|
@@ -15,9 +15,9 @@ Record your test suite's HTTP interactions and replay them during future test ru
|
|
15
15
|
|
16
16
|
class VCRTest < Test::Unit::TestCase
|
17
17
|
def test_example_dot_com
|
18
|
-
VCR.use_cassette('synopsis'
|
19
|
-
response = Net::HTTP.get_response(URI
|
20
|
-
assert_match /
|
18
|
+
VCR.use_cassette('synopsis') do
|
19
|
+
response = Net::HTTP.get_response(URI('http://www.iana.org/domains/example/'))
|
20
|
+
assert_match /Example Domains/, response.body
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
@@ -36,6 +36,7 @@ maintenance) and accurate (the response from example.com will contain the same h
|
|
36
36
|
* [WebMock](https://github.com/bblimke/webmock)
|
37
37
|
* [Typhoeus](https://github.com/dbalatero/typhoeus)
|
38
38
|
* [Faraday](https://github.com/technoweenie/faraday)
|
39
|
+
* [Excon](https://github.com/geemus/excon)
|
39
40
|
* Supports multiple HTTP libraries:
|
40
41
|
* [Patron](http://github.com/toland/patron) (when using WebMock)
|
41
42
|
* [Curb](http://github.com/taf2/curb) (when using WebMock -- only supports Curb::Easy at the moment)
|
@@ -43,6 +44,7 @@ maintenance) and accurate (the response from example.com will contain the same h
|
|
43
44
|
* [em-http-request](http://github.com/igrigorik/em-http-request) (when using WebMock)
|
44
45
|
* [Net::HTTP](http://www.ruby-doc.org/stdlib/libdoc/net/http/rdoc/index.html) (when using FakeWeb and WebMock)
|
45
46
|
* [Typhoeus](https://github.com/dbalatero/typhoeus) (Typhoeus::Hydra, but not Typhoeus::Easy or Typhoeus::Multi)
|
47
|
+
* [Excon](https://github.com/geemus/excon)
|
46
48
|
* [Faraday](https://github.com/technoweenie/faraday)
|
47
49
|
* And of course any library built on Net::HTTP, such as [Mechanize](http://github.com/tenderlove/mechanize),
|
48
50
|
[HTTParty](http://github.com/jnunemaker/httparty) or [Rest Client](http://github.com/archiloque/rest-client).
|
@@ -125,6 +127,8 @@ If you find VCR useful, please recommend me on [working with rails](http://worki
|
|
125
127
|
the inspiration for VCR.
|
126
128
|
* [David Balatero](https://github.com/dbalatero) for help with [Typhoeus](https://github.com/pauldix/typhoeus)
|
127
129
|
support.
|
130
|
+
* [Wesley Beary](https://github.com/geemus) for help with [Excon](https://github.com/geemus/excon)
|
131
|
+
support.
|
128
132
|
|
129
133
|
Thanks also to the following people who have contributed patches or helpful suggestions:
|
130
134
|
|
data/Rakefile
CHANGED
data/cucumber.yml
CHANGED
@@ -7,6 +7,10 @@ interp_opts = if defined?(RUBY_ENGINE)
|
|
7
7
|
else
|
8
8
|
''
|
9
9
|
end
|
10
|
+
|
11
|
+
if ENV['TRAVIS'] && RUBY_VERSION == '1.8.6'
|
12
|
+
interp_opts << ' --tags ~@exclude-travis-186'
|
13
|
+
end
|
10
14
|
%>
|
11
15
|
default: <%= std_opts %><%= interp_opts %> features
|
12
16
|
wip: --tags @wip:30 --wip features<%= interp_opts %>
|
@@ -46,6 +46,7 @@ Feature: Error for HTTP request made when no cassette is in use
|
|
46
46
|
| :webmock | patron | Real HTTP connections are disabled |
|
47
47
|
| :webmock | em-http-request | Real HTTP connections are disabled |
|
48
48
|
| :typhoeus | typhoeus | Real HTTP requests are not allowed |
|
49
|
+
| :excon | excon | Real HTTP connections are disabled |
|
49
50
|
|
50
51
|
Scenario: Temporarily turn VCR off to allow HTTP requests to procede as normal
|
51
52
|
Given a file named "turn_off_vcr.rb" with:
|
@@ -95,6 +95,7 @@ Feature: Request matching
|
|
95
95
|
| :webmock | curb |
|
96
96
|
| :webmock | em-http-request |
|
97
97
|
| :typhoeus | typhoeus |
|
98
|
+
| :excon | excon |
|
98
99
|
|
99
100
|
Scenario Outline: match on host and path (to ignore query params)
|
100
101
|
Given a previously recorded cassette file "cassettes/example.yml" with:
|
@@ -164,6 +165,7 @@ Feature: Request matching
|
|
164
165
|
| :webmock | curb |
|
165
166
|
| :webmock | em-http-request |
|
166
167
|
| :typhoeus | typhoeus |
|
168
|
+
| :excon | excon |
|
167
169
|
|
168
170
|
Scenario Outline: match on request body
|
169
171
|
Given a previously recorded cassette file "cassettes/example.yml" with:
|
@@ -236,6 +238,7 @@ Feature: Request matching
|
|
236
238
|
| :webmock | curb |
|
237
239
|
| :webmock | em-http-request |
|
238
240
|
| :typhoeus | typhoeus |
|
241
|
+
| :excon | excon |
|
239
242
|
|
240
243
|
Scenario Outline: match on request headers
|
241
244
|
Given a previously recorded cassette file "cassettes/example.yml" with:
|
@@ -308,6 +311,7 @@ Feature: Request matching
|
|
308
311
|
| :webmock | curb |
|
309
312
|
| :webmock | em-http-request |
|
310
313
|
| :typhoeus | typhoeus |
|
314
|
+
| :excon | excon |
|
311
315
|
|
312
316
|
Scenario Outline: Use a regex for the request URI
|
313
317
|
Given a previously recorded cassette file "cassettes/example.yml" with:
|
@@ -146,8 +146,8 @@ Feature: Filter sensitive data
|
|
146
146
|
And the file "cassettes/example.yml" should contain "body: john.doe/<PASSWORD>"
|
147
147
|
And the file "cassettes/example.yml" should contain a YAML fragment like:
|
148
148
|
"""
|
149
|
-
|
150
|
-
|
149
|
+
x-http-password:
|
150
|
+
- <PASSWORD>
|
151
151
|
"""
|
152
152
|
|
153
153
|
When I run "ruby dynamic_filtering.rb"
|
@@ -61,6 +61,8 @@ Feature: ignore_localhost
|
|
61
61
|
| :webmock | em-http-request | Real HTTP connections are disabled | c.ignore_localhost = false |
|
62
62
|
| :typhoeus | typhoeus | Real HTTP requests are not allowed | |
|
63
63
|
| :typhoeus | typhoeus | Real HTTP requests are not allowed | c.ignore_localhost = false |
|
64
|
+
| :excon | excon | Real HTTP connections are disabled | |
|
65
|
+
| :excon | excon | Real HTTP connections are disabled | c.ignore_localhost = false |
|
64
66
|
|
65
67
|
Scenario Outline: localhost requests are allowed and not recorded when ignore_localhost = true
|
66
68
|
Given a file named "ignore_localhost_true.rb" with:
|
@@ -100,4 +102,5 @@ Feature: ignore_localhost
|
|
100
102
|
| :webmock | curb |
|
101
103
|
| :webmock | em-http-request |
|
102
104
|
| :typhoeus | typhoeus |
|
105
|
+
| :excon | excon |
|
103
106
|
|
@@ -13,6 +13,7 @@ Feature: stub_with
|
|
13
13
|
- EM HTTP Request
|
14
14
|
- Typhoeus can be used to stub itself (as long as you use Typhoeus::Hydra,
|
15
15
|
but not Typhoeus::Easy or Typhoeus::Multi).
|
16
|
+
- Excon can be used to stub itself.
|
16
17
|
- Faraday can be used (in combination with the provided Faraday middleware)
|
17
18
|
to stub requests made through Faraday (regardless of which Faraday HTTP
|
18
19
|
adapter is used).
|
@@ -30,12 +31,12 @@ Feature: stub_with
|
|
30
31
|
supported HTTP libraries. No monkey patching is used for Typhoeus or
|
31
32
|
Faraday.
|
32
33
|
- FakeWeb and WebMock cannot both be used at the same time.
|
33
|
-
- Typhoeus and Faraday can be used together, and with either
|
34
|
+
- Typhoeus, Excon and Faraday can be used together, and with either
|
34
35
|
FakeWeb or WebMock.
|
35
36
|
|
36
37
|
Regardless of which library you use, VCR takes care of all of the configuration
|
37
38
|
for you. You should not need to interact directly with FakeWeb, WebMock or the
|
38
|
-
stubbing facilities of Typhoeus or Faraday. If/when you decide to change stubbing
|
39
|
+
stubbing facilities of Typhoeus, Excon or Faraday. If/when you decide to change stubbing
|
39
40
|
libraries (i.e. if you initially use FakeWeb because it's faster but later need the
|
40
41
|
additional features of WebMock) you can change the `stub_with` configuration
|
41
42
|
option and it'll work with no other changes required.
|
@@ -52,6 +53,7 @@ Feature: stub_with
|
|
52
53
|
puts "FakeWeb Loaded: #{!!defined?(FakeWeb)}"
|
53
54
|
puts "WebMock Loaded: #{!!defined?(WebMock)}"
|
54
55
|
puts "Typhoeus Loaded: #{!!defined?(Typhoeus)}"
|
56
|
+
puts "Excon Loaded: #{!!defined?(Excon)}"
|
55
57
|
"""
|
56
58
|
When I run "ruby vcr_stub_with.rb"
|
57
59
|
Then the output should contain:
|
@@ -59,13 +61,15 @@ Feature: stub_with
|
|
59
61
|
FakeWeb Loaded: <fakeweb_loaded>
|
60
62
|
WebMock Loaded: <webmock_loaded>
|
61
63
|
Typhoeus Loaded: <typhoeus_loaded>
|
64
|
+
Excon Loaded: <excon_loaded>
|
62
65
|
"""
|
63
66
|
|
64
67
|
Examples:
|
65
|
-
| stub_with | fakeweb_loaded | webmock_loaded | typhoeus_loaded |
|
66
|
-
| :fakeweb | true | false | false |
|
67
|
-
| :webmock | false | true | false |
|
68
|
-
| :typhoeus | false | false | true |
|
68
|
+
| stub_with | fakeweb_loaded | webmock_loaded | typhoeus_loaded | excon_loaded |
|
69
|
+
| :fakeweb | true | false | false | false |
|
70
|
+
| :webmock | false | true | false | false |
|
71
|
+
| :typhoeus | false | false | true | false |
|
72
|
+
| :excon | false | false | false | true |
|
69
73
|
|
70
74
|
Scenario Outline: Record and replay a request using each supported stubbing/http library combination
|
71
75
|
Given a file named "stubbing_http_lib_combo.rb" with:
|
@@ -111,13 +115,15 @@ Feature: stub_with
|
|
111
115
|
| :webmock | curb |
|
112
116
|
| :webmock | em-http-request |
|
113
117
|
| :typhoeus | typhoeus |
|
118
|
+
| :excon | excon |
|
114
119
|
|
115
120
|
@exclude-jruby
|
116
|
-
Scenario Outline: Use Typhoeus and Faraday in combination with FakeWeb or WebMock
|
121
|
+
Scenario Outline: Use Typhoeus, Excon and Faraday in combination with FakeWeb or WebMock
|
117
122
|
Given a file named "stub_with_multiple.rb" with:
|
118
123
|
"""
|
119
124
|
require 'vcr_cucumber_helpers'
|
120
125
|
require 'typhoeus'
|
126
|
+
require 'excon'
|
121
127
|
|
122
128
|
start_sinatra_app(:port => 7777) do
|
123
129
|
get('/:path') { "#{ARGV[0]} #{params[:path]}" }
|
@@ -131,6 +137,10 @@ Feature: stub_with
|
|
131
137
|
Typhoeus::Request.get("http://localhost:7777/typhoeus").body
|
132
138
|
end
|
133
139
|
|
140
|
+
def excon_response
|
141
|
+
Excon.get("http://localhost:7777/excon").body
|
142
|
+
end
|
143
|
+
|
134
144
|
def faraday_response
|
135
145
|
Faraday::Connection.new(:url => 'http://localhost:7777') do |builder|
|
136
146
|
builder.use VCR::Middleware::Faraday do |cassette|
|
@@ -144,17 +154,19 @@ Feature: stub_with
|
|
144
154
|
|
145
155
|
puts "Net::HTTP 1: #{net_http_response}"
|
146
156
|
puts "Typhoeus 1: #{typhoeus_response}"
|
157
|
+
puts "Excon 1: #{excon_response}"
|
147
158
|
|
148
159
|
require 'vcr'
|
149
160
|
|
150
161
|
VCR.config do |c|
|
151
|
-
c.stub_with <stub_with>, :typhoeus, :faraday
|
162
|
+
c.stub_with <stub_with>, :typhoeus, :excon, :faraday
|
152
163
|
c.cassette_library_dir = 'vcr_cassettes'
|
153
164
|
end
|
154
165
|
|
155
166
|
VCR.use_cassette('example', :record => :new_episodes) do
|
156
167
|
puts "Net::HTTP 2: #{net_http_response}"
|
157
168
|
puts "Typhoeus 2: #{typhoeus_response}"
|
169
|
+
puts "Excon 2: #{excon_response}"
|
158
170
|
end
|
159
171
|
|
160
172
|
puts "Faraday: #{faraday_response}"
|
@@ -163,20 +175,25 @@ Feature: stub_with
|
|
163
175
|
Then the output should contain each of the following:
|
164
176
|
| Net::HTTP 1: Hello net_http |
|
165
177
|
| Typhoeus 1: Hello typhoeus |
|
178
|
+
| Excon 1: Hello excon |
|
166
179
|
| Net::HTTP 2: Hello net_http |
|
167
180
|
| Typhoeus 2: Hello typhoeus |
|
181
|
+
| Excon 2: Hello excon |
|
168
182
|
| Faraday: Hello faraday |
|
169
183
|
And the cassette "vcr_cassettes/example.yml" should have the following response bodies:
|
170
184
|
| Hello net_http |
|
171
185
|
| Hello typhoeus |
|
186
|
+
| Hello excon |
|
172
187
|
| Hello faraday |
|
173
188
|
|
174
189
|
When I run "ruby stub_with_multiple.rb 'Goodbye'"
|
175
190
|
Then the output should contain each of the following:
|
176
191
|
| Net::HTTP 1: Goodbye net_http |
|
177
192
|
| Typhoeus 1: Goodbye typhoeus |
|
193
|
+
| Excon 1: Goodbye excon |
|
178
194
|
| Net::HTTP 2: Hello net_http |
|
179
195
|
| Typhoeus 2: Hello typhoeus |
|
196
|
+
| Excon 2: Hello excon |
|
180
197
|
| Faraday: Hello faraday |
|
181
198
|
|
182
199
|
Examples:
|
@@ -34,6 +34,16 @@ module VCRHelpers
|
|
34
34
|
s.response.headers.reject! { |k, v| %w[ server date ].include?(k) }
|
35
35
|
end
|
36
36
|
|
37
|
+
case $stubbing_lib_for_current_scenario
|
38
|
+
when ':excon'
|
39
|
+
# Excon does not expose the status message or http version,
|
40
|
+
# so we have no way to record these attributes.
|
41
|
+
structs.each do |s|
|
42
|
+
s.response.status.message = nil
|
43
|
+
s.response.http_version = nil
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
37
47
|
structs
|
38
48
|
end
|
39
49
|
|
@@ -100,17 +110,16 @@ Then /^the file "([^"]*)" should contain:$/ do |file_name, expected_content|
|
|
100
110
|
end
|
101
111
|
|
102
112
|
Then /^the file "([^"]*)" should contain a YAML fragment like:$/ do |file_name, fragment|
|
103
|
-
|
104
|
-
|
105
|
-
fragment = fragment.split("\n").map { |s| s.rstrip }.join("\n")
|
106
|
-
end
|
113
|
+
in_current_dir do
|
114
|
+
file_content = File.read(file_name)
|
107
115
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
116
|
+
# Normalize by removing leading and trailing whitespace...
|
117
|
+
file_content = file_content.split("\n").map do |line|
|
118
|
+
line.strip
|
119
|
+
end.join("\n")
|
112
120
|
|
113
|
-
|
121
|
+
file_content.should include(fragment)
|
122
|
+
end
|
114
123
|
end
|
115
124
|
|
116
125
|
Then /^the cassette "([^"]*)" should have the following response bodies:$/ do |file, table|
|
@@ -22,6 +22,8 @@ elsif defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
|
|
22
22
|
elsif RUBY_PLATFORM == 'java'
|
23
23
|
# These gems have C extensions and can't install on JRuby.
|
24
24
|
UNSUPPORTED_HTTP_LIBS = %w[ typhoeus patron curb em-http-request ]
|
25
|
+
elsif RUBY_VERSION == '1.8.6' && ENV['TRAVIS']
|
26
|
+
UNSUPPORTED_HTTP_LIBS = %w[ em-http-request ]
|
25
27
|
end
|
26
28
|
|
27
29
|
if defined?(UNSUPPORTED_HTTP_LIBS)
|
@@ -35,3 +37,19 @@ if defined?(UNSUPPORTED_HTTP_LIBS)
|
|
35
37
|
end
|
36
38
|
end
|
37
39
|
|
40
|
+
stubbing_libs = %w[ :fakeweb :webmock :typhoeus :faraday :excon ]
|
41
|
+
|
42
|
+
# Set a global based on the current stubbing lib so we can put special-case
|
43
|
+
# logic in our step definitions based on the http stubbing library.
|
44
|
+
Before do |scenario|
|
45
|
+
if scenario.respond_to?(:cell_values)
|
46
|
+
stub_with = stubbing_libs & scenario.cell_values
|
47
|
+
if stub_with.size == 1
|
48
|
+
$stubbing_lib_for_current_scenario = stub_with.first
|
49
|
+
else
|
50
|
+
$stubbing_lib_for_current_scenario = nil
|
51
|
+
end
|
52
|
+
else
|
53
|
+
$stubbing_lib_for_current_scenario = nil
|
54
|
+
end
|
55
|
+
end
|
data/lib/vcr.rb
CHANGED
@@ -140,10 +140,11 @@ module VCR
|
|
140
140
|
|
141
141
|
def adapter_for(lib)
|
142
142
|
case lib
|
143
|
+
when :excon; HttpStubbingAdapters::Excon
|
143
144
|
when :fakeweb; HttpStubbingAdapters::FakeWeb
|
144
|
-
when :webmock; HttpStubbingAdapters::WebMock
|
145
|
-
when :typhoeus; HttpStubbingAdapters::Typhoeus
|
146
145
|
when :faraday; HttpStubbingAdapters::Faraday
|
146
|
+
when :typhoeus; HttpStubbingAdapters::Typhoeus
|
147
|
+
when :webmock; HttpStubbingAdapters::WebMock
|
147
148
|
else raise ArgumentError.new("#{lib.inspect} is not a supported HTTP stubbing library.")
|
148
149
|
end
|
149
150
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
module VCR
|
2
2
|
module HttpStubbingAdapters
|
3
|
+
autoload :Excon, 'vcr/http_stubbing_adapters/excon'
|
3
4
|
autoload :FakeWeb, 'vcr/http_stubbing_adapters/fakeweb'
|
4
5
|
autoload :Faraday, 'vcr/http_stubbing_adapters/faraday'
|
5
6
|
autoload :MultiObjectProxy, 'vcr/http_stubbing_adapters/multi_object_proxy'
|
@@ -0,0 +1,221 @@
|
|
1
|
+
require 'excon'
|
2
|
+
|
3
|
+
module VCR
|
4
|
+
module HttpStubbingAdapters
|
5
|
+
module Excon
|
6
|
+
include VCR::HttpStubbingAdapters::Common
|
7
|
+
extend self
|
8
|
+
|
9
|
+
class HttpConnectionNotAllowedError < StandardError; end
|
10
|
+
|
11
|
+
MINIMUM_VERSION = '0.6.2'
|
12
|
+
MAXIMUM_VERSION = '0.6'
|
13
|
+
|
14
|
+
attr_writer :http_connections_allowed
|
15
|
+
|
16
|
+
def http_connections_allowed?
|
17
|
+
!!@http_connections_allowed
|
18
|
+
end
|
19
|
+
|
20
|
+
def ignored_hosts=(hosts)
|
21
|
+
@ignored_hosts = hosts
|
22
|
+
end
|
23
|
+
|
24
|
+
def uri_should_be_ignored?(uri)
|
25
|
+
uri = URI.parse(uri) unless uri.respond_to?(:host)
|
26
|
+
ignored_hosts.include?(uri.host)
|
27
|
+
end
|
28
|
+
|
29
|
+
def stub_requests(http_interactions, match_attributes)
|
30
|
+
match_attributes_stack << match_attributes
|
31
|
+
grouped_responses(http_interactions, match_attributes).each do |request_matcher, responses|
|
32
|
+
queue = stub_queues[request_matcher]
|
33
|
+
responses.each { |res| queue << res }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def create_stubs_checkpoint(cassette)
|
38
|
+
checkpoints[cassette] = stub_queue_dup
|
39
|
+
end
|
40
|
+
|
41
|
+
def restore_stubs_checkpoint(cassette)
|
42
|
+
match_attributes_stack.pop
|
43
|
+
@stub_queues = checkpoints.delete(cassette) || super
|
44
|
+
end
|
45
|
+
|
46
|
+
def stubbed_response_for(request)
|
47
|
+
return nil unless match_attributes_stack.any?
|
48
|
+
request_matcher = request.matcher(match_attributes_stack.last)
|
49
|
+
queue = stub_queues[request_matcher]
|
50
|
+
return queue.shift if queue.size > 1
|
51
|
+
queue.first
|
52
|
+
end
|
53
|
+
|
54
|
+
def reset!
|
55
|
+
instance_variables.each do |ivar|
|
56
|
+
remove_instance_variable(ivar)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def version
|
63
|
+
::Excon::VERSION
|
64
|
+
end
|
65
|
+
|
66
|
+
def ignored_hosts
|
67
|
+
@ignored_hosts ||= []
|
68
|
+
end
|
69
|
+
|
70
|
+
def checkpoints
|
71
|
+
@checkpoints ||= {}
|
72
|
+
end
|
73
|
+
|
74
|
+
def stub_queues
|
75
|
+
@stub_queues ||= hash_of_arrays
|
76
|
+
end
|
77
|
+
|
78
|
+
def match_attributes_stack
|
79
|
+
@match_attributes_stack ||= []
|
80
|
+
end
|
81
|
+
|
82
|
+
def stub_queue_dup
|
83
|
+
dup = hash_of_arrays
|
84
|
+
|
85
|
+
stub_queues.each do |k, v|
|
86
|
+
dup[k] = v.dup
|
87
|
+
end
|
88
|
+
|
89
|
+
dup
|
90
|
+
end
|
91
|
+
|
92
|
+
def hash_of_arrays
|
93
|
+
Hash.new { |h, k| h[k] = [] }
|
94
|
+
end
|
95
|
+
|
96
|
+
class RequestHandler
|
97
|
+
attr_reader :params
|
98
|
+
def initialize(params)
|
99
|
+
@params = params
|
100
|
+
end
|
101
|
+
|
102
|
+
def handle
|
103
|
+
case
|
104
|
+
when request_should_be_ignored?
|
105
|
+
perform_real_request
|
106
|
+
when stubbed_response
|
107
|
+
stubbed_response
|
108
|
+
when http_connections_allowed?
|
109
|
+
record_interaction
|
110
|
+
else
|
111
|
+
raise_connections_disabled_error
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
private
|
116
|
+
|
117
|
+
def request_should_be_ignored?
|
118
|
+
VCR::HttpStubbingAdapters::Excon.uri_should_be_ignored?(uri)
|
119
|
+
end
|
120
|
+
|
121
|
+
def stubbed_response
|
122
|
+
unless defined?(@stubbed_response)
|
123
|
+
@stubbed_response = VCR::HttpStubbingAdapters::Excon.stubbed_response_for(vcr_request)
|
124
|
+
|
125
|
+
if @stubbed_response && @stubbed_response.headers
|
126
|
+
@stubbed_response.headers = normalized_headers(@stubbed_response.headers)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
@stubbed_response
|
131
|
+
end
|
132
|
+
|
133
|
+
def http_connections_allowed?
|
134
|
+
VCR::HttpStubbingAdapters::Excon.http_connections_allowed?
|
135
|
+
end
|
136
|
+
|
137
|
+
def perform_real_request
|
138
|
+
connection = ::Excon.new(uri)
|
139
|
+
response = connection.request(params.merge(:mock => false))
|
140
|
+
|
141
|
+
yield response if block_given?
|
142
|
+
|
143
|
+
response.attributes
|
144
|
+
end
|
145
|
+
|
146
|
+
def record_interaction
|
147
|
+
perform_real_request do |response|
|
148
|
+
if VCR::HttpStubbingAdapters::Excon.enabled?
|
149
|
+
http_interaction = http_interaction_for(response)
|
150
|
+
VCR.record_http_interaction(http_interaction)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
def uri
|
156
|
+
@uri ||= begin
|
157
|
+
uri = "#{params[:scheme]}://#{params[:host]}:#{params[:port]}#{params[:path]}"
|
158
|
+
uri << "?#{params[:query]}" if params[:query]
|
159
|
+
uri
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def http_interaction_for(response)
|
164
|
+
VCR::HTTPInteraction.new \
|
165
|
+
vcr_request,
|
166
|
+
vcr_response(response)
|
167
|
+
end
|
168
|
+
|
169
|
+
def vcr_request
|
170
|
+
@vcr_request ||= begin
|
171
|
+
headers = params[:headers].dup
|
172
|
+
headers.delete("Host")
|
173
|
+
|
174
|
+
VCR::Request.new \
|
175
|
+
params[:method],
|
176
|
+
uri,
|
177
|
+
params[:body],
|
178
|
+
headers
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
def vcr_response(response)
|
183
|
+
VCR::Response.new \
|
184
|
+
VCR::ResponseStatus.new(response.status, nil),
|
185
|
+
response.headers,
|
186
|
+
response.body,
|
187
|
+
nil
|
188
|
+
end
|
189
|
+
|
190
|
+
def normalized_headers(headers)
|
191
|
+
normalized = {}
|
192
|
+
headers.each do |k, v|
|
193
|
+
v = v.join(', ') if v.respond_to?(:join)
|
194
|
+
normalized[normalize_header_key(k)] = v
|
195
|
+
end
|
196
|
+
normalized
|
197
|
+
end
|
198
|
+
|
199
|
+
def normalize_header_key(key)
|
200
|
+
key.split('-'). # 'user-agent' => %w(user agent)
|
201
|
+
each { |w| w.capitalize! }. # => %w(User Agent)
|
202
|
+
join('-')
|
203
|
+
end
|
204
|
+
|
205
|
+
def raise_connections_disabled_error
|
206
|
+
raise HttpConnectionNotAllowedError.new(
|
207
|
+
"Real HTTP connections are disabled. Request: #{params[:method]} #{uri}"
|
208
|
+
)
|
209
|
+
end
|
210
|
+
|
211
|
+
::Excon.stub({}) do |params|
|
212
|
+
self.new(params).handle
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
Excon.mock = true
|
221
|
+
VCR::HttpStubbingAdapters::Common.add_vcr_info_to_exception_message(VCR::HttpStubbingAdapters::Excon::HttpConnectionNotAllowedError)
|
data/lib/vcr/version.rb
CHANGED
data/script/full_build
CHANGED
@@ -1 +1 @@
|
|
1
|
-
rvm 1.8.6,1.8.7,1.9.1,1.9.2,ree,rbx rake -f script/FullBuildRakeFile build
|
1
|
+
rvm 1.8.6,1.8.7,1.9.1,1.9.2,ree,rbx rake -f script/FullBuildRakeFile build | tee tmp/full_build.out
|
data/script/spec
CHANGED
@@ -1 +1 @@
|
|
1
|
-
rvm 1.8.6,1.8.7,1.9.1,1.9.2,ree,rbx rake -f script/FullBuildRakeFile spec
|
1
|
+
rvm 1.8.6,1.8.7,1.9.1,1.9.2,ree,rbx rake -f script/FullBuildRakeFile spec | tee tmp/spec.out
|
data/spec/spec_helper.rb
CHANGED
@@ -43,7 +43,9 @@ RSpec.configure do |config|
|
|
43
43
|
config.color_enabled = true
|
44
44
|
config.debug = (using_git && RUBY_INTERPRETER == :mri)
|
45
45
|
|
46
|
+
tmp_dir = File.expand_path('../../tmp/cassette_library_dir', __FILE__)
|
46
47
|
config.before(:each) do
|
48
|
+
VCR::Config.cassette_library_dir = tmp_dir
|
47
49
|
VCR.turn_on! unless VCR.turned_on?
|
48
50
|
VCR.eject_cassette while VCR.current_cassette
|
49
51
|
|
@@ -56,17 +58,11 @@ RSpec.configure do |config|
|
|
56
58
|
FakeWeb.clean_registry
|
57
59
|
|
58
60
|
VCR::HttpStubbingAdapters::Faraday.reset!
|
59
|
-
|
60
|
-
|
61
|
-
# Ensure each example uses a different cassette library to keep them isolated.
|
62
|
-
config.around(:each) do |example|
|
63
|
-
Dir.mktmpdir do |dir|
|
64
|
-
VCR::Config.cassette_library_dir = dir
|
65
|
-
example.run
|
66
|
-
end
|
61
|
+
VCR::HttpStubbingAdapters::Excon.reset!
|
67
62
|
end
|
68
63
|
|
69
64
|
config.after(:each) do
|
65
|
+
FileUtils.rm_rf tmp_dir
|
70
66
|
VCR::HttpStubbingAdapters::Common.adapters.each do |a|
|
71
67
|
a.ignored_hosts = []
|
72
68
|
end
|
@@ -11,7 +11,14 @@ HTTP_LIBRARY_ADAPTERS['net/http'] = Module.new do
|
|
11
11
|
|
12
12
|
def make_http_request(method, url, body = nil, headers = {})
|
13
13
|
uri = URI.parse(url)
|
14
|
-
Net::HTTP.new(uri.host, uri.port)
|
14
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
15
|
+
|
16
|
+
if uri.scheme == "https"
|
17
|
+
http.use_ssl = true
|
18
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
19
|
+
end
|
20
|
+
|
21
|
+
http.send_request(method.to_s.upcase, uri.request_uri, body, headers)
|
15
22
|
end
|
16
23
|
end
|
17
24
|
|
@@ -112,6 +119,22 @@ HTTP_LIBRARY_ADAPTERS['typhoeus'] = Module.new do
|
|
112
119
|
end
|
113
120
|
end
|
114
121
|
|
122
|
+
HTTP_LIBRARY_ADAPTERS['excon'] = Module.new do
|
123
|
+
def self.http_library_name; "Excon"; end
|
124
|
+
|
125
|
+
def get_body_string(response)
|
126
|
+
response.body
|
127
|
+
end
|
128
|
+
|
129
|
+
def get_header(header_key, response)
|
130
|
+
response.headers[header_key]
|
131
|
+
end
|
132
|
+
|
133
|
+
def make_http_request(method, url, body = nil, headers = {})
|
134
|
+
Excon.send(method, url, :body => body, :headers => headers)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
115
138
|
%w[ net_http typhoeus patron ].each do |_faraday_adapter|
|
116
139
|
HTTP_LIBRARY_ADAPTERS["faraday-#{_faraday_adapter}"] = Module.new do
|
117
140
|
class << self; self; end.class_eval do
|
@@ -7,7 +7,15 @@ shared_examples_for "an http library" do |library, supported_request_match_attri
|
|
7
7
|
raise ArgumentError.new("No http library adapter module could be found for #{library}")
|
8
8
|
end
|
9
9
|
|
10
|
-
|
10
|
+
http_lib_unsupported = if RUBY_INTERPRETER == :mri
|
11
|
+
# em-http-request is causing issues on 1.8.6 on travis like:
|
12
|
+
# ruby: symbol lookup error: /home/travis/.rvm/gems/ruby-1.8.6-p420/gems/em-http-request-0.3.0/lib/http11_client.so: undefined symbol: rb_hash_lookup
|
13
|
+
library =~ /em-http/ && RUBY_VERSION == '1.8.6' && ENV['TRAVIS']
|
14
|
+
else
|
15
|
+
library =~ /(typhoeus|curb|patron|em-http)/
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "using #{adapter_module.http_library_name}", :unless => http_lib_unsupported do
|
11
19
|
include adapter_module
|
12
20
|
|
13
21
|
# Necessary for ruby 1.9.2. On 1.9.2 we get an error when we use super,
|
@@ -79,6 +87,9 @@ shared_examples_for "an http library" do |library, supported_request_match_attri
|
|
79
87
|
end
|
80
88
|
end
|
81
89
|
|
90
|
+
test_url "using https and no explicit port", "https://example.com/foo"
|
91
|
+
test_url "using https and port 443", "https://example.com:443/foo"
|
92
|
+
test_url "using https and some other port", "https://example.com:5190/foo"
|
82
93
|
test_url "that has query params", "http://example.com/search?q=param"
|
83
94
|
test_url "with spaces encoded as +", "http://example.com/search?q=a+b"
|
84
95
|
test_url "with spaces encoded as %20", "http://example.com/search?q=a%20b"
|
@@ -307,7 +318,9 @@ shared_examples_for "an http library" do |library, supported_request_match_attri
|
|
307
318
|
end unless other.include?(:does_not_support_rotating_responses)
|
308
319
|
|
309
320
|
it "correctly handles stubbing multiple values for the same header" do
|
310
|
-
get_header('Set-Cookie', make_http_request(:get, 'http://example.com/two_set_cookie_headers'))
|
321
|
+
header = get_header('Set-Cookie', make_http_request(:get, 'http://example.com/two_set_cookie_headers'))
|
322
|
+
header = header.split(', ') if header.respond_to?(:split)
|
323
|
+
header.should =~ ['bar=bazz', 'foo=bar']
|
311
324
|
end
|
312
325
|
|
313
326
|
context 'when we restore our previous check point' do
|
data/spec/vcr/cassette_spec.rb
CHANGED
@@ -80,13 +80,12 @@ describe VCR::Cassette do
|
|
80
80
|
|
81
81
|
describe "reading the file from disk" do
|
82
82
|
before(:each) do
|
83
|
-
VCR::Config.cassette_library_dir = "cassette_lib"
|
84
83
|
File.stub(:size? => true)
|
85
84
|
end
|
86
85
|
|
87
86
|
it 'reads the appropriate file from disk using a VCR::Cassette::Reader' do
|
88
87
|
VCR::Cassette::Reader.should_receive(:new).with(
|
89
|
-
|
88
|
+
"#{VCR::Config.cassette_library_dir}/foo.yml", anything
|
90
89
|
).and_return(mock('reader', :read => VCR::YAML.dump([])))
|
91
90
|
|
92
91
|
VCR::Cassette.new('foo', :record => :new_episodes)
|
data/spec/vcr/config_spec.rb
CHANGED
@@ -7,11 +7,11 @@ describe VCR::Config do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
describe '.cassette_library_dir=' do
|
10
|
+
let(:tmp_dir) { VCR::SPEC_ROOT + '/../tmp/cassette_library_dir/new_dir' }
|
11
|
+
after(:each) { FileUtils.rm_rf tmp_dir }
|
12
|
+
|
10
13
|
it 'creates the directory if it does not exist' do
|
11
|
-
|
12
|
-
dir += '/cassettes'
|
13
|
-
expect { VCR::Config.cassette_library_dir = dir }.to change { File.exist?(dir) }.from(false).to(true)
|
14
|
-
end
|
14
|
+
expect { VCR::Config.cassette_library_dir = tmp_dir }.to change { File.exist?(tmp_dir) }.from(false).to(true)
|
15
15
|
end
|
16
16
|
|
17
17
|
it 'does not raise an error if given nil' do
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe VCR::HttpStubbingAdapters::Excon, :without_monkey_patches => :vcr do
|
4
|
+
it_behaves_like 'an http stubbing adapter',
|
5
|
+
['excon'],
|
6
|
+
[:method, :uri, :host, :path, :body, :headers],
|
7
|
+
:status_message_not_exposed
|
8
|
+
|
9
|
+
it_performs('version checking',
|
10
|
+
:valid => %w[ 0.6.2 0.6.99 ],
|
11
|
+
:too_low => %w[ 0.5.99 0.6.1 ],
|
12
|
+
:too_high => %w[ 0.7.0 1.0.0 ]
|
13
|
+
) do
|
14
|
+
before(:each) { @orig_version = Excon::VERSION }
|
15
|
+
after(:each) { Excon::VERSION = @orig_version }
|
16
|
+
|
17
|
+
# Cannot be regular method def as that raises a "dynamic constant assignment" error
|
18
|
+
define_method :stub_version do |version|
|
19
|
+
Excon::VERSION = version
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
@@ -40,7 +40,7 @@ describe VCR::RequestMatcher do
|
|
40
40
|
|
41
41
|
for_matcher :path do
|
42
42
|
it("matches a basic URL for the same path") { should =~ 'http://domain.tld/path/to/something?p=v&q=r' }
|
43
|
-
it("matches an https URL") { should =~ '
|
43
|
+
it("matches an https URL") { should =~ 'https://domain.tld/path/to/something?p=v&q=r' }
|
44
44
|
it("ignores the case of the URL") { should =~ 'HTTP://DOMAIN.TLD/PATH/TO/SOMETHING?P=V&Q=R' }
|
45
45
|
it("matches with a trailing slash") { should =~ 'http://domain.tld/path/to/something/' }
|
46
46
|
it("matches without a trailing slash") { should =~ 'http://domain.tld/path/to/something' }
|
data/spec/vcr_spec.rb
CHANGED
@@ -147,7 +147,8 @@ describe VCR do
|
|
147
147
|
{
|
148
148
|
:fakeweb => VCR::HttpStubbingAdapters::FakeWeb,
|
149
149
|
:webmock => VCR::HttpStubbingAdapters::WebMock,
|
150
|
-
:faraday => VCR::HttpStubbingAdapters::Faraday
|
150
|
+
:faraday => VCR::HttpStubbingAdapters::Faraday,
|
151
|
+
:excon => VCR::HttpStubbingAdapters::Excon
|
151
152
|
}.each do |symbol, klass|
|
152
153
|
it "returns #{klass} for :#{symbol}" do
|
153
154
|
VCR::Config.stub_with symbol
|
data/vcr.gemspec
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vcr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 51
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
-
-
|
8
|
+
- 9
|
9
9
|
- 0
|
10
|
-
version: 1.
|
10
|
+
version: 1.9.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Myron Marston
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-04-14 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -197,8 +197,24 @@ dependencies:
|
|
197
197
|
- !ruby/object:Gem::Dependency
|
198
198
|
prerelease: false
|
199
199
|
type: :development
|
200
|
-
name:
|
200
|
+
name: excon
|
201
201
|
version_requirements: &id012 !ruby/object:Gem::Requirement
|
202
|
+
none: false
|
203
|
+
requirements:
|
204
|
+
- - ~>
|
205
|
+
- !ruby/object:Gem::Version
|
206
|
+
hash: 3
|
207
|
+
segments:
|
208
|
+
- 0
|
209
|
+
- 6
|
210
|
+
- 2
|
211
|
+
version: 0.6.2
|
212
|
+
requirement: *id012
|
213
|
+
- !ruby/object:Gem::Dependency
|
214
|
+
prerelease: false
|
215
|
+
type: :development
|
216
|
+
name: cucumber
|
217
|
+
version_requirements: &id013 !ruby/object:Gem::Requirement
|
202
218
|
none: false
|
203
219
|
requirements:
|
204
220
|
- - ~>
|
@@ -209,12 +225,12 @@ dependencies:
|
|
209
225
|
- 9
|
210
226
|
- 4
|
211
227
|
version: 0.9.4
|
212
|
-
requirement: *
|
228
|
+
requirement: *id013
|
213
229
|
- !ruby/object:Gem::Dependency
|
214
230
|
prerelease: false
|
215
231
|
type: :development
|
216
232
|
name: webmock
|
217
|
-
version_requirements: &
|
233
|
+
version_requirements: &id014 !ruby/object:Gem::Requirement
|
218
234
|
none: false
|
219
235
|
requirements:
|
220
236
|
- - ~>
|
@@ -225,12 +241,12 @@ dependencies:
|
|
225
241
|
- 6
|
226
242
|
- 0
|
227
243
|
version: 1.6.0
|
228
|
-
requirement: *
|
244
|
+
requirement: *id014
|
229
245
|
- !ruby/object:Gem::Dependency
|
230
246
|
prerelease: false
|
231
247
|
type: :development
|
232
248
|
name: curb
|
233
|
-
version_requirements: &
|
249
|
+
version_requirements: &id015 !ruby/object:Gem::Requirement
|
234
250
|
none: false
|
235
251
|
requirements:
|
236
252
|
- - "="
|
@@ -241,12 +257,12 @@ dependencies:
|
|
241
257
|
- 7
|
242
258
|
- 8
|
243
259
|
version: 0.7.8
|
244
|
-
requirement: *
|
260
|
+
requirement: *id015
|
245
261
|
- !ruby/object:Gem::Dependency
|
246
262
|
prerelease: false
|
247
263
|
type: :development
|
248
264
|
name: patron
|
249
|
-
version_requirements: &
|
265
|
+
version_requirements: &id016 !ruby/object:Gem::Requirement
|
250
266
|
none: false
|
251
267
|
requirements:
|
252
268
|
- - "="
|
@@ -257,12 +273,12 @@ dependencies:
|
|
257
273
|
- 4
|
258
274
|
- 9
|
259
275
|
version: 0.4.9
|
260
|
-
requirement: *
|
276
|
+
requirement: *id016
|
261
277
|
- !ruby/object:Gem::Dependency
|
262
278
|
prerelease: false
|
263
279
|
type: :development
|
264
280
|
name: em-http-request
|
265
|
-
version_requirements: &
|
281
|
+
version_requirements: &id017 !ruby/object:Gem::Requirement
|
266
282
|
none: false
|
267
283
|
requirements:
|
268
284
|
- - ~>
|
@@ -273,12 +289,12 @@ dependencies:
|
|
273
289
|
- 3
|
274
290
|
- 0
|
275
291
|
version: 0.3.0
|
276
|
-
requirement: *
|
292
|
+
requirement: *id017
|
277
293
|
- !ruby/object:Gem::Dependency
|
278
294
|
prerelease: false
|
279
295
|
type: :development
|
280
296
|
name: typhoeus
|
281
|
-
version_requirements: &
|
297
|
+
version_requirements: &id018 !ruby/object:Gem::Requirement
|
282
298
|
none: false
|
283
299
|
requirements:
|
284
300
|
- - ~>
|
@@ -289,7 +305,7 @@ dependencies:
|
|
289
305
|
- 2
|
290
306
|
- 1
|
291
307
|
version: 0.2.1
|
292
|
-
requirement: *
|
308
|
+
requirement: *id018
|
293
309
|
description: VCR provides a simple API to record and replay your test suite's HTTP interactions. It works with a variety of HTTP client libraries, HTTP stubbing libraries and testing frameworks.
|
294
310
|
email: myron.marston@gmail.com
|
295
311
|
executables: []
|
@@ -359,6 +375,7 @@ files:
|
|
359
375
|
- lib/vcr/extensions/net_http.rb
|
360
376
|
- lib/vcr/extensions/net_http_response.rb
|
361
377
|
- lib/vcr/http_stubbing_adapters/common.rb
|
378
|
+
- lib/vcr/http_stubbing_adapters/excon.rb
|
362
379
|
- lib/vcr/http_stubbing_adapters/fakeweb.rb
|
363
380
|
- lib/vcr/http_stubbing_adapters/faraday.rb
|
364
381
|
- lib/vcr/http_stubbing_adapters/multi_object_proxy.rb
|
@@ -430,6 +447,7 @@ files:
|
|
430
447
|
- spec/vcr/deprecations/http_stubbing_adapters/fakeweb_spec.rb
|
431
448
|
- spec/vcr/extensions/net_http_response_spec.rb
|
432
449
|
- spec/vcr/extensions/net_http_spec.rb
|
450
|
+
- spec/vcr/http_stubbing_adapters/excon_spec.rb
|
433
451
|
- spec/vcr/http_stubbing_adapters/fakeweb_spec.rb
|
434
452
|
- spec/vcr/http_stubbing_adapters/faraday_spec.rb
|
435
453
|
- spec/vcr/http_stubbing_adapters/multi_object_proxy_spec.rb
|
@@ -562,6 +580,7 @@ test_files:
|
|
562
580
|
- spec/vcr/deprecations/http_stubbing_adapters/fakeweb_spec.rb
|
563
581
|
- spec/vcr/extensions/net_http_response_spec.rb
|
564
582
|
- spec/vcr/extensions/net_http_spec.rb
|
583
|
+
- spec/vcr/http_stubbing_adapters/excon_spec.rb
|
565
584
|
- spec/vcr/http_stubbing_adapters/fakeweb_spec.rb
|
566
585
|
- spec/vcr/http_stubbing_adapters/faraday_spec.rb
|
567
586
|
- spec/vcr/http_stubbing_adapters/multi_object_proxy_spec.rb
|