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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9b677a19e1ff31dc6603b612bb0e43df4f5a3f6d7922c8ea1fe6515898915f6c
4
- data.tar.gz: f81ebbdc2ec57af625f095492ae60b1bf471cce4e0543d48349e0f031e6a5282
3
+ metadata.gz: 013c48242b5599c0523e3a0628008cad711662fc96cf40271d5a1f28ae27fe33
4
+ data.tar.gz: 734a79394ff2baef976fcc0f3ad21907f994892c6dbba7a888d26f37332fdcb2
5
5
  SHA512:
6
- metadata.gz: 2911a8d750ee6aa10285a7350dea230de47071f497c581aa4eb10302affcc8ab4e8b5771d7896d083ed46b8010737b39ecdbbfdaf0a408fef21f3fb6f4c03c92
7
- data.tar.gz: 2d6c453ee8b51686b669e39e1fb138655a99ec6020313b72cd03e35eebbcbbcf80deabb1046808804db52c03ae565e9e6250adadb069b9e656d2fba1dd2dc3aa
6
+ metadata.gz: e065e5f99495d3e5acd90fa10807b3ed33138669ea120e0709b2fce1169b53085fa81ad2751120f21befaad1a89bb1295d3a1837465ac1eebf5c2dc6f8a9bad1
7
+ data.tar.gz: 36054ddc380804d4b94b18829ec6859a595b82f14ccae0de78e5d5f842aa266af04c78782677b1d8a9a52f37a72e1168e203bfaac28d53e2ad8acaa79c90cadd
@@ -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
- expected_array = expected_size.times.collect{ Pact::Term.unpack_regexps(array_like.contents) }
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
- ((rules_array.length - 1)..0).each do | index |
112
- rules_array.delete_at(index) if rules_array[index].empty?
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
 
@@ -1,5 +1,5 @@
1
1
  module Pact
2
2
  module Support
3
- VERSION = "1.14.1"
3
+ VERSION = "1.15.2"
4
4
  end
5
5
  end
@@ -80,6 +80,5 @@ module Pact
80
80
  destination[key] = unpack_regexps source[key]
81
81
  end
82
82
  end
83
-
84
83
  end
85
84
  end
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.14.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-02-27 00:00:00.000000000 Z
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
- rubyforge_project:
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