pact 1.41.2 → 1.42.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
  SHA1:
3
- metadata.gz: 682d57626c30c4ce3f4e83038a3e5ff54d0f4878
4
- data.tar.gz: 7eb5834ea442abebf6e8739a5a2746514560fdc8
3
+ metadata.gz: e4b327f444ffe97e8a904aa40ccdf20086de7507
4
+ data.tar.gz: 4885272ca8b7b4eb1e3ebd8d5f995ec50fbb96b5
5
5
  SHA512:
6
- metadata.gz: 369f376d001db7fac67ed5fce394dd0672c735de178c4c940b67082e7f36e7b8f43e18f2eb91d93403c969a1c26a995c229331f14780563e18b957456951b814
7
- data.tar.gz: db56fdd2c74f3cba9dd6b1e3ec7983eb50a46888f2c6ea7a9a70f2153738be1bbd6a53894a433d70d8f8dd4329b3526334b31c825cc7bcf75d4072e962f4f506
6
+ metadata.gz: 3e26230cf9736addab312532d9ca89bf519872b08d5a2b9a0934f4b033ca815b0c09c20f96b68fd43912621c634f6a0ca03dfc05b4475dfe6d229674c6c13f0b
7
+ data.tar.gz: 5765ee8272e673040156be5cea50512bbfa613e93424260bb556bc412dded504ea25d3608f4a743bcb42b2febe4995cfe35e368c953f397c607d0ca73bb44df7
@@ -1,3 +1,12 @@
1
+ <a name="v1.42.0"></a>
2
+ ### v1.42.0 (2019-09-26)
3
+
4
+
5
+ #### Features
6
+
7
+ * use new 'pacts for verification' endpoint to retrieve pacts (#199) ([55bb935](/../../commit/55bb935))
8
+
9
+
1
10
  <a name="v1.41.2"></a>
2
11
  ### v1.41.2 (2019-09-10)
3
12
 
@@ -44,15 +44,17 @@ module Pact
44
44
  end
45
45
 
46
46
  def run_specs
47
- exit_code = if options[:pact_uri]
48
- run_with_pact_uri
47
+ exit_code = if options[:pact_uri].is_a?(String)
48
+ run_with_pact_url_string
49
+ elsif options[:pact_uri]
50
+ run_with_pact_uri_object # from pact-provider-verifier
49
51
  else
50
- run_with_configured_pacts
52
+ run_with_configured_pacts_from_pact_helper
51
53
  end
52
54
  exit exit_code
53
55
  end
54
56
 
55
- def run_with_pact_uri
57
+ def run_with_pact_url_string
56
58
  pact_repository_uri_options = {}
57
59
  pact_repository_uri_options[:username] = options[:pact_broker_username] if options[:pact_broker_username]
58
60
  pact_repository_uri_options[:password] = options[:pact_broker_password] if options[:pact_broker_password]
@@ -61,7 +63,11 @@ module Pact
61
63
  Pact::Provider::PactSpecRunner.new([pact_uri], pact_spec_options).run
62
64
  end
63
65
 
64
- def run_with_configured_pacts
66
+ def run_with_pact_uri_object
67
+ Pact::Provider::PactSpecRunner.new([options[:pact_uri]], pact_spec_options).run
68
+ end
69
+
70
+ def run_with_configured_pacts_from_pact_helper
65
71
  pact_urls = Pact.provider_world.pact_urls
66
72
  raise "Please configure a pact to verify" if pact_urls.empty?
67
73
  Pact::Provider::PactSpecRunner.new(pact_urls, pact_spec_options).run
@@ -1,6 +1,7 @@
1
1
  require 'pact/retry'
2
2
  require 'pact/hal/authorization_header_redactor'
3
3
  require 'net/http'
4
+ require 'rack'
4
5
 
5
6
  module Pact
6
7
  module Hal
@@ -15,9 +16,11 @@ module Pact
15
16
  end
16
17
 
17
18
  def get href, params = {}, headers = {}
18
- query = params.collect{ |(key, value)| "#{CGI::escape(key)}=#{CGI::escape(value)}" }.join("&")
19
19
  uri = URI(href)
20
- uri.query = query
20
+ if params && params.any?
21
+ existing_params = Rack::Utils.parse_nested_query(uri.query)
22
+ uri.query = Rack::Utils.build_nested_query(existing_params.merge(params))
23
+ end
21
24
  perform_request(create_request(uri, 'Get', nil, headers), uri)
22
25
  end
23
26
 
@@ -40,6 +40,10 @@ module Pact
40
40
  wrap_response(href, @http_client.get(href, payload, headers))
41
41
  end
42
42
 
43
+ def get!(*args)
44
+ get(*args).assert_success!
45
+ end
46
+
43
47
  def put(payload = nil, headers = {})
44
48
  wrap_response(href, @http_client.put(href, payload ? payload.to_json : nil, headers))
45
49
  end
@@ -51,11 +55,25 @@ module Pact
51
55
  def expand(params)
52
56
  expanded_url = expand_url(params, href)
53
57
  new_attrs = @attrs.merge('href' => expanded_url)
54
- Link.new(new_attrs, @http_client)
58
+ Link.new(new_attrs, http_client)
59
+ end
60
+
61
+ def with_query(query)
62
+ if query && query.any?
63
+ uri = URI(href)
64
+ existing_query_params = Rack::Utils.parse_nested_query(uri.query)
65
+ uri.query = Rack::Utils.build_nested_query(existing_query_params.merge(query))
66
+ new_attrs = attrs.merge('href' => uri.to_s)
67
+ Link.new(new_attrs, http_client)
68
+ else
69
+ self
70
+ end
55
71
  end
56
72
 
57
73
  private
58
74
 
75
+ attr_reader :attrs, :http_client
76
+
59
77
  def wrap_response(href, http_response)
60
78
  require 'pact/hal/entity' # avoid circular reference
61
79
  if http_response.success?
@@ -1,19 +1,25 @@
1
1
  require 'pact/pact_broker/fetch_pacts'
2
- require 'pact/pact_broker/fetch_pending_pacts'
2
+ require 'pact/pact_broker/fetch_pact_uris_for_verification'
3
+ require 'pact/provider/pact_uri'
3
4
 
4
5
  #
5
- # @public Use by Pact Provider Verifier
6
+ # @public Used by Pact Provider Verifier
6
7
  #
7
8
  module Pact
8
9
  module PactBroker
9
10
  extend self
10
11
 
12
+ # Keep for backwards compatibility with pact-provider-verifier < 1.23.1
11
13
  def fetch_pact_uris *args
12
14
  Pact::PactBroker::FetchPacts.call(*args).collect(&:uri)
13
15
  end
14
16
 
15
- def fetch_pending_pact_uris *args
16
- Pact::PactBroker::FetchPendingPacts.call(*args).collect(&:uri)
17
+ def fetch_pact_uris_for_verification *args
18
+ Pact::PactBroker::FetchPactURIsForVerification.call(*args)
19
+ end
20
+
21
+ def build_pact_uri(*args)
22
+ Pact::Provider::PactURI.new(*args)
17
23
  end
18
24
  end
19
25
  end
@@ -0,0 +1,96 @@
1
+ require 'pact/hal/entity'
2
+ require 'pact/hal/http_client'
3
+ require 'pact/provider/pact_uri'
4
+ require 'pact/errors'
5
+ require 'pact/pact_broker/fetch_pacts'
6
+
7
+ module Pact
8
+ module PactBroker
9
+ class FetchPactURIsForVerification
10
+ attr_reader :provider, :consumer_version_selectors, :provider_version_tags, :broker_base_url, :http_client_options, :http_client
11
+
12
+ PACTS_FOR_VERIFICATION_RELATION = 'beta:provider-pacts-for-verification'.freeze
13
+ PACTS = 'pacts'.freeze
14
+ HREF = 'href'.freeze
15
+ LINKS = '_links'.freeze
16
+ SELF = 'self'.freeze
17
+ EMBEDDED = '_embedded'.freeze
18
+
19
+ def initialize(provider, consumer_version_selectors, provider_version_tags, broker_base_url, http_client_options)
20
+ @provider = provider
21
+ @consumer_version_selectors = consumer_version_selectors
22
+ @provider_version_tags = provider_version_tags
23
+ @http_client_options = http_client_options
24
+ @broker_base_url = broker_base_url
25
+ @http_client = Pact::Hal::HttpClient.new(http_client_options)
26
+ end
27
+
28
+ def self.call(provider, consumer_version_selectors, provider_version_tags, broker_base_url, http_client_options)
29
+ new(provider, consumer_version_selectors, provider_version_tags, broker_base_url, http_client_options).call
30
+ end
31
+
32
+ def call
33
+ if index.can?(PACTS_FOR_VERIFICATION_RELATION)
34
+ log_message
35
+ pacts_for_verification
36
+ else
37
+ # Fall back to old method of fetching pacts
38
+ consumer_version_tags = consumer_version_selectors.collect{ | selector | selector[:tag] }
39
+ FetchPacts.call(provider, consumer_version_tags, broker_base_url, http_client_options)
40
+ end
41
+ end
42
+
43
+ private
44
+
45
+ def index
46
+ @index_entity ||= Pact::Hal::Link.new({ "href" => broker_base_url }, http_client).get.assert_success!
47
+ end
48
+
49
+ def pacts_for_verification
50
+ pacts_for_verification_entity.response.body[EMBEDDED][PACTS].collect do | pact |
51
+ metadata = {
52
+ pending: pact["verificationProperties"]["pending"],
53
+ pending_reason: pact["verificationProperties"]["pendingReason"],
54
+ inclusion_reason: pact["verificationProperties"]["inclusionReason"],
55
+ }
56
+ Pact::Provider::PactURI.new(pact[LINKS][SELF][HREF], http_client_options, metadata)
57
+ end
58
+ end
59
+
60
+ def pacts_for_verification_entity
61
+ index
62
+ ._link(PACTS_FOR_VERIFICATION_RELATION)
63
+ .expand(provider: provider)
64
+ .with_query(query)
65
+ .get!
66
+ end
67
+
68
+ def query
69
+ q = {}
70
+ if consumer_version_selectors&.any?
71
+ q["consumer_version_selectors"] = consumer_version_selectors
72
+ end
73
+
74
+ if provider_version_tags&.any?
75
+ q["provider_version_tags"] = provider_version_tags
76
+ end
77
+ q
78
+ end
79
+
80
+ def log_message
81
+ latest = consumer_version_selectors&.any? ? "" : "latest "
82
+ message = "INFO: Fetching #{latest}pacts for #{provider} from #{broker_base_url}"
83
+ if consumer_version_selectors&.any?
84
+ desc = consumer_version_selectors.collect do |selector|
85
+ all_or_latest = selector[:all] ? "all" : "latest"
86
+ # TODO support fallback
87
+ name = selector[:fallback] ? "#{selector[:tag]} (or #{selector[:fallback]} if not found)" : selector[:tag]
88
+ "#{all_or_latest} #{name}"
89
+ end.join(", ")
90
+ message << " for tags: #{desc}"
91
+ end
92
+ Pact.configuration.output_stream.puts message
93
+ end
94
+ end
95
+ end
96
+ end
@@ -1,6 +1,6 @@
1
1
  require 'pact/shared/dsl'
2
2
  require 'pact/provider/world'
3
- require 'pact/pact_broker/fetch_pacts'
3
+ require 'pact/pact_broker/fetch_pact_uris_for_verification'
4
4
  require 'pact/errors'
5
5
 
6
6
  module Pact
@@ -14,10 +14,11 @@ module Pact
14
14
  # in parent scope, it will clash with these ones,
15
15
  # so put an underscore in front of the name to be safer.
16
16
 
17
- attr_accessor :_provider_name, :_pact_broker_base_url, :_consumer_version_tags, :_basic_auth_options, :_verbose
17
+ attr_accessor :_provider_name, :_pact_broker_base_url, :_consumer_version_tags, :_provider_version_tags, :_basic_auth_options, :_verbose
18
18
 
19
- def initialize(provider_name)
19
+ def initialize(provider_name, provider_version_tags)
20
20
  @_provider_name = provider_name
21
+ @_provider_version_tags = provider_version_tags
21
22
  @_consumer_version_tags = []
22
23
  @_verbose = false
23
24
  end
@@ -45,10 +46,27 @@ module Pact
45
46
  private
46
47
 
47
48
  def create_pact_verification
48
- fetch_pacts = Pact::PactBroker::FetchPacts.new(_provider_name, _consumer_version_tags, _pact_broker_base_url, _basic_auth_options.merge(verbose: _verbose))
49
+ fetch_pacts = Pact::PactBroker::FetchPactURIsForVerification.new(
50
+ _provider_name,
51
+ consumer_version_selectors,
52
+ _provider_version_tags,
53
+ _pact_broker_base_url,
54
+ _basic_auth_options.merge(verbose: _verbose)
55
+ )
56
+
49
57
  Pact.provider_world.add_pact_uri_source fetch_pacts
50
58
  end
51
59
 
60
+ def consumer_version_selectors
61
+ # TODO support "all"
62
+ _consumer_version_tags.collect do | tag |
63
+ {
64
+ tag: tag,
65
+ latest: true
66
+ }
67
+ end
68
+ end
69
+
52
70
  def validate
53
71
  raise Pact::Error.new("Please provide a pact_broker_base_url from which to retrieve the pacts") unless _pact_broker_base_url
54
72
  end
@@ -65,7 +65,7 @@ module Pact
65
65
  end
66
66
 
67
67
  def create_pact_verification_from_broker(&block)
68
- PactVerificationFromBroker.build(name, &block)
68
+ PactVerificationFromBroker.build(name, tags, &block)
69
69
  end
70
70
 
71
71
  def finalize
@@ -1,17 +1,19 @@
1
1
  module Pact
2
2
  module Provider
3
3
  class PactURI
4
- attr_reader :uri, :options
4
+ attr_reader :uri, :options, :metadata
5
5
 
6
- def initialize (uri, options={})
6
+ def initialize (uri, options = nil, metadata = nil)
7
7
  @uri = uri
8
- @options = options
8
+ @options = options || {}
9
+ @metadata = metadata || {} # make sure it's not nil if nil is passed in
9
10
  end
10
11
 
11
12
  def == other
12
13
  other.is_a?(PactURI) &&
13
14
  uri == other.uri &&
14
- options == other.options
15
+ options == other.options &&
16
+ metadata == other.metadata
15
17
  end
16
18
 
17
19
  def basic_auth?
@@ -21,11 +21,13 @@ module Pact
21
21
  include ::RSpec::Core::DSL
22
22
 
23
23
  def honour_pactfile pact_uri, pact_json, options
24
- pact_description = options[:ignore_failures] ? "Pending pact" : "pact"
25
- Pact.configuration.output_stream.puts "INFO: Reading #{pact_description} at #{pact_uri}"
26
- Pact.configuration.output_stream.puts "INFO: Filtering interactions by: #{options[:criteria]}" if options[:criteria] && options[:criteria].any?
24
+ Pact.configuration.output_stream.puts "INFO: Reading pact at #{pact_uri}"
25
+ Pact.configuration.output_stream.puts("DEBUG: #{pact_uri.metadata[:inclusion_reason]}") if pact_uri.metadata[:inclusion_reason]
26
+ Pact.configuration.output_stream.puts("DEBUG: #{pact_uri.metadata[:pending_reason]}") if pact_uri.metadata[:pending_reason]
27
+ Pact.configuration.output_stream.puts "DEBUG: Filtering interactions by: #{options[:criteria]}" if options[:criteria] && options[:criteria].any?
27
28
  consumer_contract = Pact::ConsumerContract.from_json(pact_json)
28
- ::RSpec.describe "Verifying a #{pact_description} between #{consumer_contract.consumer.name} and #{consumer_contract.provider.name}", pactfile_uri: pact_uri do
29
+ suffix = pact_uri.metadata[:pending] ? " [PENDING]": ""
30
+ ::RSpec.describe "Verifying a pact between #{consumer_contract.consumer.name} and #{consumer_contract.provider.name}#{suffix}", pactfile_uri: pact_uri do
29
31
  honour_consumer_contract consumer_contract, options.merge(pact_json: pact_json, pact_uri: pact_uri)
30
32
  end
31
33
  end
@@ -74,7 +76,7 @@ module Pact
74
76
  pact_interaction: interaction,
75
77
  pact_interaction_example_description: interaction_description_for_rerun_command(interaction),
76
78
  pact_uri: options[:pact_uri],
77
- pact_ignore_failures: options[:ignore_failures]
79
+ pact_ignore_failures: options[:pact_uri].metadata[:pending]
78
80
  }
79
81
 
80
82
  describe description_for(interaction), metadata do
@@ -1,4 +1,4 @@
1
1
  # Remember to bump pact-provider-proxy when this changes major version
2
2
  module Pact
3
- VERSION = "1.41.2"
3
+ VERSION = "1.42.0"
4
4
  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.41.2
4
+ version: 1.42.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: 2019-09-09 00:00:00.000000000 Z
15
+ date: 2019-09-26 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: randexp
@@ -323,8 +323,8 @@ files:
323
323
  - lib/pact/hal/http_client.rb
324
324
  - lib/pact/hal/link.rb
325
325
  - lib/pact/pact_broker.rb
326
+ - lib/pact/pact_broker/fetch_pact_uris_for_verification.rb
326
327
  - lib/pact/pact_broker/fetch_pacts.rb
327
- - lib/pact/pact_broker/fetch_pending_pacts.rb
328
328
  - lib/pact/project_root.rb
329
329
  - lib/pact/provider.rb
330
330
  - lib/pact/provider/configuration.rb
@@ -1,58 +0,0 @@
1
- require 'pact/hal/entity'
2
- require 'pact/hal/http_client'
3
- require 'pact/provider/pact_uri'
4
- require 'pact/errors'
5
-
6
- module Pact
7
- module PactBroker
8
- class FetchPendingPacts
9
- attr_reader :provider, :tags, :broker_base_url, :http_client_options, :http_client, :index_entity
10
-
11
- PENDING_PROVIDER_RELATION = 'beta:pending-provider-pacts'.freeze
12
- WIP_PROVIDER_RELATION = 'beta:wip-provider-pacts'.freeze # deprecated
13
- PACTS = 'pacts'.freeze
14
- PB_PACTS = 'pb:pacts'.freeze
15
- HREF = 'href'.freeze
16
-
17
- def initialize(provider, broker_base_url, http_client_options)
18
- @provider = provider
19
- @http_client_options = http_client_options
20
- @broker_base_url = broker_base_url
21
- @http_client = Pact::Hal::HttpClient.new(http_client_options)
22
- end
23
-
24
- def self.call(provider, broker_base_url, http_client_options)
25
- new(provider, broker_base_url, http_client_options).call
26
- end
27
-
28
- def call
29
- if index.success?
30
- pending_pacts_for_provider
31
- else
32
- raise Pact::Error.new("Error retrieving #{broker_base_url} status=#{index_entity.response.code} #{index_entity.response.raw_body}")
33
- end
34
- end
35
-
36
- private
37
-
38
- def index
39
- @index_entity ||= Pact::Hal::Link.new({ "href" => broker_base_url }, http_client).get.assert_success!
40
- end
41
-
42
- def pending_pacts_for_provider
43
- link = index_entity._link(WIP_PROVIDER_RELATION, PENDING_PROVIDER_RELATION)
44
- if link
45
- get_pact_urls(link.expand(provider: provider).get)
46
- else
47
- []
48
- end
49
- end
50
-
51
- def get_pact_urls(link_by_provider)
52
- link_by_provider.fetch(PB_PACTS, PACTS).collect do |pact|
53
- Pact::Provider::PactURI.new(pact[HREF], http_client_options)
54
- end
55
- end
56
- end
57
- end
58
- end