lib/table.rb in table_pal-0.3.1 vs lib/table.rb in table_pal-0.3.2

- old
+ new

@@ -1,14 +1,16 @@ module TablePal class Table - attr_reader :rows, :columns, :cells + attr_reader :validations, :rows, :columns, :cells_by_row_and_column, :cells_by_column - def initialize - @rows = [] - @columns = [] - @cells = [] + def initialize(validations: false) + @validations = validations + @rows = [] + @columns = [] + @cells_by_column = {} + @cells_by_row_and_column = {} end def create_row(options = {}) Validate.new(__method__, options) @@ -20,35 +22,49 @@ def create_underline Row.new(table: self).cells_as_underline end def create_column(options = {}) - Validate.new(__method__, options) + Validate.new(__method__, options) if validations Column.new(options.merge(table: self)).tap do |column| + cells_by_column[column] = [] @columns << column end end def create_cell(options = {}) - Validate.new(__method__, options) + Validate.new(__method__, options) if validations - ensure_cell_does_not_exist(options.slice(:row, :column)) + row = options[:row] + column = options[:column] + ensure_cell_does_not_exist(row: row, column: column) + Cell.new(options).tap do |cell| - @cells << cell + cells_by_column[column] << cell + cells_by_row_and_column[key(options)] = cell end end - def find_cell(row:, column:) - cells.find { |cell| cell.row == row && cell.column == column } + def find_cell(options) + cells_by_row_and_column[key(options)] end + def key(options) + { + row: options[:row], + column: options[:column] + } + end + def select_cells(column:) - cells.select { |cell| cell.column == column } + cells_by_column[column] end def ensure_cell_does_not_exist(row:, column:) + return unless validations + cell = find_cell(row: row, column: column) return unless cell raise TablePalError, "Cell with content: '#{cell.content}' already exists at this row and column."