class Extractor2

extracts duplicate attributes from ROXML objects

Attributes

subclasses[R]

Public Class Methods

new(roxml_objs, runtime) click to toggle source
# File lib/roundtrip_xml/extractor2.rb, line 14
def initialize(roxml_objs, runtime)
  @roxml_objs = roxml_objs
  @hashes = @roxml_objs.map { |obj| obj.to_hash }
  @runtime = runtime
  @subclass_names = Multiset.new
  @subclasses = []
end

Public Instance Methods

convert_roxml(obj, keys, class_name) click to toggle source
# File lib/roundtrip_xml/extractor2.rb, line 66
def convert_roxml(obj, keys, class_name)
  parent = @runtime.fetch(class_name)
  new = parent.new
  parent.plain_accessors.each do |new_accessor|
    old_accessor = new_accessor.to_s.gsub(VAR_SUFIX, '').to_sym
    new.send "#{new_accessor}=", obj.send(old_accessor)
  end

  keys.each do |accessor|
    new.send "#{accessor}=", obj.send(accessor)
  end
  new
end
convert_roxml_objs() click to toggle source
# File lib/roundtrip_xml/extractor2.rb, line 80
def convert_roxml_objs
  fields, diff_keys = similar_fields
  parent_name = @roxml_objs[0].class.class_name
  name = create_romxl_class fields, parent_name
  @roxml_objs.map do |roxml|
    convert_roxml roxml, diff_keys, name
  end
end
create_romxl_class(keys, parent) click to toggle source
# File lib/roundtrip_xml/extractor2.rb, line 54
def create_romxl_class(keys, parent)
  @subclass_names << parent
  name = "#{parent.to_s}#{@subclass_names.count(parent)}"
  clazz = new_roxml_class name, @runtime.fetch(parent) do
    include RoxmlSubclassHelpers
  end
  clazz.defaults = keys
  @runtime.add_class name, clazz
  @subclasses << clazz
  name
end
list_diffs() click to toggle source
# File lib/roundtrip_xml/extractor2.rb, line 21
def list_diffs

  HashDiff.best_diff(@hashes[0], @hashes[6]).sort_by do |diff|
    m = diff[1].match(/\./)
    m ? m.size : 0
  end.map {|diff| diff[1]}
end
similar_fields() click to toggle source
# File lib/roundtrip_xml/extractor2.rb, line 29
def similar_fields
  keys = Set.new @hashes[0].keys
  diff_keys = Set.new
  compared = {}
  @hashes.each do |hash_1|
    @hashes.each do |hash_2|
      compared[hash_2] ||= Set.new
      next if hash_1 == hash_2 || compared[hash_1].include?(hash_2)
      compared[hash_2].add hash_1

      diffs = HashDiff.diff(hash_1, hash_2).map do |diff|
        diff[1].match(/(\w+)\.?/)[1]
      end

      diff_keys.merge diffs
    end
  end
  keys = keys - diff_keys
  key_hash = keys.inject({}) do |hash, key|
    hash[key] = @hashes[0][key]
    hash
  end
  [key_hash, diff_keys]
end