class JsonDeepCompare::NodeComparison

Constants

ExcerptPadding

Attributes

lval[R]
rval[R]
selector[R]

Public Class Methods

new(lval, rval, selector, options = {}) click to toggle source
# File lib/json-deep-compare/node_comparison.rb, line 6
def initialize(lval, rval, selector, options = {})
  @lval, @rval, @selector, @options = lval, rval, selector, options
  @children = []
  if lval.is_a?(Hash)
    if rval.is_a?(Hash)
      lval.each do |key, left_sub_value|
        @children << NodeComparison.new(
          left_sub_value, 
          rval[key], 
          "#{selector} > .#{key}", 
          options
        )
      end
    end
  elsif lval.is_a?(Array)
    if rval.is_a?(Array)
      lval.each_with_index do |left_sub_value, i|
        @children << NodeComparison.new(
          left_sub_value, 
          rval[i], 
          "#{selector} :nth-child(#{i+1})",
          options
        )
      end
    end
  end
end

Public Instance Methods

blank?(value) click to toggle source
# File lib/json-deep-compare/node_comparison.rb, line 34
def blank?(value)
  value.respond_to?(:empty?) ? value.empty? : !value
end
blank_equality?() click to toggle source
# File lib/json-deep-compare/node_comparison.rb, line 38
def blank_equality?
  @options[:blank_equality]
end
differences() click to toggle source
# File lib/json-deep-compare/node_comparison.rb, line 42
def differences
  if equal?
    []
  else
    if leaf?
      if excerptable_difference?
        [excerpted_difference]
      else
        [Difference.new(
          @selector, "expected to be :lval but was :rval",
          lval: value_inspect(lval_for_equality), 
          rval: value_inspect(rval_for_equality)
        )]
      end
    else
      @children.map(&:differences).compact.flatten
    end
  end
end
equal?() click to toggle source
# File lib/json-deep-compare/node_comparison.rb, line 62
def equal?
  if leaf?
    if selector_excluded?
      true
    elsif equality_proc
      equality_proc.call(lval_for_equality, rval_for_equality)
    elsif blank_equality? && blank?(lval_for_equality) && blank?(rval_for_equality)
      true
    else
      lval_for_equality == rval_for_equality
    end
  else
    @children.all?(&:equal?)
  end
end
equality_proc() click to toggle source
# File lib/json-deep-compare/node_comparison.rb, line 78
def equality_proc
  @options[:equality]
end
excerptable_difference?() click to toggle source
# File lib/json-deep-compare/node_comparison.rb, line 82
def excerptable_difference?
  @lval.is_a?(String) and @rval.is_a?(String) && (
    @lval.size > ExcerptPadding * 2 || @rval.size > ExcerptPadding * 2
  )
end
excerpted_difference() click to toggle source
# File lib/json-deep-compare/node_comparison.rb, line 88
def excerpted_difference
  difference_start = (0..@lval.length).detect { |i| @lval[i] != @rval[i] }
  range_start = if difference_start > ExcerptPadding
    difference_start - ExcerptPadding
  else
    0
  end
  left_excerpt = @lval[range_start..difference_start+ExcerptPadding]
  right_excerpt = @rval[range_start..difference_start+ExcerptPadding]
  if difference_start - ExcerptPadding > 0
    left_excerpt = "..." + left_excerpt
    right_excerpt = "..." + right_excerpt
  end
  if difference_start + ExcerptPadding < @lval.length
    left_excerpt = left_excerpt + '...'
  end
  if difference_start + ExcerptPadding < @rval.length
    right_excerpt = right_excerpt + '...'
  end
  Difference.new(
    @selector,
    "differs starting at char :difference_start: :lval differs from :rval",
    difference_start: difference_start.to_s,
    lval: left_excerpt.inspect, rval: right_excerpt.inspect
  )
end
has_substitution?() click to toggle source
# File lib/json-deep-compare/node_comparison.rb, line 115
def has_substitution?
  @options[:substitutions] && @options[:substitutions].has_key?(selector)
end
leaf?() click to toggle source
# File lib/json-deep-compare/node_comparison.rb, line 119
def leaf?
  @children.empty?
end
left_to_right?() click to toggle source
# File lib/json-deep-compare/node_comparison.rb, line 123
def left_to_right?
  @options[:direction] == :left
end
lval_for_equality() click to toggle source
# File lib/json-deep-compare/node_comparison.rb, line 127
def lval_for_equality
  @_lval_for_equality ||= begin
    if left_to_right? && has_substitution?
      substitution
    else
      lval
    end
  end
end
right_to_left?() click to toggle source
# File lib/json-deep-compare/node_comparison.rb, line 137
def right_to_left?
  @options[:direction] == :right
end
rval_for_equality() click to toggle source
# File lib/json-deep-compare/node_comparison.rb, line 141
def rval_for_equality
  @_rval_for_equality ||= begin
    if right_to_left? && has_substitution?
      substitution
    else
      rval
    end
  end
end
selector_excluded?() click to toggle source
# File lib/json-deep-compare/node_comparison.rb, line 151
def selector_excluded?
  @options[:exclusions].any? { |exclusion|
    if exclusion.is_a?(String)
      exclusion == @selector
    else
      @selector =~ exclusion
    end
  }
end
substitution() click to toggle source
# File lib/json-deep-compare/node_comparison.rb, line 161
def substitution
  @options[:substitutions][selector]
end
value_inspect(value) click to toggle source
# File lib/json-deep-compare/node_comparison.rb, line 165
def value_inspect(value)
  str = value.inspect
  if str.length >= 40
    "#{value.class.name} #{str[0..37]}..."
  else
    str
  end
end