Method: Xcodeproj::Differ.array_diff

Defined in:
lib/xcodeproj/differ.rb

.array_diff(value_1, value_2, options) ⇒ Object

Returns the recursive diff of two arrays.

See Also:



111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# File 'lib/xcodeproj/differ.rb', line 111

def self.array_diff(value_1, value_2, options)
  ensure_class(value_1, Array)
  ensure_class(value_2, Array)
  return nil if value_1 == value_2

  new_objects_value_1 = array_non_unique_diff(value_1, value_2)
  new_objects_value_2 = array_non_unique_diff(value_2, value_1)
  return nil if value_1.empty? && value_2.empty?

  matched_diff = {}
  if id_key = options[:id_key]
    matched_value_1 = []
    matched_value_2 = []
    new_objects_value_1.each do |entry_value_1|
      if entry_value_1.is_a?(Hash)
        id_value = entry_value_1[id_key]
        entry_value_2 = new_objects_value_2.find do |entry|
          entry[id_key] == id_value
        end
        if entry_value_2
          matched_value_1 << entry_value_1
          matched_value_2 << entry_value_2
          diff = diff(entry_value_1, entry_value_2, options)
          matched_diff[id_value] = diff if diff
        end
      end
    end

    new_objects_value_1 -= matched_value_1
    new_objects_value_2 -= matched_value_2
  end

  if new_objects_value_1.empty? && new_objects_value_2.empty?
    if matched_diff.empty?
      nil
    else
      matched_diff
    end
  else
    result = {}
    result[options[:key_1]] = new_objects_value_1 unless new_objects_value_1.empty?
    result[options[:key_2]] = new_objects_value_2 unless new_objects_value_2.empty?
    result[:diff] = matched_diff unless matched_diff.empty?
    result
  end
end