pact 1.46.1 → 1.47.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: 25ae3362c392a7deab31b4273d9d35c954822fc5e67febdccd318239831be087
4
- data.tar.gz: 89de14252d7225f678881afff334c501a2cfc1e39c191cf3b5a4da9c642c97da
3
+ metadata.gz: baf86f2efd8ed6641172f514a29fc1493e79cfb291c516a8c4059d94f778d58e
4
+ data.tar.gz: 264598f33c4561cd0ce013a8371d27fbb05855c392d762827a002dd0ab4240de
5
5
  SHA512:
6
- metadata.gz: cf708ab7cbebbf0dbb0df3bc196ee5bd9818218c2dd925f73f59055bf1d05fea698731b6ac2d510098eea48f05b02c49b9f7492e2a9f6cfb3064ebb8524dc7bf
7
- data.tar.gz: 223a6ed21f94fdd178794af79eb6f47371aa66e85b5f7e19140a2e51a6fcaf7cc71dfae9f1c965162bd0a8b0b1a82dff0c699a4582a1747e3ebd7e2dd17bd9f7
6
+ metadata.gz: e12522bd3471bb2268ab523a50d7198f8ce8c60ea78031e2f01533628d8c16b11352ceb52e17b879f5306b9b5ce3ab06ef4af9ee1fa2b8abf13a4a74847732de
7
+ data.tar.gz: f8d1e0d854deebf0451c65419e142a48ff1e8ded5cf2a0404ef06929520b77a68e20000c06209aac607fa58d3cbb86af4fb252fe2cf334ee4202aad4919578a8
@@ -1,3 +1,13 @@
1
+ <a name="v1.47.0"></a>
2
+ ### v1.47.0 (2020-02-08)
3
+
4
+
5
+ #### Features
6
+
7
+ * update json formatter output ([376e47a](/../../commit/376e47a))
8
+ * add pact metadata to json formatter ([6c6ddb8](/../../commit/6c6ddb8))
9
+
10
+
1
11
  <a name="v1.46.1"></a>
2
12
  ### v1.46.1 (2020-01-22)
3
13
 
@@ -3,6 +3,7 @@ require 'pact/hal/http_client'
3
3
  require 'pact/provider/pact_uri'
4
4
  require 'pact/errors'
5
5
  require 'pact/pact_broker/fetch_pacts'
6
+ require 'pact/pact_broker/notices'
6
7
 
7
8
  module Pact
8
9
  module PactBroker
@@ -51,7 +52,8 @@ module Pact
51
52
  pacts_for_verification_entity.response.body[EMBEDDED][PACTS].collect do | pact |
52
53
  metadata = {
53
54
  pending: pact["verificationProperties"]["pending"],
54
- notices: extract_notices(pact)
55
+ notices: extract_notices(pact),
56
+ short_description: pact["shortDescription"]
55
57
  }
56
58
  Pact::Provider::PactURI.new(pact[LINKS][SELF][HREF], http_client_options, metadata)
57
59
  end
@@ -69,11 +71,12 @@ module Pact
69
71
  q["includePendingStatus"] = true if options[:include_pending_status]
70
72
  q["consumerVersionSelectors"] = consumer_version_selectors if consumer_version_selectors.any?
71
73
  q["providerVersionTags"] = provider_version_tags if provider_version_tags.any?
74
+ q["includeWipPactsSince"] = options[:include_wip_pacts_since] if options[:include_wip_pacts_since]
72
75
  q
73
76
  end
74
77
 
75
78
  def extract_notices(pact)
76
- (pact["verificationProperties"]["notices"] || []).collect{ |notice| symbolize_keys(notice) }.compact
79
+ Notices.new((pact["verificationProperties"]["notices"] || []).collect{ |notice| symbolize_keys(notice) })
77
80
  end
78
81
 
79
82
  def symbolize_keys(hash)
@@ -82,15 +85,15 @@ module Pact
82
85
 
83
86
  def log_message
84
87
  latest = consumer_version_selectors.any? ? "" : "latest "
85
- message = "INFO: Fetching #{latest}pacts for #{provider} from #{broker_base_url}"
88
+ message = "INFO: Fetching pacts for #{provider} from #{broker_base_url} with the selection criteria: "
86
89
  if consumer_version_selectors.any?
87
90
  desc = consumer_version_selectors.collect do |selector|
88
- all_or_latest = selector[:all] ? "all" : "latest"
91
+ all_or_latest = selector[:all] ? "all for tag" : "latest for tag"
89
92
  # TODO support fallback
90
93
  name = selector[:fallback] ? "#{selector[:tag]} (or #{selector[:fallback]} if not found)" : selector[:tag]
91
94
  "#{all_or_latest} #{name}"
92
95
  end.join(", ")
93
- message << " for tags: #{desc}"
96
+ message << ": #{desc}"
94
97
  end
95
98
  Pact.configuration.output_stream.puts message
96
99
  end
@@ -0,0 +1,34 @@
1
+ module Pact
2
+ module PactBroker
3
+ class Notices < Array
4
+ def before_verification_notices
5
+ select { | notice | notice[:when].nil? || notice[:when].start_with?('before_verification') }
6
+ end
7
+
8
+ def before_verification_notices_text
9
+ before_verification_notices.collect{ | notice | notice[:text] }
10
+ end
11
+
12
+ def after_verification_notices(success, published)
13
+ select { | notice | notice[:when] == "after_verification:success_#{success}_published_#{published}" || notice[:when] == "after_verification" }
14
+ .collect do | notice |
15
+ notice.merge(:when => simplify_notice_when(notice[:when]))
16
+ end
17
+ end
18
+
19
+ def after_verification_notices_text(success, published)
20
+ after_verification_notices(success, published).collect{ | notice | notice[:text] }
21
+ end
22
+
23
+ def all_notices(success, published)
24
+ before_verification_notices + after_verification_notices(success, published)
25
+ end
26
+
27
+ private
28
+
29
+ def simplify_notice_when(when_key)
30
+ when_key.split(":").first
31
+ end
32
+ end
33
+ end
34
+ end
@@ -6,7 +6,7 @@ module Pact
6
6
  module Provider
7
7
  class PactSource
8
8
 
9
- attr_reader :uri
9
+ attr_reader :uri # PactURI class
10
10
 
11
11
  def initialize uri
12
12
  @uri = uri
@@ -122,7 +122,7 @@ module Pact
122
122
  ignore_failures: options[:ignore_failures],
123
123
  request_customizer: options[:request_customizer]
124
124
  }
125
- honour_pactfile pact_source.uri, ordered_pact_json(pact_source.pact_json), spec_options
125
+ honour_pactfile pact_source, ordered_pact_json(pact_source.pact_json), spec_options
126
126
  end
127
127
  end
128
128
 
@@ -21,16 +21,20 @@ module Pact
21
21
 
22
22
  include ::RSpec::Core::DSL
23
23
 
24
- def honour_pactfile pact_uri, pact_json, options
24
+ def honour_pactfile pact_source, pact_json, options
25
+ pact_uri = pact_source.uri
25
26
  Pact.configuration.output_stream.puts "INFO: Reading pact at #{pact_uri}"
26
- (pact_uri.metadata[:notices] || EMPTY_ARRAY).each do | notice |
27
- Pact.configuration.output_stream.puts("DEBUG: #{notice[:text]}")
27
+ if pact_uri.metadata[:notices]
28
+ pact_uri.metadata[:notices].before_verification_notices_text.each do | text |
29
+ Pact.configuration.output_stream.puts("DEBUG: #{text}")
30
+ end
28
31
  end
32
+
29
33
  Pact.configuration.output_stream.puts "DEBUG: Filtering interactions by: #{options[:criteria]}" if options[:criteria] && options[:criteria].any?
30
34
  consumer_contract = Pact::ConsumerContract.from_json(pact_json)
31
35
  suffix = pact_uri.metadata[:pending] ? " [PENDING]": ""
32
36
  ::RSpec.describe "Verifying a pact between #{consumer_contract.consumer.name} and #{consumer_contract.provider.name}#{suffix}", pactfile_uri: pact_uri do
33
- honour_consumer_contract consumer_contract, options.merge(pact_json: pact_json, pact_uri: pact_uri)
37
+ honour_consumer_contract consumer_contract, options.merge(pact_json: pact_json, pact_uri: pact_uri, pact_source: pact_source, consumer_contract: consumer_contract)
34
38
  end
35
39
  end
36
40
 
@@ -78,7 +82,9 @@ module Pact
78
82
  pact_interaction: interaction,
79
83
  pact_interaction_example_description: interaction_description_for_rerun_command(interaction),
80
84
  pact_uri: options[:pact_uri],
81
- pact_ignore_failures: options[:pact_uri].metadata[:pending] || options[:ignore_failures]
85
+ pact_source: options[:pact_source],
86
+ pact_ignore_failures: options[:pact_uri].metadata[:pending] || options[:ignore_failures],
87
+ pact_consumer_contract: options[:consumer_contract]
82
88
  }
83
89
 
84
90
  describe description_for(interaction), metadata do
@@ -8,19 +8,21 @@ module Pact
8
8
 
9
9
  def dump_summary(summary)
10
10
  super(create_custom_summary(summary))
11
- output_hash[:summary][:notices] = pact_broker_notices(summary)
11
+ output_hash[:summary][:pacts] = pacts(summary)
12
12
  end
13
13
 
14
14
  def format_example(example)
15
15
  {
16
16
  :id => example.id,
17
+ :interaction_index => example.metadata[:pact_interaction].index,
17
18
  :description => example.description,
18
19
  :full_description => example.full_description,
19
20
  :status => calculate_status(example),
20
21
  :file_path => example.metadata[:file_path],
21
22
  :line_number => example.metadata[:line_number],
22
23
  :run_time => example.execution_result.run_time,
23
- :mismatches => extract_differences(example)
24
+ :mismatches => extract_differences(example),
25
+ :pact_url => example.metadata[:pact_uri].uri
24
26
  }
25
27
  end
26
28
 
@@ -54,12 +56,22 @@ module Pact
54
56
  # If the JSON formatter is used by someone else and they have multiple pacts, all the notices
55
57
  # for the pacts will be mushed together in one collection, so it will be hard to know which notice
56
58
  # belongs to which pact.
57
- def pact_broker_notices(summary)
58
- pact_uris(summary).collect{ |pact_uri| pact_uri.metadata[:notices] }.compact.flatten
59
+ def pacts(summary)
60
+ unique_pact_metadatas(summary).collect do | example_metadata |
61
+ pact_uri = example_metadata[:pact_uri]
62
+ notices = (pact_uri.metadata[:notices] && pact_uri.metadata[:notices].before_verification_notices) || []
63
+ {
64
+ notices: notices,
65
+ url: pact_uri.uri,
66
+ consumer_name: example_metadata[:pact_consumer_contract].consumer.name,
67
+ provider_name: example_metadata[:pact_consumer_contract].provider.name,
68
+ short_description: pact_uri.metadata[:short_description]
69
+ }
70
+ end
59
71
  end
60
72
 
61
- def pact_uris(summary)
62
- summary.examples.collect(&:metadata).collect{ |metadata| metadata[:pact_uri] }.uniq
73
+ def unique_pact_metadatas(summary)
74
+ summary.examples.collect(&:metadata).group_by{ | metadata | metadata[:pact_uri].uri }.values.collect(&:first)
63
75
  end
64
76
 
65
77
  def create_custom_summary(summary)
@@ -33,6 +33,9 @@ module Pact
33
33
  if can_publish_verification_results?
34
34
  tag_versions_if_configured
35
35
  publish_verification_results
36
+ true
37
+ else
38
+ false
36
39
  end
37
40
  end
38
41
 
@@ -17,7 +17,12 @@ module Pact
17
17
 
18
18
  def call
19
19
  verification_results.collect do | (pact_source, verification_result) |
20
- Publish.call(pact_source, verification_result)
20
+ published = false
21
+ begin
22
+ published = Publish.call(pact_source, verification_result)
23
+ ensure
24
+ print_after_verification_notices(pact_source, verification_result, published)
25
+ end
21
26
  end
22
27
  end
23
28
 
@@ -29,6 +34,14 @@ module Pact
29
34
  end
30
35
  end
31
36
 
37
+ def print_after_verification_notices(pact_source, verification_result, published)
38
+ if pact_source.uri.metadata[:notices]
39
+ pact_source.uri.metadata[:notices].after_verification_notices_text(verification_result.success, published).each do | text |
40
+ Pact.configuration.output_stream.puts "DEBUG: #{text}"
41
+ end
42
+ end
43
+ end
44
+
32
45
  attr_reader :pact_sources, :test_results_hash
33
46
  end
34
47
  end
@@ -4,6 +4,7 @@ module Pact
4
4
  module Provider
5
5
  module VerificationResults
6
6
  class VerificationResult
7
+ attr_reader :success, :provider_application_version, :test_results_hash
7
8
 
8
9
  def initialize publishable, success, provider_application_version, test_results_hash
9
10
  @publishable = publishable
@@ -31,10 +32,6 @@ module Pact
31
32
  def to_s
32
33
  "[success: #{success}, providerApplicationVersion: #{provider_application_version}]"
33
34
  end
34
-
35
- private
36
-
37
- attr_reader :success, :provider_application_version, :test_results_hash
38
35
  end
39
36
  end
40
37
  end
@@ -1,4 +1,4 @@
1
1
  # Remember to bump pact-provider-proxy when this changes major version
2
2
  module Pact
3
- VERSION = "1.46.1"
3
+ VERSION = "1.47.0"
4
4
  end
@@ -44,4 +44,5 @@ Gem::Specification.new do |gem|
44
44
  gem.add_development_dependency 'conventional-changelog', '~> 1.3'
45
45
  gem.add_development_dependency 'bump', '~> 0.5'
46
46
  gem.add_development_dependency 'pact-message', '~> 0.6'
47
+ gem.add_development_dependency 'rspec-its', '~> 1.3'
47
48
  end
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.46.1
4
+ version: 1.47.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: 2020-01-22 00:00:00.000000000 Z
15
+ date: 2020-02-08 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: rspec
@@ -250,6 +250,20 @@ dependencies:
250
250
  - - "~>"
251
251
  - !ruby/object:Gem::Version
252
252
  version: '0.6'
253
+ - !ruby/object:Gem::Dependency
254
+ name: rspec-its
255
+ requirement: !ruby/object:Gem::Requirement
256
+ requirements:
257
+ - - "~>"
258
+ - !ruby/object:Gem::Version
259
+ version: '1.3'
260
+ type: :development
261
+ prerelease: false
262
+ version_requirements: !ruby/object:Gem::Requirement
263
+ requirements:
264
+ - - "~>"
265
+ - !ruby/object:Gem::Version
266
+ version: '1.3'
253
267
  description: Enables consumer driven contract testing, providing a mock service and
254
268
  DSL for the consumer project, and interaction playback and verification for the
255
269
  service provider project.
@@ -304,6 +318,7 @@ files:
304
318
  - lib/pact/pact_broker.rb
305
319
  - lib/pact/pact_broker/fetch_pact_uris_for_verification.rb
306
320
  - lib/pact/pact_broker/fetch_pacts.rb
321
+ - lib/pact/pact_broker/notices.rb
307
322
  - lib/pact/project_root.rb
308
323
  - lib/pact/provider.rb
309
324
  - lib/pact/provider/configuration.rb