workable-pact-provider-verifier 1.24.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,33 @@
1
+ require 'ostruct'
2
+
3
+ module Pact
4
+ module ProviderVerifier
5
+ class CustomMiddleware
6
+ def self.descendants
7
+ descendants = []
8
+ ObjectSpace.each_object(singleton_class) do |k|
9
+ descendants.unshift k unless k == self
10
+ end
11
+ descendants
12
+ end
13
+
14
+ attr_accessor :app
15
+
16
+ def initialize app
17
+ @app = app
18
+ end
19
+
20
+ def call env
21
+ raise NotImplementedError
22
+ end
23
+
24
+ def provider_states_from(env)
25
+ if env["X_PACT_PROVIDER_STATES"]
26
+ env["X_PACT_PROVIDER_STATES"].collect{ | provider_state| OpenStruct.new(provider_state) }
27
+ else
28
+ []
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,25 @@
1
+ require 'net/https'
2
+ require 'faraday_middleware'
3
+ require 'json'
4
+ require_relative './app'
5
+ require_relative 'set_up_provider_state'
6
+ require 'pact/provider/configuration'
7
+ require 'pact/provider_verifier/underscored_headers_monkeypatch.rb'
8
+
9
+ # Responsible for making the call to the provider state server to set up the state
10
+
11
+ Pact.configure do | config |
12
+ config.provider_state_set_up = Pact::ProviderVerifier::SetUpProviderState
13
+ config.provider_state_tear_down = -> (*args){ }
14
+ end
15
+
16
+ if ENV['MONKEYPATCH']
17
+ ENV['MONKEYPATCH'].split("\n").each do | file |
18
+ $stdout.puts "DEBUG: Requiring monkeypatch file #{file}" if ENV['VERBOSE_LOGGING']
19
+ begin
20
+ require file
21
+ rescue LoadError => e
22
+ $stderr.puts "ERROR: #{e.class} - #{e.message}. Ensure you have specified the absolute path."
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,36 @@
1
+ require 'delegate'
2
+
3
+ module Pact
4
+ module ProviderVerifier
5
+ module ProviderStates
6
+ class RequestDelegate < SimpleDelegator
7
+ def initialize request, extra_rack_headers
8
+ super(request)
9
+ @extra_rack_headers = extra_rack_headers
10
+ end
11
+
12
+ def headers
13
+ __getobj__().headers.merge(@extra_rack_headers)
14
+ end
15
+
16
+ def method
17
+ __getobj__().method
18
+ end
19
+ end
20
+
21
+ class AddProviderStatesHeader
22
+
23
+ def self.call(request, interaction)
24
+ if interaction.provider_state
25
+ extra_rack_headers = {
26
+ "X_PACT_PROVIDER_STATES" => [{ "name" => interaction.provider_state }]
27
+ }
28
+ RequestDelegate.new(request, extra_rack_headers)
29
+ else
30
+ request
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,19 @@
1
+ module Pact
2
+ module ProviderVerifier
3
+ module ProviderStates
4
+ class RemoveProviderStatesHeaderMiddleware
5
+ def initialize app
6
+ @app = app
7
+ end
8
+
9
+ def call env
10
+ @app.call(remove_header(env))
11
+ end
12
+
13
+ def remove_header env
14
+ env.reject { | key, value | key == "X_PACT_PROVIDER_STATES" }
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,34 @@
1
+ require 'rspec'
2
+
3
+ begin
4
+ require 'rspec/core/formatters/json_formatter'
5
+
6
+ RSpec::Core::Formatters::JsonFormatter
7
+
8
+ # This looks dodgy, but it's actually safer than inheriting from
9
+ # RSpec::Core::Formatters::JsonFormatter and using a custom class,
10
+ # because if the JsonFormatter class gets refactored,
11
+ # the --format json option will still work, but the inheritance will break.
12
+
13
+ module RSpec
14
+ module Core
15
+ module Formatters
16
+ class JsonFormatter
17
+ alias_method :old_close, :close
18
+
19
+ def close(*args)
20
+ # Append a new line so that the output stream can be split at
21
+ # the new lines, and each JSON document parsed separately
22
+ old_close(*args)
23
+ output.write("\n")
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ rescue NameError
31
+ Pact.configuration.error_stream.puts "WARN: Could not find RSpec::Core::Formatters::JsonFormatter to modify it to put a new line between JSON result documents."
32
+ rescue LoadError
33
+ Pact.configuration.error_stream.puts "WARN: Could not load rspec/core/formatters/json_formatter to modify it to put a new line between JSON result documents."
34
+ end
@@ -0,0 +1,112 @@
1
+ require 'faraday'
2
+
3
+ module Pact
4
+ module ProviderVerifier
5
+
6
+ class SetUpProviderStateError < StandardError; end
7
+
8
+ class SetUpProviderState
9
+
10
+ def initialize provider_state, consumer, options
11
+ @provider_state = provider_state
12
+ @consumer = consumer
13
+ @options = options
14
+ @params = (options && options[:params]) || {}
15
+ end
16
+
17
+ def self.call provider_state, consumer, options
18
+ new(provider_state, consumer, options).call
19
+ end
20
+
21
+ def call
22
+ if provider_states_setup_url.nil?
23
+ warn_if_provider_state_set
24
+ return
25
+ end
26
+
27
+ log_request
28
+ response = post_to_provider_state
29
+ check_for_error response
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :provider_state, :consumer, :params
35
+
36
+ def post_to_provider_state
37
+ verbose = verbose?
38
+ options = {url: provider_states_setup_url}
39
+
40
+ if provider_states_setup_url.start_with?("https:")
41
+ options[:ssl] = {verify: false}
42
+ end
43
+
44
+ connection = Faraday.new(options) do | faraday |
45
+ # Have encountered flakiness on windows build for pact-go
46
+ # Using retries as a hacky solution to try and get around this
47
+ # until/if we can work out what the underlying cause is.
48
+ # https://github.com/pact-foundation/pact-go/issues/42
49
+ # eg. https://ci.appveyor.com/project/mefellows/pact-go/build/25#L1202
50
+
51
+ faraday.request :retry, max: 2, interval: 0.05,
52
+ interval_randomness: 0.5, backoff_factor: 2,
53
+ methods:[:post],
54
+ exceptions: [Faraday::ConnectionFailed]
55
+
56
+ faraday.response :logger if verbose
57
+ faraday.adapter Faraday.default_adapter
58
+ end
59
+
60
+ connection.post do |req|
61
+ req.headers["Content-Type"] = "application/json"
62
+ add_custom_provider_header req
63
+ req.body = {
64
+ consumer: consumer,
65
+ state: provider_state,
66
+ states: [provider_state],
67
+ params: params
68
+ }.to_json
69
+ end
70
+ end
71
+
72
+ def provider_states_setup_url
73
+ ENV['PROVIDER_STATES_SETUP_URL']
74
+ end
75
+
76
+ def verbose?
77
+ ENV['VERBOSE_LOGGING']
78
+ end
79
+
80
+ def custom_provider_headers
81
+ ENV.fetch('CUSTOM_PROVIDER_HEADER', '').split("\n").each_with_object({}) do | header, headers_hash |
82
+ header_name, header_value = header.split(":", 2).collect(&:strip)
83
+ headers_hash[header_name] = header_value
84
+ end
85
+ end
86
+
87
+ def add_custom_provider_header request
88
+ custom_provider_headers.each do | header_name, header_value |
89
+ request[header_name] = header_value
90
+ end
91
+ end
92
+
93
+ def check_for_error response
94
+ if response.status >= 300
95
+ raise SetUpProviderStateError.new("Error setting up provider state '#{provider_state}' for consumer '#{consumer}' at #{provider_states_setup_url}. response status=#{response.status} response body=#{response.body}")
96
+ end
97
+ end
98
+
99
+ def log_request
100
+ if verbose?
101
+ $stdout.puts "DEBUG: Setting up provider state '#{provider_state}' for consumer '#{consumer}' using provider state set up URL #{provider_states_setup_url}"
102
+ end
103
+ end
104
+
105
+ def warn_if_provider_state_set
106
+ if provider_state
107
+ $stderr.puts "WARN: Skipping set up for provider state '#{provider_state}' for consumer '#{consumer}' as there is no --provider-states-setup-url specified."
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,96 @@
1
+ # Ok, this doesn't make me feel good about myself, but it's the best way I've found
2
+ # to ensure that any underscored headers (eg "access_token") are not turned into dasherized
3
+ # headers by the Rack code that converts capitalized, dasherized headers into uppercase,
4
+ # underscored headers, and then back again.
5
+ # eg. access_token => HTTP_ACCESS_TOKEN => ACCESS-TOKEN
6
+ # To ensure the original header format is kept, an extra header, HTTP_X_PACT_ORIGINAL_HEADER_NAMES
7
+ # is added to the Rack Request when it is created from the request in the pact file, which contains
8
+ # a comma separated list of the original header names.
9
+ # This header is then removed by the modified Rack Reverse Proxy code, and used to restore
10
+ # the original header names if they have been transformed "incorrectly".
11
+ require 'pact/configuration'
12
+
13
+ def rack_reverse_proxy_headers_method_found
14
+ begin
15
+ RackReverseProxy::RoundTrip.instance_method(:headers)
16
+ true
17
+ rescue NameError
18
+ Pact.configuration.error_stream.puts "WARN: Could not find the RackReverseProxy::RoundTrip#headers method. The implementation must have changed. Cannot monkey patch the aforementioned method to ensure any underscores are retained in header names. You can ignore this warning if you use normal dasherized headers."
19
+ false
20
+ end
21
+ end
22
+
23
+ def pact_provider_request_headers_method_found
24
+ begin
25
+ Pact::Provider::Request::Replayable.instance_method(:headers)
26
+ true
27
+ rescue NameError
28
+ Pact.configuration.error_stream.puts "WARN: Could not find the Pact::Provider::Request::Replayable#headers method. The implementation must have changed. Cannot monkey patch the aforementioned method to ensure any underscores are retained in header names. You can ignore this warning if you use normal dasherized headers."
29
+ false
30
+ end
31
+ end
32
+
33
+ module Pact
34
+ module ProviderVerifier
35
+ module UnderscoredHeadersMonkeyPatch
36
+ extend self
37
+
38
+ def save_original_header_names rack_headers, expected_request_headers
39
+ # expected_request_headers may be a Pact::NullExpectation
40
+ if rack_headers.any?
41
+ rack_headers['HTTP_X_PACT_ORIGINAL_HEADER_NAMES'] = expected_request_headers.keys.join(",")
42
+ end
43
+ rack_headers
44
+ end
45
+
46
+ def restore_original_header_names dasherized_headers
47
+ original_header_names_value = dasherized_headers.delete("X-PACT-ORIGINAL-HEADER-NAMES")
48
+ if original_header_names_value && original_header_names_value.size > 0
49
+ replace_header_names(dasherized_headers, original_header_names_value.split(","))
50
+ else
51
+ dasherized_headers
52
+ end
53
+ end
54
+
55
+ private
56
+
57
+ def replace_header_names dasherized_headers, original_header_names
58
+ original_header_names.each_with_object(dasherized_headers) do | original_header_name, headers |
59
+ if headers.key?(pact_uppercase_and_dasherize(original_header_name))
60
+ headers[original_header_name] = headers.delete(pact_uppercase_and_dasherize(original_header_name))
61
+ end
62
+ end
63
+ end
64
+
65
+ def pact_uppercase_and_dasherize header_name
66
+ header_name.upcase.split("_").join("-")
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+ if pact_provider_request_headers_method_found && rack_reverse_proxy_headers_method_found
73
+ module Pact
74
+ module Provider
75
+ module Request
76
+ class Replayable
77
+ alias_method :pact_old_headers, :headers
78
+
79
+ def headers
80
+ Pact::ProviderVerifier::UnderscoredHeadersMonkeyPatch.save_original_header_names(pact_old_headers, expected_request.headers)
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+
87
+ module RackReverseProxy
88
+ class RoundTrip
89
+ alias_method :pact_old_headers, :headers
90
+
91
+ def headers
92
+ Pact::ProviderVerifier::UnderscoredHeadersMonkeyPatch.restore_original_header_names(pact_old_headers)
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,5 @@
1
+ module Pact
2
+ module ProviderVerifier
3
+ VERSION = "1.24.2"
4
+ end
5
+ end
@@ -0,0 +1,24 @@
1
+ require 'socket'
2
+ require 'time'
3
+
4
+ module Pact
5
+ module WaitUntilServerAvailable
6
+ def self.call(host, port, wait_time = 15)
7
+ end_time = Time.now + wait_time
8
+ tries = 0
9
+ begin
10
+ sleep 2 if tries != 0
11
+ Socket.tcp(host, port, connect_timeout: 3) {}
12
+ true
13
+ rescue => e
14
+ tries += 1
15
+ retry if Time.now < end_time
16
+ return false
17
+ end
18
+ end
19
+
20
+ def wait_until_server_available *args
21
+ WaitUntilServerAvailable.call(*args)
22
+ end
23
+ end
24
+ end
metadata ADDED
@@ -0,0 +1,324 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: workable-pact-provider-verifier
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.24.2
5
+ platform: ruby
6
+ authors:
7
+ - Angelos Karagkiozidis
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-10-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.5'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pact
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 1.42.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.42.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: pact-message
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 0.6.2
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 0.6.2
55
+ - !ruby/object:Gem::Dependency
56
+ name: faraday
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 0.9.0
62
+ - - "~>"
63
+ - !ruby/object:Gem::Version
64
+ version: '0.9'
65
+ type: :runtime
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: 0.9.0
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '0.9'
75
+ - !ruby/object:Gem::Dependency
76
+ name: faraday_middleware
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0.10'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '0.10'
89
+ - !ruby/object:Gem::Dependency
90
+ name: json
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">"
94
+ - !ruby/object:Gem::Version
95
+ version: '1.8'
96
+ type: :runtime
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">"
101
+ - !ruby/object:Gem::Version
102
+ version: '1.8'
103
+ - !ruby/object:Gem::Dependency
104
+ name: rack
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '2.0'
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '2.0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: rake
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: 10.4.2
124
+ type: :runtime
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: 10.4.2
131
+ - !ruby/object:Gem::Dependency
132
+ name: rack-reverse-proxy
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ type: :runtime
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ - !ruby/object:Gem::Dependency
146
+ name: rspec_junit_formatter
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '0.3'
152
+ type: :runtime
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '0.3'
159
+ - !ruby/object:Gem::Dependency
160
+ name: sinatra
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ - !ruby/object:Gem::Dependency
174
+ name: sinatra-contrib
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ type: :development
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ - !ruby/object:Gem::Dependency
188
+ name: octokit
189
+ requirement: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - "~>"
192
+ - !ruby/object:Gem::Version
193
+ version: '4.7'
194
+ type: :development
195
+ prerelease: false
196
+ version_requirements: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - "~>"
199
+ - !ruby/object:Gem::Version
200
+ version: '4.7'
201
+ - !ruby/object:Gem::Dependency
202
+ name: webmock
203
+ requirement: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - "~>"
206
+ - !ruby/object:Gem::Version
207
+ version: '3.0'
208
+ type: :development
209
+ prerelease: false
210
+ version_requirements: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: '3.0'
215
+ - !ruby/object:Gem::Dependency
216
+ name: conventional-changelog
217
+ requirement: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - "~>"
220
+ - !ruby/object:Gem::Version
221
+ version: '1.2'
222
+ type: :development
223
+ prerelease: false
224
+ version_requirements: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - "~>"
227
+ - !ruby/object:Gem::Version
228
+ version: '1.2'
229
+ - !ruby/object:Gem::Dependency
230
+ name: pry-byebug
231
+ requirement: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - "~>"
234
+ - !ruby/object:Gem::Version
235
+ version: '3.4'
236
+ type: :development
237
+ prerelease: false
238
+ version_requirements: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - "~>"
241
+ - !ruby/object:Gem::Version
242
+ version: '3.4'
243
+ - !ruby/object:Gem::Dependency
244
+ name: find_a_port
245
+ requirement: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - "~>"
248
+ - !ruby/object:Gem::Version
249
+ version: '1.0'
250
+ type: :development
251
+ prerelease: false
252
+ version_requirements: !ruby/object:Gem::Requirement
253
+ requirements:
254
+ - - "~>"
255
+ - !ruby/object:Gem::Version
256
+ version: '1.0'
257
+ - !ruby/object:Gem::Dependency
258
+ name: bump
259
+ requirement: !ruby/object:Gem::Requirement
260
+ requirements:
261
+ - - "~>"
262
+ - !ruby/object:Gem::Version
263
+ version: '0.5'
264
+ type: :development
265
+ prerelease: false
266
+ version_requirements: !ruby/object:Gem::Requirement
267
+ requirements:
268
+ - - "~>"
269
+ - !ruby/object:Gem::Version
270
+ version: '0.5'
271
+ description: |-
272
+ A cross-platform Pact verification tool to validate API Providers.
273
+ Used in the pact-js-provider project to simplify development
274
+ email:
275
+ - angelos@workable.com
276
+ executables:
277
+ - pact-provider-verifier
278
+ extensions: []
279
+ extra_rdoc_files: []
280
+ files:
281
+ - CHANGELOG.md
282
+ - Gemfile
283
+ - LICENSE.txt
284
+ - README.md
285
+ - bin/pact-provider-verifier
286
+ - lib/pact/provider_verifier.rb
287
+ - lib/pact/provider_verifier/add_header_middlware.rb
288
+ - lib/pact/provider_verifier/aggregate_pact_configs.rb
289
+ - lib/pact/provider_verifier/app.rb
290
+ - lib/pact/provider_verifier/cli/custom_thor.rb
291
+ - lib/pact/provider_verifier/cli/verify.rb
292
+ - lib/pact/provider_verifier/custom_middleware.rb
293
+ - lib/pact/provider_verifier/pact_helper.rb
294
+ - lib/pact/provider_verifier/provider_states/add_provider_states_header.rb
295
+ - lib/pact/provider_verifier/provider_states/remove_provider_states_header_middleware.rb
296
+ - lib/pact/provider_verifier/rspec_json_formatter_monkeypatch.rb
297
+ - lib/pact/provider_verifier/set_up_provider_state.rb
298
+ - lib/pact/provider_verifier/underscored_headers_monkeypatch.rb
299
+ - lib/pact/provider_verifier/version.rb
300
+ - lib/pact/wait_until_server_available.rb
301
+ homepage: https://github.com/pact-foundation/pact-provider-verifier
302
+ licenses:
303
+ - MIT
304
+ metadata: {}
305
+ post_install_message:
306
+ rdoc_options: []
307
+ require_paths:
308
+ - lib
309
+ required_ruby_version: !ruby/object:Gem::Requirement
310
+ requirements:
311
+ - - ">="
312
+ - !ruby/object:Gem::Version
313
+ version: '0'
314
+ required_rubygems_version: !ruby/object:Gem::Requirement
315
+ requirements:
316
+ - - ">="
317
+ - !ruby/object:Gem::Version
318
+ version: '0'
319
+ requirements: []
320
+ rubygems_version: 3.0.6
321
+ signing_key:
322
+ specification_version: 4
323
+ summary: Provides a Pact verification service for use with Pact
324
+ test_files: []