vcr 2.2.5 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
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
+