class Eternity::ConflictResolver

Constants

Diff

Attributes

base[R]
current[R]
target[R]

Public Class Methods

new(current, target, base={}) click to toggle source
# File lib/eternity/conflict_resolver.rb, line 8
def initialize(current, target, base={})
  @current = current
  @target = target
  @base = base
end
resolve(current, target, base={}) click to toggle source
# File lib/eternity/conflict_resolver.rb, line 20
def self.resolve(current, target, base={})
  new(current, target, base).resolve
end

Public Instance Methods

resolve() click to toggle source
# File lib/eternity/conflict_resolver.rb, line 14
def resolve
  current_diff = diff current, base
  target_diff = diff target, base
  merge(target_diff, target, merge(current_diff, current, base))
end

Private Instance Methods

diff(object, base) click to toggle source
# File lib/eternity/conflict_resolver.rb, line 26
def diff(object, base)
  Diff.new object.keys - base.keys,
           base.keys.select { |k| base[k] != object[k] },
           base.keys - object.keys
end
merge(diff, object, base) click to toggle source
# File lib/eternity/conflict_resolver.rb, line 32
def merge(diff, object, base)
  base.dup.tap do |result|
    (diff.added + diff.updated).each { |k| result[k] = object[k] }
    diff.removed.each { |k| result.delete k }
  end
end