lib/chop/table.rb in chop-0.8.0 vs lib/chop/table.rb in chop-0.9.0
- old
+ new
@@ -1,78 +1,90 @@
-require "delegate"
-
+require "active_support/core_ext/object/blank"
+
module Chop
- class Table < SimpleDelegator
- def self.diff! table, &block
- klass = Class.new(self) do
- class_attribute :cell_transformers
- self.cell_transformers = []
+ class Table < Struct.new(:selector, :table, :session, :block)
+ def self.diff! selector, table, session: Capybara.current_session, &block
+ new(selector, table, session, block).diff!
+ end
- def self.cell index, &block
- cell_transformers[index] = block
- end
+ attr_accessor :transformations
- def cell_to_text cell, index
- if transformer = cell_transformers[index]
- transformer.call cell
- else
- super
- end
- end
-
- instance_eval &block if block_given?
- end
-
- klass.new.diff! table
+ def initialize(selector = "table", table = nil, session = Capybara.current_session, block = nil, &other_block)
+ super
+ self.transformations = []
+ instance_eval &block if block.respond_to?(:call)
+ instance_eval &other_block if block_given?
end
- def initialize selector = "table", session: Capybara.current_session
- super(session)
- @selector = selector
- end
-
def header_elements
rows("thead")
end
def header
- header_elements.collect do |row|
+ header_elements.map do |row|
row.all(:xpath, "./*").map(&:text)
end
end
def body_elements
rows("tbody")
end
def body
- body_elements.collect do |row|
+ body_elements.map do |row|
row_to_text(row)
end
end
- def to_a
+ def base_to_a
header + body
end
def normalized_to_a
- raw = to_a
+ raw = base_to_a
max = raw.map(&:count).max
raw.select { |row| row.count == max }
end
- def diff! table
- table.diff! normalized_to_a
+ def to_a
+ results = normalized_to_a
+ transformations.each { |transformation| transformation.call(results) }
+ results
end
+ def transformation &block
+ transformations << block
+ end
+
+ def diff! cucumber_table = table
+ cucumber_table.diff! to_a
+ end
+
+ def hashes
+ rows = to_a.dup
+ header = rows.shift
+ rows.map do |row|
+ Hash[header.zip(row)]
+ end
+ end
+
+ def allow_not_found
+ @allow_not_found = true
+ end
+
private
def rows parent = nil
node.all("#{parent} tr")
end
def node
- @node ||= find(@selector)
+ @node ||= begin
+ session.find(selector)
+ rescue Capybara::ElementNotFound
+ raise unless @allow_not_found
+ Capybara::Node::Simple.new("")
+ end
end
def row_to_text row
row.all(:xpath, "./*").map.with_index do |cell, index|
cell_to_text cell, index