pact 1.46.1 → 1.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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