Class: JsonDeepCompare::NodeComparison
- Inherits:
-
Object
- Object
- JsonDeepCompare::NodeComparison
- Defined in:
- lib/json-deep-compare.rb
Constant Summary collapse
- ExcerptPadding =
15
Instance Attribute Summary collapse
-
#left_value ⇒ Object
readonly
Returns the value of attribute left_value.
-
#right_value ⇒ Object
readonly
Returns the value of attribute right_value.
-
#selector ⇒ Object
readonly
Returns the value of attribute selector.
Instance Method Summary collapse
- #difference_message ⇒ Object
- #equal? ⇒ Boolean
- #excerptable_difference? ⇒ Boolean
- #excerpted_difference ⇒ Object
-
#initialize(left_value, right_value, options = {}) ⇒ NodeComparison
constructor
A new instance of NodeComparison.
- #leaf? ⇒ Boolean
- #value_inspect(value) ⇒ Object
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, = {}) @left_value, @right_value = left_value, right_value @selector = [:selector] || ':root' @exclusions = [: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_value ⇒ Object (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_value ⇒ Object (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 |
#selector ⇒ Object (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_message ⇒ Object
45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/json-deep-compare.rb', line 45 def 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
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
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_difference ⇒ Object
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
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 |