pact 1.58.0 → 1.62.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: c0eccb0bdb60c799b434febc79b825448330f476eb1fd9041d85067b73afa12f
4
- data.tar.gz: 552f9f3e11377b6bc4ebb0cb5a30ee5f95f5689ac7dcf0b74a59ec7688eaafac
3
+ metadata.gz: 7b4004f1a6eed7b4222d8f6f4bd72eb568c75fd198ab77ee663b6aab918ea907
4
+ data.tar.gz: f6cc541f1416275a0cea5b0819d20f58e6b27d8ca10e8f708b0d44d382b88461
5
5
  SHA512:
6
- metadata.gz: ef8d1d0f38c7370d36c1643592b82f45415e18065fb1ae3cc07f63f6eb20c082c80376995e3c0388b1bd85e432ada99bc13b4c2024d66ea1f1d2a511a6efa298
7
- data.tar.gz: bb42f0d27a63304df146884e152f60f8628c673db09d52c6ff979a2c1508973522cf4f09bb7cb87dea0c2139ca500c745038a0f4702b1f38e67cae6838a68292
6
+ metadata.gz: 31ce201c07203749e19cb6ca6d1088ef69f1119686119519ab5e15faddda38f80f2846b782efb2e7cb4c3e26bb9df529e45fcc1350df2be63819fbfde50c54e5
7
+ data.tar.gz: 3fa2538f3f8472759eafcd12b8ef829141f343e5cdab8c83ba27bd4f4f1ca0eee1e960fb2467333b17da30a29c8bc849427178c5dc7566e2c94d948cd109a96e
data/CHANGELOG.md CHANGED
@@ -1,3 +1,35 @@
1
+ <a name="v1.62.0"></a>
2
+ ### v1.62.0 (2022-02-21)
3
+
4
+ #### Features
5
+
6
+ * add telemetry (#256) ([4497ee9](/../../commit/4497ee9))
7
+
8
+ <a name="v1.61.0"></a>
9
+ ### v1.61.0 (2021-12-16)
10
+
11
+ #### Features
12
+
13
+ * support description of matching_branch and matching_tag consumer version selectors ([8e8bb22](/../../commit/8e8bb22))
14
+
15
+ #### Bug Fixes
16
+
17
+ * pass through includePendingStatus to the 'pacts for verification' API when it is false ([f0e37a4](/../../commit/f0e37a4))
18
+
19
+ <a name="v1.60.0"></a>
20
+ ### v1.60.0 (2021-10-01)
21
+
22
+ #### Features
23
+
24
+ * allow SSL verification to be disabled in the HAL client by setting the environment variable PACT_DISABLE_SSL_VERIFICATION=true ([ce07d32](/../../commit/ce07d32))
25
+
26
+ <a name="v1.59.0"></a>
27
+ ### v1.59.0 (2021-09-07)
28
+
29
+ #### Features
30
+
31
+ * update descriptions for new consumer version selectors ([0471397](/../../commit/0471397))
32
+
1
33
  <a name="v1.58.0"></a>
2
34
  ### v1.58.0 (2021-09-01)
3
35
 
@@ -2,6 +2,7 @@ require 'pact/retry'
2
2
  require 'pact/hal/authorization_header_redactor'
3
3
  require 'net/http'
4
4
  require 'rack'
5
+ require 'openssl'
5
6
 
6
7
  module Pact
7
8
  module Hal
@@ -48,10 +49,16 @@ module Pact
48
49
  def perform_request request, uri
49
50
  response = Retry.until_true do
50
51
  http = Net::HTTP.new(uri.host, uri.port, :ENV)
51
- http.set_debug_output(output_stream) if verbose || ENV['VERBOSE'] == 'true'
52
+ http.set_debug_output(output_stream) if verbose?
52
53
  http.use_ssl = (uri.scheme == 'https')
53
54
  http.ca_file = ENV['SSL_CERT_FILE'] if ENV['SSL_CERT_FILE'] && ENV['SSL_CERT_FILE'] != ''
54
55
  http.ca_path = ENV['SSL_CERT_DIR'] if ENV['SSL_CERT_DIR'] && ENV['SSL_CERT_DIR'] != ''
56
+ if disable_ssl_verification?
57
+ if verbose?
58
+ Pact.configuration.output_stream.puts("SSL verification is disabled")
59
+ end
60
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
61
+ end
55
62
  http.start do |http|
56
63
  http.request request
57
64
  end
@@ -63,6 +70,14 @@ module Pact
63
70
  AuthorizationHeaderRedactor.new(Pact.configuration.output_stream)
64
71
  end
65
72
 
73
+ def verbose?
74
+ verbose || ENV['VERBOSE'] == 'true'
75
+ end
76
+
77
+ def disable_ssl_verification?
78
+ ENV['PACT_DISABLE_SSL_VERIFICATION'] == 'true' || ENV['PACT_BROKER_DISABLE_SSL_VERIFICATION'] == 'true'
79
+ end
80
+
66
81
  class Response < SimpleDelegator
67
82
  def body
68
83
  bod = raw_body
@@ -0,0 +1,17 @@
1
+ module Pact
2
+ module HashRefinements
3
+ refine Hash do
4
+ def compact
5
+ h = {}
6
+ each do |key, value|
7
+ h[key] = value unless value == nil
8
+ end
9
+ h
10
+ end unless Hash.method_defined? :compact
11
+
12
+ def compact!
13
+ reject! {|_key, value| value == nil}
14
+ end unless Hash.method_defined? :compact!
15
+ end
16
+ end
17
+ end
@@ -5,10 +5,13 @@ require 'pact/errors'
5
5
  require 'pact/pact_broker/fetch_pacts'
6
6
  require 'pact/pact_broker/notices'
7
7
  require 'pact/pact_broker/pact_selection_description'
8
+ require "pact/hash_refinements"
8
9
 
9
10
  module Pact
10
11
  module PactBroker
11
12
  class FetchPactURIsForVerification
13
+ using Pact::HashRefinements
14
+
12
15
  include PactSelectionDescription
13
16
  attr_reader :provider, :consumer_version_selectors, :provider_version_branch, :provider_version_tags, :broker_base_url, :http_client_options, :http_client, :options
14
17
 
@@ -74,12 +77,12 @@ module Pact
74
77
 
75
78
  def query
76
79
  q = {}
77
- q["includePendingStatus"] = true if options[:include_pending_status]
80
+ q["includePendingStatus"] = options[:include_pending_status]
78
81
  q["consumerVersionSelectors"] = consumer_version_selectors if consumer_version_selectors.any?
79
82
  q["providerVersionTags"] = provider_version_tags if provider_version_tags.any?
80
- q["providerVersionBranch"] = provider_version_branch if provider_version_branch
81
- q["includeWipPactsSince"] = options[:include_wip_pacts_since] if options[:include_wip_pacts_since]
82
- q
83
+ q["providerVersionBranch"] = provider_version_branch
84
+ q["includeWipPactsSince"] = options[:include_wip_pacts_since]
85
+ q.compact
83
86
  end
84
87
 
85
88
  def extract_notices(pact)
@@ -5,11 +5,54 @@ module Pact
5
5
  message = "Fetching pacts for #{provider} from #{broker_base_url} with the selection criteria: "
6
6
  if consumer_version_selectors.any?
7
7
  desc = consumer_version_selectors.collect do |selector|
8
- all_or_latest = !selector[:latest] ? "all for tag" : "latest for tag"
9
- consumer = selector[:consumer] ? "of consumer #{selector[:consumer]}" : nil
8
+ desc = nil
9
+ if selector[:tag]
10
+ desc = !selector[:latest] ? "all for tag #{selector[:tag]}" : "latest for tag #{selector[:tag]}"
11
+ desc = "#{desc} of #{selector[:consumer]}" if selector[:consumer]
12
+ elsif selector[:branch]
13
+ desc = "latest from branch #{selector[:branch]}"
14
+ desc = "#{desc} of #{selector[:consumer]}" if selector[:consumer]
15
+ elsif selector[:mainBranch]
16
+ desc = "latest from main branch"
17
+ desc = "#{desc} of #{selector[:consumer]}" if selector[:consumer]
18
+ elsif selector[:deployed]
19
+ if selector[:environment]
20
+ desc = "currently deployed to #{selector[:environment]}"
21
+ else
22
+ desc = "currently deployed"
23
+ end
24
+ desc = "#{selector[:consumer]} #{desc}" if selector[:consumer]
25
+ elsif selector[:released]
26
+ if selector[:environment]
27
+ desc = "currently released to #{selector[:environment]}"
28
+ else
29
+ desc = "currently released"
30
+ end
31
+ desc = "#{selector[:consumer]} #{desc}" if selector[:consumer]
32
+ elsif selector[:deployedOrReleased]
33
+ if selector[:environment]
34
+ desc = "currently deployed or released to #{selector[:environment]}"
35
+ else
36
+ desc = "currently deployed or released"
37
+ end
38
+ desc = "#{selector[:consumer]} #{desc}" if selector[:consumer]
39
+ elsif selector[:environment]
40
+ desc = "currently in #{selector[:environment]}"
41
+ desc = "#{selector[:consumer]} #{desc}" if selector[:consumer]
42
+ elsif selector[:matchingBranch]
43
+ desc = "matching current branch"
44
+ desc = "#{desc} for #{selector[:consumer]}" if selector[:consumer]
45
+ elsif selector[:matchingTag]
46
+ desc = "matching tag"
47
+ desc = "#{desc} for #{selector[:consumer]}" if selector[:consumer]
48
+ else
49
+ desc = selector.to_s
50
+ end
51
+
10
52
  fallback = selector[:fallback] || selector[:fallbackTag]
11
- name = fallback ? "#{selector[:tag]} (or #{fallback} if not found)" : selector[:tag]
12
- [all_or_latest, name, consumer].compact.join(" ")
53
+ desc = "#{desc} (or #{fallback} if not found)" if fallback
54
+
55
+ desc
13
56
  end.join(", ")
14
57
  if options[:include_wip_pacts_since]
15
58
  desc = "#{desc}, work in progress pacts created after #{options[:include_wip_pacts_since]}"
@@ -12,6 +12,7 @@ require 'pact/provider/rspec/pact_broker_formatter'
12
12
  require 'pact/provider/rspec/json_formatter'
13
13
  require 'pact/provider/rspec'
14
14
  require 'pact/provider/rspec/calculate_exit_code'
15
+ require 'pact/utils/metrics'
15
16
 
16
17
  module Pact
17
18
  module Provider
@@ -130,6 +131,8 @@ module Pact
130
131
  ignore_failures: options[:ignore_failures],
131
132
  request_customizer: options[:request_customizer]
132
133
  }
134
+ Pact::Utils::Metrics.report_metric("Pacts verified", "ProviderTest", "Completed")
135
+
133
136
  honour_pactfile pact_source, ordered_pact_json(pact_source.pact_json), spec_options
134
137
  end
135
138
  end
@@ -0,0 +1,85 @@
1
+ require 'securerandom'
2
+ require 'digest'
3
+ require 'socket'
4
+ require 'pact/version'
5
+ require 'net/http'
6
+
7
+ module Pact
8
+ module Utils
9
+ class Metrics
10
+
11
+ def self.report_metric(event, category, action, value = 1)
12
+ in_thread do
13
+ begin
14
+ if track_events?
15
+ Pact.configuration.output_stream.puts "WARN: Please note: we are tracking events anonymously to gather important usage statistics like Pact-Ruby version
16
+ and operating system. To disable tracking, set the 'PACT_DO_NOT_TRACK' environment
17
+ variable to 'true'."
18
+
19
+ uri = URI('https://www.google-analytics.com/collect')
20
+ req = Net::HTTP::Post.new(uri)
21
+ req.set_form_data(create_tracking_event(event, category, action, value))
22
+
23
+ Net::HTTP.start(uri.hostname, uri.port, read_timeout:2, open_timeout:2, :use_ssl => true ) do |http|
24
+ http.request(req)
25
+ end
26
+ end
27
+ rescue StandardError => e
28
+ handle_error(e)
29
+ end
30
+ end
31
+ end
32
+
33
+ private
34
+ def self.handle_error e
35
+ if ENV['PACT_METRICS_DEBUG'] == 'true'
36
+ Pact.configuration.output_stream.puts("DEBUG: #{e.inspect}\n" + e.backtrace.join("\n"))
37
+ end
38
+ end
39
+
40
+ def self.in_thread
41
+ Thread.new do
42
+ yield
43
+ end
44
+ end
45
+
46
+ def self.create_tracking_event(event, category, action, value)
47
+ {
48
+ "v" => 1,
49
+ "t" => "event",
50
+ "tid" => "UA-117778936-1",
51
+ "cid" => calculate_cid,
52
+ "an" => "Pact Ruby",
53
+ "av" => Pact::VERSION,
54
+ "aid" => "pact-ruby",
55
+ "aip" => 1,
56
+ "ds" => ENV['PACT_EXECUTING_LANGUAGE'] ? "client" : "cli",
57
+ "cd2" => ENV['CI'] == "true" ? "CI" : "unknown",
58
+ "cd3" => RUBY_PLATFORM,
59
+ "cd6" => ENV['PACT_EXECUTING_LANGUAGE'] || "unknown",
60
+ "cd7" => ENV['PACT_EXECUTING_LANGUAGE_VERSION'],
61
+ "el" => event,
62
+ "ec" => category,
63
+ "ea" => action,
64
+ "ev" => value
65
+ }
66
+ end
67
+
68
+ def self.track_events?
69
+ ENV['PACT_DO_NOT_TRACK'] != 'true'
70
+ end
71
+
72
+ def self.calculate_cid
73
+ if RUBY_PLATFORM.include? "windows"
74
+ hostname = ENV['COMPUTERNAME']
75
+ else
76
+ hostname = ENV['HOSTNAME']
77
+ end
78
+ if !hostname
79
+ hostname = Socket.gethostname
80
+ end
81
+ Digest::MD5.hexdigest hostname || SecureRandom.urlsafe_base64(5)
82
+ end
83
+ end
84
+ end
85
+ end
data/lib/pact/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # Remember to bump pact-provider-proxy when this changes major version
2
2
  module Pact
3
- VERSION = "1.58.0"
3
+ VERSION = "1.62.0"
4
4
  end
data/pact.gemspec CHANGED
@@ -32,7 +32,7 @@ Gem::Specification.new do |gem|
32
32
  gem.add_runtime_dependency 'webrick', '~> 1.3'
33
33
  gem.add_runtime_dependency 'term-ansicolor', '~> 1.0'
34
34
 
35
- gem.add_runtime_dependency 'pact-support', '~> 1.15'
35
+ gem.add_runtime_dependency 'pact-support', '~> 1.16', '>= 1.16.9'
36
36
  gem.add_runtime_dependency 'pact-mock_service', '~> 3.0', '>= 3.3.1'
37
37
 
38
38
  gem.add_development_dependency 'rake', '~> 13.0'
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.58.0
4
+ version: 1.62.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Fraser
@@ -9,10 +9,10 @@ authors:
9
9
  - Brent Snook
10
10
  - Ronald Holshausen
11
11
  - Beth Skurrie
12
- autorequire:
12
+ autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2021-09-07 00:00:00.000000000 Z
15
+ date: 2022-02-21 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: rspec
@@ -102,14 +102,20 @@ dependencies:
102
102
  requirements:
103
103
  - - "~>"
104
104
  - !ruby/object:Gem::Version
105
- version: '1.15'
105
+ version: '1.16'
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: 1.16.9
106
109
  type: :runtime
107
110
  prerelease: false
108
111
  version_requirements: !ruby/object:Gem::Requirement
109
112
  requirements:
110
113
  - - "~>"
111
114
  - !ruby/object:Gem::Version
112
- version: '1.15'
115
+ version: '1.16'
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: 1.16.9
113
119
  - !ruby/object:Gem::Dependency
114
120
  name: pact-mock_service
115
121
  requirement: !ruby/object:Gem::Requirement
@@ -321,6 +327,7 @@ files:
321
327
  - lib/pact/hal/http_client.rb
322
328
  - lib/pact/hal/link.rb
323
329
  - lib/pact/hal/non_json_entity.rb
330
+ - lib/pact/hash_refinements.rb
324
331
  - lib/pact/pact_broker.rb
325
332
  - lib/pact/pact_broker/fetch_pact_uris_for_verification.rb
326
333
  - lib/pact/pact_broker/fetch_pacts.rb
@@ -378,6 +385,7 @@ files:
378
385
  - lib/pact/tasks/verification_task.rb
379
386
  - lib/pact/templates/help.erb
380
387
  - lib/pact/templates/provider_state.erb
388
+ - lib/pact/utils/metrics.rb
381
389
  - lib/pact/utils/string.rb
382
390
  - lib/pact/version.rb
383
391
  - lib/tasks/pact.rake
@@ -390,7 +398,7 @@ metadata:
390
398
  source_code_uri: https://github.com/pact-foundation/pact-ruby
391
399
  bug_tracker_uri: https://github.com/pact-foundation/pact-ruby/issues
392
400
  documentation_uri: https://github.com/pact-foundation/pact-ruby/blob/master/README.md
393
- post_install_message:
401
+ post_install_message:
394
402
  rdoc_options: []
395
403
  require_paths:
396
404
  - lib
@@ -405,8 +413,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
405
413
  - !ruby/object:Gem::Version
406
414
  version: '0'
407
415
  requirements: []
408
- rubygems_version: 3.2.27
409
- signing_key:
416
+ rubygems_version: 3.3.7
417
+ signing_key:
410
418
  specification_version: 4
411
419
  summary: Enables consumer driven contract testing, providing a mock service and DSL
412
420
  for the consumer project, and interaction playback and verification for the service