Sha256: b6ecd76d55e6c4a96131d3dd5e6f8a28e4907fa9ac82dd2f4334412b27c6bc23

Contents?: true

Size: 932 Bytes

Versions: 17

Compression:

Stored size: 932 Bytes

Contents

module Eternity
  class ConflictResolver

    Diff = Struct.new :added, :updated, :removed

    attr_reader :current, :target, :base
    
    def initialize(current, target, base={})
      @current = current
      @target = target
      @base = base
    end

    def resolve
      current_diff = diff current, base
      target_diff = diff target, base
      merge(target_diff, target, merge(current_diff, current, base))
    end

    def self.resolve(current, target, base={})
      new(current, target, base).resolve
    end

    private

    def diff(object, base)
      Diff.new object.keys - base.keys,
               base.keys.select { |k| base[k] != object[k] },
               base.keys - object.keys
    end

    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

  end
end

Version data entries

17 entries across 17 versions & 1 rubygems

Version Path
eternity-4.0.0 lib/eternity/conflict_resolver.rb
eternity-3.0.1 lib/eternity/conflict_resolver.rb
eternity-3.0.0 lib/eternity/conflict_resolver.rb
eternity-2.0.1 lib/eternity/conflict_resolver.rb
eternity-2.0.0 lib/eternity/conflict_resolver.rb
eternity-1.1.1 lib/eternity/conflict_resolver.rb
eternity-1.1.0 lib/eternity/conflict_resolver.rb
eternity-1.0.0 lib/eternity/conflict_resolver.rb
eternity-0.1.3 lib/eternity/conflict_resolver.rb
eternity-0.1.2 lib/eternity/conflict_resolver.rb
eternity-0.1.1 lib/eternity/conflict_resolver.rb
eternity-0.1.0 lib/eternity/conflict_resolver.rb
eternity-0.0.5 lib/eternity/conflict_resolver.rb
eternity-0.0.4 lib/eternity/conflict_resolver.rb
eternity-0.0.3 lib/eternity/conflict_resolver.rb
eternity-0.0.2 lib/eternity/conflict_resolver.rb
eternity-0.0.1 lib/eternity/conflict_resolver.rb