vcr 1.9.0 → 1.10.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/.travis.yml CHANGED
@@ -1,9 +1,11 @@
1
- script: "rake ci:build"
1
+ script: "bundle exec rake ci:build"
2
2
  rvm:
3
3
  - 1.8.6
4
4
  - 1.8.7
5
5
  - 1.9.1
6
6
  - 1.9.2
7
7
  - ree
8
- - rbx
9
8
  - jruby
9
+ - rbx
10
+ env:
11
+ - CI=true
data/CHANGELOG.md CHANGED
@@ -1,6 +1,20 @@
1
1
  ## In git
2
2
 
3
- [Full Changelog](http://github.com/myronmarston/vcr/compare/v1.9.0...master)
3
+ [Full Changelog](http://github.com/myronmarston/vcr/compare/v1.10.0...master)
4
+
5
+ ## 1.10.0 (May 18, 2011)
6
+
7
+ [Full Changelog](http://github.com/myronmarston/vcr/compare/v1.9.0...v1.10.0)
8
+
9
+ * Fix header normalization so that it properly handles nested arrays and
10
+ non-string values.
11
+ * Add cucumber scenario documenting how VCR sanitizes cassette names
12
+ to "normal" file names (i.e. only alphanumerics, no spaces).
13
+ * Add `:ignore_cassettes` option to `VCR.turn_off!`. This causes
14
+ cassette insertions to be ignored rather than to trigger an error.
15
+ Patch provided by [Justin Smestad](https://github.com/jsmestad).
16
+ * Fix rack middleware to make it threadsafe.
17
+ * Update to latest RSpec (rspec 2.6).
4
18
 
5
19
  ## 1.9.0 (April 14, 2011)
6
20
 
data/README.md CHANGED
@@ -4,28 +4,30 @@ Record your test suite's HTTP interactions and replay them during future test ru
4
4
 
5
5
  ## Synopsis
6
6
 
7
- require 'rubygems'
8
- require 'test/unit'
9
- require 'vcr'
10
-
11
- VCR.config do |c|
12
- c.cassette_library_dir = 'fixtures/vcr_cassettes'
13
- c.stub_with :webmock # or :fakeweb
14
- end
15
-
16
- class VCRTest < Test::Unit::TestCase
17
- def test_example_dot_com
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
- end
22
- end
7
+ ``` ruby
8
+ require 'rubygems'
9
+ require 'test/unit'
10
+ require 'vcr'
11
+
12
+ VCR.config do |c|
13
+ c.cassette_library_dir = 'fixtures/vcr_cassettes'
14
+ c.stub_with :webmock # or :fakeweb
15
+ end
16
+
17
+ class VCRTest < Test::Unit::TestCase
18
+ def test_example_dot_com
19
+ VCR.use_cassette('synopsis') do
20
+ response = Net::HTTP.get_response(URI('http://www.iana.org/domains/example/'))
21
+ assert_match /Example Domains/, response.body
23
22
  end
23
+ end
24
+ end
25
+ ```
24
26
 
25
27
  Run this test once, and VCR will record the http request to `fixtures/vcr_cassettes/synopsis.yml`. Run it again, and VCR
26
- will replay the response from example.com when the http request is made. This test is now fast (no real HTTP requests are
27
- made anymore), deterministic (the test will continue to pass, even if you are offline, or example.com goes down for
28
- maintenance) and accurate (the response from example.com will contain the same headers and body you get from a real request).
28
+ will replay the response from iana.org when the http request is made. This test is now fast (no real HTTP requests are
29
+ made anymore), deterministic (the test will continue to pass, even if you are offline, or iana.org goes down for
30
+ maintenance) and accurate (the response will contain the same headers and body you get from a real request).
29
31
 
30
32
  ## Features
31
33
 
@@ -39,7 +41,7 @@ maintenance) and accurate (the response from example.com will contain the same h
39
41
  * [Excon](https://github.com/geemus/excon)
40
42
  * Supports multiple HTTP libraries:
41
43
  * [Patron](http://github.com/toland/patron) (when using WebMock)
42
- * [Curb](http://github.com/taf2/curb) (when using WebMock -- only supports Curb::Easy at the moment)
44
+ * [Curb](http://github.com/taf2/curb) (when using WebMock -- only supports Curl::Easy at the moment)
43
45
  * [HTTPClient](http://github.com/nahi/httpclient) (when using WebMock)
44
46
  * [em-http-request](http://github.com/igrigorik/em-http-request) (when using WebMock)
45
47
  * [Net::HTTP](http://www.ruby-doc.org/stdlib/libdoc/net/http/rdoc/index.html) (when using FakeWeb and WebMock)
@@ -136,6 +138,7 @@ Thanks also to the following people who have contributed patches or helpful sugg
136
138
  * [Bartosz Blimke](http://github.com/bblimke)
137
139
  * [Ben Hutton](http://github.com/benhutton)
138
140
  * [Eric Allam](http://github.com/rubymaverick)
141
+ * [Justin Smestad](https://github.com/jsmestad)
139
142
  * [Karl Baum](https://github.com/kbaum)
140
143
  * [Nathaniel Bibler](https://github.com/nbibler)
141
144
  * [Oliver Searle-Barnes](https://github.com/opsb)
data/features/.nav CHANGED
@@ -4,6 +4,7 @@
4
4
  - LICENSE.md (License)
5
5
  - cassettes:
6
6
  - format.feature
7
+ - naming.feature
7
8
  - no_cassette.feature
8
9
  - request_matching.feature
9
10
  - dynamic_erb.feature
@@ -0,0 +1,29 @@
1
+ Feature: Naming
2
+
3
+ When inserting or using a cassette, the first argument is the cassette name.
4
+ You can use any string for the name. VCR will sanitize the string before
5
+ using it as a file name, so that it is a file-system friendly file name.
6
+
7
+ Scenario: Name sanitizing
8
+ Given a file named "name_sanitizing.rb" with:
9
+ """
10
+ require 'vcr_cucumber_helpers'
11
+
12
+ start_sinatra_app(:port => 7777) do
13
+ get('/') { "Hello" }
14
+ end
15
+
16
+ require 'vcr'
17
+
18
+ VCR.config do |c|
19
+ c.cassette_library_dir = 'cassettes'
20
+ c.stub_with :fakeweb
21
+ end
22
+
23
+ VCR.use_cassette('Fee, Fi Fo Fum', :record => :new_episodes) do
24
+ Net::HTTP.get_response('localhost', '/', 7777)
25
+ end
26
+ """
27
+ And the directory "cassettes" does not exist
28
+ When I run "ruby name_sanitizing.rb"
29
+ Then the file "cassettes/Fee_Fi_Fo_Fum.yml" should contain "body: Hello"
@@ -11,7 +11,10 @@ Feature: Error for HTTP request made when no cassette is in use
11
11
  (see configuration/allow_http_connections_when_no_cassette.feature) or
12
12
  you can temporarily turn VCR off:
13
13
 
14
- - `VCR.turn_off!` => turn VCR off so HTTP requests are allowed
14
+ - `VCR.turn_off!` => turn VCR off so HTTP requests are allowed.
15
+ Cassette insertions will trigger an error.
16
+ - `VCR.turn_off!(:ignore_cassettes => true)` => turn
17
+ VCR off and ignore cassette insertions (so that no error is raised).
15
18
  - `VCR.turn_on!` => turn VCR back on
16
19
  - `VCR.turned_off { ... }` => turn VCR off for the duration of the
17
20
  provided block.
@@ -104,3 +107,45 @@ Feature: Error for HTTP request made when no cassette is in use
104
107
  Error: Real HTTP connections are disabled.
105
108
  """
106
109
 
110
+ Scenario: Turning VCR off prevents cassettes from being inserted
111
+ Given a file named "turn_off_vcr_and_insert_cassette.rb" with:
112
+ """
113
+ require 'vcr'
114
+
115
+ VCR.config do |c|
116
+ c.stub_with :fakeweb
117
+ end
118
+
119
+ VCR.turn_off!
120
+ VCR.insert_cassette('example')
121
+ """
122
+ When I run "ruby turn_off_vcr_and_insert_cassette.rb"
123
+ Then it should fail with "VCR is turned off. You must turn it on before you can insert a cassette."
124
+
125
+ Scenario: Turning VCR off with `:ignore_cassettes => true` ignores cassettes
126
+ Given a file named "turn_off_vcr_and_insert_cassette.rb" with:
127
+ """
128
+ require 'vcr_cucumber_helpers'
129
+
130
+ start_sinatra_app(:port => 7777) do
131
+ get('/') { 'Hello' }
132
+ end
133
+
134
+ require 'vcr'
135
+
136
+ VCR.config do |c|
137
+ c.cassette_library_dir = 'cassettes'
138
+ c.stub_with :fakeweb
139
+ end
140
+
141
+ VCR.turn_off!(:ignore_cassettes => true)
142
+
143
+ VCR.use_cassette('example') do
144
+ response = Net::HTTP.get_response('localhost', '/', 7777).body
145
+ puts "Response: #{response}"
146
+ end
147
+ """
148
+ When I run "ruby turn_off_vcr_and_insert_cassette.rb"
149
+ Then it should pass with "Response: Hello"
150
+ And the file "cassettes/example.yml" should not exist
151
+
@@ -9,7 +9,7 @@ Feature: stub_with
9
9
  - Net::HTTP
10
10
  - HTTPClient
11
11
  - Patron
12
- - Curb (Curb::Easy, but not Curb::Multi)
12
+ - Curb (Curl::Easy, but not Curl::Multi)
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).
@@ -22,16 +22,20 @@ Feature: Usage with Cucumber
22
22
  last argument to `#tag` or `#tags`.
23
23
 
24
24
  Scenario: Record HTTP interactions in a scenario by tagging it
25
- Given a file named "features/support/vcr.rb" with:
25
+ Given a file named "lib/server.rb" with:
26
26
  """
27
- require 'vcr_cucumber_helpers.rb'
27
+ require 'vcr_cucumber_helpers'
28
28
 
29
29
  if ENV['WITH_SERVER'] == 'true'
30
30
  start_sinatra_app(:port => 7777) do
31
31
  get('/:path') { "Hello #{params[:path]}" }
32
32
  end
33
33
  end
34
+ """
34
35
 
36
+ Given a file named "features/support/vcr.rb" with:
37
+ """
38
+ require "lib/server"
35
39
  require 'vcr'
36
40
 
37
41
  VCR.config do |c|
data/lib/vcr.rb CHANGED
@@ -48,17 +48,19 @@ module VCR
48
48
  end
49
49
 
50
50
  def insert_cassette(name, options = {})
51
- unless turned_on?
52
- raise TurnedOffError.new("VCR is turned off. You must turn it on before you can insert a cassette.")
53
- end
51
+ if turned_on?
52
+ if cassettes.any? { |c| c.name == name }
53
+ raise ArgumentError.new("There is already a cassette with the same name (#{name}). You cannot nest multiple cassettes with the same name.")
54
+ end
54
55
 
55
- if cassettes.any? { |c| c.name == name }
56
- raise ArgumentError.new("There is already a cassette with the same name (#{name}). You cannot nest multiple cassettes with the same name.")
56
+ cassette = Cassette.new(name, options)
57
+ cassettes.push(cassette)
58
+ cassette
59
+ elsif !ignore_cassettes?
60
+ message = "VCR is turned off. You must turn it on before you can insert a cassette. " +
61
+ "Or you can use the `:ignore_cassette => true` option to completely ignore cassette insertions."
62
+ raise TurnedOffError.new(message)
57
63
  end
58
-
59
- cassette = Cassette.new(name, options)
60
- cassettes.push(cassette)
61
- cassette
62
64
  end
63
65
 
64
66
  def eject_cassette
@@ -108,8 +110,8 @@ module VCR
108
110
  cassette.record_http_interaction(interaction)
109
111
  end
110
112
 
111
- def turned_off
112
- turn_off!
113
+ def turned_off(options = {})
114
+ turn_off!(options)
113
115
 
114
116
  begin
115
117
  yield
@@ -118,11 +120,17 @@ module VCR
118
120
  end
119
121
  end
120
122
 
121
- def turn_off!
123
+ def turn_off!(options = {})
122
124
  if VCR.current_cassette
123
125
  raise CassetteInUseError.new("A VCR cassette is currently in use. You must eject it before you can turn VCR off.")
124
126
  end
125
127
 
128
+ @ignore_cassettes = options[:ignore_cassettes]
129
+ invalid_options = options.keys - [:ignore_cassettes]
130
+ if invalid_options.any?
131
+ raise ArgumentError.new("You passed some invalid options: #{invalid_options.inspect}")
132
+ end
133
+
126
134
  VCR.http_stubbing_adapter.http_connections_allowed = true
127
135
  @turned_off = true
128
136
  end
@@ -136,6 +144,10 @@ module VCR
136
144
  !@turned_off
137
145
  end
138
146
 
147
+ def ignore_cassettes?
148
+ @ignore_cassettes
149
+ end
150
+
139
151
  private
140
152
 
141
153
  def adapter_for(lib)
@@ -3,9 +3,16 @@ module VCR
3
3
  class Rack
4
4
  include Common
5
5
 
6
+ def initialize(*args)
7
+ @mutex = Mutex.new
8
+ super
9
+ end
10
+
6
11
  def call(env)
7
- VCR.use_cassette(*cassette_arguments(env)) do
8
- @app.call(env)
12
+ @mutex.synchronize do
13
+ VCR.use_cassette(*cassette_arguments(env)) do
14
+ @app.call(env)
15
+ end
9
16
  end
10
17
  end
11
18
  end
@@ -39,18 +39,26 @@ module VCR
39
39
  important_vals = important_header_values(k, val_array)
40
40
  next unless important_vals.size > 0
41
41
 
42
- # Ensure the values are raw strings.
43
- # Apparently for Paperclip uploads to S3, headers
44
- # get serialized with some extra stuff which leads
45
- # to a seg fault. See this issue for more info:
46
- # https://github.com/myronmarston/vcr/issues#issue/39
47
- string_vals = important_vals.map { |v| String.new(v) }
48
-
49
- new_headers[k] = string_vals
42
+ new_headers[k] = convert_to_raw_strings(important_vals)
50
43
  end if headers
51
44
 
52
45
  self.headers = new_headers.empty? ? nil : new_headers
53
46
  end
47
+
48
+ def convert_to_raw_strings(array)
49
+ # Ensure the values are raw strings.
50
+ # Apparently for Paperclip uploads to S3, headers
51
+ # get serialized with some extra stuff which leads
52
+ # to a seg fault. See this issue for more info:
53
+ # https://github.com/myronmarston/vcr/issues#issue/39
54
+ array.map do |v|
55
+ case v
56
+ when String; String.new(v)
57
+ when Array; convert_to_raw_strings(v)
58
+ else v
59
+ end
60
+ end
61
+ end
54
62
  end
55
63
  end
56
64
  end
data/lib/vcr/version.rb CHANGED
@@ -3,7 +3,7 @@ module VCR
3
3
 
4
4
  def version
5
5
  @version ||= begin
6
- string = '1.9.0'
6
+ string = '1.10.0'
7
7
 
8
8
  def string.parts
9
9
  split('.').map { |p| p.to_i }
data/spec/spec_helper.rb CHANGED
@@ -41,7 +41,8 @@ end
41
41
 
42
42
  RSpec.configure do |config|
43
43
  config.color_enabled = true
44
- config.debug = (using_git && RUBY_INTERPRETER == :mri)
44
+ config.debug = (using_git && RUBY_INTERPRETER == :mri && RUBY_VERSION != '1.9.1')
45
+ config.treat_symbols_as_metadata_keys_with_true_values = true
45
46
 
46
47
  tmp_dir = File.expand_path('../../tmp/cassette_library_dir', __FILE__)
47
48
  config.before(:each) do
@@ -40,7 +40,8 @@ HTTP_LIBRARY_ADAPTERS['httpclient'] = Module.new do
40
40
  def self.http_library_name; 'HTTP Client'; end
41
41
 
42
42
  def get_body_string(response)
43
- string = response.body.content
43
+ body = response.body
44
+ string = body.is_a?(String) ? body : body.content
44
45
  string.respond_to?(:read) ? string.read : string
45
46
  end
46
47
 
@@ -37,6 +37,18 @@ shared_examples_for "header normalization" do
37
37
  instance = with_headers('my-key' => [value])
38
38
  VCR::YAML.dump(instance.headers).should == VCR::YAML.dump('my-key' => ['my-value'])
39
39
  end
40
+
41
+ it 'handles nested arrays' do
42
+ accept_encoding = [["gzip", "1.0"], ["deflate", "1.0"], ["sdch", "1.0"]]
43
+ instance = with_headers('accept-encoding' => accept_encoding)
44
+ instance.headers['accept-encoding'].should == accept_encoding
45
+ end
46
+
47
+ it 'handles nested arrays with floats' do
48
+ accept_encoding = [["gzip", 1.0], ["deflate", 1.0], ["sdch", 1.0]]
49
+ instance = with_headers('accept-encoding' => accept_encoding)
50
+ instance.headers['accept-encoding'].should == accept_encoding
51
+ end
40
52
  end
41
53
 
42
54
  shared_examples_for "body normalization" do
@@ -29,7 +29,13 @@ module VCR
29
29
  end
30
30
 
31
31
  def self.server
32
- @server ||= VCR::LocalhostServer.new(new)
32
+ raise "Sinatra app failed to boot." if @_boot_failed
33
+ @server ||= begin
34
+ VCR::LocalhostServer.new(new)
35
+ rescue
36
+ @_boot_failed = true
37
+ raise
38
+ end
33
39
  end
34
40
  end
35
41
  end
@@ -13,7 +13,7 @@ module VCR
13
13
 
14
14
  def call(env)
15
15
  if env["PATH_INFO"] == "/__identify__"
16
- [200, {}, @app.object_id.to_s]
16
+ [200, {}, [@app.object_id.to_s]]
17
17
  else
18
18
  @app.call(env)
19
19
  end
@@ -40,7 +40,9 @@ module VCR
40
40
 
41
41
  def boot
42
42
  # Use WEBrick since it's part of the ruby standard library and is available on all ruby interpreters.
43
- Rack::Handler::WEBrick.run(Identify.new(@rack_app), :Port => port, :AccessLog => [], :Logger => WEBrick::BasicLog.new(StringIO.new))
43
+ options = { :Port => port }
44
+ options.merge!(:AccessLog => [], :Logger => WEBrick::BasicLog.new(StringIO.new)) unless ENV['CI']
45
+ Rack::Handler::WEBrick.run(Identify.new(@rack_app), options)
44
46
  end
45
47
 
46
48
  def booted?
@@ -449,7 +449,7 @@ describe VCR::Cassette do
449
449
  end
450
450
 
451
451
  it "matches old requests to new ones using the cassette's match attributes" do
452
- pending("Need to fix this to work with Psych", :if => defined?(::Psych)) do
452
+ pending("Need to fix this to work with Psych", :if => defined?(::Psych) && !ENV['CI']) do
453
453
  [
454
454
  old_interaction_1, old_interaction_2, old_interaction_3,
455
455
  new_interaction_1, new_interaction_2, new_interaction_3
@@ -51,4 +51,24 @@ describe VCR::Middleware::Rack do
51
51
  instance.call(env_hash)
52
52
  end
53
53
  end
54
+
55
+ let(:threaded_app) do
56
+ lambda do |env|
57
+ sleep 0.15
58
+ VCR.send(:cassettes).should have(1).cassette
59
+ [200, {}, ['OK']]
60
+ end
61
+ end
62
+
63
+ it 'is thread safe' do
64
+ stack = described_class.new(threaded_app) do |cassette|
65
+ cassette.name 'c'
66
+ end
67
+
68
+ thread = Thread.new { stack.call({}) }
69
+ stack.call({})
70
+ thread.join
71
+
72
+ VCR.current_cassette.should be_nil
73
+ end
54
74
  end
data/spec/vcr_spec.rb CHANGED
@@ -237,6 +237,32 @@ describe VCR do
237
237
  VCR.insert_cassette('foo')
238
238
  }.to raise_error(VCR::TurnedOffError)
239
239
  end
240
+
241
+ it 'raises an ArgumentError when given an invalid option' do
242
+ expect {
243
+ VCR.turn_off!(:invalid_option => true)
244
+ }.to raise_error(ArgumentError)
245
+ end
246
+
247
+ context 'when `:ignore_cassettes => true` is passed' do
248
+ before(:each) { VCR.turn_off!(:ignore_cassettes => true) }
249
+
250
+ it 'ignores cassette insertions' do
251
+ VCR.insert_cassette('foo')
252
+ VCR.current_cassette.should be_nil
253
+ end
254
+
255
+ it 'still runs a block passed to use_cassette' do
256
+ yielded = false
257
+
258
+ VCR.use_cassette('foo') do
259
+ yielded = true
260
+ VCR.current_cassette.should be_nil
261
+ end
262
+
263
+ yielded.should be_true
264
+ end
265
+ end
240
266
  end
241
267
 
242
268
  describe '.turn_on!' do
@@ -267,6 +293,11 @@ describe VCR do
267
293
  yielded.should == true
268
294
  VCR.should be_turned_on
269
295
  end
296
+
297
+ it 'passes options through to .turn_off!' do
298
+ VCR.should_receive(:turn_off!).with(:ignore_cassettes => true)
299
+ VCR.turned_off(:ignore_cassettes => true) { }
300
+ end
270
301
  end
271
302
 
272
303
  describe '.turned_on?' do
data/vcr.gemspec CHANGED
@@ -21,13 +21,14 @@ Gem::Specification.new do |s|
21
21
  'bundler' => '~> 1.0.7',
22
22
  'rake' => '~> 0.8.7',
23
23
 
24
- 'rspec' => '~> 2.5',
24
+ 'rspec' => '~> 2.6',
25
25
  'cucumber' => '~> 0.9.4',
26
26
  'aruba' => '0.2.4',
27
27
  'shoulda' => '~> 2.9.2',
28
28
 
29
29
  'fakeweb' => '~> 1.3.0',
30
- 'webmock' => '~> 1.6.0',
30
+ 'webmock' => '~> 1.6.4',
31
+ 'addressable' => '~> 2.2.6',
31
32
 
32
33
  'faraday' => '~> 0.6.0',
33
34
  'httpclient' => '~> 2.1.5.2',
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: 51
4
+ hash: 63
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
- - 9
8
+ - 10
9
9
  - 0
10
- version: 1.9.0
10
+ version: 1.10.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Myron Marston
@@ -15,14 +15,11 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-04-14 00:00:00 -07:00
19
- default_executable:
18
+ date: 2011-05-19 00:00:00 Z
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
- prerelease: false
23
21
  type: :development
24
- name: faraday
25
- version_requirements: &id001 !ruby/object:Gem::Requirement
22
+ requirement: &id001 !ruby/object:Gem::Requirement
26
23
  none: false
27
24
  requirements:
28
25
  - - ~>
@@ -33,12 +30,12 @@ dependencies:
33
30
  - 6
34
31
  - 0
35
32
  version: 0.6.0
36
- requirement: *id001
37
- - !ruby/object:Gem::Dependency
33
+ version_requirements: *id001
34
+ name: faraday
38
35
  prerelease: false
36
+ - !ruby/object:Gem::Dependency
39
37
  type: :development
40
- name: fakeweb
41
- version_requirements: &id002 !ruby/object:Gem::Requirement
38
+ requirement: &id002 !ruby/object:Gem::Requirement
42
39
  none: false
43
40
  requirements:
44
41
  - - ~>
@@ -49,12 +46,12 @@ dependencies:
49
46
  - 3
50
47
  - 0
51
48
  version: 1.3.0
52
- requirement: *id002
53
- - !ruby/object:Gem::Dependency
49
+ version_requirements: *id002
50
+ name: fakeweb
54
51
  prerelease: false
52
+ - !ruby/object:Gem::Dependency
55
53
  type: :development
56
- name: httpclient
57
- version_requirements: &id003 !ruby/object:Gem::Requirement
54
+ requirement: &id003 !ruby/object:Gem::Requirement
58
55
  none: false
59
56
  requirements:
60
57
  - - ~>
@@ -66,12 +63,12 @@ dependencies:
66
63
  - 5
67
64
  - 2
68
65
  version: 2.1.5.2
69
- requirement: *id003
70
- - !ruby/object:Gem::Dependency
66
+ version_requirements: *id003
67
+ name: httpclient
71
68
  prerelease: false
69
+ - !ruby/object:Gem::Dependency
72
70
  type: :development
73
- name: rake
74
- version_requirements: &id004 !ruby/object:Gem::Requirement
71
+ requirement: &id004 !ruby/object:Gem::Requirement
75
72
  none: false
76
73
  requirements:
77
74
  - - ~>
@@ -82,12 +79,12 @@ dependencies:
82
79
  - 8
83
80
  - 7
84
81
  version: 0.8.7
85
- requirement: *id004
86
- - !ruby/object:Gem::Dependency
82
+ version_requirements: *id004
83
+ name: rake
87
84
  prerelease: false
85
+ - !ruby/object:Gem::Dependency
88
86
  type: :development
89
- name: timecop
90
- version_requirements: &id005 !ruby/object:Gem::Requirement
87
+ requirement: &id005 !ruby/object:Gem::Requirement
91
88
  none: false
92
89
  requirements:
93
90
  - - ~>
@@ -98,12 +95,28 @@ dependencies:
98
95
  - 3
99
96
  - 5
100
97
  version: 0.3.5
101
- requirement: *id005
98
+ version_requirements: *id005
99
+ name: timecop
100
+ prerelease: false
102
101
  - !ruby/object:Gem::Dependency
102
+ type: :development
103
+ requirement: &id006 !ruby/object:Gem::Requirement
104
+ none: false
105
+ requirements:
106
+ - - ~>
107
+ - !ruby/object:Gem::Version
108
+ hash: 11
109
+ segments:
110
+ - 2
111
+ - 2
112
+ - 6
113
+ version: 2.2.6
114
+ version_requirements: *id006
115
+ name: addressable
103
116
  prerelease: false
117
+ - !ruby/object:Gem::Dependency
104
118
  type: :development
105
- name: shoulda
106
- version_requirements: &id006 !ruby/object:Gem::Requirement
119
+ requirement: &id007 !ruby/object:Gem::Requirement
107
120
  none: false
108
121
  requirements:
109
122
  - - ~>
@@ -114,27 +127,27 @@ dependencies:
114
127
  - 9
115
128
  - 2
116
129
  version: 2.9.2
117
- requirement: *id006
118
- - !ruby/object:Gem::Dependency
130
+ version_requirements: *id007
131
+ name: shoulda
119
132
  prerelease: false
133
+ - !ruby/object:Gem::Dependency
120
134
  type: :development
121
- name: rspec
122
- version_requirements: &id007 !ruby/object:Gem::Requirement
135
+ requirement: &id008 !ruby/object:Gem::Requirement
123
136
  none: false
124
137
  requirements:
125
138
  - - ~>
126
139
  - !ruby/object:Gem::Version
127
- hash: 9
140
+ hash: 15
128
141
  segments:
129
142
  - 2
130
- - 5
131
- version: "2.5"
132
- requirement: *id007
133
- - !ruby/object:Gem::Dependency
143
+ - 6
144
+ version: "2.6"
145
+ version_requirements: *id008
146
+ name: rspec
134
147
  prerelease: false
148
+ - !ruby/object:Gem::Dependency
135
149
  type: :development
136
- name: rack
137
- version_requirements: &id008 !ruby/object:Gem::Requirement
150
+ requirement: &id009 !ruby/object:Gem::Requirement
138
151
  none: false
139
152
  requirements:
140
153
  - - "="
@@ -145,12 +158,12 @@ dependencies:
145
158
  - 1
146
159
  - 0
147
160
  version: 1.1.0
148
- requirement: *id008
149
- - !ruby/object:Gem::Dependency
161
+ version_requirements: *id009
162
+ name: rack
150
163
  prerelease: false
164
+ - !ruby/object:Gem::Dependency
151
165
  type: :development
152
- name: aruba
153
- version_requirements: &id009 !ruby/object:Gem::Requirement
166
+ requirement: &id010 !ruby/object:Gem::Requirement
154
167
  none: false
155
168
  requirements:
156
169
  - - "="
@@ -161,12 +174,12 @@ dependencies:
161
174
  - 2
162
175
  - 4
163
176
  version: 0.2.4
164
- requirement: *id009
165
- - !ruby/object:Gem::Dependency
177
+ version_requirements: *id010
178
+ name: aruba
166
179
  prerelease: false
180
+ - !ruby/object:Gem::Dependency
167
181
  type: :development
168
- name: sinatra
169
- version_requirements: &id010 !ruby/object:Gem::Requirement
182
+ requirement: &id011 !ruby/object:Gem::Requirement
170
183
  none: false
171
184
  requirements:
172
185
  - - ~>
@@ -177,12 +190,12 @@ dependencies:
177
190
  - 1
178
191
  - 0
179
192
  version: 1.1.0
180
- requirement: *id010
181
- - !ruby/object:Gem::Dependency
193
+ version_requirements: *id011
194
+ name: sinatra
182
195
  prerelease: false
196
+ - !ruby/object:Gem::Dependency
183
197
  type: :development
184
- name: bundler
185
- version_requirements: &id011 !ruby/object:Gem::Requirement
198
+ requirement: &id012 !ruby/object:Gem::Requirement
186
199
  none: false
187
200
  requirements:
188
201
  - - ~>
@@ -193,12 +206,12 @@ dependencies:
193
206
  - 0
194
207
  - 7
195
208
  version: 1.0.7
196
- requirement: *id011
197
- - !ruby/object:Gem::Dependency
209
+ version_requirements: *id012
210
+ name: bundler
198
211
  prerelease: false
212
+ - !ruby/object:Gem::Dependency
199
213
  type: :development
200
- name: excon
201
- version_requirements: &id012 !ruby/object:Gem::Requirement
214
+ requirement: &id013 !ruby/object:Gem::Requirement
202
215
  none: false
203
216
  requirements:
204
217
  - - ~>
@@ -209,12 +222,12 @@ dependencies:
209
222
  - 6
210
223
  - 2
211
224
  version: 0.6.2
212
- requirement: *id012
213
- - !ruby/object:Gem::Dependency
225
+ version_requirements: *id013
226
+ name: excon
214
227
  prerelease: false
228
+ - !ruby/object:Gem::Dependency
215
229
  type: :development
216
- name: cucumber
217
- version_requirements: &id013 !ruby/object:Gem::Requirement
230
+ requirement: &id014 !ruby/object:Gem::Requirement
218
231
  none: false
219
232
  requirements:
220
233
  - - ~>
@@ -225,28 +238,28 @@ dependencies:
225
238
  - 9
226
239
  - 4
227
240
  version: 0.9.4
228
- requirement: *id013
229
- - !ruby/object:Gem::Dependency
241
+ version_requirements: *id014
242
+ name: cucumber
230
243
  prerelease: false
244
+ - !ruby/object:Gem::Dependency
231
245
  type: :development
232
- name: webmock
233
- version_requirements: &id014 !ruby/object:Gem::Requirement
246
+ requirement: &id015 !ruby/object:Gem::Requirement
234
247
  none: false
235
248
  requirements:
236
249
  - - ~>
237
250
  - !ruby/object:Gem::Version
238
- hash: 15
251
+ hash: 7
239
252
  segments:
240
253
  - 1
241
254
  - 6
242
- - 0
243
- version: 1.6.0
244
- requirement: *id014
245
- - !ruby/object:Gem::Dependency
255
+ - 4
256
+ version: 1.6.4
257
+ version_requirements: *id015
258
+ name: webmock
246
259
  prerelease: false
260
+ - !ruby/object:Gem::Dependency
247
261
  type: :development
248
- name: curb
249
- version_requirements: &id015 !ruby/object:Gem::Requirement
262
+ requirement: &id016 !ruby/object:Gem::Requirement
250
263
  none: false
251
264
  requirements:
252
265
  - - "="
@@ -257,12 +270,12 @@ dependencies:
257
270
  - 7
258
271
  - 8
259
272
  version: 0.7.8
260
- requirement: *id015
261
- - !ruby/object:Gem::Dependency
273
+ version_requirements: *id016
274
+ name: curb
262
275
  prerelease: false
276
+ - !ruby/object:Gem::Dependency
263
277
  type: :development
264
- name: patron
265
- version_requirements: &id016 !ruby/object:Gem::Requirement
278
+ requirement: &id017 !ruby/object:Gem::Requirement
266
279
  none: false
267
280
  requirements:
268
281
  - - "="
@@ -273,12 +286,12 @@ dependencies:
273
286
  - 4
274
287
  - 9
275
288
  version: 0.4.9
276
- requirement: *id016
277
- - !ruby/object:Gem::Dependency
289
+ version_requirements: *id017
290
+ name: patron
278
291
  prerelease: false
292
+ - !ruby/object:Gem::Dependency
279
293
  type: :development
280
- name: em-http-request
281
- version_requirements: &id017 !ruby/object:Gem::Requirement
294
+ requirement: &id018 !ruby/object:Gem::Requirement
282
295
  none: false
283
296
  requirements:
284
297
  - - ~>
@@ -289,12 +302,12 @@ dependencies:
289
302
  - 3
290
303
  - 0
291
304
  version: 0.3.0
292
- requirement: *id017
293
- - !ruby/object:Gem::Dependency
305
+ version_requirements: *id018
306
+ name: em-http-request
294
307
  prerelease: false
308
+ - !ruby/object:Gem::Dependency
295
309
  type: :development
296
- name: typhoeus
297
- version_requirements: &id018 !ruby/object:Gem::Requirement
310
+ requirement: &id019 !ruby/object:Gem::Requirement
298
311
  none: false
299
312
  requirements:
300
313
  - - ~>
@@ -305,7 +318,9 @@ dependencies:
305
318
  - 2
306
319
  - 1
307
320
  version: 0.2.1
308
- requirement: *id018
321
+ version_requirements: *id019
322
+ name: typhoeus
323
+ prerelease: false
309
324
  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.
310
325
  email: myron.marston@gmail.com
311
326
  executables: []
@@ -334,6 +349,7 @@ files:
334
349
  - features/cassettes/automatic_re_recording.feature
335
350
  - features/cassettes/dynamic_erb.feature
336
351
  - features/cassettes/format.feature
352
+ - features/cassettes/naming.feature
337
353
  - features/cassettes/no_cassette.feature
338
354
  - features/cassettes/request_matching.feature
339
355
  - features/cassettes/update_content_length_header.feature
@@ -468,7 +484,6 @@ files:
468
484
  - spec/vcr/version_spec.rb
469
485
  - spec/vcr_spec.rb
470
486
  - vcr.gemspec
471
- has_rdoc: true
472
487
  homepage: http://github.com/myronmarston/vcr
473
488
  licenses: []
474
489
 
@@ -502,7 +517,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
502
517
  requirements: []
503
518
 
504
519
  rubyforge_project:
505
- rubygems_version: 1.5.2
520
+ rubygems_version: 1.8.2
506
521
  signing_key:
507
522
  specification_version: 3
508
523
  summary: Record your test suite's HTTP interactions and replay them during future test runs for fast, deterministic, accurate tests.
@@ -511,6 +526,7 @@ test_files:
511
526
  - features/cassettes/automatic_re_recording.feature
512
527
  - features/cassettes/dynamic_erb.feature
513
528
  - features/cassettes/format.feature
529
+ - features/cassettes/naming.feature
514
530
  - features/cassettes/no_cassette.feature
515
531
  - features/cassettes/request_matching.feature
516
532
  - features/cassettes/update_content_length_header.feature