pact 1.28.0 → 1.29.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +17 -0
- data/lib/pact/cli.rb +1 -1
- data/lib/pact/cli/run_pact_verification.rb +2 -1
- data/lib/pact/consumer/configuration/mock_service.rb +1 -1
- data/lib/pact/hal/entity.rb +2 -2
- data/lib/pact/pact_broker.rb +19 -0
- data/lib/pact/pact_broker/fetch_pacts.rb +16 -15
- data/lib/pact/pact_broker/fetch_wip_pacts.rb +56 -0
- data/lib/pact/provider/pact_spec_runner.rb +6 -2
- data/lib/pact/provider/rspec.rb +5 -3
- data/lib/pact/provider/rspec/formatter_rspec_3.rb +18 -2
- data/lib/pact/retry.rb +2 -0
- data/lib/pact/tasks/task_helper.rb +4 -3
- data/lib/pact/tasks/verification_task.rb +3 -1
- data/lib/pact/version.rb +1 -1
- data/pact.gemspec +1 -1
- metadata +4 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b4544628feb78e41d434d8df2fa467c3795b0849
|
4
|
+
data.tar.gz: 22c2d7a7caa71c7da7dd33e232a44ba5374f3fd9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e1e6ddfcaad18582eb50938d8599e02d19a68efc4053f26e677ccd44125d3c855d4447a13e11a900652612ba1eec1d13759d18fbf32824f8d4c686d06601f9fc
|
7
|
+
data.tar.gz: 572c7b4c21f1143d3352620f4596f923917dc974c590b78a2cc9cd2fed071d9d5a5cf2ffe41e369e9cfda4ae6201713760ff3e263a6a74a34ccec747b5b3bcd4
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
<a name="v1.29.0"></a>
|
2
|
+
### v1.29.0 (2018-07-24)
|
3
|
+
|
4
|
+
|
5
|
+
#### Features
|
6
|
+
|
7
|
+
* return plain string URLs from Pact::PactBroker.fetch_pact_uris ([1aa1989](/../../commit/1aa1989))
|
8
|
+
* use beta:wip-provider-pacts rather than pb:wip-provider-pacts to fetch WIP pacts ([3bb0501](/../../commit/3bb0501))
|
9
|
+
* allow WIP pacts to be verified without causing the process to return an non zero exit code ([9e6de46](/../../commit/9e6de46))
|
10
|
+
|
11
|
+
|
12
|
+
#### Bug Fixes
|
13
|
+
|
14
|
+
* add missing require ([0aa2d2a](/../../commit/0aa2d2a))
|
15
|
+
* default pact specification version to 2 ([917891a](/../../commit/917891a))
|
16
|
+
|
17
|
+
|
1
18
|
<a name="v1.28.0"></a>
|
2
19
|
### v1.28.0 (2018-06-24)
|
3
20
|
|
data/lib/pact/cli.rb
CHANGED
@@ -8,6 +8,7 @@ module Pact
|
|
8
8
|
desc 'verify', "Verify a pact"
|
9
9
|
method_option :pact_helper, aliases: "-h", desc: "Pact helper file", :required => true
|
10
10
|
method_option :pact_uri, aliases: "-p", desc: "Pact URI"
|
11
|
+
method_option :wip, type: :boolean, default: false, desc: "If WIP, process will always exit with exit code 0", hide: true
|
11
12
|
method_option :pact_broker_username, aliases: "-u", desc: "Pact broker user name"
|
12
13
|
method_option :pact_broker_password, aliases: "-w", desc: "Pact broker password"
|
13
14
|
method_option :backtrace, aliases: "-b", desc: "Show full backtrace", :default => false, :type => :boolean
|
@@ -33,6 +34,5 @@ module Pact
|
|
33
34
|
require 'pact/doc/generator'
|
34
35
|
Pact::Doc::Generate.call(options[:pact_dir], options[:doc_dir], [Pact::Doc::Markdown::Generator])
|
35
36
|
end
|
36
|
-
|
37
37
|
end
|
38
38
|
end
|
data/lib/pact/hal/entity.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'pact/pact_broker/fetch_pacts'
|
2
|
+
require 'pact/pact_broker/fetch_wip_pacts'
|
3
|
+
|
4
|
+
#
|
5
|
+
# @public Use by Pact Provider Verifier
|
6
|
+
#
|
7
|
+
module Pact
|
8
|
+
module PactBroker
|
9
|
+
extend self
|
10
|
+
|
11
|
+
def fetch_pact_uris *args
|
12
|
+
Pact::PactBroker::FetchPacts.call(*args).collect(&:uri)
|
13
|
+
end
|
14
|
+
|
15
|
+
def fetch_wip_pact_uris *args
|
16
|
+
Pact::PactBroker::FetchWipPacts.call(*args).collect(&:uri)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -11,6 +11,7 @@ module Pact
|
|
11
11
|
LATEST_PROVIDER_TAG_RELATION = 'pb:latest-provider-pacts-with-tag'.freeze
|
12
12
|
LATEST_PROVIDER_RELATION = 'pb:latest-provider-pacts'.freeze
|
13
13
|
PACTS = 'pacts'.freeze
|
14
|
+
PB_PACTS = 'pb:pacts'.freeze
|
14
15
|
HREF = 'href'.freeze
|
15
16
|
|
16
17
|
def initialize(provider, tags, broker_base_url, http_client_options)
|
@@ -33,11 +34,11 @@ module Pact
|
|
33
34
|
|
34
35
|
def call
|
35
36
|
log_message
|
36
|
-
if
|
37
|
+
if index.success?
|
37
38
|
if any_tags?
|
38
|
-
|
39
|
+
tagged_pacts_for_provider
|
39
40
|
else
|
40
|
-
|
41
|
+
latest_pacts_for_provider
|
41
42
|
end
|
42
43
|
else
|
43
44
|
raise Pact::Error.new("Error retrieving #{broker_base_url} status=#{index_entity.response.code} #{index_entity.response.raw_body}")
|
@@ -50,18 +51,18 @@ module Pact
|
|
50
51
|
tags && tags.any?
|
51
52
|
end
|
52
53
|
|
53
|
-
def
|
54
|
+
def tagged_pacts_for_provider
|
54
55
|
tags.collect do |tag|
|
55
|
-
link =
|
56
|
-
urls =
|
57
|
-
if urls
|
58
|
-
urls =
|
56
|
+
link = link_for(tag)
|
57
|
+
urls = pact_urls(link.expand(provider: provider, tag: tag[:name]).get)
|
58
|
+
if urls.empty? && tag[:fallback]
|
59
|
+
urls = pact_urls(link.expand(provider: provider, tag: tag[:fallback]).get)
|
59
60
|
end
|
60
61
|
urls
|
61
62
|
end.flatten
|
62
63
|
end
|
63
64
|
|
64
|
-
def
|
65
|
+
def link_for(tag)
|
65
66
|
if !tag[:all]
|
66
67
|
index_entity._link(LATEST_PROVIDER_TAG_RELATION)
|
67
68
|
else
|
@@ -69,17 +70,17 @@ module Pact
|
|
69
70
|
end
|
70
71
|
end
|
71
72
|
|
72
|
-
def
|
73
|
-
@index_entity
|
73
|
+
def index
|
74
|
+
@index_entity ||= Pact::Hal::Link.new({ "href" => broker_base_url }, http_client).get
|
74
75
|
end
|
75
76
|
|
76
|
-
def
|
77
|
+
def latest_pacts_for_provider
|
77
78
|
link = index_entity._link(LATEST_PROVIDER_RELATION)
|
78
|
-
|
79
|
+
pact_urls(link.expand(provider: provider).get)
|
79
80
|
end
|
80
81
|
|
81
|
-
def
|
82
|
-
link_by_provider.fetch(PACTS).collect do |pact|
|
82
|
+
def pact_urls(link_by_provider)
|
83
|
+
link_by_provider.fetch(PB_PACTS, PACTS).collect do |pact|
|
83
84
|
Pact::Provider::PactURI.new(pact[HREF], http_client_options)
|
84
85
|
end
|
85
86
|
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'pact/hal/entity'
|
2
|
+
require 'pact/hal/http_client'
|
3
|
+
require 'pact/provider/pact_uri'
|
4
|
+
|
5
|
+
module Pact
|
6
|
+
module PactBroker
|
7
|
+
class FetchWipPacts
|
8
|
+
attr_reader :provider, :tags, :broker_base_url, :http_client_options, :http_client, :index_entity
|
9
|
+
|
10
|
+
WIP_PROVIDER_RELATION = 'beta:wip-provider-pacts'.freeze
|
11
|
+
PACTS = 'pacts'.freeze
|
12
|
+
PB_PACTS = 'pb:pacts'.freeze
|
13
|
+
HREF = 'href'.freeze
|
14
|
+
|
15
|
+
def initialize(provider, broker_base_url, http_client_options)
|
16
|
+
@provider = provider
|
17
|
+
@http_client_options = http_client_options
|
18
|
+
@broker_base_url = broker_base_url
|
19
|
+
@http_client = Pact::Hal::HttpClient.new(http_client_options)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.call(provider, broker_base_url, http_client_options)
|
23
|
+
new(provider, broker_base_url, http_client_options).call
|
24
|
+
end
|
25
|
+
|
26
|
+
def call
|
27
|
+
if index.success?
|
28
|
+
wip_pacts_for_provider
|
29
|
+
else
|
30
|
+
raise Pact::Error.new("Error retrieving #{broker_base_url} status=#{index_entity.response.code} #{index_entity.response.raw_body}")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def index
|
37
|
+
@index_entity ||= Pact::Hal::Link.new({ "href" => broker_base_url }, http_client).get
|
38
|
+
end
|
39
|
+
|
40
|
+
def wip_pacts_for_provider
|
41
|
+
link = index_entity._link(WIP_PROVIDER_RELATION)
|
42
|
+
if link
|
43
|
+
get_pact_urls(link.expand(provider: provider).get)
|
44
|
+
else
|
45
|
+
[]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def get_pact_urls(link_by_provider)
|
50
|
+
link_by_provider.fetch(PB_PACTS, PACTS).collect do |pact|
|
51
|
+
Pact::Provider::PactURI.new(pact[HREF], http_client_options)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -36,6 +36,7 @@ module Pact
|
|
36
36
|
ensure
|
37
37
|
::RSpec.reset
|
38
38
|
Pact.clear_provider_world
|
39
|
+
Pact.clear_consumer_world
|
39
40
|
end
|
40
41
|
end
|
41
42
|
|
@@ -90,7 +91,7 @@ module Pact
|
|
90
91
|
::RSpec::Core::CommandLine.new(NoConfigurationOptions.new)
|
91
92
|
.run(::RSpec.configuration.output_stream, ::RSpec.configuration.error_stream)
|
92
93
|
end
|
93
|
-
exit_code
|
94
|
+
options[:wip] ? 0 : exit_code
|
94
95
|
end
|
95
96
|
|
96
97
|
def rspec_runner_options
|
@@ -118,7 +119,8 @@ module Pact
|
|
118
119
|
def initialize_specs
|
119
120
|
pact_sources.each do | pact_source |
|
120
121
|
options = {
|
121
|
-
criteria: @options[:criteria]
|
122
|
+
criteria: @options[:criteria],
|
123
|
+
wip: @options[:wip]
|
122
124
|
}
|
123
125
|
honour_pactfile pact_source.uri, ordered_pact_json(pact_source.pact_json), options
|
124
126
|
end
|
@@ -144,6 +146,8 @@ module Pact
|
|
144
146
|
end
|
145
147
|
|
146
148
|
::RSpec.configuration.full_backtrace = @options[:full_backtrace]
|
149
|
+
|
150
|
+
::RSpec.configuration.failure_color = :yellow if @options[:wip]
|
147
151
|
end
|
148
152
|
|
149
153
|
def ordered_pact_json(pact_json)
|
data/lib/pact/provider/rspec.rb
CHANGED
@@ -21,10 +21,11 @@ module Pact
|
|
21
21
|
include ::RSpec::Core::DSL
|
22
22
|
|
23
23
|
def honour_pactfile pact_uri, pact_json, options
|
24
|
-
|
24
|
+
pact_description = options[:wip] ? "WIP pact" : "pact"
|
25
|
+
Pact.configuration.output_stream.puts "INFO: Reading #{pact_description} at #{pact_uri}"
|
25
26
|
Pact.configuration.output_stream.puts "INFO: Filtering interactions by: #{options[:criteria]}" if options[:criteria] && options[:criteria].any?
|
26
27
|
consumer_contract = Pact::ConsumerContract.from_json(pact_json)
|
27
|
-
::RSpec.describe "Verifying a
|
28
|
+
::RSpec.describe "Verifying a #{pact_description} between #{consumer_contract.consumer.name} and #{consumer_contract.provider.name}", pactfile_uri: pact_uri do
|
28
29
|
honour_consumer_contract consumer_contract, options.merge(pact_json: pact_json, pact_uri: pact_uri)
|
29
30
|
end
|
30
31
|
end
|
@@ -72,7 +73,8 @@ module Pact
|
|
72
73
|
pact: :verify,
|
73
74
|
pact_interaction: interaction,
|
74
75
|
pact_interaction_example_description: interaction_description_for_rerun_command(interaction),
|
75
|
-
pact_uri: options[:pact_uri]
|
76
|
+
pact_uri: options[:pact_uri],
|
77
|
+
pact_wip: options[:wip]
|
76
78
|
}
|
77
79
|
|
78
80
|
describe description_for(interaction), metadata do
|
@@ -42,9 +42,21 @@ module Pact
|
|
42
42
|
summary.failed_examples.collect{ |e| e.metadata[:pact_interaction_example_description] }.uniq.size
|
43
43
|
end
|
44
44
|
|
45
|
+
def wip?(summary)
|
46
|
+
summary.failed_examples.any?{ |e| e.metadata[:pact_wip] }
|
47
|
+
end
|
48
|
+
|
49
|
+
def failure_title summary
|
50
|
+
if wip?(summary)
|
51
|
+
"#{failed_interactions_count(summary)} pending"
|
52
|
+
else
|
53
|
+
::RSpec::Core::Formatters::Helpers.pluralize(failed_interactions_count(summary), "failure")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
45
57
|
def totals_line summary
|
46
58
|
line = ::RSpec::Core::Formatters::Helpers.pluralize(interactions_count(summary), "interaction")
|
47
|
-
line << ", " <<
|
59
|
+
line << ", " << failure_title(summary)
|
48
60
|
line
|
49
61
|
end
|
50
62
|
|
@@ -57,7 +69,11 @@ module Pact
|
|
57
69
|
end
|
58
70
|
|
59
71
|
def print_rerun_commands summary
|
60
|
-
|
72
|
+
if wip?(summary)
|
73
|
+
output.puts("\nPending interactions: (Failures listed here are expected and do not affect your suite's status)\n\n")
|
74
|
+
else
|
75
|
+
output.puts("\nFailed interactions:\n\n")
|
76
|
+
end
|
61
77
|
interaction_rerun_commands(summary).each do | message |
|
62
78
|
output.puts(message)
|
63
79
|
end
|
data/lib/pact/retry.rb
CHANGED
@@ -10,8 +10,8 @@ module Pact
|
|
10
10
|
|
11
11
|
extend self
|
12
12
|
|
13
|
-
def execute_pact_verify pact_uri = nil, pact_helper = nil, rspec_opts = nil
|
14
|
-
execute_cmd verify_command(pact_helper || Pact::Provider::PactHelperLocater.pact_helper_path, pact_uri, rspec_opts)
|
13
|
+
def execute_pact_verify pact_uri = nil, pact_helper = nil, rspec_opts = nil, verification_opts = {}
|
14
|
+
execute_cmd verify_command(pact_helper || Pact::Provider::PactHelperLocater.pact_helper_path, pact_uri, rspec_opts, verification_opts)
|
15
15
|
end
|
16
16
|
|
17
17
|
def handle_verification_failure
|
@@ -19,7 +19,7 @@ module Pact
|
|
19
19
|
abort if exit_status != 0
|
20
20
|
end
|
21
21
|
|
22
|
-
def verify_command pact_helper, pact_uri, rspec_opts
|
22
|
+
def verify_command pact_helper, pact_uri, rspec_opts, verification_opts
|
23
23
|
command_parts = []
|
24
24
|
# Clear SPEC_OPTS, otherwise we can get extra formatters, creating duplicate output eg. CI Reporting.
|
25
25
|
# Allow deliberate configuration using rspec_opts in VerificationTask.
|
@@ -28,6 +28,7 @@ module Pact
|
|
28
28
|
command_parts << "-S pact verify"
|
29
29
|
command_parts << "--pact-helper" << Shellwords.escape(pact_helper.end_with?(".rb") ? pact_helper : pact_helper + ".rb")
|
30
30
|
(command_parts << "--pact-uri" << pact_uri) if pact_uri
|
31
|
+
command_parts << "--wip" if verification_opts[:wip]
|
31
32
|
command_parts << "--pact-broker-username" << ENV['PACT_BROKER_USERNAME'] if ENV['PACT_BROKER_USERNAME']
|
32
33
|
command_parts << "--pact-broker-password" << ENV['PACT_BROKER_PASSWORD'] if ENV['PACT_BROKER_PASSWORD']
|
33
34
|
command_parts << "--backtrace" if ENV['BACKTRACE'] == 'true'
|
@@ -30,9 +30,11 @@ module Pact
|
|
30
30
|
|
31
31
|
attr_reader :pact_spec_configs
|
32
32
|
attr_accessor :rspec_opts
|
33
|
+
attr_accessor :wip
|
33
34
|
|
34
35
|
def initialize(name)
|
35
36
|
@rspec_opts = nil
|
37
|
+
@wip = false
|
36
38
|
@pact_spec_configs = []
|
37
39
|
@name = name
|
38
40
|
yield self
|
@@ -74,7 +76,7 @@ module Pact
|
|
74
76
|
require 'pact/tasks/task_helper'
|
75
77
|
|
76
78
|
exit_statuses = pact_spec_configs.collect do | config |
|
77
|
-
Pact::TaskHelper.execute_pact_verify config[:uri], config[:pact_helper], rspec_opts
|
79
|
+
Pact::TaskHelper.execute_pact_verify config[:uri], config[:pact_helper], rspec_opts, { wip: wip }
|
78
80
|
end
|
79
81
|
|
80
82
|
Pact::TaskHelper.handle_verification_failure do
|
data/lib/pact/version.rb
CHANGED
data/pact.gemspec
CHANGED
@@ -33,7 +33,7 @@ Gem::Specification.new do |gem|
|
|
33
33
|
|
34
34
|
gem.add_development_dependency 'rake', '~> 10.0.3'
|
35
35
|
gem.add_development_dependency 'webmock', '~> 3.0'
|
36
|
-
gem.add_development_dependency 'pry-byebug'
|
36
|
+
#gem.add_development_dependency 'pry-byebug'
|
37
37
|
gem.add_development_dependency 'fakefs', '0.5' # 0.6.0 blows up
|
38
38
|
gem.add_development_dependency 'hashie', '~> 2.0'
|
39
39
|
gem.add_development_dependency 'activesupport'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pact
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.29.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Fraser
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2018-
|
15
|
+
date: 2018-07-24 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: randexp
|
@@ -174,20 +174,6 @@ dependencies:
|
|
174
174
|
- - "~>"
|
175
175
|
- !ruby/object:Gem::Version
|
176
176
|
version: '3.0'
|
177
|
-
- !ruby/object:Gem::Dependency
|
178
|
-
name: pry-byebug
|
179
|
-
requirement: !ruby/object:Gem::Requirement
|
180
|
-
requirements:
|
181
|
-
- - ">="
|
182
|
-
- !ruby/object:Gem::Version
|
183
|
-
version: '0'
|
184
|
-
type: :development
|
185
|
-
prerelease: false
|
186
|
-
version_requirements: !ruby/object:Gem::Requirement
|
187
|
-
requirements:
|
188
|
-
- - ">="
|
189
|
-
- !ruby/object:Gem::Version
|
190
|
-
version: '0'
|
191
177
|
- !ruby/object:Gem::Dependency
|
192
178
|
name: fakefs
|
193
179
|
requirement: !ruby/object:Gem::Requirement
|
@@ -335,7 +321,9 @@ files:
|
|
335
321
|
- lib/pact/hal/entity.rb
|
336
322
|
- lib/pact/hal/http_client.rb
|
337
323
|
- lib/pact/hal/link.rb
|
324
|
+
- lib/pact/pact_broker.rb
|
338
325
|
- lib/pact/pact_broker/fetch_pacts.rb
|
326
|
+
- lib/pact/pact_broker/fetch_wip_pacts.rb
|
339
327
|
- lib/pact/project_root.rb
|
340
328
|
- lib/pact/provider.rb
|
341
329
|
- lib/pact/provider/configuration.rb
|