webmock 3.5.0 → 3.25.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 (142) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +476 -2
  3. data/README.md +166 -42
  4. data/lib/webmock/api.rb +2 -0
  5. data/lib/webmock/assertion_failure.rb +2 -0
  6. data/lib/webmock/callback_registry.rb +2 -0
  7. data/lib/webmock/config.rb +2 -0
  8. data/lib/webmock/cucumber.rb +2 -0
  9. data/lib/webmock/deprecation.rb +2 -0
  10. data/lib/webmock/errors.rb +2 -0
  11. data/lib/webmock/http_lib_adapters/async_http_client_adapter.rb +228 -0
  12. data/lib/webmock/http_lib_adapters/curb_adapter.rb +14 -3
  13. data/lib/webmock/http_lib_adapters/em_http_request_adapter.rb +22 -9
  14. data/lib/webmock/http_lib_adapters/excon_adapter.rb +5 -0
  15. data/lib/webmock/http_lib_adapters/http_lib_adapter.rb +2 -0
  16. data/lib/webmock/http_lib_adapters/http_lib_adapter_registry.rb +2 -0
  17. data/lib/webmock/http_lib_adapters/http_rb/client.rb +4 -1
  18. data/lib/webmock/http_lib_adapters/http_rb/request.rb +17 -5
  19. data/lib/webmock/http_lib_adapters/http_rb/response.rb +49 -5
  20. data/lib/webmock/http_lib_adapters/http_rb/streamer.rb +11 -3
  21. data/lib/webmock/http_lib_adapters/http_rb/webmock.rb +8 -2
  22. data/lib/webmock/http_lib_adapters/http_rb_adapter.rb +7 -5
  23. data/lib/webmock/http_lib_adapters/httpclient_adapter.rb +25 -7
  24. data/lib/webmock/http_lib_adapters/manticore_adapter.rb +35 -15
  25. data/lib/webmock/http_lib_adapters/net_http.rb +59 -112
  26. data/lib/webmock/http_lib_adapters/net_http_response.rb +3 -1
  27. data/lib/webmock/http_lib_adapters/patron_adapter.rb +4 -2
  28. data/lib/webmock/http_lib_adapters/typhoeus_hydra_adapter.rb +18 -2
  29. data/lib/webmock/matchers/any_arg_matcher.rb +2 -0
  30. data/lib/webmock/matchers/hash_argument_matcher.rb +2 -0
  31. data/lib/webmock/matchers/hash_excluding_matcher.rb +2 -0
  32. data/lib/webmock/matchers/hash_including_matcher.rb +2 -0
  33. data/lib/webmock/minitest.rb +2 -0
  34. data/lib/webmock/rack_response.rb +5 -1
  35. data/lib/webmock/request_body_diff.rb +3 -1
  36. data/lib/webmock/request_execution_verifier.rb +2 -0
  37. data/lib/webmock/request_pattern.rb +118 -61
  38. data/lib/webmock/request_registry.rb +2 -0
  39. data/lib/webmock/request_signature.rb +4 -2
  40. data/lib/webmock/request_signature_snippet.rb +2 -0
  41. data/lib/webmock/request_stub.rb +34 -0
  42. data/lib/webmock/response.rb +22 -14
  43. data/lib/webmock/responses_sequence.rb +2 -0
  44. data/lib/webmock/rspec/matchers/request_pattern_matcher.rb +2 -0
  45. data/lib/webmock/rspec/matchers/webmock_matcher.rb +2 -0
  46. data/lib/webmock/rspec/matchers.rb +2 -0
  47. data/lib/webmock/rspec.rb +4 -1
  48. data/lib/webmock/stub_registry.rb +28 -11
  49. data/lib/webmock/stub_request_snippet.rb +2 -0
  50. data/lib/webmock/test_unit.rb +3 -3
  51. data/lib/webmock/util/hash_counter.rb +12 -6
  52. data/lib/webmock/util/hash_keys_stringifier.rb +2 -0
  53. data/lib/webmock/util/hash_validator.rb +2 -0
  54. data/lib/webmock/util/headers.rb +23 -10
  55. data/lib/webmock/util/parsers/json.rb +72 -0
  56. data/lib/webmock/util/parsers/parse_error.rb +7 -0
  57. data/lib/webmock/util/parsers/xml.rb +16 -0
  58. data/lib/webmock/util/query_mapper.rb +6 -2
  59. data/lib/webmock/util/uri.rb +11 -9
  60. data/lib/webmock/util/values_stringifier.rb +2 -0
  61. data/lib/webmock/util/version_checker.rb +7 -5
  62. data/lib/webmock/version.rb +3 -1
  63. data/lib/webmock/webmock.rb +22 -3
  64. data/lib/webmock.rb +5 -2
  65. metadata +99 -175
  66. data/.gemtest +0 -0
  67. data/.gitignore +0 -34
  68. data/.rspec-tm +0 -2
  69. data/.travis.yml +0 -21
  70. data/Gemfile +0 -9
  71. data/Rakefile +0 -30
  72. data/lib/webmock/util/json.rb +0 -67
  73. data/minitest/test_helper.rb +0 -34
  74. data/minitest/test_webmock.rb +0 -9
  75. data/minitest/webmock_spec.rb +0 -60
  76. data/spec/acceptance/curb/curb_spec.rb +0 -481
  77. data/spec/acceptance/curb/curb_spec_helper.rb +0 -147
  78. data/spec/acceptance/em_http_request/em_http_request_spec.rb +0 -406
  79. data/spec/acceptance/em_http_request/em_http_request_spec_helper.rb +0 -77
  80. data/spec/acceptance/excon/excon_spec.rb +0 -77
  81. data/spec/acceptance/excon/excon_spec_helper.rb +0 -50
  82. data/spec/acceptance/http_rb/http_rb_spec.rb +0 -82
  83. data/spec/acceptance/http_rb/http_rb_spec_helper.rb +0 -54
  84. data/spec/acceptance/httpclient/httpclient_spec.rb +0 -217
  85. data/spec/acceptance/httpclient/httpclient_spec_helper.rb +0 -57
  86. data/spec/acceptance/manticore/manticore_spec.rb +0 -56
  87. data/spec/acceptance/manticore/manticore_spec_helper.rb +0 -35
  88. data/spec/acceptance/net_http/net_http_shared.rb +0 -153
  89. data/spec/acceptance/net_http/net_http_spec.rb +0 -331
  90. data/spec/acceptance/net_http/net_http_spec_helper.rb +0 -64
  91. data/spec/acceptance/net_http/real_net_http_spec.rb +0 -20
  92. data/spec/acceptance/patron/patron_spec.rb +0 -125
  93. data/spec/acceptance/patron/patron_spec_helper.rb +0 -54
  94. data/spec/acceptance/shared/allowing_and_disabling_net_connect.rb +0 -313
  95. data/spec/acceptance/shared/callbacks.rb +0 -147
  96. data/spec/acceptance/shared/complex_cross_concern_behaviors.rb +0 -36
  97. data/spec/acceptance/shared/enabling_and_disabling_webmock.rb +0 -95
  98. data/spec/acceptance/shared/precedence_of_stubs.rb +0 -15
  99. data/spec/acceptance/shared/request_expectations.rb +0 -923
  100. data/spec/acceptance/shared/returning_declared_responses.rb +0 -388
  101. data/spec/acceptance/shared/stubbing_requests.rb +0 -638
  102. data/spec/acceptance/typhoeus/typhoeus_hydra_spec.rb +0 -135
  103. data/spec/acceptance/typhoeus/typhoeus_hydra_spec_helper.rb +0 -60
  104. data/spec/acceptance/webmock_shared.rb +0 -41
  105. data/spec/fixtures/test.txt +0 -1
  106. data/spec/quality_spec.rb +0 -84
  107. data/spec/spec_helper.rb +0 -48
  108. data/spec/support/example_curl_output.txt +0 -22
  109. data/spec/support/failures.rb +0 -9
  110. data/spec/support/my_rack_app.rb +0 -53
  111. data/spec/support/network_connection.rb +0 -19
  112. data/spec/support/webmock_server.rb +0 -69
  113. data/spec/unit/api_spec.rb +0 -175
  114. data/spec/unit/errors_spec.rb +0 -129
  115. data/spec/unit/http_lib_adapters/http_lib_adapter_registry_spec.rb +0 -17
  116. data/spec/unit/http_lib_adapters/http_lib_adapter_spec.rb +0 -12
  117. data/spec/unit/matchers/hash_excluding_matcher_spec.rb +0 -61
  118. data/spec/unit/matchers/hash_including_matcher_spec.rb +0 -87
  119. data/spec/unit/rack_response_spec.rb +0 -112
  120. data/spec/unit/request_body_diff_spec.rb +0 -90
  121. data/spec/unit/request_execution_verifier_spec.rb +0 -208
  122. data/spec/unit/request_pattern_spec.rb +0 -596
  123. data/spec/unit/request_registry_spec.rb +0 -95
  124. data/spec/unit/request_signature_snippet_spec.rb +0 -89
  125. data/spec/unit/request_signature_spec.rb +0 -155
  126. data/spec/unit/request_stub_spec.rb +0 -199
  127. data/spec/unit/response_spec.rb +0 -282
  128. data/spec/unit/stub_registry_spec.rb +0 -103
  129. data/spec/unit/stub_request_snippet_spec.rb +0 -115
  130. data/spec/unit/util/hash_counter_spec.rb +0 -39
  131. data/spec/unit/util/hash_keys_stringifier_spec.rb +0 -27
  132. data/spec/unit/util/headers_spec.rb +0 -28
  133. data/spec/unit/util/json_spec.rb +0 -33
  134. data/spec/unit/util/query_mapper_spec.rb +0 -150
  135. data/spec/unit/util/uri_spec.rb +0 -299
  136. data/spec/unit/util/version_checker_spec.rb +0 -65
  137. data/spec/unit/webmock_spec.rb +0 -11
  138. data/test/http_request.rb +0 -24
  139. data/test/shared_test.rb +0 -108
  140. data/test/test_helper.rb +0 -23
  141. data/test/test_webmock.rb +0 -6
  142. data/webmock.gemspec +0 -46
@@ -1,4 +1,4 @@
1
- require 'base64'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module WebMock
4
4
 
@@ -6,18 +6,21 @@ module WebMock
6
6
 
7
7
  class Headers
8
8
 
9
+ STANDARD_HEADER_DELIMITER = '-'
10
+ NONSTANDARD_HEADER_DELIMITER = '_'
11
+ JOIN = ', '
12
+
9
13
  def self.normalize_headers(headers)
10
14
  return nil unless headers
11
- array = headers.map { |name, value|
12
- [name.to_s.split(/_|-/).map { |segment| segment.capitalize }.join("-"),
13
- case value
15
+
16
+ headers.each_with_object({}) do |(name, value), new_headers|
17
+ new_headers[normalize_name(name)] =
18
+ case value
14
19
  when Regexp then value
15
- when Array then (value.size == 1) ? value.first.to_s : value.map {|v| v.to_s}.sort
20
+ when Array then (value.size == 1) ? value.first.to_s : value.map(&:to_s).sort
16
21
  else value.to_s
17
- end
18
- ]
19
- }
20
- Hash[*array.inject([]) {|r,x| r + x}]
22
+ end
23
+ end
21
24
  end
22
25
 
23
26
  def self.sorted_headers_string(headers)
@@ -54,7 +57,17 @@ module WebMock
54
57
  end
55
58
 
56
59
  def self.basic_auth_header(*credentials)
57
- "Basic #{Base64.strict_encode64(credentials.join(':')).chomp}"
60
+ strict_base64_encoded = [credentials.join(':')].pack("m0")
61
+ "Basic #{strict_base64_encoded.chomp}"
62
+ end
63
+
64
+ def self.normalize_name(name)
65
+ name
66
+ .to_s
67
+ .tr(NONSTANDARD_HEADER_DELIMITER, STANDARD_HEADER_DELIMITER)
68
+ .split(STANDARD_HEADER_DELIMITER)
69
+ .map!(&:capitalize)
70
+ .join(STANDARD_HEADER_DELIMITER)
58
71
  end
59
72
 
60
73
  end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This is a copy of https://github.com/jnunemaker/crack/blob/master/lib/crack/json.rb
4
+ # with date parsing removed
5
+ # Copyright (c) 2004-2008 David Heinemeier Hansson
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
7
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
9
+
10
+ require_relative "parse_error"
11
+
12
+ module WebMock
13
+ module Util
14
+ module Parsers
15
+ class JSON
16
+ def self.parse(json)
17
+ yaml = unescape(convert_json_to_yaml(json))
18
+ YAML.load(yaml)
19
+ rescue ArgumentError, Psych::SyntaxError => e
20
+ raise ParseError, "Invalid JSON string: #{yaml}, Error: #{e.inspect}"
21
+ end
22
+
23
+ protected
24
+
25
+ def self.unescape(str)
26
+ str.gsub(/\\u([0-9a-f]{4})/) { [$1.hex].pack("U") }
27
+ end
28
+
29
+ # Ensure that ":" and "," are always followed by a space
30
+ def self.convert_json_to_yaml(json) #:nodoc:
31
+ scanner, quoting, marks, times = StringScanner.new(json), false, [], []
32
+ while scanner.scan_until(/(\\['"]|['":,\\]|\\.)/)
33
+ case char = scanner[1]
34
+ when '"', "'"
35
+ if !quoting
36
+ quoting = char
37
+ elsif quoting == char
38
+ quoting = false
39
+ end
40
+ when ":",","
41
+ marks << scanner.pos - 1 unless quoting
42
+ when "\\"
43
+ scanner.skip(/\\/)
44
+ end
45
+ end
46
+
47
+ if marks.empty?
48
+ json.gsub(/\\\//, '/')
49
+ else
50
+ left_pos = [-1].push(*marks)
51
+ right_pos = marks << json.bytesize
52
+ output = []
53
+
54
+ left_pos.each_with_index do |left, i|
55
+ if json.respond_to?(:byteslice)
56
+ output << json.byteslice(left.succ..right_pos[i])
57
+ else
58
+ output << json[left.succ..right_pos[i]]
59
+ end
60
+ end
61
+
62
+ output = output * " "
63
+
64
+ times.each { |i| output[i-1] = ' ' }
65
+ output.gsub!(/\\\//, '/')
66
+ output
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,7 @@
1
+ module WebMock
2
+ module Util
3
+ module Parsers
4
+ class ParseError < StandardError; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,16 @@
1
+ require_relative "parse_error"
2
+ require "crack/xml"
3
+
4
+ module WebMock
5
+ module Util
6
+ module Parsers
7
+ class XML
8
+ def self.parse(xml)
9
+ ::Crack::XML.parse(xml)
10
+ rescue ::REXML::ParseException => e
11
+ raise ParseError, "Invalid XML string: #{xml}, Error: #{e.inspect}"
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module WebMock::Util
2
4
  class QueryMapper
3
5
  class << self
@@ -161,7 +163,7 @@ module WebMock::Util
161
163
  else
162
164
  if array_value
163
165
  current_node[last_key] ||= []
164
- current_node[last_key] << value
166
+ current_node[last_key] << value unless value.nil?
165
167
  else
166
168
  current_node[last_key] = value
167
169
  end
@@ -186,7 +188,9 @@ module WebMock::Util
186
188
  new_query_values = new_query_values.to_hash
187
189
  new_query_values = new_query_values.inject([]) do |object, (key, value)|
188
190
  key = key.to_s if key.is_a?(::Symbol) || key.nil?
189
- if value.is_a?(Array)
191
+ if value.is_a?(Array) && value.empty?
192
+ object << [key.to_s + '[]']
193
+ elsif value.is_a?(Array)
190
194
  value.each { |v| object << [key.to_s + '[]', v] }
191
195
  elsif value.is_a?(Hash)
192
196
  value.each { |k, v| object << ["#{key.to_s}[#{k}]", v]}
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module WebMock
2
4
 
3
5
  module Util
@@ -41,12 +43,12 @@ module WebMock
41
43
  uris = uris_with_trailing_slash_and_without(uris)
42
44
  end
43
45
 
44
- uris = uris_encoded_and_unencoded(uris)
45
-
46
46
  if normalized_uri.port == Addressable::URI.port_mapping[normalized_uri.scheme]
47
47
  uris = uris_with_inferred_port_and_without(uris)
48
48
  end
49
49
 
50
+ uris = uris_encoded_and_unencoded(uris)
51
+
50
52
  if normalized_uri.scheme == "http" && !only_with_scheme
51
53
  uris = uris_with_scheme_and_without(uris)
52
54
  end
@@ -68,7 +70,7 @@ module WebMock
68
70
 
69
71
  def self.is_uri_localhost?(uri)
70
72
  uri.is_a?(Addressable::URI) &&
71
- %w(localhost 127.0.0.1 0.0.0.0).include?(uri.host)
73
+ %w(localhost 127.0.0.1 0.0.0.0 [::1]).include?(uri.host)
72
74
  end
73
75
 
74
76
  private
@@ -80,27 +82,27 @@ module WebMock
80
82
 
81
83
  def self.uris_with_inferred_port_and_without(uris)
82
84
  uris.map { |uri|
83
- uri = uri.dup.force_encoding(Encoding::ASCII_8BIT) if uri.respond_to?(:force_encoding)
84
- [ uri, uri.gsub(%r{(:80)|(:443)}, "").freeze ]
85
+ [ uri, uri.omit(:port)]
85
86
  }.flatten
86
87
  end
87
88
 
88
89
  def self.uris_encoded_and_unencoded(uris)
89
90
  uris.map do |uri|
90
- [ uri.to_s, Addressable::URI.unencode(uri, String).freeze ]
91
+ [
92
+ uri.to_s.force_encoding(Encoding::ASCII_8BIT),
93
+ Addressable::URI.unencode(uri, String).force_encoding(Encoding::ASCII_8BIT).freeze
94
+ ]
91
95
  end.flatten
92
96
  end
93
97
 
94
98
  def self.uris_with_scheme_and_without(uris)
95
99
  uris.map { |uri|
96
- uri = uri.dup.force_encoding(Encoding::ASCII_8BIT) if uri.respond_to?(:force_encoding)
97
100
  [ uri, uri.gsub(%r{^https?://},"").freeze ]
98
101
  }.flatten
99
102
  end
100
103
 
101
104
  def self.uris_with_trailing_slash_and_without(uris)
102
- uris = uris.map { |uri|
103
- uri = uri.dup.force_encoding(Encoding::ASCII_8BIT) if uri.respond_to?(:force_encoding)
105
+ uris.map { |uri|
104
106
  [ uri, uri.omit(:path).freeze ]
105
107
  }.flatten
106
108
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class WebMock::Util::ValuesStringifier
2
4
  def self.stringify_values(value)
3
5
  case value
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This code was created based on https://github.com/myronmarston/vcr/blob/master/lib/vcr/util/version_checker.rb
2
4
  # Thanks to @myronmarston
3
5
 
@@ -84,12 +86,12 @@ module WebMock
84
86
  def compare_version
85
87
  case
86
88
  when @major < @min_major then :too_low
89
+ when @major == @min_major && @minor < @min_minor then :too_low
90
+ when @major == @min_major && @minor == @min_minor && @patch < @min_patch then :too_low
87
91
  when @max_major && @major > @max_major then :too_high
88
- when @major > @min_major then :ok
89
- when @minor < @min_minor then :too_low
90
- when @max_minor && @minor > @max_minor then :too_high
91
- when @minor > @min_minor then :ok
92
- when @patch < @min_patch then :too_low
92
+ when @max_major && @major == @max_major && @max_minor && @minor > @max_minor then :too_high
93
+
94
+ else :ok
93
95
  end
94
96
  end
95
97
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module WebMock
2
- VERSION = '3.5.0' unless defined?(::WebMock::VERSION)
4
+ VERSION = '3.25.0' unless defined?(::WebMock::VERSION)
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module WebMock
2
4
 
3
5
  def self.included(clazz)
@@ -53,16 +55,33 @@ module WebMock
53
55
  Config.instance.net_http_connect_on_start = options[:net_http_connect_on_start]
54
56
  end
55
57
 
58
+ class << self
59
+ alias :enable_net_connect! :allow_net_connect!
60
+ alias :disallow_net_connect! :disable_net_connect!
61
+ end
62
+
56
63
  def self.net_connect_allowed?(uri = nil)
64
+ return !!Config.instance.allow_net_connect if uri.nil?
65
+
57
66
  if uri.is_a?(String)
58
67
  uri = WebMock::Util::URI.normalize_uri(uri)
59
68
  end
60
69
 
61
- Config.instance.allow_net_connect ||
70
+ !!Config.instance.allow_net_connect ||
62
71
  ( Config.instance.allow_localhost && WebMock::Util::URI.is_uri_localhost?(uri) ||
63
72
  Config.instance.allow && net_connect_explicit_allowed?(Config.instance.allow, uri) )
64
73
  end
65
74
 
75
+ def self.net_http_connect_on_start?(uri)
76
+ allowed = Config.instance.net_http_connect_on_start || false
77
+
78
+ if [true, false].include?(allowed)
79
+ allowed
80
+ else
81
+ net_connect_explicit_allowed?(allowed, uri)
82
+ end
83
+ end
84
+
66
85
  def self.net_connect_explicit_allowed?(allowed, uri=nil)
67
86
  case allowed
68
87
  when Array
@@ -133,8 +152,8 @@ module WebMock
133
152
  puts WebMock::RequestExecutionVerifier.executed_requests_message
134
153
  end
135
154
 
136
- def self.globally_stub_request(&block)
137
- WebMock::StubRegistry.instance.register_global_stub(&block)
155
+ def self.globally_stub_request(order = :before_local_stubs, &block)
156
+ WebMock::StubRegistry.instance.register_global_stub(order, &block)
138
157
  end
139
158
 
140
159
  %w(
data/lib/webmock.rb CHANGED
@@ -1,8 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'singleton'
2
4
 
3
5
  require 'addressable/uri'
4
6
  require 'addressable/template'
5
- require 'crack/xml'
6
7
 
7
8
  require_relative 'webmock/deprecation'
8
9
  require_relative 'webmock/version'
@@ -15,7 +16,8 @@ require_relative 'webmock/util/headers'
15
16
  require_relative 'webmock/util/hash_counter'
16
17
  require_relative 'webmock/util/hash_keys_stringifier'
17
18
  require_relative 'webmock/util/values_stringifier'
18
- require_relative 'webmock/util/json'
19
+ require_relative 'webmock/util/parsers/json'
20
+ require_relative 'webmock/util/parsers/xml'
19
21
  require_relative 'webmock/util/version_checker'
20
22
  require_relative 'webmock/util/hash_validator'
21
23
 
@@ -54,5 +56,6 @@ require_relative 'webmock/http_lib_adapters/em_http_request_adapter'
54
56
  require_relative 'webmock/http_lib_adapters/typhoeus_hydra_adapter'
55
57
  require_relative 'webmock/http_lib_adapters/excon_adapter'
56
58
  require_relative 'webmock/http_lib_adapters/manticore_adapter'
59
+ require_relative 'webmock/http_lib_adapters/async_http_client_adapter'
57
60
 
58
61
  require_relative 'webmock/webmock'