pact-support 1.14.2 → 1.15.3
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 +4 -4
- data/CHANGELOG.md +37 -0
- data/lib/pact/consumer_contract/interaction_v2_parser.rb +7 -2
- data/lib/pact/consumer_contract/pact_file.rb +25 -0
- data/lib/pact/consumer_contract/query.rb +98 -0
- data/lib/pact/matching_rules/v3/merge.rb +4 -2
- data/lib/pact/support/version.rb +1 -1
- metadata +17 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 77150437510b8051743d39e09cbcbabbcc26928bd9c2c9a2f4b188685827b944
|
4
|
+
data.tar.gz: a47852ece83bfd36301ce8d4653b148336efe8b3b4c1273190fcfe37f09e8c68
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5368791e27bfba35b35f7ebc2f2a80885612279a25f21fdbc997c0f7ffbe0620021f83997567c666a3f89f19d3b27df427f776833db4998de5529274aed1a9c8
|
7
|
+
data.tar.gz: 3418d9632455cc44dd54c979e2665fb024add6548904ff37552984952141b8041f74d46fdfdc81ce3e458900f2c49a0430838bb429e67e3cee8bf0f9afb10a78
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,40 @@
|
|
1
|
+
<a name="v1.15.3"></a>
|
2
|
+
### v1.15.3 (2020-11-04)
|
3
|
+
|
4
|
+
|
5
|
+
#### Bug Fixes
|
6
|
+
|
7
|
+
* release workflow ([4bdf8d8](/../../commit/4bdf8d8))
|
8
|
+
* not actually a fix, just triggering new release ([74038a5](/../../commit/74038a5))
|
9
|
+
|
10
|
+
|
11
|
+
<a name="v1.15.2"></a>
|
12
|
+
### v1.15.2 (2020-11-04)
|
13
|
+
|
14
|
+
|
15
|
+
#### Bug Fixes
|
16
|
+
|
17
|
+
* parse query string to hash for v2 interactions ([faff17c](/../../commit/faff17c))
|
18
|
+
|
19
|
+
|
20
|
+
<a name="v1.15.0"></a>
|
21
|
+
### v1.15.0 (2020-04-30)
|
22
|
+
|
23
|
+
|
24
|
+
#### Bug Fixes
|
25
|
+
|
26
|
+
* follow first redirect when fetching remote pact artifacts. (#80) ([c1df6dd](/../../commit/c1df6dd))
|
27
|
+
|
28
|
+
|
29
|
+
<a name="v1.14.3"></a>
|
30
|
+
### v1.14.3 (2020-04-06)
|
31
|
+
|
32
|
+
|
33
|
+
#### Bug Fixes
|
34
|
+
|
35
|
+
* do not blow up when there are no matchers ([ac70846](/../../commit/ac70846))
|
36
|
+
|
37
|
+
|
1
38
|
<a name="v1.14.2"></a>
|
2
39
|
### v1.14.2 (2020-03-25)
|
3
40
|
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'pact/consumer_contract/request'
|
2
2
|
require 'pact/consumer_contract/response'
|
3
3
|
require 'pact/consumer_contract/provider_state'
|
4
|
+
require 'pact/consumer_contract/query'
|
4
5
|
require 'pact/symbolize_keys'
|
5
6
|
require 'pact/matching_rules'
|
6
7
|
require 'pact/errors'
|
@@ -15,13 +16,17 @@ module Pact
|
|
15
16
|
response = parse_response(hash['response'], options)
|
16
17
|
provider_states = parse_provider_states(hash['providerState'] || hash['provider_state'])
|
17
18
|
metadata = parse_metadata(hash['metadata'])
|
18
|
-
Interaction.new(symbolize_keys(hash).merge(request: request,
|
19
|
-
response: response,
|
19
|
+
Interaction.new(symbolize_keys(hash).merge(request: request,
|
20
|
+
response: response,
|
20
21
|
provider_states: provider_states,
|
21
22
|
metadata: metadata))
|
22
23
|
end
|
23
24
|
|
24
25
|
def self.parse_request request_hash, options
|
26
|
+
if request_hash['query'].is_a?(String)
|
27
|
+
request_hash = request_hash.dup
|
28
|
+
request_hash['query'] = Pact::Query.parse_string(request_hash['query'])
|
29
|
+
end
|
25
30
|
request_hash = Pact::MatchingRules.merge(request_hash, request_hash['matchingRules'], options)
|
26
31
|
Pact::Request::Expected.from_hash(request_hash)
|
27
32
|
end
|
@@ -79,12 +79,37 @@ module Pact
|
|
79
79
|
|
80
80
|
def get_remote(uri, options)
|
81
81
|
request = Net::HTTP::Get.new(uri)
|
82
|
+
request = prepare_auth(request, options) if options[:username] || options[:token]
|
83
|
+
|
84
|
+
http = prepare_request(uri)
|
85
|
+
response = perform_http_request(http, request, options)
|
86
|
+
|
87
|
+
if response.is_a?(Net::HTTPRedirection)
|
88
|
+
uri = URI(response.header['location'])
|
89
|
+
req = Net::HTTP::Get.new(uri)
|
90
|
+
req = prepare_auth(req, options) if options[:username] || options[:token]
|
91
|
+
|
92
|
+
http = prepare_request(uri)
|
93
|
+
response = perform_http_request(http, req, options)
|
94
|
+
end
|
95
|
+
response
|
96
|
+
end
|
97
|
+
|
98
|
+
def prepare_auth(request, options)
|
82
99
|
request.basic_auth(options[:username], options[:password]) if options[:username]
|
83
100
|
request['Authorization'] = "Bearer #{options[:token]}" if options[:token]
|
101
|
+
request
|
102
|
+
end
|
103
|
+
|
104
|
+
def prepare_request(uri)
|
84
105
|
http = Net::HTTP.new(uri.host, uri.port, :ENV)
|
85
106
|
http.use_ssl = (uri.scheme == 'https')
|
86
107
|
http.ca_file = ENV['SSL_CERT_FILE'] if ENV['SSL_CERT_FILE'] && ENV['SSL_CERT_FILE'] != ''
|
87
108
|
http.ca_path = ENV['SSL_CERT_DIR'] if ENV['SSL_CERT_DIR'] && ENV['SSL_CERT_DIR'] != ''
|
109
|
+
http
|
110
|
+
end
|
111
|
+
|
112
|
+
def perform_http_request(http, request, options)
|
88
113
|
http.start do |http|
|
89
114
|
http.open_timeout = options[:open_timeout] || OPEN_TIMEOUT
|
90
115
|
http.read_timeout = options[:read_timeout] || READ_TIMEOUT
|
@@ -3,6 +3,9 @@ require 'pact/consumer_contract/query_string'
|
|
3
3
|
|
4
4
|
module Pact
|
5
5
|
class Query
|
6
|
+
DEFAULT_SEP = /[&;] */n
|
7
|
+
COMMON_SEP = { ";" => /[;] */n, ";," => /[;,] */n, "&" => /[&] */n }
|
8
|
+
|
6
9
|
def self.create query
|
7
10
|
if query.is_a? Hash
|
8
11
|
Pact::QueryHash.new(query)
|
@@ -10,5 +13,100 @@ module Pact
|
|
10
13
|
Pact::QueryString.new(query)
|
11
14
|
end
|
12
15
|
end
|
16
|
+
|
17
|
+
def self.parse_string query_string
|
18
|
+
parsed_query = parse_query(query_string)
|
19
|
+
|
20
|
+
# If Rails nested params...
|
21
|
+
if parsed_query.keys.any?{ | key| key.include?("[") }
|
22
|
+
parse_nested_query(query_string)
|
23
|
+
else
|
24
|
+
parsed_query.each_with_object({}) do | (key, value), new_hash |
|
25
|
+
new_hash[key] = [*value]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Ripped from Rack to avoid adding an unnecessary dependency, thank you Rack
|
31
|
+
# https://github.com/rack/rack/blob/649c72bab9e7b50d657b5b432d0c205c95c2be07/lib/rack/utils.rb
|
32
|
+
def self.parse_query(qs, d = nil, &unescaper)
|
33
|
+
unescaper ||= method(:unescape)
|
34
|
+
|
35
|
+
params = {}
|
36
|
+
|
37
|
+
(qs || '').split(d ? (COMMON_SEP[d] || /[#{d}] */n) : DEFAULT_SEP).each do |p|
|
38
|
+
next if p.empty?
|
39
|
+
k, v = p.split('=', 2).map!(&unescaper)
|
40
|
+
|
41
|
+
if cur = params[k]
|
42
|
+
if cur.class == Array
|
43
|
+
params[k] << v
|
44
|
+
else
|
45
|
+
params[k] = [cur, v]
|
46
|
+
end
|
47
|
+
else
|
48
|
+
params[k] = v
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
return params.to_h
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.parse_nested_query(qs, d = nil)
|
56
|
+
params = {}
|
57
|
+
|
58
|
+
unless qs.nil? || qs.empty?
|
59
|
+
(qs || '').split(d ? (COMMON_SEP[d] || /[#{d}] */n) : DEFAULT_SEP).each do |p|
|
60
|
+
k, v = p.split('=', 2).map! { |s| unescape(s) }
|
61
|
+
|
62
|
+
normalize_params(params, k, v)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
return params.to_h
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.normalize_params(params, name, v)
|
70
|
+
name =~ %r(\A[\[\]]*([^\[\]]+)\]*)
|
71
|
+
k = $1 || ''
|
72
|
+
after = $' || ''
|
73
|
+
|
74
|
+
if k.empty?
|
75
|
+
if !v.nil? && name == "[]"
|
76
|
+
return Array(v)
|
77
|
+
else
|
78
|
+
return
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
if after == ''
|
83
|
+
params[k] = v
|
84
|
+
elsif after == "["
|
85
|
+
params[name] = v
|
86
|
+
elsif after == "[]"
|
87
|
+
params[k] ||= []
|
88
|
+
raise ParameterTypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array)
|
89
|
+
params[k] << v
|
90
|
+
elsif after =~ %r(^\[\]\[([^\[\]]+)\]$) || after =~ %r(^\[\](.+)$)
|
91
|
+
child_key = $1
|
92
|
+
params[k] ||= []
|
93
|
+
raise ParameterTypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array)
|
94
|
+
if params_hash_type?(params[k].last) && !params_hash_has_key?(params[k].last, child_key)
|
95
|
+
normalize_params(params[k].last, child_key, v)
|
96
|
+
else
|
97
|
+
params[k] << normalize_params({}, child_key, v)
|
98
|
+
end
|
99
|
+
else
|
100
|
+
params[k] ||= {}
|
101
|
+
raise ParameterTypeError, "expected Hash (got #{params[k].class.name}) for param `#{k}'" unless params_hash_type?(params[k])
|
102
|
+
params[k] = normalize_params(params[k], after, v, depth - 1)
|
103
|
+
end
|
104
|
+
|
105
|
+
params
|
106
|
+
end
|
107
|
+
|
108
|
+
def self.unescape(s, encoding = Encoding::UTF_8)
|
109
|
+
URI.decode_www_form_component(s, encoding)
|
110
|
+
end
|
13
111
|
end
|
14
112
|
end
|
@@ -108,8 +108,10 @@ module Pact
|
|
108
108
|
def log_ignored_rules
|
109
109
|
@matching_rules.each do | jsonpath, rules_hash |
|
110
110
|
rules_array = rules_hash["matchers"]
|
111
|
-
|
112
|
-
rules_array.
|
111
|
+
if rules_array
|
112
|
+
((rules_array.length - 1)..0).each do | index |
|
113
|
+
rules_array.delete_at(index) if rules_array[index].empty?
|
114
|
+
end
|
113
115
|
end
|
114
116
|
end
|
115
117
|
|
data/lib/pact/support/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pact-support
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.15.3
|
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-
|
15
|
+
date: 2020-11-04 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: randexp
|
@@ -70,6 +70,20 @@ dependencies:
|
|
70
70
|
- - "~>"
|
71
71
|
- !ruby/object:Gem::Version
|
72
72
|
version: '1.1'
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: diff-lcs
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '1.4'
|
80
|
+
type: :runtime
|
81
|
+
prerelease: false
|
82
|
+
version_requirements: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - "~>"
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '1.4'
|
73
87
|
- !ruby/object:Gem::Dependency
|
74
88
|
name: rake
|
75
89
|
requirement: !ruby/object:Gem::Requirement
|
@@ -298,8 +312,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
298
312
|
- !ruby/object:Gem::Version
|
299
313
|
version: '0'
|
300
314
|
requirements: []
|
301
|
-
|
302
|
-
rubygems_version: 2.7.6
|
315
|
+
rubygems_version: 3.1.4
|
303
316
|
signing_key:
|
304
317
|
specification_version: 4
|
305
318
|
summary: Shared code for Pact gems
|