webmock 3.14.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 (144) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +213 -3
  3. data/README.md +66 -20
  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 +16 -4
  12. data/lib/webmock/http_lib_adapters/curb_adapter.rb +4 -2
  13. data/lib/webmock/http_lib_adapters/em_http_request_adapter.rb +17 -7
  14. data/lib/webmock/http_lib_adapters/excon_adapter.rb +2 -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 +3 -3
  18. data/lib/webmock/http_lib_adapters/http_rb/request.rb +17 -5
  19. data/lib/webmock/http_lib_adapters/http_rb/response.rb +32 -9
  20. data/lib/webmock/http_lib_adapters/http_rb/streamer.rb +10 -2
  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 +26 -25
  24. data/lib/webmock/http_lib_adapters/manticore_adapter.rb +2 -0
  25. data/lib/webmock/http_lib_adapters/net_http.rb +46 -121
  26. data/lib/webmock/http_lib_adapters/net_http_response.rb +2 -0
  27. data/lib/webmock/http_lib_adapters/patron_adapter.rb +3 -1
  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 +2 -0
  36. data/lib/webmock/request_execution_verifier.rb +2 -0
  37. data/lib/webmock/request_pattern.rb +35 -12
  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 +15 -13
  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 +2 -0
  48. data/lib/webmock/stub_registry.rb +2 -0
  49. data/lib/webmock/stub_request_snippet.rb +2 -0
  50. data/lib/webmock/test_unit.rb +2 -0
  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 +2 -0
  59. data/lib/webmock/util/uri.rb +3 -1
  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 +12 -0
  64. data/lib/webmock.rb +4 -2
  65. metadata +66 -185
  66. data/.gemtest +0 -0
  67. data/.github/workflows/CI.yml +0 -37
  68. data/.gitignore +0 -34
  69. data/.rspec-tm +0 -2
  70. data/Gemfile +0 -9
  71. data/Rakefile +0 -38
  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/async_http_client/async_http_client_spec.rb +0 -375
  77. data/spec/acceptance/async_http_client/async_http_client_spec_helper.rb +0 -73
  78. data/spec/acceptance/curb/curb_spec.rb +0 -499
  79. data/spec/acceptance/curb/curb_spec_helper.rb +0 -147
  80. data/spec/acceptance/em_http_request/em_http_request_spec.rb +0 -462
  81. data/spec/acceptance/em_http_request/em_http_request_spec_helper.rb +0 -77
  82. data/spec/acceptance/excon/excon_spec.rb +0 -77
  83. data/spec/acceptance/excon/excon_spec_helper.rb +0 -52
  84. data/spec/acceptance/http_rb/http_rb_spec.rb +0 -93
  85. data/spec/acceptance/http_rb/http_rb_spec_helper.rb +0 -54
  86. data/spec/acceptance/httpclient/httpclient_spec.rb +0 -217
  87. data/spec/acceptance/httpclient/httpclient_spec_helper.rb +0 -57
  88. data/spec/acceptance/manticore/manticore_spec.rb +0 -107
  89. data/spec/acceptance/manticore/manticore_spec_helper.rb +0 -35
  90. data/spec/acceptance/net_http/net_http_shared.rb +0 -153
  91. data/spec/acceptance/net_http/net_http_spec.rb +0 -369
  92. data/spec/acceptance/net_http/net_http_spec_helper.rb +0 -64
  93. data/spec/acceptance/net_http/real_net_http_spec.rb +0 -20
  94. data/spec/acceptance/patron/patron_spec.rb +0 -125
  95. data/spec/acceptance/patron/patron_spec_helper.rb +0 -54
  96. data/spec/acceptance/shared/allowing_and_disabling_net_connect.rb +0 -313
  97. data/spec/acceptance/shared/callbacks.rb +0 -148
  98. data/spec/acceptance/shared/complex_cross_concern_behaviors.rb +0 -36
  99. data/spec/acceptance/shared/enabling_and_disabling_webmock.rb +0 -95
  100. data/spec/acceptance/shared/precedence_of_stubs.rb +0 -15
  101. data/spec/acceptance/shared/request_expectations.rb +0 -930
  102. data/spec/acceptance/shared/returning_declared_responses.rb +0 -409
  103. data/spec/acceptance/shared/stubbing_requests.rb +0 -678
  104. data/spec/acceptance/typhoeus/typhoeus_hydra_spec.rb +0 -135
  105. data/spec/acceptance/typhoeus/typhoeus_hydra_spec_helper.rb +0 -60
  106. data/spec/acceptance/webmock_shared.rb +0 -41
  107. data/spec/fixtures/test.txt +0 -1
  108. data/spec/quality_spec.rb +0 -84
  109. data/spec/spec_helper.rb +0 -48
  110. data/spec/support/example_curl_output.txt +0 -22
  111. data/spec/support/failures.rb +0 -9
  112. data/spec/support/my_rack_app.rb +0 -53
  113. data/spec/support/network_connection.rb +0 -19
  114. data/spec/support/webmock_server.rb +0 -70
  115. data/spec/unit/api_spec.rb +0 -175
  116. data/spec/unit/errors_spec.rb +0 -129
  117. data/spec/unit/http_lib_adapters/http_lib_adapter_registry_spec.rb +0 -17
  118. data/spec/unit/http_lib_adapters/http_lib_adapter_spec.rb +0 -12
  119. data/spec/unit/matchers/hash_excluding_matcher_spec.rb +0 -61
  120. data/spec/unit/matchers/hash_including_matcher_spec.rb +0 -87
  121. data/spec/unit/rack_response_spec.rb +0 -112
  122. data/spec/unit/request_body_diff_spec.rb +0 -90
  123. data/spec/unit/request_execution_verifier_spec.rb +0 -208
  124. data/spec/unit/request_pattern_spec.rb +0 -736
  125. data/spec/unit/request_registry_spec.rb +0 -95
  126. data/spec/unit/request_signature_snippet_spec.rb +0 -89
  127. data/spec/unit/request_signature_spec.rb +0 -155
  128. data/spec/unit/request_stub_spec.rb +0 -199
  129. data/spec/unit/response_spec.rb +0 -286
  130. data/spec/unit/stub_registry_spec.rb +0 -103
  131. data/spec/unit/stub_request_snippet_spec.rb +0 -115
  132. data/spec/unit/util/hash_counter_spec.rb +0 -39
  133. data/spec/unit/util/hash_keys_stringifier_spec.rb +0 -27
  134. data/spec/unit/util/headers_spec.rb +0 -28
  135. data/spec/unit/util/json_spec.rb +0 -33
  136. data/spec/unit/util/query_mapper_spec.rb +0 -157
  137. data/spec/unit/util/uri_spec.rb +0 -371
  138. data/spec/unit/util/version_checker_spec.rb +0 -65
  139. data/spec/unit/webmock_spec.rb +0 -60
  140. data/test/http_request.rb +0 -24
  141. data/test/shared_test.rb +0 -108
  142. data/test/test_helper.rb +0 -23
  143. data/test/test_webmock.rb +0 -12
  144. data/webmock.gemspec +0 -54
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a8f150fbeccca419468dfebe632e3b5d365cb8c2df9a5e2a31e65591298786fb
4
- data.tar.gz: d92950bc5ae3510e599c40545f3e7a0ebaafa54a698f79a3c82243e240d35948
3
+ metadata.gz: a71743bb6d5f304d032ba24c918ac45b07426f28b170068c5fbd5c7c0757fcb6
4
+ data.tar.gz: ad25d2f20543df2419e74378c2f072824347d37587a7a8fd00dccca40aaa07e5
5
5
  SHA512:
6
- metadata.gz: f58d569f7c633d758cee725e5dafb39edacb74e0017ba9c29de0cad8fe16d1f7740cc30847a9f129f6571232d2ca8172d7fb76a1eb3383e31ee8371472f141f9
7
- data.tar.gz: 52191c4e12ac3bf79b575f36d58823ea37ab17f83c7a62602889f361eafadabfa4b0b8ffc1f466eee6de53ea77578fc0149a60e14abdd8a7459b651afbeb85d0
6
+ metadata.gz: 00f2b6475d6845de134311b47cd545c674b750f6b270579bc3124664f40ce60d7b56b26c531d0e968d72fa53d1c902f105d7e52d274330336c30c504cbcd83e3
7
+ data.tar.gz: 163df74a3e2c219ee42c8d591acd9042e605427433129a7c421dc4d25671ca8073757409fb105740601add8284d52b2a464ed59500829dc9a97eeceb99b2545c
data/CHANGELOG.md CHANGED
@@ -1,5 +1,215 @@
1
1
  # Changelog
2
2
 
3
+ # 3.25.0
4
+
5
+ * Resolve net-http adapter deprecation Ruby 3.4
6
+
7
+ Thanks to [Earlopain](https://github.com/Earlopain)
8
+
9
+ # 3.24.0
10
+
11
+ * Ignore parsing errors when parsing invalid JSON or XML body to match against body pattern #1066
12
+
13
+ Thanks to [Christian Schmidt](https://github.com/c960657)
14
+
15
+ * Added support for mocked HTTP::Connection#finished_request? method #1065
16
+
17
+ Thanks to [Christian Schmidt](https://github.com/c960657)
18
+
19
+ * Detect if Patron is loaded by checking if Patron::Session constant is defined #1068
20
+
21
+ Thanks to [Rodrigo Argumedo](https://github.com/rodrigoargumedo)
22
+
23
+ * Raising an ArgumentError when uri is passed as a Pathname object to stub_request or request expectation declaration.
24
+
25
+ * Dropped support for em-http-request on Ruby 3.4. The current version of em-http-request (1.1.7) is incompatible with Ruby 3.4 due to an unresolved issue (https://github.com/igrigorik/em-http-request/issues/365). Support for em-http-request will be re-enabled once the compatibility issue is resolved.
26
+
27
+ Thanks to [Christian Schmidt](https://github.com/c960657)
28
+
29
+ # 3.23.1
30
+
31
+ * Added support for async-http version >= 0.65.0 [PR](https://github.com/bblimke/webmock/pull/1056)
32
+
33
+ Thanks to [Jacob Frautschi](https://github.com/jakeonfire)
34
+
35
+ # 3.23.0
36
+
37
+ * Fixed HTTP.rb adapter to support streaming real responses when WebMock is enabled.
38
+
39
+ Thanks to [Viacheslav Nepomniashchikh](https://github.com/aka-nez) for reporting and investigating this [issue](https://github.com/bblimke/webmock/issues/1017).
40
+
41
+ # 3.22.0
42
+
43
+ * Addressed an issue in the HTTPClient adapter where memoized stubbed responses and memoized request_signatures were incorrectly persisted between subsequent requests ([#1019](https://github.com/bblimke/webmock/issues/1019)). The implementation of a more robust thread-safety solution by [Tom Beauvais](https://github.com/tbeauvais) in [PR #300](https://github.com/bblimke/webmock/pull/300) not only resolved the memoization problem but also enhanced the overall thread safety of the adapter. This update ensures that stubbed responses and request signatures are correctly isolated to individual requests, improving both consistency and thread safety.
44
+
45
+ # 3.21.2
46
+
47
+ * Corrected type checking in `WebMock::Response#assert_valid_body!` to accurately recognize `Hash` objects. Additionally, improved the clarity of the error message for unsupported body types, guiding users towards proper usage.
48
+
49
+ Thanks to [Jake Robb](https://github.com/jakerobb) for reporting.
50
+
51
+ # 3.21.1
52
+
53
+ * The stubbed Net::HTTPResponse#uri now returns request.uri, aligning it with the behavior of an actual Net::HTTPResponse.
54
+
55
+ Thanks to [Abe Voelker](https://github.com/abevoelker) for reporting and to [Victor Maslov](https://github.com/Nakilon) and [Gio Lodi](https://github.com/mokagio) for the suggested solution.
56
+
57
+ # 3.21.0
58
+
59
+ * Don't use deprecated Rack::VERSION for Rack >= 3
60
+
61
+ Thanks to [Étienne Barrié](https://github.com/etiennebarrie)
62
+
63
+ * Updated HTTPClient adapter, to build request signature using the URI after filters have been applied.
64
+
65
+ Thanks to [Matt Brown](https://github.com/mattbnz)
66
+
67
+ # 3.20.0
68
+
69
+ * Optimised EmHttpRequestAdapter performance.
70
+
71
+ Thanks to [Ricardo Trindade](https://github.com/RicardoTrindade)
72
+
73
+ * Removed runtime dependency on base64.
74
+
75
+ Thanks to [Earlopain](https://github.com/Earlopain)
76
+
77
+ * Typhoeus::Response objects constructed from stubbed responses now have all timing attributes set to 0.0.
78
+
79
+ Thanks to [James Brown](https://github.com/Roguelazer)
80
+
81
+ * Optimised WebMock::Util::Headers by removing redundant freeze invocations.
82
+
83
+ Thanks to [Kazuhiro NISHIYAMA](https://github.com/znz)
84
+
85
+ * The default stubbed response body, which is an empty String, is unfrozen.
86
+
87
+ * When building signatures of requests made by http.rb, the request body encoding is now preserved.
88
+
89
+ # 3.19.1
90
+
91
+ * When passing a Proc or lambda as response body to `to_return_json`, the body is evaluated at the time of request and not at the time of `to_return_json` method invocation.
92
+
93
+ Thanks to [Jason Karns](https://github.com/jasonkarns) for reporting.
94
+
95
+ # 3.19.0
96
+
97
+ * Do not alter real (non-stubbed) request headers when handling em-http-request requests.
98
+
99
+ Thanks to [Yoann Lecuyer](https://github.com/ylecuyer)
100
+
101
+ * Fix matching stubs with HashExcludingMatcher
102
+
103
+ Thanks to [Lucas Arnaud](https://github.com/lucasarnaud)
104
+
105
+ * Remove development and test files from the gem package
106
+
107
+ Thanks to [Orien Madgwick](https://github.com/orien)
108
+
109
+ * Fix supported http client gem version checks.
110
+
111
+ Thanks to [Marc Rohloff](https://github.com/marcrohloff) and [Roman Stražanec](https://github.com/romanstrazanec)
112
+
113
+ * Non-string body passed to #to_return_json is now converted to JSON string.
114
+
115
+ Thanks to [inkstak](https://github.com/inkstak)
116
+
117
+ * `[::1]` is recognised as localhost e.g when passing `allow_localhost` option to `disable_net_connect!`
118
+
119
+ Thanks to [Yuki Inoue](https://github.com/Yuki-Inoue)
120
+
121
+ * Optimized `normalize_headers` for performance
122
+
123
+ Thanks to [Brandon Weaver](https://github.com/baweaver)
124
+
125
+ * Added Frozen string literal to files to optimise memory usage
126
+
127
+ Thanks to [Josh Nichols](https://github.com/technicalpickles)
128
+
129
+ # 3.18.1
130
+
131
+ * Reverted simplified connection handing in Net::HTTP adapter due to https://github.com/bblimke/webmock/issues/999
132
+
133
+ # 3.18.0
134
+
135
+ * Net::BufferedIO is not replaced anymore.
136
+
137
+ Thanks to [Ray Zane](https://github.com/rzane)
138
+
139
+ * Simplified connection handing in Net::HTTP adapter.
140
+
141
+ Thanks to [Ray Zane](https://github.com/rzane)
142
+
143
+ # 3.17.1
144
+
145
+ * Fixed Syntax Error
146
+
147
+ Thanks to [Mark Spangler](https://github.com/mspangler)
148
+
149
+ # 3.17.0
150
+
151
+ * Minimum required Ruby version is 2.3
152
+
153
+ Thanks to [Go Sueyoshi](https://github.com/sue445)
154
+
155
+ * When using Net::HTTP, stubbed socket StubSocket#close and StubSocket#closed? behave more like the real sockets.
156
+
157
+ Thanks to [Ray Zane](https://github.com/rzane)
158
+
159
+ * Added `peeraddr`, `ssl_version` and `cipher` methods to stubbed sockets used by Net::HTTP.
160
+
161
+ Thanks to [Ray Zane](https://github.com/rzane)
162
+
163
+ * Added support for matching top-level array in JSON request body.
164
+
165
+ E.g.
166
+
167
+ ````
168
+ stub_request(:post, 'www.example.com').with(body: [{a: 1}])
169
+ ````
170
+
171
+ Thanks to [Cedric Sohrauer](https://github.com/cedrics)
172
+
173
+ # 3.16.2
174
+
175
+ * Minimum required Ruby version is 2.0.
176
+
177
+ # 3.16.0 (yanked)
178
+
179
+ * Fix leaky file descriptors and reuse socket for persistent connections.
180
+
181
+ Thanks to [Ray Zane](https://github.com/rzane)
182
+
183
+ * Allow specifying for what URIs or hosts, Net::HTTP should connect on start.
184
+
185
+ Thanks to [Ray Zane](https://github.com/rzane)
186
+
187
+ # 3.15.2
188
+
189
+ * Minimum required Ruby version is 2.0.
190
+
191
+ # 3.15.0 (yanked)
192
+
193
+ * fixed async-http adapter on Windows
194
+
195
+ Thanks to [Pavel Rosický](https://github.com/ahorek)
196
+
197
+ * Support for http.rb >= 5.0.2
198
+
199
+ Thanks to [ojab](https://github.com/ojab)
200
+
201
+ * Curb adapter supports headers with `:` character in the header value
202
+
203
+ Thanks to [Giorgio Gambino](https://github.com/mrbuzz)
204
+
205
+ * Support for matching body of JSON or application/x-www-form-urlencoded requests with content type header including charset.
206
+
207
+ Thanks to [Timmitry](https://github.com/Timmitry)
208
+
209
+ * Prevent double-wrapping http.rb features on non-stubbed requests
210
+
211
+ Thanks to [Michael Fairley](https://github.com/michaelfairley)
212
+
3
213
  # 3.14.0
4
214
 
5
215
  * Bump Addressable from 2.3.6 to 2.8.0
@@ -32,7 +242,7 @@
32
242
 
33
243
  * Fixed async-http adapter to only considered requests as real if they are real.
34
244
 
35
- Thanks to Thanks to [Tony Schneider](https://github.com/tonywok) and [Samuel Williams](https://github.com/ioquatix)
245
+ Thanks to [Tony Schneider](https://github.com/tonywok) and [Samuel Williams](https://github.com/ioquatix)
36
246
 
37
247
  # 3.11.2
38
248
 
@@ -605,9 +815,9 @@
605
815
  * `WebMock.disable_net_connect` accepts `:allow` option with an object that responds to `#call`, receiving a `URI` object and returning a boolean:
606
816
 
607
817
 
608
- blacklist = ['google.com', 'facebook.com', 'apple.com']
818
+ denylist = ['google.com', 'facebook.com', 'apple.com']
609
819
  allowed_sites = lambda{|uri|
610
- blacklist.none?{|site| uri.host.include?(site) }
820
+ denylist.none?{|site| uri.host.include?(site) }
611
821
  }
612
822
  WebMock.disable_net_connect!(:allow => allowed_sites)
613
823
 
data/README.md CHANGED
@@ -1,11 +1,9 @@
1
1
  WebMock
2
2
  =======
3
3
  [![Gem Version](https://badge.fury.io/rb/webmock.svg)](http://badge.fury.io/rb/webmock)
4
- [![Build Status](https://github.com/bblimke/webmock/workflows/CI/badge.svg?branch=master)](https://github.com/bblimke/webmock/actions)
4
+ [![Build Status](https://github.com/bblimke/webmock/actions/workflows/CI.yml/badge.svg?branch=master)](https://github.com/bblimke/webmock/actions)
5
5
  [![Code Climate](https://codeclimate.com/github/bblimke/webmock/badges/gpa.svg)](https://codeclimate.com/github/bblimke/webmock)
6
6
  [![Mentioned in Awesome Ruby](https://awesome.re/mentioned-badge.svg)](https://github.com/markets/awesome-ruby)
7
- [![Inline docs](http://inch-ci.org/github/bblimke/webmock.svg?branch=master)](http://inch-ci.org/github/bblimke/webmock)
8
- [![SemVer](https://api.dependabot.com/badges/compatibility_score?dependency-name=webmock&package-manager=bundler&version-scheme=semver)](https://dependabot.com/compatibility-score.html?dependency-name=webmock&package-manager=bundler&version-scheme=semver)
9
7
 
10
8
  Library for stubbing and setting expectations on HTTP requests in Ruby.
11
9
 
@@ -40,32 +38,36 @@ Supported HTTP libraries
40
38
 
41
39
  Supported Ruby Interpreters
42
40
  ---------------------------
43
-
44
- * MRI 2.5
45
41
  * MRI 2.6
46
42
  * MRI 2.7
43
+ * MRI 3.0
44
+ * MRI 3.1
45
+ * MRI 3.2
46
+ * MRI 3.3
47
+ * MRI 3.4
47
48
  * JRuby
48
- * Rubinius
49
49
 
50
50
  ## Installation
51
51
 
52
52
  ```bash
53
- gem install webmock
53
+ gem install webmock
54
54
  ```
55
55
  or alternatively:
56
56
 
57
57
  ```ruby
58
- # add to your Gemfile
59
- group :test do
60
- gem "webmock"
61
- end
58
+ # add to your Gemfile
59
+ group :test do
60
+ gem "webmock"
61
+ end
62
62
  ```
63
63
 
64
64
  ### or to install the latest development version from github master
65
65
 
66
- git clone http://github.com/bblimke/webmock.git
67
- cd webmock
68
- rake install
66
+ ```bash
67
+ git clone http://github.com/bblimke/webmock.git
68
+ cd webmock
69
+ rake install
70
+ ```
69
71
 
70
72
  ## Upgrading from v1.x to v2.x
71
73
 
@@ -330,6 +332,16 @@ stub_request(:any, "www.example.com").
330
332
  Net::HTTP.get('www.example.com', '/') # ===> "abc\n"
331
333
  ```
332
334
 
335
+ ### Response with JSON body
336
+
337
+ ```ruby
338
+
339
+ stub_request(:any, "www.example.com").
340
+ to_return_json(body: {foo: "bar"})
341
+
342
+ Net::HTTP.get('www.example.com', '/') # ===> "{\"foo\": \"bar\"}"
343
+ ```
344
+
333
345
  ### Response with custom status message
334
346
 
335
347
  ```ruby
@@ -383,7 +395,8 @@ RestClient.post('www.example.net', 'abc') # ===> "abc\n"
383
395
 
384
396
  ### Dynamically evaluated raw responses recorded with `curl -is`
385
397
 
386
- `curl -is www.example.com > /tmp/www.example.com.txt`
398
+ `curl -is www.example.com > /tmp/www.example.com.txt`
399
+
387
400
  ```ruby
388
401
  stub_request(:get, "www.example.com").
389
402
  to_return(lambda { |request| File.new("/tmp/#{request.uri.host.to_s}.txt") })
@@ -540,7 +553,7 @@ RestClient.get('www.example.org:8080', '/') # ===> Allowed
540
553
  With a `Regexp` matching the URI:
541
554
 
542
555
  ```ruby
543
- WebMock.disable_net_connect!(allow: %r{ample.org/foo})
556
+ WebMock.disable_net_connect!(allow: %r{ample\.org/foo})
544
557
 
545
558
  RestClient.get('www.example.org', '/foo/bar') # ===> Allowed
546
559
  RestClient.get('sample.org', '/foo') # ===> Allowed
@@ -550,9 +563,9 @@ RestClient.get('sample.org', '/bar') # ===> Failure
550
563
  With an object that responds to `#call`, receiving a `URI` object and returning a boolean:
551
564
 
552
565
  ```ruby
553
- blacklist = ['google.com', 'facebook.com', 'apple.com']
566
+ denylist = ['google.com', 'facebook.com', 'apple.com']
554
567
  allowed_sites = lambda{|uri|
555
- blacklist.none?{|site| uri.host.include?(site) }
568
+ denylist.none?{|site| uri.host.include?(site) }
556
569
  }
557
570
  WebMock.disable_net_connect!(allow: allowed_sites)
558
571
 
@@ -595,7 +608,11 @@ which can be passed to `WebMock.allow_net_connect!` and `WebMock.disable_net_con
595
608
  WebMock.allow_net_connect!(net_http_connect_on_start: true)
596
609
  ```
597
610
 
598
- This forces WebMock Net::HTTP adapter to always connect on `Net::HTTP.start`.
611
+ This forces WebMock Net::HTTP adapter to always connect on `Net::HTTP.start`. At the time of connection being made there is no information about the request or URL yet, therefore WebMock is not able to decide whether to stub a request or not and all connections are allowed. To enable connections only to a specific domain (e.g. your test server) use:
612
+
613
+ ```ruby
614
+ WebMock.allow_net_connect!(net_http_connect_on_start: "www.example.com")
615
+ ```
599
616
 
600
617
  ## Setting Expectations
601
618
 
@@ -1161,13 +1178,42 @@ People who submitted patches and new features or suggested improvements. Many th
1161
1178
  * Alex Vondrak
1162
1179
  * Will Storey
1163
1180
  * Eduardo Hernandez
1181
+ * ojab
1182
+ * Giorgio Gambino
1183
+ * Timmitry
1184
+ * Michael Fairley
1185
+ * Ray Zane
1186
+ * Go Sueyoshi
1187
+ * Cedric Sohrauer
1188
+ * Akira Matsuda
1189
+ * Mark Spangler
1190
+ * Henrik Nyh
1191
+ * Yoann Lecuyer
1192
+ * Lucas Arnaud
1193
+ * Marc Rohloff
1194
+ * inkstak
1195
+ * Yuki Inoue
1196
+ * Brandon Weaver
1197
+ * Josh Nichols
1198
+ * Ricardo Trindade
1199
+ * Earlopain
1200
+ * James Brown
1201
+ * Kazuhiro NISHIYAMA
1202
+ * Étienne Barrié
1203
+ * Matt Brown
1204
+ * Victor Maslov
1205
+ * Gio Lodi
1206
+ * Ryan Brooks
1207
+ * Jacob Frautschi
1208
+ * Christian Schmidt
1209
+ * Rodrigo Argumedo
1164
1210
 
1165
1211
  For a full list of contributors you can visit the
1166
1212
  [contributors](https://github.com/bblimke/webmock/contributors) page.
1167
1213
 
1168
1214
  ## Background
1169
1215
 
1170
- Thank you Fakeweb! This library was inspired by [FakeWeb](http://fakeweb.rubyforge.org).
1216
+ Thank you Fakeweb! This library was inspired by [FakeWeb](https://github.com/chrisk/fakeweb).
1171
1217
  I imported some solutions from that project to WebMock. I also copied some code i.e Net:HTTP adapter.
1172
1218
  Fakeweb architecture unfortunately didn't allow me to extend it easily with the features I needed.
1173
1219
  I also preferred some things to work differently i.e request stub precedence.
data/lib/webmock/api.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module WebMock
2
4
  module API
3
5
  extend self
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module WebMock
2
4
  class AssertionFailure
3
5
  @error_class = RuntimeError
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module WebMock
2
4
  class CallbackRegistry
3
5
  @@callbacks = []
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module WebMock
2
4
  class Config
3
5
  include Singleton
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'webmock'
2
4
  require 'webmock/rspec/matchers'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module WebMock
2
4
  class Deprecation
3
5
  class << self
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module WebMock
2
4
 
3
5
  class NetConnectNotAllowedError < Exception
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  begin
2
4
  require 'async'
3
5
  require 'async/http'
@@ -33,9 +35,9 @@ if defined?(Async::HTTP)
33
35
  class WebMockClientWrapper < Client
34
36
  def initialize(
35
37
  endpoint,
36
- protocol = endpoint.protocol,
37
- scheme = endpoint.scheme,
38
- authority = endpoint.authority,
38
+ protocol: endpoint.protocol,
39
+ scheme: endpoint.scheme,
40
+ authority: endpoint.authority,
39
41
  **options
40
42
  )
41
43
  webmock_endpoint = WebMockEndpoint.new(scheme, authority, protocol)
@@ -43,6 +45,7 @@ if defined?(Async::HTTP)
43
45
  @network_client = WebMockClient.new(endpoint, **options)
44
46
  @webmock_client = WebMockClient.new(webmock_endpoint, **options)
45
47
 
48
+ @endpoint = endpoint
46
49
  @scheme = scheme
47
50
  @authority = authority
48
51
  end
@@ -150,8 +153,17 @@ if defined?(Async::HTTP)
150
153
 
151
154
  private
152
155
 
156
+ def socket_class
157
+ defined?(Async::IO::Socket) ? Async::IO::Socket : Socket
158
+ end
159
+
153
160
  def create_connected_sockets
154
- Async::IO::Socket.pair(Socket::AF_UNIX, Socket::SOCK_STREAM).tap do |sockets|
161
+ pair = begin
162
+ socket_class.pair(Socket::AF_UNIX, Socket::SOCK_STREAM)
163
+ rescue Errno::EAFNOSUPPORT
164
+ socket_class.pair(Socket::AF_INET, Socket::SOCK_STREAM)
165
+ end
166
+ pair.tap do |sockets|
155
167
  sockets.each do |socket|
156
168
  socket.instance_variable_set :@alpn_protocol, nil
157
169
  socket.instance_eval do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  begin
2
4
  require 'curb'
3
5
  rescue LoadError
@@ -5,7 +7,7 @@ rescue LoadError
5
7
  end
6
8
 
7
9
  if defined?(Curl)
8
- WebMock::VersionChecker.new('Curb', Curl::CURB_VERSION, '0.7.16', '0.9.1', ['0.8.7']).check_version!
10
+ WebMock::VersionChecker.new('Curb', Curl::CURB_VERSION, '0.7.16', '1.0.1', ['0.8.7']).check_version!
9
11
 
10
12
  module WebMock
11
13
  module HttpLibAdapters
@@ -128,7 +130,7 @@ if defined?(Curl)
128
130
  def headers_as_hash(headers)
129
131
  if headers.is_a?(Array)
130
132
  headers.inject({}) {|hash, header|
131
- name, value = header.split(":").map(&:strip)
133
+ name, value = header.split(":", 2).map(&:strip)
132
134
  hash[name] = value
133
135
  hash
134
136
  }
@@ -1,3 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ return if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.4.0')
4
+
1
5
  begin
2
6
  require 'em-http-request'
3
7
  rescue LoadError
@@ -101,7 +105,7 @@ if defined?(EventMachine::HttpClient)
101
105
 
102
106
  def connection_completed
103
107
  @state = :response_header
104
- send_request(request_signature.headers, request_signature.body)
108
+ send_request(*headers_and_body_processed_by_middleware)
105
109
  end
106
110
 
107
111
  def send_request(head, body)
@@ -154,7 +158,7 @@ if defined?(EventMachine::HttpClient)
154
158
  raw_cookie = response_header.cookie
155
159
  raw_cookie = [raw_cookie] if raw_cookie.is_a? String
156
160
 
157
- cookie = raw_cookie.select { |c| c.start_with? name }.first
161
+ cookie = raw_cookie.detect { |c| c.start_with? name }
158
162
  cookie and cookie.split('=', 2)[1]
159
163
  end
160
164
 
@@ -168,12 +172,18 @@ if defined?(EventMachine::HttpClient)
168
172
  webmock_response
169
173
  end
170
174
 
171
- def build_request_signature
172
- headers, body = build_request, @req.body
173
-
174
- @conn.middleware.select {|m| m.respond_to?(:request) }.each do |m|
175
- headers, body = m.request(self, headers, body)
175
+ def headers_and_body_processed_by_middleware
176
+ @headers_and_body_processed_by_middleware ||= begin
177
+ head, body = build_request, @req.body
178
+ @conn.middleware.each do |m|
179
+ head, body = m.request(self, head, body) if m.respond_to?(:request)
180
+ end
181
+ [head, body]
176
182
  end
183
+ end
184
+
185
+ def build_request_signature
186
+ headers, body = headers_and_body_processed_by_middleware
177
187
 
178
188
  method = @req.method
179
189
  uri = @req.uri.clone
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  begin
2
4
  require 'excon'
3
5
  rescue LoadError
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module WebMock
2
4
  class HttpLibAdapter
3
5
  def self.adapter_for(lib)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module WebMock
2
4
  class HttpLibAdapterRegistry
3
5
  include Singleton
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module HTTP
2
4
  class Client
3
5
  alias_method :__perform__, :perform
@@ -5,9 +7,7 @@ module HTTP
5
7
  def perform(request, options)
6
8
  return __perform__(request, options) unless webmock_enabled?
7
9
 
8
- response = WebMockPerform.new(request) { __perform__(request, options) }.exec
9
- options.features.each { |_name, feature| response = feature.wrap_response(response) }
10
- response
10
+ WebMockPerform.new(request, options) { __perform__(request, options) }.exec
11
11
  end
12
12
 
13
13
  def webmock_enabled?
@@ -1,11 +1,23 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module HTTP
2
4
  class Request
3
5
  def webmock_signature
4
- request_body = if defined?(HTTP::Request::Body)
5
- ''.tap { |string| body.each { |part| string << part } }
6
- else
7
- body
8
- end
6
+ request_body = nil
7
+
8
+ if defined?(HTTP::Request::Body)
9
+ request_body = String.new
10
+ first_chunk_encoding = nil
11
+ body.each do |part|
12
+ request_body << part
13
+ first_chunk_encoding ||= part.encoding
14
+ end
15
+
16
+ request_body.force_encoding(first_chunk_encoding) if first_chunk_encoding
17
+ request_body
18
+ else
19
+ request_body = body
20
+ end
9
21
 
10
22
  ::WebMock::RequestSignature.new(verb, uri.to_s, {
11
23
  headers: headers.to_h,