Class: Eco::Data::Hashes::DiffResult

Inherits:
Object
  • Object
show all
Defined in:
lib/eco/data/hashes/diff_result.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(src1, src2, key:, compare: :all, case_sensitive: false) ⇒ DiffResult

Returns a new instance of DiffResult.

Parameters:

  • compare (Array<String>, sym) (defaults to: :all)
    • :all compares the matching attrs between both hashes only


10
11
12
13
14
15
16
# File 'lib/eco/data/hashes/diff_result.rb', line 10

def initialize(src1, src2, key:, compare: :all, case_sensitive: false)
  @key     = key
  @compare = compare
  @case_sensitive = case_sensitive
  @src1 = src1
  @src2 = src2
end

Instance Attribute Details

#keyObject (readonly)

Returns the value of attribute key.



5
6
7
# File 'lib/eco/data/hashes/diff_result.rb', line 5

def key
  @key
end

#src1Object (readonly)

Returns the value of attribute src1.



6
7
8
# File 'lib/eco/data/hashes/diff_result.rb', line 6

def src1
  @src1
end

#src2Object (readonly)

Returns the value of attribute src2.



6
7
8
# File 'lib/eco/data/hashes/diff_result.rb', line 6

def src2
  @src2
end

Instance Method Details

#attr(attr) ⇒ Object



45
46
47
48
# File 'lib/eco/data/hashes/diff_result.rb', line 45

def attr(attr)
  return nil unless src2
  src2[attr.to_s]
end

#attr_prev(attr) ⇒ Object



50
51
52
53
# File 'lib/eco/data/hashes/diff_result.rb', line 50

def attr_prev(attr)
  return nil unless src1
  src1[attr.to_s]
end

#case_sensitive?Boolean

Returns:

  • (Boolean)


79
80
81
# File 'lib/eco/data/hashes/diff_result.rb', line 79

def case_sensitive?
  !!@case_sensitive
end

#comparable_attrsObject



83
84
85
86
# File 'lib/eco/data/hashes/diff_result.rb', line 83

def comparable_attrs
  return [] if new? || del?
  compared_attrs
end

#compared_attrsObject



88
89
90
91
92
93
94
95
96
97
98
# File 'lib/eco/data/hashes/diff_result.rb', line 88

def compared_attrs
  return @compared_attrs if instance_variable_defined?(:@compared_attrs)
  @compared_attrs = \
    if @compare == :all
      src1.keys & src2.keys
    elsif @compare.is_a?(Array)
      @compare.map(&:to_s)
    else
      raise "Expecting 'compare' to be sym (:all) or Array<String>. Given: #{@compare.class}"
    end
end

#del?Boolean

Returns:

  • (Boolean)


22
23
24
# File 'lib/eco/data/hashes/diff_result.rb', line 22

def del?
  !!src1 && !src2
end

#diff?Boolean

Returns:

  • (Boolean)


30
31
32
# File 'lib/eco/data/hashes/diff_result.rb', line 30

def diff?
  new? || del? || !diff_attrs.empty?
end

#diff_attr?(attr) ⇒ Boolean

Returns:

  • (Boolean)


39
40
41
42
43
# File 'lib/eco/data/hashes/diff_result.rb', line 39

def diff_attr?(attr)
  return true if new?
  return true if del?
  diff_attrs.include?(attr.to_s)
end

#diff_attrsObject



66
67
68
69
70
# File 'lib/eco/data/hashes/diff_result.rb', line 66

def diff_attrs
  @diff_attrs ||= comparable_attrs.each_with_object([]) do |attr, out|
    out << attr unless eq?(src1[attr], src2[attr])
  end
end

#diff_hashObject



59
60
61
62
63
64
# File 'lib/eco/data/hashes/diff_result.rb', line 59

def diff_hash
  target_attrs = [key] | compared_attrs
  return src2.slice(*target_attrs) if new?
  return src1.slice(key)           if del?
  src2.slice(key, *diff_attrs)
end

#eq?(val1, val2) ⇒ Boolean

Returns:

  • (Boolean)


72
73
74
75
76
77
# File 'lib/eco/data/hashes/diff_result.rb', line 72

def eq?(val1, val2)
  return true  if val1 == val2
  return false if case_sensitive?
  return false if !val2 || !val1
  val1.upcase == val2.upcase
end

#key?Boolean

Is the key attr value changing?

Returns:

  • (Boolean)


35
36
37
# File 'lib/eco/data/hashes/diff_result.rb', line 35

def key?
  !(new? || del?) && diff_attr?(key)
end

#new?Boolean

Returns:

  • (Boolean)


18
19
20
# File 'lib/eco/data/hashes/diff_result.rb', line 18

def new?
  !src1 && !!src2
end

#previous(attr) ⇒ Object



55
56
57
# File 'lib/eco/data/hashes/diff_result.rb', line 55

def previous(attr)
  src1 && src1[attr.to_s]
end

#update?Boolean

Returns:

  • (Boolean)


26
27
28
# File 'lib/eco/data/hashes/diff_result.rb', line 26

def update?
  !new? && !del? && diff?
end