json-deep-compare 0.2.1 → 0.2.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.
@@ -6,6 +6,10 @@ module JsonDeepCompare
6
6
  else
7
7
  options[:exclusions] = []
8
8
  end
9
+ if substitute_with = options[:substitute_with]
10
+ options[:substitutions] =
11
+ SubstitutionsBuilder.new(substitute_with).result
12
+ end
9
13
  @root_comparisons = []
10
14
  @root_comparisons << NodeComparison.new(
11
15
  lval, rval, ":root", options.merge(direction: :left)
@@ -32,5 +36,58 @@ module JsonDeepCompare
32
36
  def equal?
33
37
  @root_comparisons.all?(&:equal?)
34
38
  end
39
+
40
+ class SubstitutionsBuilder
41
+ attr_reader :result
42
+
43
+ def initialize(proc)
44
+ @proc = proc
45
+ @result = {}
46
+ root = Node.new(":root")
47
+ proc.call root
48
+ root.rules.each do |rule|
49
+ @result[rule.selector] = rule.value
50
+ end
51
+ end
52
+
53
+ class Node
54
+ def initialize(selector)
55
+ @selector = selector
56
+ @sub_nodes = []
57
+ end
58
+
59
+ def method_missing(meth, *args, &block)
60
+ if block_given?
61
+ if args.size == 1
62
+ sub_node = Node.new(
63
+ @selector + " > .#{meth} :nth-child(#{args.first})"
64
+ )
65
+ else
66
+ sub_node = Node.new(@selector + " > .#{meth}")
67
+ end
68
+ yield sub_node
69
+ elsif args.size == 2
70
+ sub_node = Node.new(
71
+ @selector + " > .#{meth} :nth-child(#{args.first})"
72
+ )
73
+ sub_node.value = args.last
74
+ else
75
+ sub_node = Node.new(@selector + " > .#{meth}")
76
+ sub_node.value = args.first
77
+ end
78
+ @sub_nodes << sub_node
79
+ end
80
+
81
+ def rules
82
+ @sub_nodes.map { |sn| sn.rules }.flatten.concat([@rule]).compact
83
+ end
84
+
85
+ def value=(v)
86
+ @rule = Rule.new(@selector, v)
87
+ end
88
+ end
89
+
90
+ Rule = Struct.new(:selector, :value)
91
+ end
35
92
  end
36
93
  end
@@ -49,7 +49,8 @@ module JsonDeepCompare
49
49
  else
50
50
  [Difference.new(
51
51
  @selector, "expected to be :lval but was :rval",
52
- lval: value_inspect(@lval), rval: value_inspect(@rval)
52
+ lval: value_inspect(lval_for_equality),
53
+ rval: value_inspect(rval_for_equality)
53
54
  )]
54
55
  end
55
56
  else
@@ -1,3 +1,3 @@
1
1
  module JsonDeepCompare
2
- VERSION = '0.2.1'
2
+ VERSION = '0.2.2'
3
3
  end
@@ -222,4 +222,64 @@ class DocumentComparisonTestCase < Test::Unit::TestCase
222
222
  )
223
223
  assert comparison.equal?
224
224
  end
225
+
226
+ def test_failure_while_substituting
227
+ lval = {'one' => 'raw_value'}
228
+ rval = {'one' => 'actual_value'}
229
+ comparison = JsonDeepCompare::DocumentComparison.new(
230
+ lval, rval, substitutions: {":root > .one" => 'expected_value'}
231
+ )
232
+ assert !comparison.equal?
233
+ assert_match(
234
+ /":root > .one" expected to be "expected_value" but was "actual_value"/,
235
+ comparison.difference_messages
236
+ )
237
+ end
238
+
239
+ def test_substitute_with_block
240
+ lval = {
241
+ 'one' => 1,
242
+ 'two' => {
243
+ 'three' => 3,
244
+ 'four' => 'four',
245
+ 'five' => [
246
+ {'six' => 'six'}, {'seven' => 7}
247
+ ],
248
+ 'eight' => [
249
+ 'nine',
250
+ 10,
251
+ 'eleven'
252
+ ]
253
+ }
254
+ }
255
+ rval = {
256
+ 'one' => 'one',
257
+ 'two' => {
258
+ 'three' => 'three',
259
+ 'four' => 'four',
260
+ 'five' => [
261
+ {'six' => 'six'}, {'seven' => 'seven'}
262
+ ],
263
+ 'eight' => [
264
+ 'nine',
265
+ 'ten',
266
+ 'eleven'
267
+ ]
268
+ }
269
+ }
270
+ comparison = JsonDeepCompare::DocumentComparison.new(
271
+ lval, rval,
272
+ substitute_with: Proc.new { |root|
273
+ root.one 'one'
274
+ root.two do |two|
275
+ two.three 'three'
276
+ two.five(2) do |five|
277
+ five.seven 'seven'
278
+ end
279
+ two.eight(2, 'ten')
280
+ end
281
+ }
282
+ )
283
+ assert comparison.equal?
284
+ end
225
285
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json-deep-compare
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-02-10 00:00:00.000000000 Z
12
+ date: 2014-02-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -77,7 +77,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
77
77
  version: '0'
78
78
  segments:
79
79
  - 0
80
- hash: -2669003529915222280
80
+ hash: -2413287472773223774
81
81
  required_rubygems_version: !ruby/object:Gem::Requirement
82
82
  none: false
83
83
  requirements:
@@ -86,7 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
86
86
  version: '0'
87
87
  segments:
88
88
  - 0
89
- hash: -2669003529915222280
89
+ hash: -2413287472773223774
90
90
  requirements: []
91
91
  rubyforge_project:
92
92
  rubygems_version: 1.8.23