class DomGlancy::Analyzer

Attributes

changed_element_pairs[R]
set_changed_master[R]
set_current_not_master[R]
set_master_not_current[R]

Public Class Methods

new(master_data, current_data, test_root = nil) click to toggle source
# File lib/dom_glancy/analyzer.rb, line 12
def initialize(master_data, current_data, test_root = nil)
  @master_data  = master_data
  @current_data = current_data
  @test_root    = test_root
end

Public Instance Methods

analyze() click to toggle source
# File lib/dom_glancy/analyzer.rb, line 18
def analyze
  clear_results

  if missing_elements? || extra_elements?
    remove_similar_elements
    extract_changed_elements
  end

  # create_diff_file if @test_root && !all_same?
  compile_results
end

Private Instance Methods

add_similarity(element) click to toggle source
# File lib/dom_glancy/analyzer.rb, line 135
def add_similarity(element)
  element.merge('similarity' => ::DomGlancy.configuration.similarity)
end
all_same?() click to toggle source
# File lib/dom_glancy/analyzer.rb, line 54
def all_same?
  @set_current_not_master.count == 0 && @set_master_not_current.count == 0 && @changed_element_pairs.count == 0
end
clear_results() click to toggle source
# File lib/dom_glancy/analyzer.rb, line 32
def clear_results
  master_set = @master_data.to_set
  current_set = @current_data.to_set

  @set_current_not_master = current_set - master_set
  @set_master_not_current = master_set - current_set
  @set_changed_master = Set.new

  @changed_element_pairs = []
end
compile_results() click to toggle source
# File lib/dom_glancy/analyzer.rb, line 43
def compile_results
  {
    not_in_master:         @set_current_not_master,
    not_in_current:        @set_master_not_current,
    changed_element_pairs: @changed_element_pairs,
    changed_master:        @set_changed_master,
    test_root:             @test_root,
    same:                  all_same?
  }
end
extra_elements?() click to toggle source
# File lib/dom_glancy/analyzer.rb, line 62
def extra_elements?
  @set_current_not_master.count > 0
end
extract_changed_elements() click to toggle source
# File lib/dom_glancy/analyzer.rb, line 75
def extract_changed_elements
  @changed_element_pairs = []

  @set_current_not_master.each do |item1|           # in current
    element1 = DOMElement.new(item1)
    changed_elements = []
    @set_master_not_current.each do |item2|         # in master
      element2 = DOMElement.new(item2)
      if element1.same_element?(element2)
        changed_elements << element2
      end
    end

    least_changed = changed_elements[0]
    changed_elements.each do |element|
      change_analyzer = ChangeAnalyzer.new
      least_changed = element if change_analyzer.compare(element1, element) < change_analyzer.compare(element1, least_changed)
    end

    @changed_element_pairs << [item1, least_changed.to_hash] if least_changed
  end

  remove_elements_from_data_sets @changed_element_pairs

  @changed_element_pairs.select!{ |pair| !DOMElement.new(add_similarity(pair[0])).close_enough?(DOMElement.new(add_similarity(pair[1]))) }

  @changed_element_pairs.each do |pair|
    current_element = pair[0].dup
    master_element  = pair[1].dup
    current_element['was'] = master_element
    @set_changed_master.add(current_element)
  end
end
missing_elements?() click to toggle source
# File lib/dom_glancy/analyzer.rb, line 58
def missing_elements?
  @set_master_not_current.count > 0
end
remove_element_from_data_sets(element) click to toggle source
# File lib/dom_glancy/analyzer.rb, line 116
def remove_element_from_data_sets(element)
  @set_current_not_master.delete element
  @set_master_not_current.delete element
end
remove_elements_from_data_sets(element_pairs) click to toggle source
# File lib/dom_glancy/analyzer.rb, line 109
def remove_elements_from_data_sets(element_pairs)
  element_pairs.each do |element_1, element_2|
    remove_element_from_data_sets element_1
    remove_element_from_data_sets element_2
  end
end
remove_similar_elements() click to toggle source
# File lib/dom_glancy/analyzer.rb, line 66
def remove_similar_elements
  ok_pairs = similar_pairs(@set_current_not_master, @set_master_not_current)

  ok_pairs.each do |item1, item2|
    @set_current_not_master.delete(item1)
    @set_master_not_current.delete(item2)
  end
end
similar_pairs(set1, set2) click to toggle source
# File lib/dom_glancy/analyzer.rb, line 121
def similar_pairs(set1, set2)
  ok_pairs = []
  set1.each do |item1|
    element1 = DOMElement.new(add_similarity(item1))
    set2.each do |item2|
      element2 = DOMElement.new(add_similarity(item2))
      if element1.same_element?(element2) && element1.close_enough?(element2)
        ok_pairs << [item1, item2]
      end
    end
  end
  ok_pairs
end