pact-support 1.14.1 → 1.15.2
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 +36 -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/matchers/matchers.rb +5 -1
- data/lib/pact/matching_rules/v3/merge.rb +4 -2
- data/lib/pact/support/version.rb +1 -1
- data/lib/pact/term.rb +0 -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: 013c48242b5599c0523e3a0628008cad711662fc96cf40271d5a1f28ae27fe33
|
4
|
+
data.tar.gz: 734a79394ff2baef976fcc0f3ad21907f994892c6dbba7a888d26f37332fdcb2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e065e5f99495d3e5acd90fa10807b3ed33138669ea120e0709b2fce1169b53085fa81ad2751120f21befaad1a89bb1295d3a1837465ac1eebf5c2dc6f8a9bad1
|
7
|
+
data.tar.gz: 36054ddc380804d4b94b18829ec6859a595b82f14ccae0de78e5d5f842aa266af04c78782677b1d8a9a52f37a72e1168e203bfaac28d53e2ad8acaa79c90cadd
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,39 @@
|
|
1
|
+
<a name="v1.15.2"></a>
|
2
|
+
### v1.15.2 (2020-11-04)
|
3
|
+
|
4
|
+
|
5
|
+
#### Bug Fixes
|
6
|
+
|
7
|
+
* parse query string to hash for v2 interactions ([faff17c](/../../commit/faff17c))
|
8
|
+
|
9
|
+
|
10
|
+
<a name="v1.15.0"></a>
|
11
|
+
### v1.15.0 (2020-04-30)
|
12
|
+
|
13
|
+
|
14
|
+
#### Bug Fixes
|
15
|
+
|
16
|
+
* follow first redirect when fetching remote pact artifacts. (#80) ([c1df6dd](/../../commit/c1df6dd))
|
17
|
+
|
18
|
+
|
19
|
+
<a name="v1.14.3"></a>
|
20
|
+
### v1.14.3 (2020-04-06)
|
21
|
+
|
22
|
+
|
23
|
+
#### Bug Fixes
|
24
|
+
|
25
|
+
* do not blow up when there are no matchers ([ac70846](/../../commit/ac70846))
|
26
|
+
|
27
|
+
|
28
|
+
<a name="v1.14.2"></a>
|
29
|
+
### v1.14.2 (2020-03-25)
|
30
|
+
|
31
|
+
|
32
|
+
#### Bug Fixes
|
33
|
+
|
34
|
+
* don't blow up when there is a term inside an each like ([a565a56](/../../commit/a565a56))
|
35
|
+
|
36
|
+
|
1
37
|
<a name="v1.14.1"></a>
|
2
38
|
### v1.14.1 (2020-02-27)
|
3
39
|
|
@@ -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
|
@@ -120,7 +120,11 @@ module Pact
|
|
120
120
|
def array_like_diff array_like, actual, options
|
121
121
|
if actual.is_a? Array
|
122
122
|
expected_size = [array_like.min, actual.size].max
|
123
|
-
|
123
|
+
# I know changing this is going to break something, but I don't know what it is, as there's no
|
124
|
+
# test that fails when I make this change. I know the unpack regexps was there for a reason however.
|
125
|
+
# Guess we'll have to change it and see!
|
126
|
+
# expected_array = expected_size.times.collect{ Pact::Term.unpack_regexps(array_like.contents) }
|
127
|
+
expected_array = expected_size.times.collect{ array_like.contents }
|
124
128
|
actual_array_diff expected_array, actual, options.merge(:type => true)
|
125
129
|
else
|
126
130
|
Difference.new array_like.generate, actual, type_difference_message(array_like.generate, actual)
|
@@ -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
data/lib/pact/term.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.2
|
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-03 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
|