vcr 2.2.5 → 2.3.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.
Files changed (45) hide show
  1. data/.gitignore +5 -0
  2. data/.travis.yml +0 -5
  3. data/Appraisals +9 -0
  4. data/CHANGELOG.md +21 -0
  5. data/Gemfile +17 -21
  6. data/README.md +5 -2
  7. data/Rakefile +1 -0
  8. data/features/configuration/hook_into.feature +7 -6
  9. data/features/configuration/uri_parser.feature +91 -0
  10. data/features/middleware/faraday.feature +4 -3
  11. data/features/support/http_lib_filters.rb +2 -3
  12. data/features/support/vcr_cucumber_helpers.rb +2 -1
  13. data/features/test_frameworks/cucumber.feature +6 -0
  14. data/gemfiles/typhoeus-new.gemfile +18 -0
  15. data/gemfiles/typhoeus-new.gemfile.lock +172 -0
  16. data/gemfiles/typhoeus-old.gemfile +18 -0
  17. data/gemfiles/typhoeus-old.gemfile.lock +159 -0
  18. data/lib/vcr/cassette/migrator.rb +1 -1
  19. data/lib/vcr/configuration.rb +28 -0
  20. data/lib/vcr/errors.rb +1 -1
  21. data/lib/vcr/library_hooks/typhoeus.rb +74 -77
  22. data/lib/vcr/library_hooks/typhoeus_0.4.rb +99 -0
  23. data/lib/vcr/middleware/faraday.rb +1 -1
  24. data/lib/vcr/request_ignorer.rb +2 -2
  25. data/lib/vcr/request_matcher_registry.rb +8 -3
  26. data/lib/vcr/structs.rb +8 -1
  27. data/lib/vcr/test_frameworks/cucumber.rb +1 -1
  28. data/lib/vcr/version.rb +1 -1
  29. data/script/ci.sh +8 -1
  30. data/spec/capture_warnings.rb +10 -0
  31. data/spec/monkey_patches.rb +21 -3
  32. data/spec/spec_helper.rb +2 -0
  33. data/spec/support/http_library_adapters.rb +29 -0
  34. data/spec/support/limited_uri.rb +30 -0
  35. data/spec/support/vcr_localhost_server.rb +1 -4
  36. data/spec/vcr/cassette/http_interaction_list_spec.rb +0 -1
  37. data/spec/vcr/configuration_spec.rb +15 -1
  38. data/spec/vcr/library_hooks/typhoeus_0.4_spec.rb +31 -0
  39. data/spec/vcr/library_hooks/typhoeus_spec.rb +6 -6
  40. data/spec/vcr/library_hooks/webmock_spec.rb +3 -1
  41. data/spec/vcr/middleware/faraday_spec.rb +3 -1
  42. data/spec/vcr/request_matcher_registry_spec.rb +3 -1
  43. data/spec/vcr/structs_spec.rb +27 -1
  44. data/spec/vcr/test_frameworks/cucumber_spec.rb +1 -1
  45. metadata +41 -29
@@ -0,0 +1,18 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source :rubygems
4
+
5
+ gem "appraisal"
6
+ gem "jruby-openssl", :platforms=>:jruby
7
+ gem "yard"
8
+ gem "relish", "~> 0.6"
9
+ gem "fuubar"
10
+ gem "fuubar-cucumber"
11
+ gem "redcarpet", "~> 1.17.2"
12
+ gem "github-markup"
13
+ gem "ruby-debug", :platforms=>[:mri_18, :jruby]
14
+ gem "debugger", :platforms=>:mri_19
15
+ gem "typhoeus", "~> 0.4.2"
16
+ gem "webmock", "1.8.11"
17
+
18
+ gemspec :path=>"../"
@@ -0,0 +1,159 @@
1
+ PATH
2
+ remote: /Users/myron/code/vcr
3
+ specs:
4
+ vcr (2.2.5)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ addressable (2.3.2)
10
+ appraisal (0.4.1)
11
+ bundler
12
+ rake
13
+ archive-tar-minitar (0.5.2)
14
+ aruba (0.4.11)
15
+ childprocess (>= 0.2.3)
16
+ cucumber (>= 1.1.1)
17
+ ffi (>= 1.0.11)
18
+ rspec (>= 2.7.0)
19
+ builder (3.1.4)
20
+ childprocess (0.3.6)
21
+ ffi (~> 1.0, >= 1.0.6)
22
+ columnize (0.3.6)
23
+ cookiejar (0.3.0)
24
+ crack (0.3.1)
25
+ cucumber (1.1.9)
26
+ builder (>= 2.1.2)
27
+ diff-lcs (>= 1.1.2)
28
+ gherkin (~> 2.9.0)
29
+ json (>= 1.4.6)
30
+ term-ansicolor (>= 1.0.6)
31
+ curb (0.8.1)
32
+ debugger (1.2.1)
33
+ columnize (>= 0.3.1)
34
+ debugger-linecache (~> 1.1.1)
35
+ debugger-ruby_core_source (~> 1.1.4)
36
+ debugger-linecache (1.1.2)
37
+ debugger-ruby_core_source (>= 1.1.1)
38
+ debugger-ruby_core_source (1.1.4)
39
+ diff-lcs (1.1.3)
40
+ em-http-request (1.0.3)
41
+ addressable (>= 2.2.3)
42
+ cookiejar
43
+ em-socksify
44
+ eventmachine (>= 1.0.0.beta.4)
45
+ http_parser.rb (>= 0.5.3)
46
+ em-socksify (0.2.1)
47
+ eventmachine (>= 1.0.0.beta.4)
48
+ eventmachine (1.0.0)
49
+ excon (0.16.7)
50
+ fakeweb (1.3.0)
51
+ faraday (0.8.4)
52
+ multipart-post (~> 1.1)
53
+ ffi (1.1.5)
54
+ fuubar (1.0.0)
55
+ rspec (~> 2.0)
56
+ rspec-instafail (~> 0.2.0)
57
+ ruby-progressbar (~> 0.0.10)
58
+ fuubar-cucumber (0.0.15)
59
+ cucumber (>= 1.0.2)
60
+ ruby-progressbar (~> 0.0.10)
61
+ gherkin (2.9.3)
62
+ json (>= 1.4.6)
63
+ github-markup (0.7.4)
64
+ http_parser.rb (0.5.3)
65
+ httpclient (2.3.0.1)
66
+ json (1.6.7)
67
+ linecache (0.46)
68
+ rbx-require-relative (> 0.0.4)
69
+ mime-types (1.19)
70
+ multi_json (1.0.4)
71
+ multipart-post (1.1.5)
72
+ patron (0.4.18)
73
+ rack (1.3.6)
74
+ rack-protection (1.2.0)
75
+ rack
76
+ rake (0.9.2.2)
77
+ rbx-require-relative (0.0.9)
78
+ redcarpet (1.17.2)
79
+ redis (2.2.2)
80
+ relish (0.6)
81
+ archive-tar-minitar (>= 0.5.2)
82
+ json (>= 1.4.6)
83
+ rest-client (>= 1.6.1)
84
+ rest-client (1.6.7)
85
+ mime-types (>= 1.16)
86
+ rspec (2.11.0)
87
+ rspec-core (~> 2.11.0)
88
+ rspec-expectations (~> 2.11.0)
89
+ rspec-mocks (~> 2.11.0)
90
+ rspec-core (2.11.1)
91
+ rspec-expectations (2.11.3)
92
+ diff-lcs (~> 1.1.3)
93
+ rspec-instafail (0.2.4)
94
+ rspec-mocks (2.11.3)
95
+ ruby-debug (0.10.4)
96
+ columnize (>= 0.1)
97
+ ruby-debug-base (~> 0.10.4.0)
98
+ ruby-debug-base (0.10.4)
99
+ linecache (>= 0.3)
100
+ ruby-progressbar (0.0.10)
101
+ shoulda (2.9.2)
102
+ simplecov (0.5.4)
103
+ multi_json (~> 1.0.3)
104
+ simplecov-html (~> 0.5.3)
105
+ simplecov-html (0.5.3)
106
+ sinatra (1.3.3)
107
+ rack (~> 1.3, >= 1.3.6)
108
+ rack-protection (~> 1.2)
109
+ tilt (~> 1.3, >= 1.3.3)
110
+ term-ansicolor (1.0.7)
111
+ tilt (1.3.3)
112
+ timecop (0.3.5)
113
+ typhoeus (0.4.2)
114
+ ffi (~> 1.0)
115
+ mime-types (~> 1.18)
116
+ webmock (1.8.11)
117
+ addressable (>= 2.2.7)
118
+ crack (>= 0.1.7)
119
+ yajl-ruby (1.1.0)
120
+ yard (0.8.3)
121
+
122
+ PLATFORMS
123
+ ruby
124
+
125
+ DEPENDENCIES
126
+ appraisal
127
+ aruba (~> 0.4.11)
128
+ bundler (>= 1.0.7)
129
+ cucumber (~> 1.1.4)
130
+ curb (~> 0.8.0)
131
+ debugger
132
+ em-http-request (~> 1.0.2)
133
+ excon (>= 0.11.0, < 1.0)
134
+ fakeweb (~> 1.3.0)
135
+ faraday (~> 0.8)
136
+ fuubar
137
+ fuubar-cucumber
138
+ github-markup
139
+ httpclient (~> 2.2)
140
+ jruby-openssl
141
+ json (~> 1.6.5)
142
+ multi_json (~> 1.0.3)
143
+ patron (~> 0.4.15)
144
+ rack (~> 1.3.6)
145
+ rake (~> 0.9.2)
146
+ redcarpet (~> 1.17.2)
147
+ redis (~> 2.2.2)
148
+ relish (~> 0.6)
149
+ rspec (~> 2.11)
150
+ ruby-debug
151
+ shoulda (~> 2.9.2)
152
+ simplecov (~> 0.5.3)
153
+ sinatra (~> 1.3.2)
154
+ timecop (~> 0.3.5)
155
+ typhoeus (~> 0.4.2)
156
+ vcr!
157
+ webmock (= 1.8.11)
158
+ yajl-ruby (~> 1.1.0)
159
+ yard
@@ -75,7 +75,7 @@ module VCR
75
75
  end
76
76
 
77
77
  def remove_unnecessary_standard_port(interaction)
78
- uri = URI(interaction.request.uri)
78
+ uri = VCR.configuration.uri_parser.parse(interaction.request.uri)
79
79
  if uri.scheme == 'http' && uri.port == 80 ||
80
80
  uri.scheme == 'https' && uri.port == 443
81
81
  uri.port = nil
@@ -1,4 +1,5 @@
1
1
  require 'vcr/util/hooks'
2
+ require 'uri'
2
3
 
3
4
  module VCR
4
5
  # Stores the VCR configuration.
@@ -123,6 +124,32 @@ module VCR
123
124
  !!@allow_http_connections_when_no_cassette
124
125
  end
125
126
 
127
+ # Sets a parser for VCR to use when parsing URIs. The new parser
128
+ # must implement a method `parse` that returns an instance of the
129
+ # URI object. This URI object must implement the following
130
+ # interface:
131
+ #
132
+ # * `scheme # => String`
133
+ # * `host # => String`
134
+ # * `port # => Fixnum`
135
+ # * `path # => String`
136
+ # * `query # => String`
137
+ # * `#port=`
138
+ # * `#query=`
139
+ # * `#to_s # => String`
140
+ # * `#== # => Boolean`
141
+ #
142
+ # The `#==` method must return true if both URI objects represent the
143
+ # same URI.
144
+ #
145
+ # This defaults to `URI` from the ruby standard library.
146
+ #
147
+ # @overload uri_parser
148
+ # @return [#parse] the current URI parser object
149
+ # @overload uri_parser=
150
+ # @param value [#parse] sets the uri_parser
151
+ attr_accessor :uri_parser
152
+
126
153
  # Registers a request matcher for later use.
127
154
  #
128
155
  # @example
@@ -424,6 +451,7 @@ module VCR
424
451
  :persist_with => :file_system
425
452
  }
426
453
 
454
+ self.uri_parser = URI
427
455
  self.debug_logger = NullDebugLogger
428
456
 
429
457
  register_built_in_hooks
@@ -188,7 +188,7 @@ module VCR
188
188
  :try_debug_logger => [
189
189
  ["If you're surprised VCR is raising this error",
190
190
  "and want insight about how VCR attempted to handle the request,",
191
- "you can use the debug_logger configuraiton option to log more details"],
191
+ "you can use the debug_logger configuration option to log more details"],
192
192
  "https://www.relishapp.com/myronmarston/vcr/v/%s/docs/configuration/debug-logging"
193
193
  ]
194
194
  }
@@ -2,105 +2,102 @@ require 'vcr/util/version_checker'
2
2
  require 'vcr/request_handler'
3
3
  require 'typhoeus'
4
4
 
5
- VCR::VersionChecker.new('Typhoeus', Typhoeus::VERSION, '0.3.2', '0.4').check_version!
5
+ if Float(Typhoeus::VERSION[/^\d+\.\d+/]) < 0.5
6
+ require 'vcr/library_hooks/typhoeus_0.4'
7
+ else
8
+ VCR::VersionChecker.new('Typhoeus', Typhoeus::VERSION, '0.5.0', '0.5').check_version!
6
9
 
7
- module VCR
8
- class LibraryHooks
9
- # @private
10
- module Typhoeus
10
+ module VCR
11
+ class LibraryHooks
11
12
  # @private
12
- class RequestHandler < ::VCR::RequestHandler
13
- attr_reader :request
14
- def initialize(request)
15
- @request = request
16
- end
13
+ module Typhoeus
14
+ # @private
15
+ class RequestHandler < ::VCR::RequestHandler
16
+ attr_reader :request
17
+ def initialize(request)
18
+ @request = request
19
+ request.block_connection = false if VCR.turned_on?
20
+ end
17
21
 
18
- def vcr_request
19
- @vcr_request ||= VCR::Request.new \
20
- request.method,
21
- request.url,
22
- request.body,
23
- request.headers
24
- end
22
+ def vcr_request
23
+ @vcr_request ||= VCR::Request.new \
24
+ request.options.fetch(:method, :get),
25
+ request.url,
26
+ request.options.fetch(:body, ""),
27
+ request.options.fetch(:headers, {})
28
+ end
25
29
 
26
- private
30
+ private
27
31
 
28
- def externally_stubbed?
29
- ::Typhoeus::Hydra.stubs.detect { |stub| stub.matches?(request) }
30
- end
32
+ def externally_stubbed?
33
+ ::Typhoeus::Expectation.find_by(request)
34
+ end
31
35
 
32
- def set_typed_request_for_after_hook(*args)
33
- super
34
- request.instance_variable_set(:@__typed_vcr_request, @after_hook_typed_request)
35
- end
36
+ def set_typed_request_for_after_hook(*args)
37
+ super
38
+ request.instance_variable_set(:@__typed_vcr_request, @after_hook_typed_request)
39
+ end
36
40
 
37
- def on_unhandled_request
38
- invoke_after_request_hook(nil)
39
- super
40
- end
41
+ def on_unhandled_request
42
+ invoke_after_request_hook(nil)
43
+ super
44
+ end
41
45
 
42
- def on_stubbed_by_vcr_request
43
- ::Typhoeus::Response.new \
44
- :http_version => stubbed_response.http_version,
45
- :code => stubbed_response.status.code,
46
- :status_message => stubbed_response.status.message,
47
- :headers_hash => stubbed_response_headers,
48
- :body => stubbed_response.body
49
- end
46
+ def on_stubbed_by_vcr_request
47
+ ::Typhoeus::Response.new \
48
+ :http_version => stubbed_response.http_version,
49
+ :code => stubbed_response.status.code,
50
+ :status_message => stubbed_response.status.message,
51
+ :headers => stubbed_response_headers,
52
+ :body => stubbed_response.body,
53
+ :mock => true
54
+ end
50
55
 
51
- def stubbed_response_headers
52
- @stubbed_response_headers ||= {}.tap do |hash|
53
- stubbed_response.headers.each do |key, values|
54
- hash[key] = values.size == 1 ? values.first : values
55
- end if stubbed_response.headers
56
+ def stubbed_response_headers
57
+ @stubbed_response_headers ||= {}.tap do |hash|
58
+ stubbed_response.headers.each do |key, values|
59
+ hash[key] = values.size == 1 ? values.first : values
60
+ end if stubbed_response.headers
61
+ end
56
62
  end
57
63
  end
58
- end
59
64
 
60
- # @private
61
- def self.vcr_response_from(response)
62
- VCR::Response.new \
63
- VCR::ResponseStatus.new(response.code, response.status_message),
64
- response.headers_hash,
65
- response.body,
66
- response.http_version
67
- end
65
+ # @private
66
+ def self.vcr_response_from(response)
67
+ VCR::Response.new \
68
+ VCR::ResponseStatus.new(response.code, response.status_message),
69
+ response.headers,
70
+ response.body,
71
+ response.http_version
72
+ end
68
73
 
69
- ::Typhoeus::Hydra.after_request_before_on_complete do |request|
70
- unless VCR.library_hooks.disabled?(:typhoeus)
71
- vcr_response = vcr_response_from(request.response)
72
- typed_vcr_request = request.send(:remove_instance_variable, :@__typed_vcr_request)
74
+ ::Typhoeus.on_complete do |response|
75
+ request = response.request
76
+ unless VCR.library_hooks.disabled?(:typhoeus)
77
+ vcr_response = vcr_response_from(response)
78
+ typed_vcr_request = request.send(:remove_instance_variable, :@__typed_vcr_request)
73
79
 
74
- unless request.response.mock?
75
- http_interaction = VCR::HTTPInteraction.new(typed_vcr_request, vcr_response)
76
- VCR.record_http_interaction(http_interaction)
77
- end
80
+ unless request.response.mock
81
+ http_interaction = VCR::HTTPInteraction.new(typed_vcr_request, vcr_response)
82
+ VCR.record_http_interaction(http_interaction)
83
+ end
78
84
 
79
- VCR.configuration.invoke_hook(:after_http_request, typed_vcr_request, vcr_response)
85
+ VCR.configuration.invoke_hook(:after_http_request, typed_vcr_request, vcr_response)
86
+ end
80
87
  end
81
- end
82
88
 
83
- ::Typhoeus::Hydra.register_stub_finder do |request|
84
- VCR::LibraryHooks::Typhoeus::RequestHandler.new(request).handle
89
+ ::Typhoeus.before do |request|
90
+ if response = VCR::LibraryHooks::Typhoeus::RequestHandler.new(request).handle
91
+ request.finish(response)
92
+ else
93
+ true
94
+ end
95
+ end
85
96
  end
86
97
  end
87
98
  end
88
99
  end
89
100
 
90
- # @private
91
- module Typhoeus
92
- class << Hydra
93
- # ensure HTTP requests are always allowed; VCR takes care of disallowing
94
- # them at the appropriate times in its hook
95
- def allow_net_connect_with_vcr?(*args)
96
- VCR.turned_on? ? true : allow_net_connect_without_vcr?
97
- end
98
-
99
- alias allow_net_connect_without_vcr? allow_net_connect?
100
- alias allow_net_connect? allow_net_connect_with_vcr?
101
- end unless Hydra.respond_to?(:allow_net_connect_with_vcr?)
102
- end
103
-
104
101
  VCR.configuration.after_library_hooks_loaded do
105
102
  # ensure WebMock's Typhoeus adapter does not conflict with us here
106
103
  # (i.e. to double record requests or whatever).
@@ -0,0 +1,99 @@
1
+ VCR::VersionChecker.new('Typhoeus', Typhoeus::VERSION, '0.3.2', '0.4').check_version!
2
+
3
+ module VCR
4
+ class LibraryHooks
5
+ # @private
6
+ module Typhoeus
7
+ # @private
8
+ class RequestHandler < ::VCR::RequestHandler
9
+ attr_reader :request
10
+ def initialize(request)
11
+ @request = request
12
+ end
13
+
14
+ def vcr_request
15
+ @vcr_request ||= VCR::Request.new \
16
+ request.method,
17
+ request.url,
18
+ request.body,
19
+ request.headers
20
+ end
21
+
22
+ private
23
+
24
+ def externally_stubbed?
25
+ ::Typhoeus::Hydra.stubs.detect { |stub| stub.matches?(request) }
26
+ end
27
+
28
+ def set_typed_request_for_after_hook(*args)
29
+ super
30
+ request.instance_variable_set(:@__typed_vcr_request, @after_hook_typed_request)
31
+ end
32
+
33
+ def on_unhandled_request
34
+ invoke_after_request_hook(nil)
35
+ super
36
+ end
37
+
38
+ def on_stubbed_by_vcr_request
39
+ ::Typhoeus::Response.new \
40
+ :http_version => stubbed_response.http_version,
41
+ :code => stubbed_response.status.code,
42
+ :status_message => stubbed_response.status.message,
43
+ :headers_hash => stubbed_response_headers,
44
+ :body => stubbed_response.body
45
+ end
46
+
47
+ def stubbed_response_headers
48
+ @stubbed_response_headers ||= {}.tap do |hash|
49
+ stubbed_response.headers.each do |key, values|
50
+ hash[key] = values.size == 1 ? values.first : values
51
+ end if stubbed_response.headers
52
+ end
53
+ end
54
+ end
55
+
56
+ # @private
57
+ def self.vcr_response_from(response)
58
+ VCR::Response.new \
59
+ VCR::ResponseStatus.new(response.code, response.status_message),
60
+ response.headers_hash,
61
+ response.body,
62
+ response.http_version
63
+ end
64
+
65
+ ::Typhoeus::Hydra.after_request_before_on_complete do |request|
66
+ unless VCR.library_hooks.disabled?(:typhoeus)
67
+ vcr_response = vcr_response_from(request.response)
68
+ typed_vcr_request = request.send(:remove_instance_variable, :@__typed_vcr_request)
69
+
70
+ unless request.response.mock?
71
+ http_interaction = VCR::HTTPInteraction.new(typed_vcr_request, vcr_response)
72
+ VCR.record_http_interaction(http_interaction)
73
+ end
74
+
75
+ VCR.configuration.invoke_hook(:after_http_request, typed_vcr_request, vcr_response)
76
+ end
77
+ end
78
+
79
+ ::Typhoeus::Hydra.register_stub_finder do |request|
80
+ VCR::LibraryHooks::Typhoeus::RequestHandler.new(request).handle
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ # @private
87
+ module Typhoeus
88
+ class << Hydra
89
+ # ensure HTTP requests are always allowed; VCR takes care of disallowing
90
+ # them at the appropriate times in its hook
91
+ def allow_net_connect_with_vcr?(*args)
92
+ VCR.turned_on? ? true : allow_net_connect_without_vcr?
93
+ end
94
+
95
+ alias allow_net_connect_without_vcr? allow_net_connect?
96
+ alias allow_net_connect? allow_net_connect_with_vcr?
97
+ end unless Hydra.respond_to?(:allow_net_connect_with_vcr?)
98
+ end
99
+