vcr 2.9.3 → 3.0.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.
- checksums.yaml +4 -4
- data/features/about_these_examples.md +1 -1
- data/features/cassettes/automatic_re_recording.feature +4 -4
- data/features/cassettes/decompress.feature +3 -3
- data/features/cassettes/exclusive.feature +11 -8
- data/features/cassettes/format.feature +135 -32
- data/features/cassettes/naming.feature +2 -2
- data/features/cassettes/no_cassette.feature +4 -4
- data/features/configuration/allow_http_connections_when_no_cassette.feature +6 -3
- data/features/configuration/cassette_library_dir.feature +2 -2
- data/features/configuration/debug_logging.feature +15 -8
- data/features/configuration/filter_sensitive_data.feature +8 -7
- data/features/configuration/hook_into.feature +8 -8
- data/features/configuration/ignore_request.feature +13 -14
- data/features/configuration/preserve_exact_body_bytes.feature +5 -5
- data/features/configuration/uri_parser.feature +15 -11
- data/features/hooks/after_http_request.feature +5 -4
- data/features/hooks/around_http_request.feature +3 -3
- data/features/hooks/before_http_request.feature +4 -2
- data/features/hooks/before_playback.feature +14 -15
- data/features/hooks/before_record.feature +10 -10
- data/features/http_libraries/em_http_request.feature +6 -3
- data/features/http_libraries/net_http.feature +15 -5
- data/features/middleware/faraday.feature +2 -2
- data/features/middleware/rack.feature +4 -4
- data/features/record_modes/all.feature +5 -5
- data/features/record_modes/new_episodes.feature +2 -2
- data/features/record_modes/once.feature +3 -3
- data/features/step_definitions/cli_steps.rb +37 -39
- data/features/support/env.rb +29 -26
- data/features/support/http_lib_filters.rb +0 -7
- data/features/test_frameworks/cucumber.feature +11 -10
- data/features/test_frameworks/rspec_macro.feature +5 -30
- data/features/test_frameworks/rspec_metadata.feature +9 -8
- data/features/test_frameworks/test_unit.feature +5 -2
- data/lib/vcr.rb +86 -14
- data/lib/vcr/cassette.rb +4 -2
- data/lib/vcr/cassette/serializers.rb +10 -8
- data/lib/vcr/cassette/serializers/compressed.rb +45 -0
- data/lib/vcr/configuration.rb +38 -17
- data/lib/vcr/library_hooks/fakeweb.rb +1 -0
- data/lib/vcr/library_hooks/faraday.rb +5 -1
- data/lib/vcr/middleware/faraday.rb +13 -9
- data/lib/vcr/test_frameworks/cucumber.rb +39 -5
- data/lib/vcr/version.rb +1 -1
- data/spec/acceptance/concurrency_spec.rb +51 -0
- data/spec/{vcr → lib/vcr}/cassette/erb_renderer_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/cassette/http_interaction_list_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/cassette/migrator_spec.rb +10 -9
- data/spec/{vcr → lib/vcr}/cassette/persisters/file_system_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/cassette/persisters_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/cassette/serializers_spec.rb +8 -2
- data/spec/{vcr → lib/vcr}/cassette_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/configuration_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/deprecations_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/errors_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/extensions/net_http_response_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/library_hooks/excon_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/library_hooks/fakeweb_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/library_hooks/faraday_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/library_hooks/typhoeus_0.4_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/library_hooks/typhoeus_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/library_hooks/webmock_spec.rb +2 -2
- data/spec/{vcr → lib/vcr}/library_hooks_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/middleware/faraday_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/middleware/rack_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/request_ignorer_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/request_matcher_registry_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/structs_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/test_frameworks/cucumber_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/test_frameworks/rspec_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/util/hooks_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/util/internet_connection_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/util/version_checker_spec.rb +0 -0
- data/spec/{vcr → lib/vcr}/version_spec.rb +0 -0
- data/spec/{vcr_spec.rb → lib/vcr_spec.rb} +2 -2
- data/spec/spec_helper.rb +21 -50
- data/spec/support/cucumber_helpers.rb +39 -0
- data/spec/support/limited_uri.rb +1 -11
- data/spec/support/shared_example_groups/hook_into_http_library.rb +2 -1
- data/spec/support/vcr_localhost_server.rb +2 -3
- metadata +475 -123
- data/.gemtest +0 -0
- data/.gitignore +0 -52
- data/.gitmodules +0 -3
- data/.rspec +0 -2
- data/.travis.yml +0 -27
- data/.yardopts +0 -9
- data/Appraisals +0 -5
- data/CHANGELOG.md +0 -987
- data/CONTRIBUTING.md +0 -26
- data/Gemfile +0 -54
- data/Gemfile.lock +0 -159
- data/LICENSE +0 -20
- data/README.md +0 -243
- data/Rakefile +0 -197
- data/Upgrade.md +0 -289
- data/benchmarks/http_stubbing_libraries.rb +0 -59
- data/benchmarks/null_logging.rb +0 -62
- data/cucumber.yml +0 -16
- data/features/.nav +0 -62
- data/features/cassettes/persistence.feature +0 -63
- data/features/support/vcr_cucumber_helpers.rb +0 -46
- data/gemfiles/typhoeus_old.gemfile +0 -34
- data/gemfiles/typhoeus_old.gemfile.lock +0 -133
- data/script/ci.sh +0 -27
- data/spec/capture_warnings.rb +0 -73
- data/spec/quality_spec.rb +0 -51
- data/vcr.gemspec +0 -23
data/features/support/env.rb
CHANGED
|
@@ -1,41 +1,44 @@
|
|
|
1
|
-
require 'rubygems'
|
|
2
1
|
require 'bundler'
|
|
3
2
|
Bundler.setup
|
|
4
3
|
|
|
5
|
-
|
|
4
|
+
ruby_engine = defined?(RUBY_ENGINE) ? RUBY_ENGINE : "ruby"
|
|
6
5
|
|
|
7
6
|
require 'aruba/cucumber'
|
|
8
7
|
require 'aruba/jruby' if RUBY_PLATFORM == 'java'
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
Before do
|
|
16
|
-
load_paths, requires = ['../../lib'], []
|
|
17
|
-
|
|
18
|
-
# Put any bundler-managed gems (such as :git gems) on the load path for when aruba shells out.
|
|
19
|
-
# Alternatively, we could hook up aruba to use bundler when it shells out, but invoking bundler
|
|
20
|
-
# for each and every time aruba starts ruby would slow everything down. We really only need it for
|
|
21
|
-
# bundler-managed gems.
|
|
22
|
-
load_paths.push($LOAD_PATH.grep %r|bundler/gems|)
|
|
23
|
-
|
|
24
|
-
if RUBY_VERSION < '1.9'
|
|
25
|
-
requires << "rubygems"
|
|
9
|
+
gem_specs = Bundler.load.specs
|
|
10
|
+
load_paths = Dir.glob(gem_specs.map { |spec|
|
|
11
|
+
if spec.respond_to?(:lib_dirs_glob)
|
|
12
|
+
spec.lib_dirs_glob
|
|
26
13
|
else
|
|
27
|
-
load_paths
|
|
14
|
+
spec.load_paths
|
|
28
15
|
end
|
|
16
|
+
}.flatten)
|
|
29
17
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
set_env('RUBYOPT', "-I#{load_paths.join(':')} #{requires.join(' ')}")
|
|
18
|
+
load_paths << File.expand_path("../../../spec", __FILE__)
|
|
19
|
+
rubyopt = "-rsupport/cucumber_helpers"
|
|
33
20
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
21
|
+
if RUBY_VERSION > '1.9'
|
|
22
|
+
load_paths.unshift(".")
|
|
23
|
+
rubyopt = "--disable-gems #{rubyopt}" if "ruby" == ruby_engine
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
Before do
|
|
27
|
+
@aruba_timeout_seconds = 30
|
|
28
|
+
if "jruby" == ruby_engine
|
|
29
|
+
@aruba_io_wait_seconds = 0.1
|
|
30
|
+
else
|
|
31
|
+
@aruba_io_wait_seconds = 0.02
|
|
37
32
|
end
|
|
33
|
+
end
|
|
38
34
|
|
|
39
|
-
|
|
35
|
+
Before("~@with-bundler") do
|
|
36
|
+
set_env("RUBYLIB", load_paths.join(":"))
|
|
37
|
+
set_env("RUBYOPT", rubyopt)
|
|
40
38
|
end
|
|
41
39
|
|
|
40
|
+
Before("@with-bundler") do
|
|
41
|
+
set_env("RUBYLIB", ".:#{ENV["RUBYLIB"]}:#{load_paths.last}")
|
|
42
|
+
set_env("RUBYOPT", "#{ENV["RUBYOPT"]} -rsupport/cucumber_helpers")
|
|
43
|
+
set_env("BUNDLE_GEMFILE", Bundler.default_gemfile.expand_path.to_s)
|
|
44
|
+
end
|
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
# make the values of the example row cells available as an array...
|
|
2
|
-
Cucumber::Ast::OutlineTable::ExampleRow.class_eval do
|
|
3
|
-
def cell_values
|
|
4
|
-
@cells.map { |c| c.value }
|
|
5
|
-
end
|
|
6
|
-
end
|
|
7
|
-
|
|
8
1
|
if RUBY_VERSION == '1.8.7'
|
|
9
2
|
# We get timeouts on 1.8.7 w/ Patron for some reason.
|
|
10
3
|
UNSUPPORTED_HTTP_LIBS = %w[ patron ]
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
@with-bundler
|
|
1
2
|
Feature: Usage with Cucumber
|
|
2
3
|
|
|
3
4
|
VCR can be used with cucumber in two basic ways:
|
|
@@ -35,7 +36,7 @@ Feature: Usage with Cucumber
|
|
|
35
36
|
Given a file named "lib/server.rb" with:
|
|
36
37
|
"""ruby
|
|
37
38
|
if ENV['WITH_SERVER'] == 'true'
|
|
38
|
-
|
|
39
|
+
$server = start_sinatra_app do
|
|
39
40
|
get('/:path') { "Hello #{params[:path]}" }
|
|
40
41
|
end
|
|
41
42
|
end
|
|
@@ -49,6 +50,9 @@ Feature: Usage with Cucumber
|
|
|
49
50
|
VCR.configure do |c|
|
|
50
51
|
c.hook_into :webmock
|
|
51
52
|
c.cassette_library_dir = 'features/cassettes'
|
|
53
|
+
c.default_cassette_options = {
|
|
54
|
+
:match_requests_on => [:method, :host, :path]
|
|
55
|
+
}
|
|
52
56
|
end
|
|
53
57
|
|
|
54
58
|
VCR.cucumber_tags do |t|
|
|
@@ -62,15 +66,17 @@ Feature: Usage with Cucumber
|
|
|
62
66
|
require 'net/http'
|
|
63
67
|
|
|
64
68
|
When /^a request is made to "([^"]*)"$/ do |url|
|
|
65
|
-
|
|
69
|
+
uri = URI.parse(url)
|
|
70
|
+
uri.port = $server.port if $server
|
|
71
|
+
@response = Net::HTTP.get_response(uri)
|
|
66
72
|
end
|
|
67
73
|
|
|
68
|
-
When /^(.*) within a cassette named "([^"]*)"$/ do |
|
|
69
|
-
VCR.use_cassette(cassette_name) {
|
|
74
|
+
When /^(.*) within a cassette named "([^"]*)"$/ do |step_name, cassette_name|
|
|
75
|
+
VCR.use_cassette(cassette_name) { step(step_name) }
|
|
70
76
|
end
|
|
71
77
|
|
|
72
78
|
Then /^the response should be "([^"]*)"$/ do |expected_response|
|
|
73
|
-
@response.body.
|
|
79
|
+
expect(@response.body).to eq(expected_response)
|
|
74
80
|
end
|
|
75
81
|
"""
|
|
76
82
|
And a file named "features/vcr_example.feature" with:
|
|
@@ -122,11 +128,6 @@ Feature: Usage with Cucumber
|
|
|
122
128
|
And the directory "features/cassettes" does not exist
|
|
123
129
|
When I run `cucumber WITH_SERVER=true features/vcr_example.feature`
|
|
124
130
|
Then it should fail with "5 scenarios (2 failed, 3 passed)"
|
|
125
|
-
And the output should contain each of the following:
|
|
126
|
-
| An HTTP request has been made that VCR does not know how to handle: |
|
|
127
|
-
| GET http://localhost:7777/disallowed_1 |
|
|
128
|
-
| An HTTP request has been made that VCR does not know how to handle: |
|
|
129
|
-
| GET http://localhost:7777/disallowed_2 |
|
|
130
131
|
And the file "features/cassettes/cucumber_tags/localhost_request.yml" should contain "Hello localhost_request_1"
|
|
131
132
|
And the file "features/cassettes/cucumber_tags/localhost_request.yml" should contain "Hello localhost_request_2"
|
|
132
133
|
And the file "features/cassettes/nested_cassette.yml" should contain "Hello nested_cassette"
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
@with-bundler
|
|
1
2
|
Feature: Usage with RSpec macro
|
|
2
3
|
|
|
3
4
|
VCR provides a macro that makes it easy to use a VCR cassette for an RSpec
|
|
@@ -28,7 +29,7 @@ Feature: Usage with RSpec macro
|
|
|
28
29
|
| spec/cassettes/net_http_example.yml |
|
|
29
30
|
And a file named "spec/sinatra_app.rb" with:
|
|
30
31
|
"""ruby
|
|
31
|
-
|
|
32
|
+
$server = start_sinatra_app do
|
|
32
33
|
get('/') { "Hello" }
|
|
33
34
|
end
|
|
34
35
|
"""
|
|
@@ -38,14 +39,14 @@ Feature: Usage with RSpec macro
|
|
|
38
39
|
|
|
39
40
|
describe "VCR-RSpec integration" do
|
|
40
41
|
def make_http_request
|
|
41
|
-
Net::HTTP.get_response('localhost', '/',
|
|
42
|
+
Net::HTTP.get_response('localhost', '/', $server.port).body
|
|
42
43
|
end
|
|
43
44
|
|
|
44
45
|
context "without an explicit cassette name" do
|
|
45
46
|
use_vcr_cassette
|
|
46
47
|
|
|
47
48
|
it 'records an http request' do
|
|
48
|
-
make_http_request.
|
|
49
|
+
expect(make_http_request).to eq('Hello')
|
|
49
50
|
end
|
|
50
51
|
end
|
|
51
52
|
|
|
@@ -53,7 +54,7 @@ Feature: Usage with RSpec macro
|
|
|
53
54
|
use_vcr_cassette "net_http_example"
|
|
54
55
|
|
|
55
56
|
it 'records an http request' do
|
|
56
|
-
make_http_request.
|
|
57
|
+
expect(make_http_request).to eq('Hello')
|
|
57
58
|
end
|
|
58
59
|
end
|
|
59
60
|
end
|
|
@@ -78,29 +79,3 @@ Feature: Usage with RSpec macro
|
|
|
78
79
|
Then the output should contain "2 examples, 0 failures"
|
|
79
80
|
And the file "spec/cassettes/VCR-RSpec_integration/without_an_explicit_cassette_name.yml" should contain "Hello"
|
|
80
81
|
And the file "spec/cassettes/net_http_example.yml" should contain "Hello"
|
|
81
|
-
|
|
82
|
-
@rspec-1 @exclude-jruby
|
|
83
|
-
Scenario: Use `use_vcr_cassette` macro with RSpec 1
|
|
84
|
-
Given a file named "spec/spec_helper.rb" with:
|
|
85
|
-
"""ruby
|
|
86
|
-
require 'sinatra_app'
|
|
87
|
-
|
|
88
|
-
require 'spec'
|
|
89
|
-
require 'spec/autorun'
|
|
90
|
-
|
|
91
|
-
require 'vcr'
|
|
92
|
-
|
|
93
|
-
VCR.configure do |c|
|
|
94
|
-
c.cassette_library_dir = 'spec/cassettes'
|
|
95
|
-
c.hook_into :webmock
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
Spec::Runner.configure do |c|
|
|
99
|
-
c.extend VCR::RSpec::Macros
|
|
100
|
-
end
|
|
101
|
-
"""
|
|
102
|
-
When I run `spec spec/vcr_example_spec.rb`
|
|
103
|
-
Then the output should contain "2 examples, 0 failures"
|
|
104
|
-
And the file "spec/cassettes/VCR-RSpec_integration/without_an_explicit_cassette_name.yml" should contain "Hello"
|
|
105
|
-
And the file "spec/cassettes/net_http_example.yml" should contain "Hello"
|
|
106
|
-
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
@with-bundler
|
|
1
2
|
Feature: Usage with RSpec metadata
|
|
2
3
|
|
|
3
4
|
VCR provides easy integration with RSpec using metadata. To set this
|
|
@@ -57,35 +58,35 @@ Feature: Usage with RSpec metadata
|
|
|
57
58
|
Scenario: Use `:vcr` metadata
|
|
58
59
|
Given a file named "spec/vcr_example_spec.rb" with:
|
|
59
60
|
"""ruby
|
|
60
|
-
|
|
61
|
+
$server = start_sinatra_app do
|
|
61
62
|
get('/') { "Hello" }
|
|
62
63
|
end
|
|
63
64
|
|
|
64
65
|
def make_http_request
|
|
65
|
-
Net::HTTP.get_response('localhost', '/',
|
|
66
|
+
Net::HTTP.get_response('localhost', '/', $server.port).body
|
|
66
67
|
end
|
|
67
68
|
|
|
68
69
|
require 'spec_helper'
|
|
69
70
|
|
|
70
71
|
describe "VCR example group metadata", :vcr do
|
|
71
72
|
it 'records an http request' do
|
|
72
|
-
make_http_request.
|
|
73
|
+
expect(make_http_request).to eq('Hello')
|
|
73
74
|
end
|
|
74
75
|
|
|
75
76
|
it 'records another http request' do
|
|
76
|
-
make_http_request.
|
|
77
|
+
expect(make_http_request).to eq('Hello')
|
|
77
78
|
end
|
|
78
79
|
|
|
79
80
|
context 'in a nested example group' do
|
|
80
81
|
it 'records another one' do
|
|
81
|
-
make_http_request.
|
|
82
|
+
expect(make_http_request).to eq('Hello')
|
|
82
83
|
end
|
|
83
84
|
end
|
|
84
85
|
end
|
|
85
86
|
|
|
86
87
|
describe "VCR example metadata" do
|
|
87
88
|
it 'records an http request', :vcr do
|
|
88
|
-
make_http_request.
|
|
89
|
+
expect(make_http_request).to eq('Hello')
|
|
89
90
|
end
|
|
90
91
|
end
|
|
91
92
|
"""
|
|
@@ -137,11 +138,11 @@ Feature: Usage with RSpec metadata
|
|
|
137
138
|
vcr_options = { :cassette_name => "example", :record => :new_episodes }
|
|
138
139
|
describe "Using an options hash", :vcr => vcr_options do
|
|
139
140
|
it 'uses the provided cassette name' do
|
|
140
|
-
VCR.current_cassette.name.
|
|
141
|
+
expect(VCR.current_cassette.name).to eq("example")
|
|
141
142
|
end
|
|
142
143
|
|
|
143
144
|
it 'sets the given options' do
|
|
144
|
-
VCR.current_cassette.record_mode.
|
|
145
|
+
expect(VCR.current_cassette.record_mode).to eq(:new_episodes)
|
|
145
146
|
end
|
|
146
147
|
end
|
|
147
148
|
"""
|
|
@@ -6,7 +6,7 @@ Feature: Usage with Test::Unit
|
|
|
6
6
|
Scenario: Use `VCR.use_cassette` in a test
|
|
7
7
|
Given a file named "test/test_server.rb" with:
|
|
8
8
|
"""ruby
|
|
9
|
-
|
|
9
|
+
$server = start_sinatra_app do
|
|
10
10
|
get('/') { "Hello" }
|
|
11
11
|
end
|
|
12
12
|
"""
|
|
@@ -19,6 +19,9 @@ Feature: Usage with Test::Unit
|
|
|
19
19
|
VCR.configure do |c|
|
|
20
20
|
c.hook_into :webmock
|
|
21
21
|
c.cassette_library_dir = 'test/fixtures/vcr_cassettes'
|
|
22
|
+
c.default_cassette_options = {
|
|
23
|
+
:match_requests_on => [:method, :host, :path]
|
|
24
|
+
}
|
|
22
25
|
end
|
|
23
26
|
"""
|
|
24
27
|
And a file named "test/vcr_example_test.rb" with:
|
|
@@ -28,7 +31,7 @@ Feature: Usage with Test::Unit
|
|
|
28
31
|
class VCRExampleTest < Test::Unit::TestCase
|
|
29
32
|
def test_use_vcr
|
|
30
33
|
VCR.use_cassette('test_unit_example') do
|
|
31
|
-
response = Net::HTTP.get_response('localhost', '/',
|
|
34
|
+
response = Net::HTTP.get_response('localhost', '/', $server ? $server.port : 0)
|
|
32
35
|
assert_equal "Hello", response.body
|
|
33
36
|
end
|
|
34
37
|
end
|
data/lib/vcr.rb
CHANGED
|
@@ -22,6 +22,12 @@ module VCR
|
|
|
22
22
|
|
|
23
23
|
extend self
|
|
24
24
|
|
|
25
|
+
# Mutex to synchronize access to cassettes in a threaded environment
|
|
26
|
+
CassetteMutex = Mutex.new
|
|
27
|
+
|
|
28
|
+
# The main thread in which VCR was loaded
|
|
29
|
+
MainThread = Thread.current
|
|
30
|
+
|
|
25
31
|
autoload :CucumberTags, 'vcr/test_frameworks/cucumber'
|
|
26
32
|
autoload :InternetConnection, 'vcr/util/internet_connection'
|
|
27
33
|
|
|
@@ -201,7 +207,7 @@ module VCR
|
|
|
201
207
|
|
|
202
208
|
# @return [VCR::Configuration] the VCR configuration.
|
|
203
209
|
def configuration
|
|
204
|
-
@configuration
|
|
210
|
+
@configuration
|
|
205
211
|
end
|
|
206
212
|
|
|
207
213
|
# Sets up `Before` and `After` cucumber hooks in order to
|
|
@@ -256,13 +262,13 @@ module VCR
|
|
|
256
262
|
"You must eject it before you can turn VCR off."
|
|
257
263
|
end
|
|
258
264
|
|
|
259
|
-
|
|
265
|
+
set_context_value(:ignore_cassettes, options[:ignore_cassettes])
|
|
260
266
|
invalid_options = options.keys - [:ignore_cassettes]
|
|
261
267
|
if invalid_options.any?
|
|
262
268
|
raise ArgumentError.new("You passed some invalid options: #{invalid_options.inspect}")
|
|
263
269
|
end
|
|
264
270
|
|
|
265
|
-
|
|
271
|
+
set_context_value(:turned_off, true)
|
|
266
272
|
end
|
|
267
273
|
|
|
268
274
|
# Turns on VCR, if it has previously been turned off.
|
|
@@ -271,7 +277,7 @@ module VCR
|
|
|
271
277
|
# @see #turned_off
|
|
272
278
|
# @see #turned_on?
|
|
273
279
|
def turn_on!
|
|
274
|
-
|
|
280
|
+
set_context_value(:turned_off, false)
|
|
275
281
|
end
|
|
276
282
|
|
|
277
283
|
# @return whether or not VCR is turned on
|
|
@@ -281,7 +287,7 @@ module VCR
|
|
|
281
287
|
# @see #turn_off!
|
|
282
288
|
# @see #turned_off
|
|
283
289
|
def turned_on?
|
|
284
|
-
|
|
290
|
+
!context_value(:turned_off)
|
|
285
291
|
end
|
|
286
292
|
|
|
287
293
|
# @private
|
|
@@ -293,32 +299,32 @@ module VCR
|
|
|
293
299
|
# @private
|
|
294
300
|
def real_http_connections_allowed?
|
|
295
301
|
return current_cassette.recording? if current_cassette
|
|
296
|
-
!!(configuration.allow_http_connections_when_no_cassette? ||
|
|
302
|
+
!!(configuration.allow_http_connections_when_no_cassette? || !turned_on?)
|
|
297
303
|
end
|
|
298
304
|
|
|
299
305
|
# @return [RequestMatcherRegistry] the request matcher registry
|
|
300
306
|
def request_matchers
|
|
301
|
-
@request_matchers
|
|
307
|
+
@request_matchers
|
|
302
308
|
end
|
|
303
309
|
|
|
304
310
|
# @private
|
|
305
311
|
def request_ignorer
|
|
306
|
-
@request_ignorer
|
|
312
|
+
@request_ignorer
|
|
307
313
|
end
|
|
308
314
|
|
|
309
315
|
# @private
|
|
310
316
|
def library_hooks
|
|
311
|
-
@library_hooks
|
|
317
|
+
@library_hooks
|
|
312
318
|
end
|
|
313
319
|
|
|
314
320
|
# @private
|
|
315
321
|
def cassette_serializers
|
|
316
|
-
@cassette_serializers
|
|
322
|
+
@cassette_serializers
|
|
317
323
|
end
|
|
318
324
|
|
|
319
325
|
# @private
|
|
320
326
|
def cassette_persisters
|
|
321
|
-
@cassette_persisters
|
|
327
|
+
@cassette_persisters
|
|
322
328
|
end
|
|
323
329
|
|
|
324
330
|
# @private
|
|
@@ -329,18 +335,84 @@ module VCR
|
|
|
329
335
|
cassette.record_http_interaction(interaction)
|
|
330
336
|
end
|
|
331
337
|
|
|
338
|
+
# @private
|
|
339
|
+
def link_context(from_thread, to_key)
|
|
340
|
+
@context[to_key] = get_context(from_thread)
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
# @private
|
|
344
|
+
def unlink_context(key)
|
|
345
|
+
@context.delete(key)
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
# @private
|
|
349
|
+
def fibers_available?
|
|
350
|
+
@fibers_available
|
|
351
|
+
end
|
|
352
|
+
|
|
332
353
|
private
|
|
354
|
+
def current_context
|
|
355
|
+
get_context(Thread.current, Fiber.current)
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
def get_context(thread_key, fiber_key = nil)
|
|
359
|
+
context = @context[fiber_key] if fiber_key
|
|
360
|
+
context ||= @context[thread_key]
|
|
361
|
+
if context
|
|
362
|
+
context
|
|
363
|
+
else
|
|
364
|
+
@context[thread_key] = dup_context(@context[MainThread])
|
|
365
|
+
end
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
def context_value(name)
|
|
369
|
+
current_context[name]
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
def set_context_value(name, value)
|
|
373
|
+
current_context[name] = value
|
|
374
|
+
end
|
|
375
|
+
|
|
376
|
+
def dup_context(context)
|
|
377
|
+
{
|
|
378
|
+
:turned_off => context[:turned_off],
|
|
379
|
+
:ignore_cassettes => context[:ignore_cassettes].dup,
|
|
380
|
+
:cassettes => context[:cassettes].dup
|
|
381
|
+
}
|
|
382
|
+
end
|
|
333
383
|
|
|
334
384
|
def ignore_cassettes?
|
|
335
|
-
|
|
385
|
+
context_value(:ignore_cassettes)
|
|
336
386
|
end
|
|
337
387
|
|
|
338
388
|
def cassettes
|
|
339
|
-
|
|
389
|
+
context_value(:cassettes)
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
def initialize_fibers
|
|
393
|
+
begin
|
|
394
|
+
require 'fiber'
|
|
395
|
+
@fibers_available = true
|
|
396
|
+
rescue LoadError
|
|
397
|
+
@fibers_available = false
|
|
398
|
+
end
|
|
340
399
|
end
|
|
341
400
|
|
|
342
401
|
def initialize_ivars
|
|
343
|
-
|
|
402
|
+
initialize_fibers
|
|
403
|
+
@context = {
|
|
404
|
+
MainThread => {
|
|
405
|
+
:turned_off => false,
|
|
406
|
+
:ignore_cassettes => [],
|
|
407
|
+
:cassettes => []
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
@configuration = Configuration.new
|
|
411
|
+
@request_matchers = RequestMatcherRegistry.new
|
|
412
|
+
@request_ignorer = RequestIgnorer.new
|
|
413
|
+
@library_hooks = LibraryHooks.new
|
|
414
|
+
@cassette_serializers = Cassette::Serializers.new
|
|
415
|
+
@cassette_persisters = Cassette::Persisters.new
|
|
344
416
|
end
|
|
345
417
|
|
|
346
418
|
initialize_ivars # to avoid warnings
|