class UtilsDrawer::TableDrawer::Table

Public Class Methods

new(min_column_size) click to toggle source
# File lib/utils_drawer/table_drawer/table.rb, line 8
def initialize(min_column_size)
  @rows = []
  @header_column_sizes = []
  @min_column_size = min_column_size
end

Public Instance Methods

add(row) click to toggle source
# File lib/utils_drawer/table_drawer/table.rb, line 14
def add(row)
  # Means the header
  if @rows.size.zero?
    set_header_column_size(row)

  else
    if row.columns.size != @header_column_sizes.size
      fail "Bud number of columns (#{row.columns.size} for #{@header_column_sizes.size})"
    end
  end

  @rows << row
end
to_s() click to toggle source
# File lib/utils_drawer/table_drawer/table.rb, line 28
def to_s
  puts separate

  @rows.each.with_index do |row, index|
    puts format_line(row)
    puts separate if index != @rows.size - 1
  end

  puts separate
end

Private Instance Methods

format_line(row) click to toggle source
# File lib/utils_drawer/table_drawer/table.rb, line 54
def format_line(row)
  line = '| '

  row.columns.each.with_index do |column, index|
    # Ignore ANSI escape sequences
    pure_text = column.text.to_pure

    if pure_text.size < @header_column_sizes[index]
      line << column.text + ' ' * (@header_column_sizes[index] - pure_text.size)

    elsif pure_text.size > @header_column_sizes[index]
      line << column.text[0, @header_column_sizes[index] - 3] + '...'

    else
      line << column.text
    end

    line << ' | ' if index != row.columns.size - 1
  end

  line << ' |'
end
separate() click to toggle source
# File lib/utils_drawer/table_drawer/table.rb, line 77
def separate
  left = middle = right = '+'
  bar = '-'

  left + @header_column_sizes.map { |size| bar * (size + 2) }.join(middle) + right
end
set_header_column_size(row) click to toggle source
# File lib/utils_drawer/table_drawer/table.rb, line 41
def set_header_column_size(row)
  row.columns.each.with_index do |column, index|
    # Ignore ANSI escape sequences
    pure_text = column.text.to_pure

    if pure_text.size > @min_column_size
      @header_column_sizes[index] = pure_text.size
    else
      @header_column_sizes[index] = @min_column_size
    end
  end
end