workable-pact-provider-verifier 1.24.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +296 -0
- data/Gemfile +11 -0
- data/LICENSE.txt +22 -0
- data/README.md +143 -0
- data/bin/pact-provider-verifier +3 -0
- data/lib/pact/provider_verifier.rb +2 -0
- data/lib/pact/provider_verifier/add_header_middlware.rb +34 -0
- data/lib/pact/provider_verifier/aggregate_pact_configs.rb +51 -0
- data/lib/pact/provider_verifier/app.rb +229 -0
- data/lib/pact/provider_verifier/cli/custom_thor.rb +71 -0
- data/lib/pact/provider_verifier/cli/verify.rb +80 -0
- data/lib/pact/provider_verifier/custom_middleware.rb +33 -0
- data/lib/pact/provider_verifier/pact_helper.rb +25 -0
- data/lib/pact/provider_verifier/provider_states/add_provider_states_header.rb +36 -0
- data/lib/pact/provider_verifier/provider_states/remove_provider_states_header_middleware.rb +19 -0
- data/lib/pact/provider_verifier/rspec_json_formatter_monkeypatch.rb +34 -0
- data/lib/pact/provider_verifier/set_up_provider_state.rb +112 -0
- data/lib/pact/provider_verifier/underscored_headers_monkeypatch.rb +96 -0
- data/lib/pact/provider_verifier/version.rb +5 -0
- data/lib/pact/wait_until_server_available.rb +24 -0
- metadata +324 -0
@@ -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,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: []
|