vcr 2.2.0 → 2.2.1
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/CHANGELOG.md +11 -0
- data/README.md +3 -3
- data/features/cassettes/format.feature +3 -3
- data/features/request_matching/uri_without_param.feature +10 -4
- data/features/test_frameworks/rspec_metadata.feature +2 -1
- data/lib/vcr.rb +1 -1
- data/lib/vcr/middleware/faraday.rb +1 -1
- data/lib/vcr/request_matcher_registry.rb +1 -1
- data/lib/vcr/test_frameworks/rspec.rb +1 -1
- data/lib/vcr/version.rb +1 -1
- data/spec/support/http_library_adapters.rb +11 -0
- data/spec/support/shared_example_groups/hook_into_http_library.rb +14 -0
- data/spec/support/sinatra_app.rb +4 -0
- data/spec/vcr/request_matcher_registry_spec.rb +7 -0
- metadata +4 -4
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -2,6 +2,17 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            [Full Changelog](http://github.com/myronmarston/vcr/compare/v2.2.0...master)
         | 
| 4 4 |  | 
| 5 | 
            +
            ## 2.2.1 (June 13, 2012)
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            [Full Changelog](http://github.com/myronmarston/vcr/compare/v2.2.0...v2.2.1)
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            Bug Fixes:
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            * Fix matcher generated by `VCR.request_matchers.uri_without_params` so that
         | 
| 12 | 
            +
              it handles URIs w/o query params properly. Previously, it would allow any
         | 
| 13 | 
            +
              two URIs w/o query params to match, even if the hosts or paths
         | 
| 14 | 
            +
              differed.
         | 
| 15 | 
            +
             | 
| 5 16 | 
             
            ## 2.2.0 (May 31, 2012)
         | 
| 6 17 |  | 
| 7 18 | 
             
            [Full Changelog](http://github.com/myronmarston/vcr/compare/v2.1.1...v2.2.0)
         | 
    
        data/README.md
    CHANGED
    
    | @@ -38,7 +38,7 @@ maintenance) and accurate (the response will contain the same headers and body y | |
| 38 38 | 
             
              following are supported:
         | 
| 39 39 | 
             
              * [FakeWeb](https://github.com/chrisk/fakeweb)
         | 
| 40 40 | 
             
              * [WebMock](https://github.com/bblimke/webmock)
         | 
| 41 | 
            -
              * [Typhoeus](https://github.com/ | 
| 41 | 
            +
              * [Typhoeus](https://github.com/typhoeus/typhoeus)
         | 
| 42 42 | 
             
              * [Faraday](https://github.com/technoweenie/faraday)
         | 
| 43 43 | 
             
              * [Excon](https://github.com/geemus/excon)
         | 
| 44 44 | 
             
            * Supports multiple HTTP libraries:
         | 
| @@ -47,7 +47,7 @@ maintenance) and accurate (the response will contain the same headers and body y | |
| 47 47 | 
             
              * [HTTPClient](http://github.com/nahi/httpclient) (when using WebMock)
         | 
| 48 48 | 
             
              * [em-http-request](http://github.com/igrigorik/em-http-request) (when using WebMock)
         | 
| 49 49 | 
             
              * [Net::HTTP](http://www.ruby-doc.org/stdlib/libdoc/net/http/rdoc/index.html) (when using FakeWeb and WebMock)
         | 
| 50 | 
            -
              * [Typhoeus](https://github.com/ | 
| 50 | 
            +
              * [Typhoeus](https://github.com/typhoeus/typhoeus) (Typhoeus::Hydra, but not Typhoeus::Easy or Typhoeus::Multi)
         | 
| 51 51 | 
             
              * [Excon](https://github.com/geemus/excon)
         | 
| 52 52 | 
             
              * [Faraday](https://github.com/technoweenie/faraday)
         | 
| 53 53 | 
             
              * And of course any library built on Net::HTTP, such as [Mechanize](http://github.com/tenderlove/mechanize),
         | 
| @@ -127,7 +127,7 @@ yard server --reload | |
| 127 127 | 
             
            * [Chris Kampmeier](http://github.com/chrisk) for [FakeWeb](http://github.com/chrisk/fakeweb).
         | 
| 128 128 | 
             
            * [Chris Young](http://github.com/chrisyoung) for [NetRecorder](http://github.com/chrisyoung/netrecorder),
         | 
| 129 129 | 
             
              the inspiration for VCR.
         | 
| 130 | 
            -
            * [David Balatero](https://github.com/dbalatero) for help with [Typhoeus](https://github.com/ | 
| 130 | 
            +
            * [David Balatero](https://github.com/dbalatero) for help with [Typhoeus](https://github.com/typhoeus/typhoeus)
         | 
| 131 131 | 
             
              support.
         | 
| 132 132 | 
             
            * [Wesley Beary](https://github.com/geemus) for help with [Excon](https://github.com/geemus/excon)
         | 
| 133 133 | 
             
              support.
         | 
| @@ -40,9 +40,9 @@ Feature: Cassette format | |
| 40 40 |  | 
| 41 41 | 
             
              You can also register a custom serializer using:
         | 
| 42 42 |  | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 43 | 
            +
                   VCR.configure do |config|
         | 
| 44 | 
            +
                     config.cassette_serializers[:my_custom_serializer] = my_serializer
         | 
| 45 | 
            +
                   end
         | 
| 46 46 |  | 
| 47 47 | 
             
              Your serializer must implement the following methods:
         | 
| 48 48 |  | 
| @@ -9,7 +9,10 @@ Feature: URI without param(s) | |
| 9 9 | 
             
              common need to match on a URI and ignore particular query parameters, VCR
         | 
| 10 10 | 
             
              provides an easier way:
         | 
| 11 11 |  | 
| 12 | 
            -
                  :match_requests_on => [ | 
| 12 | 
            +
                  :match_requests_on => [
         | 
| 13 | 
            +
                    :method,
         | 
| 14 | 
            +
                    VCR.request_matchers.uri_without_param(:timestamp)
         | 
| 15 | 
            +
                  ]
         | 
| 13 16 |  | 
| 14 17 | 
             
              `uri_without_param` also has a plural alias (i.e. `uri_without_params(:timestamp, :session)`)
         | 
| 15 18 |  | 
| @@ -70,7 +73,8 @@ Feature: URI without param(s) | |
| 70 73 | 
             
                    c.hook_into :fakeweb
         | 
| 71 74 | 
             
                    c.cassette_library_dir = 'cassettes'
         | 
| 72 75 | 
             
                    c.default_cassette_options = {
         | 
| 73 | 
            -
                      :match_requests_on => [:method, | 
| 76 | 
            +
                      :match_requests_on => [:method,
         | 
| 77 | 
            +
                        VCR.request_matchers.uri_without_param(:timestamp)]
         | 
| 74 78 | 
             
                    }
         | 
| 75 79 | 
             
                  end
         | 
| 76 80 |  | 
| @@ -79,11 +83,13 @@ Feature: URI without param(s) | |
| 79 83 | 
             
                  end
         | 
| 80 84 |  | 
| 81 85 | 
             
                  VCR.use_cassette('example') do
         | 
| 82 | 
            -
                    puts "Response for bar: " + | 
| 86 | 
            +
                    puts "Response for bar: " +
         | 
| 87 | 
            +
                         response_body_for(:get, search_uri("bar"))
         | 
| 83 88 | 
             
                  end
         | 
| 84 89 |  | 
| 85 90 | 
             
                  VCR.use_cassette('example') do
         | 
| 86 | 
            -
                    puts "Response for foo: " + | 
| 91 | 
            +
                    puts "Response for foo: " +
         | 
| 92 | 
            +
                         response_body_for(:get, search_uri("foo"))
         | 
| 87 93 | 
             
                  end
         | 
| 88 94 | 
             
                  """
         | 
| 89 95 | 
             
                When I run `ruby uri_without_param_matcher.rb`
         | 
| @@ -76,7 +76,8 @@ Feature: Usage with RSpec metadata | |
| 76 76 | 
             
                  """ruby
         | 
| 77 77 | 
             
                  require 'spec_helper'
         | 
| 78 78 |  | 
| 79 | 
            -
                   | 
| 79 | 
            +
                  vcr_options = { :cassette_name => "example", :record => :new_episodes }
         | 
| 80 | 
            +
                  describe "Using an options hash", :vcr => vcr_options do
         | 
| 80 81 | 
             
                    it 'uses the provided cassette name' do
         | 
| 81 82 | 
             
                      VCR.current_cassette.name.should == "example"
         | 
| 82 83 | 
             
                    end
         | 
    
        data/lib/vcr.rb
    CHANGED
    
    | @@ -81,7 +81,7 @@ module VCR | |
| 81 81 | 
             
              # @option options :allow_playback_repeats [Boolean] Whether or not to
         | 
| 82 82 | 
             
              #  allow a single HTTP interaction to be played back multiple times.
         | 
| 83 83 | 
             
              #  Defaults to false.
         | 
| 84 | 
            -
              # @ | 
| 84 | 
            +
              # @option options :allow_unused_http_interactions [Boolean] If set to
         | 
| 85 85 | 
             
              #  false, an error will be raised if a cassette is ejected before all
         | 
| 86 86 | 
             
              #  previously recorded HTTP interactions have been used.
         | 
| 87 87 | 
             
              #  Defaults to true.
         | 
| @@ -11,7 +11,7 @@ module VCR | |
| 11 11 | 
             
                # Faraday.
         | 
| 12 12 | 
             
                #
         | 
| 13 13 | 
             
                # @note You can either insert this middleware into the Faraday middleware stack
         | 
| 14 | 
            -
                #  yourself or configure {VCR::Configuration#hook_into} to hook into  | 
| 14 | 
            +
                #  yourself or configure {VCR::Configuration#hook_into} to hook into `:faraday`.
         | 
| 15 15 | 
             
                class Faraday
         | 
| 16 16 | 
             
                  include VCR::Deprecations::Middleware::Faraday
         | 
| 17 17 |  | 
| @@ -19,7 +19,7 @@ module VCR | |
| 19 19 | 
             
                class URIWithoutParamsMatcher < Struct.new(:params_to_ignore)
         | 
| 20 20 | 
             
                  def partial_uri_from(request)
         | 
| 21 21 | 
             
                    URI(request.uri).tap do |uri|
         | 
| 22 | 
            -
                       | 
| 22 | 
            +
                      return request.uri unless uri.query # ignore uris without params, e.g. "http://example.com/"
         | 
| 23 23 |  | 
| 24 24 | 
             
                      uri.query = uri.query.split('&').tap { |params|
         | 
| 25 25 | 
             
                        params.map! do |p|
         | 
    
        data/lib/vcr/version.rb
    CHANGED
    
    
| @@ -16,6 +16,7 @@ HTTP_LIBRARY_ADAPTERS['net/http'] = Module.new do | |
| 16 16 | 
             
              def self.http_library_name; 'Net::HTTP'; end
         | 
| 17 17 |  | 
| 18 18 | 
             
              def get_body_string(response); response.body; end
         | 
| 19 | 
            +
              alias get_body_object get_body_string
         | 
| 19 20 |  | 
| 20 21 | 
             
              def get_header(header_key, response)
         | 
| 21 22 | 
             
                response.get_fields(header_key)
         | 
| @@ -46,6 +47,7 @@ HTTP_LIBRARY_ADAPTERS['patron'] = Module.new do | |
| 46 47 | 
             
              def self.http_library_name; 'Patron'; end
         | 
| 47 48 |  | 
| 48 49 | 
             
              def get_body_string(response); response.body; end
         | 
| 50 | 
            +
              alias get_body_object get_body_string
         | 
| 49 51 |  | 
| 50 52 | 
             
              def get_header(header_key, response)
         | 
| 51 53 | 
             
                response.headers[header_key]
         | 
| @@ -69,6 +71,10 @@ HTTP_LIBRARY_ADAPTERS['httpclient'] = Module.new do | |
| 69 71 | 
             
                string.respond_to?(:read) ? string.read : string
         | 
| 70 72 | 
             
              end
         | 
| 71 73 |  | 
| 74 | 
            +
              def get_body_object(response)
         | 
| 75 | 
            +
                response.body
         | 
| 76 | 
            +
              end
         | 
| 77 | 
            +
             | 
| 72 78 | 
             
              def get_header(header_key, response)
         | 
| 73 79 | 
             
                response.header[header_key]
         | 
| 74 80 | 
             
              end
         | 
| @@ -88,6 +94,7 @@ HTTP_LIBRARY_ADAPTERS['em-http-request'] = Module.new do | |
| 88 94 | 
             
              def get_body_string(response)
         | 
| 89 95 | 
             
                response.response
         | 
| 90 96 | 
             
              end
         | 
| 97 | 
            +
              alias get_body_object get_body_string
         | 
| 91 98 |  | 
| 92 99 | 
             
              def get_header(header_key, response)
         | 
| 93 100 | 
             
                values = response.response_header[header_key.upcase.gsub('-', '_')]
         | 
| @@ -114,6 +121,7 @@ HTTP_LIBRARY_ADAPTERS['curb'] = Module.new do | |
| 114 121 | 
             
              def get_body_string(response)
         | 
| 115 122 | 
             
                response.body_str
         | 
| 116 123 | 
             
              end
         | 
| 124 | 
            +
              alias get_body_object get_body_string
         | 
| 117 125 |  | 
| 118 126 | 
             
              def get_header(header_key, response)
         | 
| 119 127 | 
             
                headers = response.header_str.split("\r\n")[1..-1]
         | 
| @@ -149,6 +157,7 @@ HTTP_LIBRARY_ADAPTERS['typhoeus'] = Module.new do | |
| 149 157 | 
             
              def get_body_string(response)
         | 
| 150 158 | 
             
                response.body
         | 
| 151 159 | 
             
              end
         | 
| 160 | 
            +
              alias get_body_object get_body_string
         | 
| 152 161 |  | 
| 153 162 | 
             
              def get_header(header_key, response)
         | 
| 154 163 | 
             
                response.headers_hash[header_key]
         | 
| @@ -169,6 +178,7 @@ HTTP_LIBRARY_ADAPTERS['excon'] = Module.new do | |
| 169 178 | 
             
              def get_body_string(response)
         | 
| 170 179 | 
             
                response.body
         | 
| 171 180 | 
             
              end
         | 
| 181 | 
            +
              alias get_body_object get_body_string
         | 
| 172 182 |  | 
| 173 183 | 
             
              def get_header(header_key, response)
         | 
| 174 184 | 
             
                response.headers[header_key]
         | 
| @@ -198,6 +208,7 @@ end | |
| 198 208 | 
             
                def get_body_string(response)
         | 
| 199 209 | 
             
                  response.body
         | 
| 200 210 | 
             
                end
         | 
| 211 | 
            +
                alias get_body_object get_body_string
         | 
| 201 212 |  | 
| 202 213 | 
             
                def get_header(header_key, response)
         | 
| 203 214 | 
             
                  value = response.headers[header_key]
         | 
| @@ -55,6 +55,20 @@ shared_examples_for "a hook into an HTTP library" do |library_hook_name, library | |
| 55 55 | 
             
                test_record_and_playback "with spaces encoded as %20",         "q=a%20b"
         | 
| 56 56 | 
             
                test_record_and_playback "with a complex escaped query param", "q=#{CGI.escape("A&(! 234k !@ kasdj232\#$ kjw35")}"
         | 
| 57 57 |  | 
| 58 | 
            +
                it 'plays back an empty body response exactly as it was recorded (e.g. nil vs empty string)' do
         | 
| 59 | 
            +
                  pending "awaiting an external fix", :if => library.gsub('_', '/').include?('net/http') do
         | 
| 60 | 
            +
                    get_body = lambda do
         | 
| 61 | 
            +
                      VCR.use_cassette('empty_body', :record => :once) do
         | 
| 62 | 
            +
                        get_body_object make_http_request(:get, "http://localhost:#{VCR::SinatraApp.port}/204")
         | 
| 63 | 
            +
                      end
         | 
| 64 | 
            +
                    end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                    recorded = get_body.call
         | 
| 67 | 
            +
                    played_back = get_body.call
         | 
| 68 | 
            +
                    played_back.should eq(recorded)
         | 
| 69 | 
            +
                  end
         | 
| 70 | 
            +
                end
         | 
| 71 | 
            +
             | 
| 58 72 | 
             
                describe 'making an HTTP request' do
         | 
| 59 73 | 
             
                  let(:status)        { VCR::ResponseStatus.new(200, 'OK') }
         | 
| 60 74 | 
             
                  let(:interaction)   { VCR::HTTPInteraction.new(request, response) }
         | 
    
        data/spec/support/sinatra_app.rb
    CHANGED
    
    | @@ -34,6 +34,10 @@ module VCR | |
| 34 34 | 
             
                  'header set'
         | 
| 35 35 | 
             
                end
         | 
| 36 36 |  | 
| 37 | 
            +
                get '/204' do
         | 
| 38 | 
            +
                  status 204
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 37 41 | 
             
                # we use a global counter so that every response is different;
         | 
| 38 42 | 
             
                # this ensures that the test demonstrates that the response
         | 
| 39 43 | 
             
                # is being played back (and not running a 2nd real request)
         | 
| @@ -134,6 +134,13 @@ module VCR | |
| 134 134 | 
             
                        request_with(:uri => 'http://example.com/search')
         | 
| 135 135 | 
             
                      ).should be_true
         | 
| 136 136 | 
             
                    end
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                    it 'does not match two requests with URIs that have no params but different paths' do
         | 
| 139 | 
            +
                      subject[subject.send(meth, :foo, :bar)].matches?(
         | 
| 140 | 
            +
                        request_with(:uri => 'http://example.com/foo'),
         | 
| 141 | 
            +
                        request_with(:uri => 'http://example.com/bar')
         | 
| 142 | 
            +
                      ).should be_false
         | 
| 143 | 
            +
                    end
         | 
| 137 144 | 
             
                  end
         | 
| 138 145 | 
             
                end
         | 
| 139 146 |  | 
    
        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: 5
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
              segments: 
         | 
| 7 7 | 
             
              - 2
         | 
| 8 8 | 
             
              - 2
         | 
| 9 | 
            -
              -  | 
| 10 | 
            -
              version: 2.2. | 
| 9 | 
            +
              - 1
         | 
| 10 | 
            +
              version: 2.2.1
         | 
| 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: 2012- | 
| 18 | 
            +
            date: 2012-06-13 00:00:00 Z
         | 
| 19 19 | 
             
            dependencies: 
         | 
| 20 20 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| 21 21 | 
             
              version_requirements: &id001 !ruby/object:Gem::Requirement 
         |