diff_matcher 2.2.0 → 2.2.1
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.
- data/Gemfile +3 -3
- data/README.md +16 -1
- data/lib/diff_matcher/difference.rb +25 -14
- data/lib/diff_matcher/version.rb +1 -1
- data/spec/diff_matcher/difference_spec.rb +66 -0
- metadata +4 -14
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -147,7 +147,7 @@ Where, - 1 missing, + 1 additional, : 2 match_class
|
|
147
147
|
|
148
148
|
When `actual` is an array with a *limited* size use an `AllMatcher` to match
|
149
149
|
against *all* the elements in the array adhering to the limits of `:min`
|
150
|
-
and or `:max
|
150
|
+
and or `:max` or `:size` (where `:size` is a Fixnum or range of Fixnum).
|
151
151
|
|
152
152
|
``` ruby
|
153
153
|
puts DiffMatcher::difference(DiffMatcher::AllMatcher.new(Fixnum, :min=>3), [1, 2])
|
@@ -159,6 +159,15 @@ puts DiffMatcher::difference(DiffMatcher::AllMatcher.new(Fixnum, :min=>3), [1, 2
|
|
159
159
|
Where, - 1 missing, : 2 match_class
|
160
160
|
```
|
161
161
|
|
162
|
+
``` ruby
|
163
|
+
puts DiffMatcher::difference(DiffMatcher::AllMatcher.new(Fixnum, :size=>3..5), [1, 2])
|
164
|
+
[
|
165
|
+
: 1,
|
166
|
+
: 2,
|
167
|
+
- Fixnum
|
168
|
+
]
|
169
|
+
Where, - 1 missing, : 2 match_class
|
170
|
+
```
|
162
171
|
|
163
172
|
When `actual` is an array of unknown size *and* `expected` can take
|
164
173
|
multiple forms use a `Matcher` inside of an `AllMatcher` to match
|
@@ -246,6 +255,10 @@ Similar gems
|
|
246
255
|
* <http://github.com/postmodern/tdiff> (Calculates the differences between two tree-like structures)
|
247
256
|
* <http://github.com/Blargel/easy_diff> (Recursive diff, merge, and unmerge for hashes and arrays)
|
248
257
|
|
258
|
+
### JSON matchers
|
259
|
+
* <http://github.com/collectiveidea/json_spec> (Easily handle JSON in RSpec and Cucumber)
|
260
|
+
* <http://github.com/lloyd/JSONSelect> (CSS-like selectors for JSON)
|
261
|
+
|
249
262
|
|
250
263
|
Why another differ?
|
251
264
|
---
|
@@ -262,6 +275,8 @@ It has extra functionality in also being able to recursively merge hashes and ar
|
|
262
275
|
DiffMatcher can match using not only regexes but classes and procs.
|
263
276
|
And the difference string that it outputs can be formatted in several ways as needed.
|
264
277
|
|
278
|
+
As for matching JSON, the matchers above work well, but don't allow for matching patterns.
|
279
|
+
|
265
280
|
|
266
281
|
Use with rspec
|
267
282
|
---
|
@@ -50,9 +50,19 @@ module DiffMatcher
|
|
50
50
|
class AllMatcher < Matcher
|
51
51
|
def expected(e, actual)
|
52
52
|
opts = expected_opts(e)
|
53
|
+
size = opts[:size]
|
54
|
+
case size
|
55
|
+
when Fixnum
|
56
|
+
min = size
|
57
|
+
max = size
|
58
|
+
when Range
|
59
|
+
min = size.first
|
60
|
+
max = size.last
|
61
|
+
else
|
62
|
+
min = opts[:min] || 0
|
63
|
+
max = opts[:max] || 1_000_000 # MAXINT?
|
64
|
+
end
|
53
65
|
size = actual.size
|
54
|
-
min = opts[:min] || 0
|
55
|
-
max = opts[:max] || 1_000_000 # MAXINT?
|
56
66
|
size = size > min ? (size < max ? size : max) : min
|
57
67
|
[e]*size
|
58
68
|
end
|
@@ -168,7 +178,7 @@ module DiffMatcher
|
|
168
178
|
items_to_s(
|
169
179
|
expected,
|
170
180
|
(item_types_shown).inject([]) { |a, method|
|
171
|
-
a + send(method, left, right, expected
|
181
|
+
a + send(method, left, right, expected).compact.map { |item| markup(method, item) }
|
172
182
|
}
|
173
183
|
)
|
174
184
|
else
|
@@ -189,9 +199,10 @@ module DiffMatcher
|
|
189
199
|
end if expected.is_a? actual.class
|
190
200
|
end
|
191
201
|
|
192
|
-
def compare(right,
|
193
|
-
|
194
|
-
|
202
|
+
def compare(right, expected, default=nil)
|
203
|
+
case expected
|
204
|
+
when Hash, Array
|
205
|
+
right && right.keys.tap { |keys| keys.sort if expected.is_a? Array }.map { |k|
|
195
206
|
yield k
|
196
207
|
}
|
197
208
|
else
|
@@ -199,20 +210,20 @@ module DiffMatcher
|
|
199
210
|
end
|
200
211
|
end
|
201
212
|
|
202
|
-
def different(left, right,
|
203
|
-
compare(right,
|
204
|
-
"#{"#{k.inspect}=>" if
|
213
|
+
def different(left, right, expected)
|
214
|
+
compare(right, expected, difference_to_s(right, left)) { |k|
|
215
|
+
"#{"#{k.inspect}=>" if expected.is_a? Hash}#{right[k]}" if right[k] and left.has_key?(k)
|
205
216
|
}
|
206
217
|
end
|
207
218
|
|
208
|
-
def missing(left, right,
|
209
|
-
compare(left,
|
210
|
-
"#{"#{k.inspect}=>" if
|
219
|
+
def missing(left, right, expected)
|
220
|
+
compare(left, expected) { |k|
|
221
|
+
"#{"#{k.inspect}=>" if expected.is_a? Hash}#{left[k].inspect}" unless right.has_key?(k) || @optional_keys.include?(k)
|
211
222
|
}
|
212
223
|
end
|
213
224
|
|
214
|
-
def additional(left, right,
|
215
|
-
missing(right, left,
|
225
|
+
def additional(left, right, expected)
|
226
|
+
missing(right, left, expected)
|
216
227
|
end
|
217
228
|
|
218
229
|
def match?(expected, actual)
|
data/lib/diff_matcher/version.rb
CHANGED
@@ -280,6 +280,22 @@ describe "DiffMatcher::difference(expected, actual, opts)" do
|
|
280
280
|
end
|
281
281
|
end
|
282
282
|
|
283
|
+
context "of an Array derived class," do
|
284
|
+
class ArrayChild < Array; end
|
285
|
+
expected, same, different =
|
286
|
+
ArrayChild[ 1 ],
|
287
|
+
ArrayChild[ 1 ],
|
288
|
+
ArrayChild[ 2 ]
|
289
|
+
|
290
|
+
it_behaves_like "a diff matcher", expected, same, different,
|
291
|
+
<<-EOF, {}
|
292
|
+
[
|
293
|
+
- 1+ 2
|
294
|
+
]
|
295
|
+
Where, - 1 missing, + 1 additional
|
296
|
+
EOF
|
297
|
+
end
|
298
|
+
|
283
299
|
context "of Range," do
|
284
300
|
expected, same, different =
|
285
301
|
(1..3),
|
@@ -340,6 +356,22 @@ describe "DiffMatcher::difference(expected, actual, opts)" do
|
|
340
356
|
end
|
341
357
|
end
|
342
358
|
end
|
359
|
+
|
360
|
+
context "of a Hash derived class," do
|
361
|
+
class HashChild < Hash; end
|
362
|
+
expected, same, different =
|
363
|
+
HashChild["a",1],
|
364
|
+
HashChild["a",1],
|
365
|
+
HashChild["a",2]
|
366
|
+
|
367
|
+
it_behaves_like "a diff matcher", expected, same, different,
|
368
|
+
<<-EOF
|
369
|
+
{
|
370
|
+
"a"=>- 1+ 2
|
371
|
+
}
|
372
|
+
Where, - 1 missing, + 1 additional
|
373
|
+
EOF
|
374
|
+
end
|
343
375
|
end
|
344
376
|
|
345
377
|
describe "when expected is," do
|
@@ -476,6 +508,40 @@ describe "DiffMatcher::difference(expected, actual, opts)" do
|
|
476
508
|
Where, + 1 additional, : 2 match_class
|
477
509
|
EOF
|
478
510
|
end
|
511
|
+
|
512
|
+
context "with a size restriction" do
|
513
|
+
expected, same, different =
|
514
|
+
DiffMatcher::AllMatcher.new(String, :size=>2),
|
515
|
+
%w(ay be),
|
516
|
+
%w(ay be ci)
|
517
|
+
|
518
|
+
it_behaves_like "a diff matcher", expected, same, different,
|
519
|
+
<<-EOF
|
520
|
+
[
|
521
|
+
: "ay",
|
522
|
+
: "be",
|
523
|
+
+ "ci"
|
524
|
+
]
|
525
|
+
Where, + 1 additional, : 2 match_class
|
526
|
+
EOF
|
527
|
+
end
|
528
|
+
|
529
|
+
context "with a size restriction range" do
|
530
|
+
expected, same, different =
|
531
|
+
DiffMatcher::AllMatcher.new(String, :size=>0..2),
|
532
|
+
%w(ay be),
|
533
|
+
%w(ay be ci)
|
534
|
+
|
535
|
+
it_behaves_like "a diff matcher", expected, same, different,
|
536
|
+
<<-EOF
|
537
|
+
[
|
538
|
+
: "ay",
|
539
|
+
: "be",
|
540
|
+
+ "ci"
|
541
|
+
]
|
542
|
+
Where, + 1 additional, : 2 match_class
|
543
|
+
EOF
|
544
|
+
end
|
479
545
|
end
|
480
546
|
|
481
547
|
context "a DiffMatcher::AllMatcher using an or-ed DiffMatcher::Matcher," do
|
metadata
CHANGED
@@ -1,13 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: diff_matcher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 7
|
5
4
|
prerelease:
|
6
|
-
|
7
|
-
- 2
|
8
|
-
- 2
|
9
|
-
- 0
|
10
|
-
version: 2.2.0
|
5
|
+
version: 2.2.1
|
11
6
|
platform: ruby
|
12
7
|
authors:
|
13
8
|
- Playup
|
@@ -15,8 +10,7 @@ autorequire:
|
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
12
|
|
18
|
-
date: 2012-
|
19
|
-
default_executable:
|
13
|
+
date: 2012-05-21 00:00:00 Z
|
20
14
|
dependencies: []
|
21
15
|
|
22
16
|
description: |
|
@@ -53,7 +47,6 @@ files:
|
|
53
47
|
- lib/diff_matcher/version.rb
|
54
48
|
- spec/diff_matcher/difference_spec.rb
|
55
49
|
- spec/spec_helper.rb
|
56
|
-
has_rdoc: true
|
57
50
|
homepage: http://github.com/playup/diff_matcher
|
58
51
|
licenses: []
|
59
52
|
|
@@ -67,7 +60,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
67
60
|
requirements:
|
68
61
|
- - ">="
|
69
62
|
- !ruby/object:Gem::Version
|
70
|
-
hash:
|
63
|
+
hash: 2195120137284672671
|
71
64
|
segments:
|
72
65
|
- 0
|
73
66
|
version: "0"
|
@@ -76,14 +69,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
76
69
|
requirements:
|
77
70
|
- - ">="
|
78
71
|
- !ruby/object:Gem::Version
|
79
|
-
hash: 3
|
80
|
-
segments:
|
81
|
-
- 0
|
82
72
|
version: "0"
|
83
73
|
requirements: []
|
84
74
|
|
85
75
|
rubyforge_project:
|
86
|
-
rubygems_version: 1.
|
76
|
+
rubygems_version: 1.8.21
|
87
77
|
signing_key:
|
88
78
|
specification_version: 3
|
89
79
|
summary: Generates a diff by matching against expected values, classes, regexes and/or procs.
|