pact-support 1.15.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: 7ccc117840bc0955cb8ffa7568bab96b94ec5d7d51b6bd5233a05b251373e221
4
- data.tar.gz: 66218c13f81e23f76facec82ef95f64038376f3368ae02aa3ce16008288f35fe
3
+ metadata.gz: 013c48242b5599c0523e3a0628008cad711662fc96cf40271d5a1f28ae27fe33
4
+ data.tar.gz: 734a79394ff2baef976fcc0f3ad21907f994892c6dbba7a888d26f37332fdcb2
5
5
  SHA512:
6
- metadata.gz: 4e16a0adf65d235937a123a5a1ee0043ded52ba0e4a2541f6b3a7a0e5e208a681cb405baee555b23c66d46a75dcb388999d1f424b0c7bb9c8055839cbf72f9ac
7
- data.tar.gz: 0dc8fef0d02eaeb5976395c4a0eb33bdc01ac0ba954dad0eab3a7bc8b24d31625224e28c048d31b551ff1bc15a39ba41bd0f275a80f8d578f9077f0193fdfcb0
6
+ metadata.gz: e065e5f99495d3e5acd90fa10807b3ed33138669ea120e0709b2fce1169b53085fa81ad2751120f21befaad1a89bb1295d3a1837465ac1eebf5c2dc6f8a9bad1
7
+ data.tar.gz: 36054ddc380804d4b94b18829ec6859a595b82f14ccae0de78e5d5f842aa266af04c78782677b1d8a9a52f37a72e1168e203bfaac28d53e2ad8acaa79c90cadd
@@ -1,3 +1,12 @@
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
+
1
10
  <a name="v1.15.0"></a>
2
11
  ### v1.15.0 (2020-04-30)
3
12
 
@@ -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
@@ -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
@@ -1,5 +1,5 @@
1
1
  module Pact
2
2
  module Support
3
- VERSION = "1.15.1"
3
+ VERSION = "1.15.2"
4
4
  end
5
5
  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.15.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-07-16 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