pact-provider-verifier 1.25.2 → 1.26.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 59ff87fe21756ab67a80de863c8902f41f9302844a3b3e3e5808bb5cd7da59a8
4
- data.tar.gz: 902737cbe85072fe7bc8c4c53957079455b3742bf7a35d247af12a77c5bbdea2
3
+ metadata.gz: 2353417f47f75fbb238b3401c5ddbfa5dc98766f83ac1e78105a246420549636
4
+ data.tar.gz: abc6c780757ba1153318867cd8869883c6bbae1bee245a0504d3ed4b39708704
5
5
  SHA512:
6
- metadata.gz: 73c8224015d7656ed468b72591006fe49f7492aa38ed91282f0bd9263382a2f3e4679c96719a82548234be50049f65fd05708c947f1f5881491f21d406e915db
7
- data.tar.gz: 238530cf7fd77aa900157813d6c9428ebec74c166d60a0889a7719c25f549e354d418c891d1bce8b9e5589c7f4e1297cf87c0b836bbfbeee29df849336974854
6
+ metadata.gz: b700edfe49387ab05780793f5fb9c515041633e6e345ee4bd30a8d4fbe0e9a64f1a0a55dd1c9daef12ad03fcd9d497c0eef4cabb16a7090d999bea6f996700fe
7
+ data.tar.gz: 4ac919f6e3f8fa1e6fa15719b67c5cb6406c7de62e2b26cb67f828afdc872dbe1c75f695b1b43885ebb2b08a66f72672041b4740ef21e4fb5f1acc8d863d91a0
data/CHANGELOG.md CHANGED
@@ -1,3 +1,16 @@
1
+ <a name="v1.26.0-1"></a>
2
+ ### v1.26.0-1 (2020-01-11)
3
+
4
+
5
+ #### Features
6
+
7
+ * **cli**
8
+ * allow publishing of verification results to be enabled by setting the environment variable PACT_BROKER_PUBLISH_VERIFICATION_RESULTS=true ([14e37f0](/../../commit/14e37f0))
9
+ * add --enable-pending parameter to CLI ([0b32a1c](/../../commit/0b32a1c))
10
+ * add --consumer-version-selector parameter ([2526590](/../../commit/2526590))
11
+ * add long description ([905ab8d](/../../commit/905ab8d))
12
+
13
+
1
14
  <a name="v1.25.1-1"></a>
2
15
  ### v1.25.1-1 (2019-11-10)
3
16
 
data/README.md CHANGED
@@ -40,24 +40,56 @@ Usage:
40
40
  pact-provider-verifier PACT_URL ... -h, --provider-base-url=PROVIDER_BASE_URL
41
41
 
42
42
  Options:
43
- -h, --provider-base-url=PROVIDER_BASE_URL # Provider host URL
44
- -c, [--provider-states-setup-url=PROVIDER_STATES_SETUP_URL] # Base URL to setup the provider states at
45
- [--pact-broker-base-url=PACT_BROKER_BASE_URL] # Base URL of the Pact Broker from which to retrieve the pacts.
46
- -n, [--broker-username=BROKER_USERNAME] # Pact Broker basic auth username
47
- -p, [--broker-password=BROKER_PASSWORD] # Pact Broker basic auth password
48
- -k, [--broker-token=BROKER_TOKEN] # Pact Broker bearer token
43
+ -h, --provider-base-url=PROVIDER_BASE_URL
44
+ # Provider host URL
45
+ -c, [--provider-states-setup-url=PROVIDER_STATES_SETUP_URL]
46
+ # Base URL to setup the provider states at
47
+ [--pact-broker-base-url=PACT_BROKER_BASE_URL]
48
+ # Base URL of the Pact Broker from which to retrieve the pacts.
49
+ -n, [--broker-username=BROKER_USERNAME]
50
+ # Pact Broker basic auth username
51
+ -p, [--broker-password=BROKER_PASSWORD]
52
+ # Pact Broker basic auth password
53
+ -k, [--broker-token=BROKER_TOKEN]
54
+ # Pact Broker bearer token
49
55
  [--provider=PROVIDER]
50
- [--consumer-version-tag=TAG] # Retrieve the latest pacts with this consumer version tag. Used in conjunction with --provider. May be specified multiple times.
51
- [--provider-version-tag=TAG] # Tag to apply to the provider application version. May be specified multiple times.
52
- -a, [--provider-app-version=PROVIDER_APP_VERSION] # Provider application version, required when publishing verification results
53
- -r, [--publish-verification-results], [--no-publish-verification-results] # Publish verification results to the broker
54
- [--custom-provider-header=CUSTOM_PROVIDER_HEADER] # Header to add to provider state set up and pact verification requests. eg 'Authorization: Basic cGFjdDpwYWN0'. May be specified multiple times.
55
- [--custom-middleware=FILE] # Ruby file containing a class implementing Pact::ProviderVerifier::CustomMiddleware. This allows the response to be modified before replaying. Use with caution!
56
- -v, [--verbose=VERBOSE] # Verbose output
57
- -f, [--format=FORMATTER] # RSpec formatter. Defaults to custom Pact formatter. Other options are json and RspecJunitFormatter (which outputs xml).
58
- -o, [--out=FILE] # Write output to a file instead of $stdout.
59
- [--wait=SECONDS] # The number of seconds to poll for the provider to become available before running the verification
60
- # Default: 0
56
+ [--consumer-version-tag=TAG]
57
+ # Retrieve the latest pacts with this consumer version tag. Used in conjunction with --provider. May be specified multiple times.
58
+ [--consumer-version-selector=SELECTOR]
59
+ # JSON string specifying a selector that identifies which pacts to verify. May be specified multiple times. See below for further documentation.
60
+ [--provider-version-tag=TAG]
61
+ # Tag to apply to the provider application version. May be specified multiple times.
62
+ -a, [--provider-app-version=PROVIDER_APP_VERSION]
63
+ # Provider application version, required when publishing verification results
64
+ -r, [--publish-verification-results], [--no-publish-verification-results]
65
+ # Publish verification results to the broker. This can also be enabled by setting the environment variable PACT_BROKER_PUBLISH_VERIFICATION_RESULTS=true
66
+ [--enable-pending], [--no-enable-pending]
67
+ # Allow pacts which are in pending state to be verified without causing the overall task to fail. For more information, see https://pact.io/pending
68
+ [--custom-provider-header=CUSTOM_PROVIDER_HEADER]
69
+ # Header to add to provider state set up and pact verification requests. eg 'Authorization: Basic cGFjdDpwYWN0'. May be specified multiple times.
70
+ [--custom-middleware=FILE]
71
+ # Ruby file containing a class implementing Pact::ProviderVerifier::CustomMiddleware. This allows the response to be modified before replaying. Use with caution!
72
+ -v, [--verbose=VERBOSE]
73
+ # Verbose output
74
+ -f, [--format=FORMATTER]
75
+ # RSpec formatter. Defaults to custom Pact formatter. Other options are json and RspecJunitFormatter (which outputs xml).
76
+ -o, [--out=FILE]
77
+ # Write output to a file instead of $stdout.
78
+ [--wait=SECONDS]
79
+ # The number of seconds to poll for the provider to become available before running the verification
80
+
81
+ # Default: 0
82
+
83
+ Description:
84
+ To verify a pact from a known URL, specify one or more PACT_URL arguments. If the pact is
85
+ hosted in a Pact Broker that uses authentication, specify the relevant
86
+ --broker-username/--broker-password or --broker-token fields. To dynamically fetch pacts
87
+ from a Pact Broker based on the provider name, specify the --pact-broker-base-url,
88
+ --provider and relevant authentication fields.
89
+
90
+ Selectors: These are specified using JSON strings. The keys are 'tag' (the name of the consumer
91
+ version tag) and 'latest' (true|false). For example '{"tag": "master", "latest": true}'.
92
+ For a detailed explanation of selectors, see https://pact.io/selectors
61
93
  ```
62
94
 
63
95
  ## Examples
@@ -6,17 +6,19 @@ module Pact
6
6
  module ProviderVerifier
7
7
  class AggregatePactConfigs
8
8
 
9
- def self.call(pact_urls, provider_name, consumer_version_tags, provider_version_tags, pact_broker_base_url, http_client_options)
10
- new(pact_urls, provider_name, consumer_version_tags, provider_version_tags, pact_broker_base_url, http_client_options).call
9
+ def self.call(pact_urls, provider_name, consumer_version_tags, consumer_version_selectors, provider_version_tags, pact_broker_base_url, http_client_options, options)
10
+ new(pact_urls, provider_name, consumer_version_tags, consumer_version_selectors, provider_version_tags, pact_broker_base_url, http_client_options, options).call
11
11
  end
12
12
 
13
- def initialize(pact_urls, provider_name, consumer_version_tags, provider_version_tags, pact_broker_base_url, http_client_options)
13
+ def initialize(pact_urls, provider_name, consumer_version_tags, consumer_version_selectors, provider_version_tags, pact_broker_base_url, http_client_options, options)
14
14
  @pact_urls = pact_urls
15
15
  @provider_name = provider_name
16
16
  @consumer_version_tags = consumer_version_tags
17
+ @consumer_version_selectors = consumer_version_selectors
17
18
  @provider_version_tags = provider_version_tags
18
19
  @pact_broker_base_url = pact_broker_base_url
19
20
  @http_client_options = http_client_options
21
+ @options = options
20
22
  end
21
23
 
22
24
  def call
@@ -25,7 +27,7 @@ module Pact
25
27
 
26
28
  private
27
29
 
28
- attr_reader :pact_urls, :provider_name, :consumer_version_tags, :provider_version_tags, :pact_broker_base_url, :http_client_options
30
+ attr_reader :pact_urls, :provider_name, :consumer_version_tags, :consumer_version_selectors, :provider_version_tags, :pact_broker_base_url, :http_client_options, :options
29
31
 
30
32
  def specified_pact_uris
31
33
  pact_urls.collect{ | url | Pact::PactBroker.build_pact_uri(url, http_client_options) }
@@ -40,11 +42,22 @@ module Pact
40
42
  end
41
43
 
42
44
  def pacts_for_verification
43
- @pacts_for_verification ||= Pact::PactBroker.fetch_pact_uris_for_verification(provider_name, consumer_version_selectors, provider_version_tags, pact_broker_base_url, http_client_options)
45
+ @pacts_for_verification ||= Pact::PactBroker.fetch_pact_uris_for_verification(
46
+ provider_name,
47
+ aggregated_consumer_version_selectors,
48
+ provider_version_tags,
49
+ pact_broker_base_url,
50
+ http_client_options,
51
+ pact_options
52
+ )
44
53
  end
45
54
 
46
- def consumer_version_selectors
47
- consumer_version_tags.collect{ |tag| { tag: tag, latest: true } }
55
+ def aggregated_consumer_version_selectors
56
+ consumer_version_selectors + consumer_version_tags.collect{ |tag| { tag: tag, latest: true } }
57
+ end
58
+
59
+ def pact_options
60
+ { include_pending_status: options[:enable_pending] }
48
61
  end
49
62
  end
50
63
  end
@@ -17,13 +17,15 @@ module Pact
17
17
  include Pact::WaitUntilServerAvailable
18
18
 
19
19
  PROXY_PACT_HELPER = File.expand_path(File.join(File.dirname(__FILE__), "pact_helper.rb"))
20
- attr_reader :pact_urls, :options, :consumer_version_tags, :provider_version_tags
20
+ attr_reader :pact_urls, :options, :consumer_version_tags, :provider_version_tags, :consumer_version_selectors, :publish_verification_results
21
21
 
22
22
  def initialize pact_urls, options = {}
23
23
  @pact_urls = pact_urls
24
24
  @options = options
25
25
  @consumer_version_tags = options[:consumer_version_tag] || []
26
26
  @provider_version_tags = options[:provider_version_tag] || []
27
+ @consumer_version_selectors = parse_consumer_version_selectors(options[:consumer_version_selector] || [])
28
+ @publish_verification_results = options.publish_verification_results || ENV['PACT_BROKER_PUBLISH_VERIFICATION_RESULTS'] == 'true'
27
29
  end
28
30
 
29
31
  def self.call pact_urls, options
@@ -82,7 +84,7 @@ module Pact
82
84
  app_version_tags this.provider_version_tags
83
85
  end
84
86
 
85
- publish_verification_results this.options.publish_verification_results
87
+ publish_verification_results this.publish_verification_results
86
88
  end
87
89
  end
88
90
 
@@ -174,7 +176,16 @@ module Pact
174
176
 
175
177
  def all_pact_urls
176
178
  http_client_options = { username: options.broker_username, password: options.broker_password, token: options.broker_token, verbose: options.verbose }
177
- AggregatePactConfigs.call(pact_urls, options.provider, consumer_version_tags, provider_version_tags, options.pact_broker_base_url, http_client_options)
179
+ AggregatePactConfigs.call(
180
+ pact_urls,
181
+ options.provider,
182
+ consumer_version_tags,
183
+ consumer_version_selectors,
184
+ provider_version_tags,
185
+ options.pact_broker_base_url,
186
+ http_client_options,
187
+ { enable_pending: options.enable_pending }
188
+ )
178
189
  end
179
190
 
180
191
  def require_pact_project_pact_helper
@@ -200,6 +211,10 @@ module Pact
200
211
  end
201
212
  end
202
213
 
214
+ def parse_consumer_version_selectors consumer_version_selectors
215
+ consumer_version_selectors.collect{ | string | JSON.parse(string) }
216
+ end
217
+
203
218
  def print_deprecation_note
204
219
  if options.provider_states_url
205
220
  $stderr.puts "WARN: The --provider-states-url option is deprecated and the URL endpoint can be removed from the application"
@@ -3,6 +3,12 @@ require 'socket'
3
3
  require 'pact/provider_verifier/app'
4
4
  require 'pact/provider_verifier/cli/custom_thor'
5
5
 
6
+ # verify --consumer-version-selector '{ all: true, tag: "feat-x", fallback: "master" }' --consumer-version-tag master
7
+
8
+ #
9
+ # tags "master", { all: true, tag: "feat-x", fallback: "master" }
10
+ #
11
+
6
12
  module Pact
7
13
  module ProviderVerifier
8
14
  module CLI
@@ -10,7 +16,13 @@ module Pact
10
16
 
11
17
  class InvalidArgumentsError < ::Thor::Error; end
12
18
 
19
+ SELECTOR_DOCS = "Selectors: These are specified using JSON strings. The keys are 'tag' (the name of the consumer version tag) and 'latest' (true|false). " +
20
+ "For example '{\"tag\": \"master\", \"latest\": true}'. For a detailed explanation of selectors, see https://pact.io/selectors"
21
+
13
22
  desc 'PACT_URL ...', "Verify pact(s) against a provider. Supports local and networked (http-based) files."
23
+ long_desc "To verify a pact from a known URL, specify one or more PACT_URL arguments. If the pact is hosted in a Pact Broker that uses authentication, specify the relevant --broker-username/--broker-password or --broker-token fields. " +
24
+ "To dynamically fetch pacts from a Pact Broker based on the provider name, specify the --pact-broker-base-url, --provider and relevant authentication fields." +
25
+ "\n\n" + SELECTOR_DOCS
14
26
  method_option :provider_base_url, aliases: "-h", desc: "Provider host URL", :required => true
15
27
  method_option :provider_states_setup_url, aliases: "-c", desc: "Base URL to setup the provider states at", :required => false
16
28
  method_option :pact_broker_base_url, desc: "Base URL of the Pact Broker from which to retrieve the pacts.", :required => false
@@ -19,9 +31,11 @@ module Pact
19
31
  method_option :broker_token, aliases: "-k", desc: "Pact Broker bearer token", :required => false
20
32
  method_option :provider, required: false
21
33
  method_option :consumer_version_tag, type: :array, banner: "TAG", desc: "Retrieve the latest pacts with this consumer version tag. Used in conjunction with --provider. May be specified multiple times.", :required => false
34
+ method_option :consumer_version_selector, type: :array, banner: "SELECTOR", desc: "JSON string specifying a selector that identifies which pacts to verify. May be specified multiple times. See below for further documentation.", :required => false
22
35
  method_option :provider_version_tag, type: :array, banner: "TAG", desc: "Tag to apply to the provider application version. May be specified multiple times.", :required => false
23
36
  method_option :provider_app_version, aliases: "-a", desc: "Provider application version, required when publishing verification results", :required => false
24
- method_option :publish_verification_results, aliases: "-r", desc: "Publish verification results to the broker", required: false, type: :boolean, default: false
37
+ method_option :publish_verification_results, aliases: "-r", desc: "Publish verification results to the broker. This can also be enabled by setting the environment variable PACT_BROKER_PUBLISH_VERIFICATION_RESULTS=true", required: false, type: :boolean, default: false
38
+ method_option :enable_pending, desc: "Allow pacts which are in pending state to be verified without causing the overall task to fail. For more information, see https://pact.io/pending", required: false, type: :boolean, default: false
25
39
  method_option :custom_provider_header, type: :array, banner: 'CUSTOM_PROVIDER_HEADER', desc: "Header to add to provider state set up and pact verification requests. eg 'Authorization: Basic cGFjdDpwYWN0'. May be specified multiple times.", :required => false
26
40
  method_option :custom_middleware, type: :array, banner: 'FILE', desc: "Ruby file containing a class implementing Pact::ProviderVerifier::CustomMiddleware. This allows the response to be modified before replaying. Use with caution!", :required => false
27
41
  method_option :monkeypatch, hide: true, type: :array, :required => false
@@ -64,6 +78,22 @@ module Pact
64
78
  if options.pact_broker_base_url && (options.provider.nil? || options.provider == "")
65
79
  raise InvalidArgumentsError, "No value provided for required option '--provider'"
66
80
  end
81
+ validate_consumer_version_selectors
82
+ end
83
+
84
+ def validate_consumer_version_selectors
85
+ error_messages = (options.consumer_version_selector || []).collect do | string |
86
+ begin
87
+ JSON.parse(string)
88
+ nil
89
+ rescue
90
+ "Invalid JSON string provided for --consumer-version-selector: #{string}"
91
+ end
92
+ end.compact
93
+
94
+ if error_messages.any?
95
+ raise InvalidArgumentsError, error_messages.join("\n")
96
+ end
67
97
  end
68
98
 
69
99
  def exit_with_non_zero_status
@@ -1,5 +1,5 @@
1
1
  module Pact
2
2
  module ProviderVerifier
3
- VERSION = "1.25.2"
3
+ VERSION = "1.26.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pact-provider-verifier
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.25.2
4
+ version: 1.26.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Fellows
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-11-15 00:00:00.000000000 Z
12
+ date: 2020-01-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -31,20 +31,14 @@ dependencies:
31
31
  requirements:
32
32
  - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: '1.42'
35
- - - ">="
36
- - !ruby/object:Gem::Version
37
- version: 1.42.3
34
+ version: '1.43'
38
35
  type: :runtime
39
36
  prerelease: false
40
37
  version_requirements: !ruby/object:Gem::Requirement
41
38
  requirements:
42
39
  - - "~>"
43
40
  - !ruby/object:Gem::Version
44
- version: '1.42'
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: 1.42.3
41
+ version: '1.43'
48
42
  - !ruby/object:Gem::Dependency
49
43
  name: pact-message
50
44
  requirement: !ruby/object:Gem::Requirement
@@ -113,14 +107,14 @@ dependencies:
113
107
  requirements:
114
108
  - - "~>"
115
109
  - !ruby/object:Gem::Version
116
- version: '2.0'
110
+ version: '2.1'
117
111
  type: :runtime
118
112
  prerelease: false
119
113
  version_requirements: !ruby/object:Gem::Requirement
120
114
  requirements:
121
115
  - - "~>"
122
116
  - !ruby/object:Gem::Version
123
- version: '2.0'
117
+ version: '2.1'
124
118
  - !ruby/object:Gem::Dependency
125
119
  name: rake
126
120
  requirement: !ruby/object:Gem::Requirement