Class: JsonDeepCompare::NodeComparison

Inherits:
Object
  • Object
show all
Defined in:
lib/json-deep-compare.rb

Constant Summary collapse

ExcerptPadding =
15

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(left_value, right_value, options = {}) ⇒ NodeComparison

Returns a new instance of NodeComparison.



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/json-deep-compare.rb', line 8

def initialize(left_value, right_value, options = {})
  @left_value, @right_value = left_value, right_value             
  @selector = options[:selector] || ':root'
  @exclusions = options[:exclusions]
  @exclusions = [@exclusions] unless @exclusions.is_a?(Array)
  @children = []
  if left_value.is_a?(Hash)
    if right_value.is_a?(Hash)
      left_value.each do |key, left_sub_value|
        @children << NodeComparison.new(
          left_sub_value, right_value[key], 
          selector: "#{selector} > .#{key}", exclusions: @exclusions
        )
      end
    end
  elsif left_value.is_a?(Array)
    if right_value.is_a?(Array)
      left_value.each_with_index do |left_sub_value, i|
        @children << NodeComparison.new(
          left_sub_value, right_value[i], 
          selector: "#{selector} :nth-child(#{i+1})", 
          exclusions: @exclusions
        )
      end
    end
  end
end

Instance Attribute Details

#left_valueObject (readonly)

Returns the value of attribute left_value.



6
7
8
# File 'lib/json-deep-compare.rb', line 6

def left_value
  @left_value
end

#right_valueObject (readonly)

Returns the value of attribute right_value.



6
7
8
# File 'lib/json-deep-compare.rb', line 6

def right_value
  @right_value
end

#selectorObject (readonly)

Returns the value of attribute selector.



6
7
8
# File 'lib/json-deep-compare.rb', line 6

def selector
  @selector
end

Instance Method Details

#difference_messageObject



45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/json-deep-compare.rb', line 45

def difference_message
  unless equal?
    if leaf?
      if excerptable_difference?
        excerpted_difference
      else
        "#{@selector.inspect} expected to be #{value_inspect(@left_value)} but was #{value_inspect(@right_value)}"
      end
    else
      @children.reject(&:equal?).map(&:difference_message).join("\n")
    end
  end
end

#equal?Boolean

Returns:

  • (Boolean)


59
60
61
62
63
64
65
# File 'lib/json-deep-compare.rb', line 59

def equal?
  if leaf?
    @exclusions.include?(@selector) || @left_value == @right_value
  else
    @children.all?(&:equal?)
  end
end

#excerptable_difference?Boolean

Returns:

  • (Boolean)


67
68
69
70
71
72
# File 'lib/json-deep-compare.rb', line 67

def excerptable_difference?
  @left_value.is_a?(String) and @right_value.is_a?(String) && (
    @left_value.size > ExcerptPadding * 2 || 
    @right_value.size > ExcerptPadding * 2
  )
end

#excerpted_differenceObject



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/json-deep-compare.rb', line 74

def excerpted_difference
  difference_start = (0..@left_value.length).detect { |i| 
    @left_value[i] != @right_value[i]
  }
  range_start = if difference_start > ExcerptPadding
    difference_start - ExcerptPadding
  else
    0
  end
  left_excerpt = @left_value[
    range_start..difference_start+ExcerptPadding
  ]
  right_excerpt = @right_value[
    range_start..difference_start+ExcerptPadding
  ]
  if difference_start - ExcerptPadding > 0
    left_excerpt = "..." + left_excerpt
    right_excerpt = "..." + right_excerpt
  end
  if difference_start + ExcerptPadding < @left_value.length
    left_excerpt = left_excerpt + '...'
  end
  if difference_start + ExcerptPadding < @right_value.length
    right_excerpt = right_excerpt + '...'
  end
  "#{@selector.inspect} differs starting at char #{difference_start}: #{left_excerpt.inspect} differs from #{right_excerpt.inspect}"
end

#leaf?Boolean

Returns:

  • (Boolean)


102
103
104
# File 'lib/json-deep-compare.rb', line 102

def leaf?
  @children.empty?
end

#value_inspect(value) ⇒ Object



36
37
38
39
40
41
42
43
# File 'lib/json-deep-compare.rb', line 36

def value_inspect(value)
  str = value.inspect
  if str.length >= 40
    "#{value.class.name} #{str[0..37]}..."
  else
    str
  end
end