vcr 3.0.2 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. checksums.yaml +5 -5
  2. data/lib/vcr.rb +33 -1
  3. data/lib/vcr/cassette.rb +47 -12
  4. data/lib/vcr/cassette/http_interaction_list.rb +14 -9
  5. data/lib/vcr/cassette/migrator.rb +0 -5
  6. data/lib/vcr/cassette/persisters/file_system.rb +9 -1
  7. data/lib/vcr/cassette/serializers/compressed.rb +2 -2
  8. data/lib/vcr/cassette/serializers/json.rb +7 -7
  9. data/lib/vcr/cassette/serializers/psych.rb +3 -1
  10. data/lib/vcr/cassette/serializers/yaml.rb +3 -1
  11. data/lib/vcr/configuration.rb +20 -8
  12. data/lib/vcr/deprecations.rb +0 -62
  13. data/lib/vcr/errors.rb +17 -12
  14. data/lib/vcr/library_hooks/excon.rb +8 -0
  15. data/lib/vcr/library_hooks/typhoeus.rb +37 -8
  16. data/lib/vcr/linked_cassette.rb +4 -4
  17. data/lib/vcr/middleware/faraday.rb +10 -1
  18. data/lib/vcr/request_ignorer.rb +4 -1
  19. data/lib/vcr/request_matcher_registry.rb +1 -1
  20. data/lib/vcr/structs.rb +48 -32
  21. data/lib/vcr/test_frameworks/cucumber.rb +4 -4
  22. data/lib/vcr/test_frameworks/rspec.rb +12 -3
  23. data/lib/vcr/util/hooks.rb +1 -0
  24. data/lib/vcr/util/internet_connection.rb +15 -21
  25. data/lib/vcr/version.rb +1 -1
  26. metadata +36 -263
  27. data/features/CHANGELOG.md +0 -1
  28. data/features/CONTRIBUTING.md +0 -1
  29. data/features/LICENSE.md +0 -1
  30. data/features/README.md +0 -1
  31. data/features/Upgrade.md +0 -1
  32. data/features/about_these_examples.md +0 -18
  33. data/features/cassettes/allow_unused_http_interactions.feature +0 -100
  34. data/features/cassettes/automatic_re_recording.feature +0 -72
  35. data/features/cassettes/decompress.feature +0 -74
  36. data/features/cassettes/dynamic_erb.feature +0 -100
  37. data/features/cassettes/exclusive.feature +0 -126
  38. data/features/cassettes/format.feature +0 -411
  39. data/features/cassettes/freezing_time.feature +0 -68
  40. data/features/cassettes/naming.feature +0 -28
  41. data/features/cassettes/no_cassette.feature +0 -152
  42. data/features/cassettes/update_content_length_header.feature +0 -112
  43. data/features/configuration/allow_http_connections_when_no_cassette.feature +0 -55
  44. data/features/configuration/cassette_library_dir.feature +0 -31
  45. data/features/configuration/debug_logging.feature +0 -58
  46. data/features/configuration/default_cassette_options.feature +0 -100
  47. data/features/configuration/filter_sensitive_data.feature +0 -153
  48. data/features/configuration/hook_into.feature +0 -172
  49. data/features/configuration/ignore_request.feature +0 -192
  50. data/features/configuration/preserve_exact_body_bytes.feature +0 -108
  51. data/features/configuration/query_parser.feature +0 -84
  52. data/features/configuration/uri_parser.feature +0 -93
  53. data/features/getting_started.md +0 -82
  54. data/features/hooks/after_http_request.feature +0 -58
  55. data/features/hooks/around_http_request.feature +0 -57
  56. data/features/hooks/before_http_request.feature +0 -63
  57. data/features/hooks/before_playback.feature +0 -184
  58. data/features/hooks/before_record.feature +0 -172
  59. data/features/http_libraries/em_http_request.feature +0 -250
  60. data/features/http_libraries/net_http.feature +0 -179
  61. data/features/middleware/faraday.feature +0 -56
  62. data/features/middleware/rack.feature +0 -92
  63. data/features/record_modes/all.feature +0 -82
  64. data/features/record_modes/new_episodes.feature +0 -79
  65. data/features/record_modes/none.feature +0 -72
  66. data/features/record_modes/once.feature +0 -95
  67. data/features/request_matching/README.md +0 -30
  68. data/features/request_matching/body.feature +0 -91
  69. data/features/request_matching/body_as_json.feature +0 -90
  70. data/features/request_matching/custom_matcher.feature +0 -135
  71. data/features/request_matching/headers.feature +0 -85
  72. data/features/request_matching/host.feature +0 -95
  73. data/features/request_matching/identical_request_sequence.feature +0 -89
  74. data/features/request_matching/method.feature +0 -96
  75. data/features/request_matching/path.feature +0 -96
  76. data/features/request_matching/playback_repeats.feature +0 -98
  77. data/features/request_matching/query.feature +0 -97
  78. data/features/request_matching/uri.feature +0 -94
  79. data/features/request_matching/uri_without_param.feature +0 -101
  80. data/features/step_definitions/cli_steps.rb +0 -199
  81. data/features/support/env.rb +0 -46
  82. data/features/support/http_lib_filters.rb +0 -46
  83. data/features/test_frameworks/cucumber.feature +0 -211
  84. data/features/test_frameworks/rspec_macro.feature +0 -81
  85. data/features/test_frameworks/rspec_metadata.feature +0 -150
  86. data/features/test_frameworks/test_unit.feature +0 -49
  87. data/lib/vcr/extensions/net_http_response.rb +0 -36
  88. data/lib/vcr/library_hooks/fakeweb.rb +0 -197
  89. data/spec/acceptance/concurrency_spec.rb +0 -51
  90. data/spec/acceptance/threading_spec.rb +0 -34
  91. data/spec/fixtures/cassette_spec/1_x_cassette.yml +0 -110
  92. data/spec/fixtures/cassette_spec/empty.yml +0 -0
  93. data/spec/fixtures/cassette_spec/example.yml +0 -111
  94. data/spec/fixtures/cassette_spec/with_localhost_requests.yml +0 -111
  95. data/spec/fixtures/fake_example_responses.yml +0 -110
  96. data/spec/fixtures/match_requests_on.yml +0 -187
  97. data/spec/lib/vcr/cassette/erb_renderer_spec.rb +0 -53
  98. data/spec/lib/vcr/cassette/http_interaction_list_spec.rb +0 -295
  99. data/spec/lib/vcr/cassette/migrator_spec.rb +0 -196
  100. data/spec/lib/vcr/cassette/persisters/file_system_spec.rb +0 -75
  101. data/spec/lib/vcr/cassette/persisters_spec.rb +0 -39
  102. data/spec/lib/vcr/cassette/serializers_spec.rb +0 -182
  103. data/spec/lib/vcr/cassette_spec.rb +0 -618
  104. data/spec/lib/vcr/configuration_spec.rb +0 -326
  105. data/spec/lib/vcr/deprecations_spec.rb +0 -85
  106. data/spec/lib/vcr/errors_spec.rb +0 -178
  107. data/spec/lib/vcr/extensions/net_http_response_spec.rb +0 -86
  108. data/spec/lib/vcr/library_hooks/excon_spec.rb +0 -104
  109. data/spec/lib/vcr/library_hooks/fakeweb_spec.rb +0 -169
  110. data/spec/lib/vcr/library_hooks/faraday_spec.rb +0 -68
  111. data/spec/lib/vcr/library_hooks/typhoeus_0.4_spec.rb +0 -36
  112. data/spec/lib/vcr/library_hooks/typhoeus_spec.rb +0 -162
  113. data/spec/lib/vcr/library_hooks/webmock_spec.rb +0 -117
  114. data/spec/lib/vcr/library_hooks_spec.rb +0 -51
  115. data/spec/lib/vcr/middleware/faraday_spec.rb +0 -181
  116. data/spec/lib/vcr/middleware/rack_spec.rb +0 -115
  117. data/spec/lib/vcr/request_ignorer_spec.rb +0 -70
  118. data/spec/lib/vcr/request_matcher_registry_spec.rb +0 -345
  119. data/spec/lib/vcr/structs_spec.rb +0 -732
  120. data/spec/lib/vcr/test_frameworks/cucumber_spec.rb +0 -107
  121. data/spec/lib/vcr/test_frameworks/rspec_spec.rb +0 -94
  122. data/spec/lib/vcr/util/hooks_spec.rb +0 -158
  123. data/spec/lib/vcr/util/internet_connection_spec.rb +0 -37
  124. data/spec/lib/vcr/util/version_checker_spec.rb +0 -31
  125. data/spec/lib/vcr/version_spec.rb +0 -27
  126. data/spec/lib/vcr_spec.rb +0 -354
  127. data/spec/monkey_patches.rb +0 -186
  128. data/spec/spec_helper.rb +0 -63
  129. data/spec/support/configuration_stubbing.rb +0 -8
  130. data/spec/support/cucumber_helpers.rb +0 -39
  131. data/spec/support/fixnum_extension.rb +0 -10
  132. data/spec/support/http_library_adapters.rb +0 -289
  133. data/spec/support/limited_uri.rb +0 -21
  134. data/spec/support/ruby_interpreter.rb +0 -7
  135. data/spec/support/shared_example_groups/excon.rb +0 -63
  136. data/spec/support/shared_example_groups/hook_into_http_library.rb +0 -594
  137. data/spec/support/shared_example_groups/request_hooks.rb +0 -59
  138. data/spec/support/sinatra_app.rb +0 -86
  139. data/spec/support/vcr_localhost_server.rb +0 -76
  140. data/spec/support/vcr_stub_helpers.rb +0 -17
@@ -88,18 +88,7 @@ module VCR
88
88
  end
89
89
 
90
90
  def current_cassettes
91
- @cassettes ||= begin
92
- cassettes = VCR.cassettes.to_a.reverse
93
-
94
- begin
95
- loop do
96
- break unless VCR.eject_cassette
97
- end
98
- rescue EjectLinkedCassetteError
99
- end
100
-
101
- cassettes
102
- end
91
+ @cassettes ||= VCR.cassettes.to_a.reverse
103
92
  end
104
93
 
105
94
  def request_description
@@ -107,6 +96,10 @@ module VCR
107
96
 
108
97
  lines << " #{request.method.to_s.upcase} #{request.uri}"
109
98
 
99
+ if match_request_on_headers?
100
+ lines << " Headers:\n#{formatted_headers}"
101
+ end
102
+
110
103
  if match_request_on_body?
111
104
  lines << " Body: #{request.body}"
112
105
  end
@@ -114,6 +107,10 @@ module VCR
114
107
  lines.join("\n")
115
108
  end
116
109
 
110
+ def match_request_on_headers?
111
+ current_matchers.include?(:headers)
112
+ end
113
+
117
114
  def match_request_on_body?
118
115
  current_matchers.include?(:body)
119
116
  end
@@ -128,6 +125,14 @@ module VCR
128
125
  end
129
126
  end
130
127
 
128
+ def formatted_headers
129
+ request.headers.flat_map do |header, values|
130
+ values.map do |val|
131
+ " #{header}: #{val.inspect}"
132
+ end
133
+ end.join("\n")
134
+ end
135
+
131
136
  def cassettes_description
132
137
  if current_cassettes.size > 0
133
138
  [cassettes_list << "\n",
@@ -22,6 +22,14 @@ VCR.configuration.after_library_hooks_loaded do
22
22
  # (i.e. to double record requests or whatever).
23
23
  if defined?(WebMock::HttpLibAdapters::ExconAdapter)
24
24
  WebMock::HttpLibAdapters::ExconAdapter.disable!
25
+
26
+ if defined?(::RSpec)
27
+ ::RSpec.configure do |config|
28
+ config.before(:suite) do
29
+ WebMock::HttpLibAdapters::ExconAdapter.disable!
30
+ end
31
+ end
32
+ end
25
33
  end
26
34
  end
27
35
 
@@ -44,7 +44,7 @@ else
44
44
  end
45
45
 
46
46
  def on_stubbed_by_vcr_request
47
- ::Typhoeus::Response.new \
47
+ response = ::Typhoeus::Response.new \
48
48
  :http_version => stubbed_response.http_version,
49
49
  :code => stubbed_response.status.code,
50
50
  :status_message => stubbed_response.status.message,
@@ -52,6 +52,13 @@ else
52
52
  :body => stubbed_response.body,
53
53
  :effective_url => stubbed_response.adapter_metadata.fetch('effective_url', request.url),
54
54
  :mock => true
55
+
56
+ first_header_line = "HTTP/#{stubbed_response.http_version} #{response.code} #{response.status_message}\r\n"
57
+ response.instance_variable_set(:@first_header_line, first_header_line)
58
+ response.instance_variable_get(:@options)[:response_headers] =
59
+ first_header_line + response.headers.map { |k,v| "#{k}: #{v}"}.join("\r\n")
60
+
61
+ response
55
62
  end
56
63
 
57
64
  def stubbed_response_headers
@@ -74,17 +81,36 @@ else
74
81
  end
75
82
 
76
83
  # @private
77
- def self.vcr_response_from(response)
78
- VCR::Response.new \
79
- VCR::ResponseStatus.new(response.code, response.status_message),
80
- response.headers,
81
- response.body,
82
- response.http_version,
83
- { "effective_url" => response.effective_url }
84
+ class << self
85
+ def vcr_response_from(response)
86
+ VCR::Response.new \
87
+ VCR::ResponseStatus.new(response.code, response.status_message),
88
+ response.headers,
89
+ response.body,
90
+ response.http_version,
91
+ { "effective_url" => response.effective_url }
92
+ end
93
+
94
+ def collect_chunks(request)
95
+ chunks = ''
96
+ request.on_body.unshift(
97
+ Proc.new do |body, response|
98
+ chunks += body
99
+ request.instance_variable_set(:@chunked_body, chunks)
100
+ end
101
+ )
102
+ end
103
+
104
+ def restore_body_from_chunks(response, request)
105
+ response.options[:response_body] = request.instance_variable_get(:@chunked_body)
106
+ end
84
107
  end
85
108
 
86
109
  ::Typhoeus.on_complete do |response|
87
110
  request = response.request
111
+
112
+ restore_body_from_chunks(response, request) if request.streaming?
113
+
88
114
  unless VCR.library_hooks.disabled?(:typhoeus)
89
115
  vcr_response = vcr_response_from(response)
90
116
  typed_vcr_request = request.send(:remove_instance_variable, :@__typed_vcr_request)
@@ -99,7 +125,10 @@ else
99
125
  end
100
126
 
101
127
  ::Typhoeus.before do |request|
128
+ collect_chunks(request) if request.streaming?
102
129
  if response = VCR::LibraryHooks::Typhoeus::RequestHandler.new(request).handle
130
+ request.on_headers.each { |cb| cb.call(response) }
131
+ request.on_body.each { |cb| cb.call(response.body, response) }
103
132
  request.finish(response)
104
133
  else
105
134
  true
@@ -9,8 +9,8 @@ module VCR
9
9
  include Enumerable
10
10
 
11
11
  # Creates a new list of context-owned cassettes and linked cassettes
12
- # @param [Array] context-owned cassettes
13
- # @param [Array] context-unowned (linked) cassettes
12
+ # @param cassettes [Array] context-owned cassettes
13
+ # @param linked_cassettes [Array] context-unowned (linked) cassettes
14
14
  def initialize(cassettes, linked_cassettes)
15
15
  @cassettes = cassettes
16
16
  @linked_cassettes = linked_cassettes
@@ -52,8 +52,8 @@ module VCR
52
52
  end
53
53
 
54
54
  # Create a new CassetteList
55
- # @param [Array] context-owned cassettes
56
- # @param [Array] context-unowned (linked) cassettes
55
+ # @param cassettes [Array] context-owned cassettes
56
+ # @param linked_cassettes [Array] context-unowned (linked) cassettes
57
57
  def self.list(cassettes, linked_cassettes)
58
58
  CassetteList.new(cassettes, linked_cassettes)
59
59
  end
@@ -31,6 +31,11 @@ module VCR
31
31
  RequestHandler.new(@app, env).handle
32
32
  end
33
33
 
34
+ # Close any persistent connections.
35
+ def close
36
+ @app.close if @app.respond_to?(:close)
37
+ end
38
+
34
39
  # @private
35
40
  class RequestHandler < ::VCR::RequestHandler
36
41
  attr_reader :app, :env
@@ -72,8 +77,12 @@ module VCR
72
77
  end
73
78
 
74
79
  def response_for(response)
80
+ # reason_phrase is a new addition to Faraday::Response,
81
+ # so maintain backward compatibility
82
+ reason = response.respond_to?(:reason_phrase) ? response.reason_phrase : nil
83
+
75
84
  VCR::Response.new(
76
- VCR::ResponseStatus.new(response.status, nil),
85
+ VCR::ResponseStatus.new(response.status, reason),
77
86
  response.headers,
78
87
  raw_body_from(response.body),
79
88
  nil
@@ -29,6 +29,10 @@ module VCR
29
29
  ignored_hosts.merge(hosts)
30
30
  end
31
31
 
32
+ def unignore_hosts(*hosts)
33
+ ignored_hosts.subtract(hosts)
34
+ end
35
+
32
36
  def ignore?(request)
33
37
  invoke_hook(:ignore_request, request).any?
34
38
  end
@@ -40,4 +44,3 @@ module VCR
40
44
  end
41
45
  end
42
46
  end
43
-
@@ -138,7 +138,7 @@ module VCR
138
138
 
139
139
  register(:body_as_json) do |r1, r2|
140
140
  begin
141
- JSON.parse(r1.body) == JSON.parse(r2.body)
141
+ r1.body == r2.body || JSON.parse(r1.body) == JSON.parse(r2.body)
142
142
  rescue JSON::ParserError
143
143
  false
144
144
  end
@@ -62,7 +62,7 @@ module VCR
62
62
  super
63
63
 
64
64
  if body && !body.is_a?(String)
65
- raise ArgumentError, "#{self.class} initialized with an invalid body: #{body.inspect}."
65
+ raise ArgumentError, "#{self.class} initialized with an invalid (non-String) body of class #{body.class}: #{body.inspect}."
66
66
  end
67
67
 
68
68
  # Ensure that the body is a raw string, in case the string instance
@@ -167,25 +167,6 @@ module VCR
167
167
  end
168
168
  end
169
169
 
170
- # @private
171
- module OrderedHashSerializer
172
- def each
173
- @ordered_keys.each do |key|
174
- yield key, self[key] if has_key?(key)
175
- end
176
- end
177
-
178
- if RUBY_VERSION.to_f > 1.8
179
- # 1.9+ hashes are already ordered.
180
- def self.apply_to(*args); end
181
- else
182
- def self.apply_to(hash, keys)
183
- hash.instance_variable_set(:@ordered_keys, keys)
184
- hash.extend self
185
- end
186
- end
187
- end
188
-
189
170
  # The request of an {HTTPInteraction}.
190
171
  #
191
172
  # @attr [Symbol] method the HTTP method (i.e. :head, :options, :get, :post, :put, :patch or :delete)
@@ -219,7 +200,7 @@ module VCR
219
200
  'uri' => uri,
220
201
  'body' => serializable_body,
221
202
  'headers' => headers
222
- }.tap { |h| OrderedHashSerializer.apply_to(h, members) }
203
+ }
223
204
  end
224
205
 
225
206
  # Constructs a new instance from a hash.
@@ -274,7 +255,7 @@ module VCR
274
255
  end
275
256
 
276
257
  # @return [Boolean] whether or not this request is being stubbed by an
277
- # external library (such as WebMock or FakeWeb).
258
+ # external library (such as WebMock).
278
259
  # @see #stubbed_by_vcr?
279
260
  # @see #stubbed?
280
261
  def externally_stubbed?
@@ -365,11 +346,10 @@ module VCR
365
346
  {
366
347
  'status' => status.to_hash,
367
348
  'headers' => headers,
368
- 'body' => serializable_body,
369
- 'http_version' => http_version
349
+ 'body' => serializable_body
370
350
  }.tap do |hash|
351
+ hash['http_version'] = http_version if http_version
371
352
  hash['adapter_metadata'] = adapter_metadata unless adapter_metadata.empty?
372
- OrderedHashSerializer.apply_to(hash, members)
373
353
  end
374
354
  end
375
355
 
@@ -403,6 +383,11 @@ module VCR
403
383
  %w[ gzip deflate ].include? content_encoding
404
384
  end
405
385
 
386
+ # Checks if VCR decompressed the response body
387
+ def vcr_decompressed?
388
+ adapter_metadata['vcr_decompressed']
389
+ end
390
+
406
391
  # Decodes the compressed body and deletes evidence that it was ever compressed.
407
392
  #
408
393
  # @return self
@@ -412,11 +397,43 @@ module VCR
412
397
  self.class.decompress(body, content_encoding) { |new_body|
413
398
  self.body = new_body
414
399
  update_content_length_header
400
+ adapter_metadata['vcr_decompressed'] = content_encoding
415
401
  delete_header('Content-Encoding')
416
402
  }
417
403
  return self
418
404
  end
419
405
 
406
+ # Recompresses the decompressed body according to adapter metadata.
407
+ #
408
+ # @raise [VCR::Errors::UnknownContentEncodingError] if the content encoding
409
+ # stored in the adapter metadata is unknown
410
+ def recompress
411
+ type = adapter_metadata['vcr_decompressed']
412
+ new_body = begin
413
+ case type
414
+ when 'gzip'
415
+ body_str = ''
416
+ args = [StringIO.new(body_str)]
417
+ args << { :encoding => 'ASCII-8BIT' } if ''.respond_to?(:encoding)
418
+ writer = Zlib::GzipWriter.new(*args)
419
+ writer.write(body)
420
+ writer.close
421
+ body_str
422
+ when 'deflate'
423
+ Zlib::Deflate.inflate(body)
424
+ when 'identity', NilClass
425
+ nil
426
+ else
427
+ raise Errors::UnknownContentEncodingError, "unknown content encoding: #{type}"
428
+ end
429
+ end
430
+ if new_body
431
+ self.body = new_body
432
+ update_content_length_header
433
+ headers['Content-Encoding'] = type
434
+ end
435
+ end
436
+
420
437
  begin
421
438
  require 'zlib'
422
439
  require 'stringio'
@@ -437,9 +454,10 @@ module VCR
437
454
 
438
455
  case type
439
456
  when 'gzip'
440
- args = [StringIO.new(body)]
441
- args << { :encoding => 'ASCII-8BIT' } if ''.respond_to?(:encoding)
442
- yield Zlib::GzipReader.new(*args).read
457
+ gzip_reader_options = {}
458
+ gzip_reader_options[:encoding] = 'ASCII-8BIT' if ''.respond_to?(:encoding)
459
+ yield Zlib::GzipReader.new(StringIO.new(body),
460
+ **gzip_reader_options).read
443
461
  when 'deflate'
444
462
  yield Zlib::Inflate.inflate(body)
445
463
  when 'identity', NilClass
@@ -463,7 +481,7 @@ module VCR
463
481
  def to_hash
464
482
  {
465
483
  'code' => code, 'message' => message
466
- }.tap { |h| OrderedHashSerializer.apply_to(h, members) }
484
+ }
467
485
  end
468
486
 
469
487
  # Constructs a new instance from a hash.
@@ -496,9 +514,7 @@ module VCR
496
514
  'request' => request.to_hash,
497
515
  'response' => response.to_hash,
498
516
  'recorded_at' => recorded_at.httpdate
499
- }.tap do |hash|
500
- OrderedHashSerializer.apply_to(hash, members)
501
- end
517
+ }
502
518
  end
503
519
 
504
520
  # Constructs a new instance from a hash.
@@ -23,10 +23,10 @@ module VCR
23
23
  # Adds `Before` and `After` cucumber hooks for the named tags that
24
24
  # will cause a VCR cassette to be used for scenarios with matching tags.
25
25
  #
26
- # @param [Array<String>] tag_names the cucumber scenario tags
27
- # @param [(optional) Hash] options the cassette options. Specify
28
- # `:use_scenario_name => true` to automatically name the
29
- # cassette according to the scenario name.
26
+ # @param tag_names [Array<String,Hash>] the cucumber scenario tags. If
27
+ # the last argument is a hash it is treated as cassette options.
28
+ # - `:use_scenario_name => true` to automatically name the
29
+ # cassette according to the scenario name.
30
30
  def tags(*tag_names)
31
31
  original_options = tag_names.last.is_a?(::Hash) ? tag_names.pop : {}
32
32
  tag_names.each do |tag_name|
@@ -32,10 +32,19 @@ module VCR
32
32
  config.before(:each, when_tagged_with_vcr) do |ex|
33
33
  example = ex.respond_to?(:metadata) ? ex : ex.example
34
34
 
35
+ cassette_name = nil
35
36
  options = example.metadata[:vcr]
36
- options = options.is_a?(Hash) ? options.dup : {} # in case it's just :vcr => true
37
-
38
- cassette_name = options.delete(:cassette_name) ||
37
+ options = case options
38
+ when Hash #=> vcr: { cassette_name: 'foo' }
39
+ options.dup
40
+ when String #=> vcr: 'bar'
41
+ cassette_name = options.dup
42
+ {}
43
+ else #=> :vcr or vcr: true
44
+ {}
45
+ end
46
+
47
+ cassette_name ||= options.delete(:cassette_name) ||
39
48
  vcr_cassette_name_for[example.metadata]
40
49
  VCR.insert_cassette(cassette_name, options)
41
50
  end
@@ -5,6 +5,7 @@ module VCR
5
5
  module Hooks
6
6
  include VariableArgsBlockCaller
7
7
 
8
+ # @private
8
9
  FilteredHook = Struct.new(:hook, :filters) do
9
10
  include VariableArgsBlockCaller
10
11
 
@@ -1,31 +1,25 @@
1
1
  module VCR
2
2
  # Ruby 1.8 provides Ping.pingecho, but it was removed in 1.9.
3
- # So we try requiring it, and if that fails, define it ourselves.
4
- begin
5
- require 'ping'
6
- Ping = ::Ping
7
- rescue LoadError
8
- # This is copied, verbatim, from Ruby 1.8.7's ping.rb.
9
- require 'timeout'
10
- require "socket"
3
+ # This is copied, verbatim, from Ruby 1.8.7's ping.rb.
4
+ require 'timeout'
5
+ require "socket"
11
6
 
12
- # @private
13
- module Ping
14
- def pingecho(host, timeout=5, service="echo")
15
- begin
16
- Timeout.timeout(timeout) do
17
- s = TCPSocket.new(host, service)
18
- s.close
19
- end
20
- rescue Errno::ECONNREFUSED
21
- return true
22
- rescue Timeout::Error, StandardError
23
- return false
7
+ # @private
8
+ module Ping
9
+ def pingecho(host, timeout=5, service="echo")
10
+ begin
11
+ Timeout.timeout(timeout) do
12
+ s = TCPSocket.new(host, service)
13
+ s.close
24
14
  end
15
+ rescue Errno::ECONNREFUSED
25
16
  return true
17
+ rescue Timeout::Error, StandardError
18
+ return false
26
19
  end
27
- module_function :pingecho
20
+ return true
28
21
  end
22
+ module_function :pingecho
29
23
  end
30
24
 
31
25
  # @private