pact-support 1.5.2 → 1.6.0

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
  SHA1:
3
- metadata.gz: 1b7354b72c73b6c34cd5555a473697b314f612a1
4
- data.tar.gz: 26e964d3881d4c65f2c2a6f44b10fb58cba2239b
3
+ metadata.gz: 9f9bc0e7a4c308bb14cf0e1eb4c86fa4aedc1092
4
+ data.tar.gz: d95f4eaf140fadf63bcd3fa8aeda797720b2cfb9
5
5
  SHA512:
6
- metadata.gz: b02995ae45c88bd74314b533b2ed59a57b6047c726455b9a3e541974d5c58ca88d9d9af8450dc545b03895aaf9dd360668462ab44a7a1873b3395dcfbfac7af8
7
- data.tar.gz: 9bc59de6ae1cc48434e872c5148723ed43c84dd2a92c11621a8f6ebbdc2bd6620eec4628ac5cccfe69295cc2bca777b00b22e3f32444a86580c7a0323b2db741
6
+ metadata.gz: b6bb681918c1f7967c58f44467e69f871307d54c16e318f79f6c6f615593fdeec240b75b379887a3e193c9f6c78616b52b2eeae01e6cd74e172ec82ad4322363
7
+ data.tar.gz: ec0c51ec2b5c13a453d6cca32d5784fc88421e1e65bc517e3822f000852e3bf153a4c38bfa81007852e80a82e7047e5112162441afa0519fa8741e6db5370f1a
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ <a name="v1.6.0"></a>
2
+ ### v1.6.0 (2018-04-03)
3
+
4
+
5
+ #### Features
6
+
7
+ * add support for writing v3 matching rules ([fc89696](/../../commit/fc89696))
8
+
9
+
1
10
  <a name="v1.5.2"></a>
2
11
  ### v1.5.2 (2018-03-23)
3
12
 
@@ -1,4 +1,5 @@
1
1
  require 'pact/matching_rules/extract'
2
+ require 'pact/matching_rules/v3/extract'
2
3
  require 'pact/matching_rules/merge'
3
4
  require 'pact/matching_rules/v3/merge'
4
5
 
@@ -7,11 +8,18 @@ module Pact
7
8
 
8
9
  # @api public Used by pact-mock_service
9
10
  def self.extract object_graph, options = {}
10
- Extract.(object_graph)
11
+ pact_specification_version = options[:pact_specification_version] || Pact::SpecificationVersion::NIL_VERSION
12
+ case pact_specification_version.major
13
+ when nil, 0, 1, 2
14
+ Extract.(object_graph)
15
+ else
16
+ V3::Extract.(object_graph)
17
+ end
11
18
  end
12
19
 
13
20
  def self.merge object_graph, matching_rules, options = {}
14
- case options[:pact_specification_version].major
21
+ pact_specification_version = options[:pact_specification_version] || Pact::SpecificationVersion::NIL_VERSION
22
+ case pact_specification_version.major
15
23
  when nil, 0, 1, 2
16
24
  Merge.(object_graph, matching_rules)
17
25
  else
@@ -0,0 +1,94 @@
1
+ require 'pact/something_like'
2
+ require 'pact/array_like'
3
+ require 'pact/term'
4
+
5
+ module Pact
6
+ module MatchingRules::V3
7
+ class Extract
8
+
9
+ def self.call matchable
10
+ new(matchable).call
11
+ end
12
+
13
+ def initialize matchable
14
+ @matchable = matchable
15
+ @rules = Hash.new
16
+ end
17
+
18
+ def call
19
+ recurse matchable, "$", nil
20
+ rules
21
+ end
22
+
23
+ private
24
+
25
+ attr_reader :matchable, :rules
26
+
27
+ def recurse object, path, match_type
28
+ case object
29
+ when Hash then recurse_hash(object, path, match_type)
30
+ when Array then recurse_array(object, path, match_type)
31
+ when Pact::SomethingLike then handle_something_like(object, path, match_type)
32
+ when Pact::ArrayLike then handle_array_like(object, path, match_type)
33
+ when Pact::Term then record_regex_rule object, path
34
+ when Pact::QueryString then recurse(object.query, path, match_type)
35
+ when Pact::QueryHash then recurse_hash(object.query, path, match_type)
36
+ end
37
+ end
38
+
39
+ def recurse_hash hash, path, match_type
40
+ hash.each do | (key, value) |
41
+ recurse value, "#{path}#{next_path_part(key)}", match_type
42
+ end
43
+ end
44
+
45
+ def recurse_array new_array, path, match_type
46
+ new_array.each_with_index do | value, index |
47
+ recurse value, "#{path}[#{index}]", match_type
48
+ end
49
+ end
50
+
51
+ def handle_something_like something_like, path, match_type
52
+ record_match_type_rule path, "type"
53
+ recurse something_like.contents, path, "type"
54
+ end
55
+
56
+ def handle_array_like array_like, path, match_type
57
+ record_rule "#{path}", 'min' => array_like.min
58
+ record_match_type_rule "#{path}[*].*", 'type'
59
+ recurse array_like.contents, "#{path}[*]", :array_like
60
+ end
61
+
62
+ def record_rule path, rule
63
+ rules[path] ||= {}
64
+ rules[path]['matchers'] ||= []
65
+ rules[path]['matchers'] << rule
66
+ end
67
+
68
+ def record_regex_rule term, path
69
+ rules[path] ||= {}
70
+ rules[path]['matchers'] ||= []
71
+ rule = { 'match' => 'regex', 'regex' => term.matcher.inspect[1..-2]}
72
+ rules[path]['matchers'] << rule
73
+ end
74
+
75
+ def record_match_type_rule path, match_type
76
+ unless match_type == :array_like || match_type.nil?
77
+ rules[path] ||= {}
78
+ rules[path]['matchers'] ||= []
79
+ rules[path]['matchers'] << { 'match' => match_type }
80
+ end
81
+ end
82
+
83
+ # Beth: there's a potential bug if the key contains a dot and a single quote.
84
+ # Not sure what to do then.
85
+ def next_path_part key
86
+ if key.to_s.include?('.')
87
+ "['#{key}']"
88
+ else
89
+ ".#{key}"
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -1,8 +1,6 @@
1
1
  module Pact
2
2
  class SpecificationVersion < Gem::Version
3
3
 
4
- NIL_VERSION = Pact::SpecificationVersion.new('')
5
-
6
4
  def major
7
5
  segments.first
8
6
  end
@@ -15,4 +13,6 @@ module Pact
15
13
  major && other < major
16
14
  end
17
15
  end
16
+
17
+ SpecificationVersion::NIL_VERSION = Pact::SpecificationVersion.new('')
18
18
  end
@@ -1,5 +1,5 @@
1
1
  module Pact
2
2
  module Support
3
- VERSION = "1.5.2"
3
+ VERSION = "1.6.0"
4
4
  end
5
5
  end
data/script/release.sh CHANGED
@@ -5,5 +5,5 @@ git checkout -- lib/pact/support/version.rb
5
5
  bundle exec bump ${1:-minor} --no-commit
6
6
  bundle exec rake generate_changelog
7
7
  git add CHANGELOG.md lib/pact/support/version.rb
8
- git commit -m "Releasing version $(ruby -r ./lib/pact/support/version.rb -e "puts Pact::Support::VERSION")"
8
+ git commit -m "chore(release): version $(ruby -r ./lib/pact/support/version.rb -e "puts Pact::Support::VERSION")"
9
9
  bundle exec rake release
@@ -0,0 +1,238 @@
1
+ require 'pact/matching_rules/v3/extract'
2
+ require 'pact/support'
3
+
4
+ module Pact
5
+ module MatchingRules::V3
6
+ describe Extract do
7
+
8
+ describe ".call" do
9
+
10
+ subject { Extract.call(matchable) }
11
+
12
+ context "with a Pact::SomethingLike" do
13
+ let(:matchable) do
14
+ {
15
+ body: Pact::SomethingLike.new(foo: 'bar', alligator: { name: 'Mary' })
16
+ }
17
+ end
18
+
19
+ let(:rules) do
20
+ {
21
+ "$.body" => {
22
+ "matchers" => [ {"match" => "type"} ]
23
+ }
24
+ }
25
+ end
26
+
27
+ it "creates a rule that matches by type" do
28
+ expect(subject).to eq rules
29
+ end
30
+ end
31
+
32
+ context "with a Pact::Term" do
33
+ let(:matchable) do
34
+ {
35
+ body: {
36
+ alligator: {
37
+ name: Pact::Term.new(generate: 'Mary', matcher: /.*a/)
38
+ }
39
+ }
40
+ }
41
+ end
42
+
43
+ let(:rules) do
44
+ {
45
+ "$.body.alligator.name" => {
46
+ "matchers" => [ {"match" => "regex", "regex" => ".*a"} ]
47
+ }
48
+ }
49
+ end
50
+
51
+ it "creates a rule that matches by regex" do
52
+ expect(subject).to eq rules
53
+ end
54
+ end
55
+
56
+ context "with a Pact::SomethingLike containing a Term" do
57
+ let(:matchable) do
58
+ {
59
+ body: Pact::SomethingLike.new(
60
+ foo: 'bar',
61
+ alligator: { name: Pact::Term.new(generate: 'Mary', matcher: /.*a/) }
62
+ )
63
+ }
64
+ end
65
+
66
+ let(:rules) do
67
+ {
68
+ "$.body" => {
69
+ "matchers" => [ {"match" => "type"} ]
70
+ },
71
+ "$.body.alligator.name" => {
72
+ "matchers" => [ {"match" => "regex", "regex"=>".*a"} ]
73
+ },
74
+ }
75
+ end
76
+
77
+ it "the match:regex overrides the match:type" do
78
+ expect(subject).to eq rules
79
+ end
80
+ end
81
+
82
+ context "with a Pact::SomethingLike containing an array" do
83
+ let(:matchable) do
84
+ {
85
+ body: Pact::SomethingLike.new(
86
+ alligators: [
87
+ {name: 'Mary'},
88
+ {name: 'Betty'}
89
+ ]
90
+ )
91
+ }
92
+ end
93
+
94
+ let(:rules) do
95
+ {
96
+ "$.body" => {
97
+ "matchers" => [ {"match" => "type"} ]
98
+ }
99
+ }
100
+ end
101
+
102
+ it "lists a rule for each item" do
103
+ expect(subject).to eq rules
104
+ end
105
+ end
106
+
107
+ context "with an ArrayLike" do
108
+ let(:matchable) do
109
+ {
110
+ body: {
111
+ alligators: Pact::ArrayLike.new(
112
+ name: 'Fred'
113
+ )
114
+ }
115
+ }
116
+ end
117
+
118
+ let(:rules) do
119
+ {
120
+ "$.body.alligators" => {
121
+ "matchers" => [ {"min" => 1} ]
122
+ },
123
+ "$.body.alligators[*].*" => {
124
+ "matchers" => [ {"match" => "type"} ]
125
+ }
126
+ }
127
+ end
128
+
129
+ it "lists a rule for all items" do
130
+ expect(subject).to eq rules
131
+ end
132
+ end
133
+
134
+ context "with an ArrayLike with a Pact::Term inside" do
135
+ let(:matchable) do
136
+ {
137
+ body: {
138
+ alligators: Pact::ArrayLike.new(
139
+ name: 'Fred',
140
+ phoneNumber: Pact::Term.new(generate: '1234567', matcher: /\d+/)
141
+ )
142
+ }
143
+ }
144
+ end
145
+
146
+ let(:rules) do
147
+ {
148
+ "$.body.alligators" => {
149
+ "matchers" => [ {"min" => 1} ]
150
+ },
151
+ "$.body.alligators[*].*" => {
152
+ "matchers" => [ {"match" => "type"} ]
153
+ },
154
+ "$.body.alligators[*].phoneNumber" => {
155
+ "matchers" => [ {"match" => "regex", "regex" => "\\d+"} ]
156
+ }
157
+ }
158
+ end
159
+
160
+ it "lists a rule that specifies that the regular expression must match" do
161
+ expect(subject).to eq rules
162
+ end
163
+ end
164
+
165
+ context "with a Pact::QueryString containing a Pact::Term" do
166
+ let(:matchable) do
167
+ {
168
+ query: Pact::QueryString.new(Pact::Term.new(generate: 'foobar', matcher: /foo/))
169
+ }
170
+ end
171
+
172
+ let(:rules) do
173
+ {
174
+ "$.query" => {
175
+ "matchers" => [ {"match" => "regex", "regex" => "foo"} ]
176
+ }
177
+ }
178
+ end
179
+
180
+ it "lists a rule that specifies that the regular expression must match" do
181
+ expect(subject).to eq rules
182
+ end
183
+ end
184
+
185
+ context "with a Pact::QueryHash containing a Pact::Term" do
186
+ let(:matchable) do
187
+ {
188
+ query: Pact::QueryHash.new(bar: Pact::Term.new(generate: 'foobar', matcher: /foo/))
189
+ }
190
+ end
191
+
192
+ let(:rules) do
193
+ {
194
+ "$.query.bar[0]" => {
195
+ "matchers" => [ {"match" => "regex", "regex" => "foo"} ]
196
+ }
197
+ }
198
+ end
199
+
200
+ it "lists a rule that specifies that the regular expression must match" do
201
+ expect(subject).to eq rules
202
+ end
203
+ end
204
+
205
+ context "with no special matching" do
206
+ let(:matchable) do
207
+ {
208
+ body: { alligator: { name: 'Mary' } }
209
+ }
210
+ end
211
+
212
+ let(:rules) do
213
+ {}
214
+ end
215
+
216
+
217
+ it "does not create any rules" do
218
+ expect(subject).to eq rules
219
+ end
220
+ end
221
+
222
+ context "with a key containing a dot" do
223
+ let(:matchable) do
224
+ {
225
+ "key" => {
226
+ "key.with.dots" => Pact::SomethingLike.new("foo")
227
+ }
228
+ }
229
+ end
230
+
231
+ it "uses square brackets notation for the key with dots" do
232
+ expect(subject.keys).to include "$.key['key.with.dots']"
233
+ end
234
+ end
235
+ end
236
+ end
237
+ end
238
+ 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.5.2
4
+ version: 1.6.0
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: 2018-03-23 00:00:00.000000000 Z
15
+ date: 2018-04-03 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: randexp
@@ -303,6 +303,7 @@ files:
303
303
  - lib/pact/matching_rules/extract.rb
304
304
  - lib/pact/matching_rules/jsonpath.rb
305
305
  - lib/pact/matching_rules/merge.rb
306
+ - lib/pact/matching_rules/v3/extract.rb
306
307
  - lib/pact/matching_rules/v3/merge.rb
307
308
  - lib/pact/reification.rb
308
309
  - lib/pact/rspec.rb
@@ -363,6 +364,7 @@ files:
363
364
  - spec/lib/pact/matchers/unix_diff_formatter_spec.rb
364
365
  - spec/lib/pact/matching_rules/extract_spec.rb
365
366
  - spec/lib/pact/matching_rules/merge_spec.rb
367
+ - spec/lib/pact/matching_rules/v3/extract_spec.rb
366
368
  - spec/lib/pact/matching_rules/v3/merge_spec.rb
367
369
  - spec/lib/pact/matching_rules_spec.rb
368
370
  - spec/lib/pact/reification_spec.rb
@@ -422,7 +424,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
422
424
  version: '0'
423
425
  requirements: []
424
426
  rubyforge_project:
425
- rubygems_version: 2.4.5.2
427
+ rubygems_version: 2.6.11
426
428
  signing_key:
427
429
  specification_version: 4
428
430
  summary: Shared code for Pact gems
@@ -465,6 +467,7 @@ test_files:
465
467
  - spec/lib/pact/matchers/unix_diff_formatter_spec.rb
466
468
  - spec/lib/pact/matching_rules/extract_spec.rb
467
469
  - spec/lib/pact/matching_rules/merge_spec.rb
470
+ - spec/lib/pact/matching_rules/v3/extract_spec.rb
468
471
  - spec/lib/pact/matching_rules/v3/merge_spec.rb
469
472
  - spec/lib/pact/matching_rules_spec.rb
470
473
  - spec/lib/pact/reification_spec.rb