class Legitable::Table

Attributes

delimiter[R]
format[R]
headers[R]
rows[R]
separator[R]
style[R]

Public Class Methods

new(alignment: {}, delimiter: ' | ', separator: '-', style: nil, &block) click to toggle source
# File lib/legitable/table.rb, line 7
def initialize(alignment: {}, delimiter: ' | ', separator: '-', style: nil, &block)
  @rows = []
  @headers = []
  @format = {}
  @formatters = {}
  @alignment = alignment
  @delimiter = delimiter
  @separator = separator
  @style = style

  if style == :markdown
    @delimiter = ' | '
    @separator = '-'
  end

  self.instance_eval(&block) unless block.nil?
end

Public Instance Methods

<<(row) click to toggle source
# File lib/legitable/table.rb, line 25
def <<(row)
  initialize_headers(row) if headers.empty?
  add_row row
  self
end
to_s() click to toggle source
# File lib/legitable/table.rb, line 31
    def to_s
      <<-EOS
#{render_headers}
#{render_rows}
      EOS
    end

Private Instance Methods

add_row(row) click to toggle source
# File lib/legitable/table.rb, line 51
def add_row(row)
  rows << headers.inject({}) do |memo, header|
    formatter = format[header].formatter
    value = formatter.call(row[header].to_s).to_s
    if format[header].width < value.length
      format[header].width = value.length
    end
    memo[header] = value
    memo
  end
end
default_formatter() click to toggle source
# File lib/legitable/table.rb, line 106
def default_formatter
  @default_formatter ||= Proc.new {|value| value.to_s }
end
default_header_formatter() click to toggle source
# File lib/legitable/table.rb, line 118
def default_header_formatter
  @default_header_formatter ||= Proc.new { |header| header.to_s.upcase }
end
formatting(header, &block) click to toggle source
# File lib/legitable/table.rb, line 102
def formatting(header, &block)
  @formatters[header] = block ? block : default_formatter
end
formatting_headers(&block) click to toggle source
# File lib/legitable/table.rb, line 110
def formatting_headers(&block)
  @header_formatter = block
end
header_formatter() click to toggle source
# File lib/legitable/table.rb, line 114
def header_formatter
  @header_formatter ||= default_header_formatter
end
initialize_headers(row) click to toggle source
# File lib/legitable/table.rb, line 40
def initialize_headers(row)
  @headers = row.keys
  headers.each do |header|
    format[header] = OpenStruct.new(
      width: header.to_s.length,
      formatter: @formatters[header] || default_formatter,
      align: @alignment[header] || :left
    )
  end
end
render_cell(header, value) click to toggle source
# File lib/legitable/table.rb, line 94
def render_cell(header, value)
  cell_width = format[header].width

  (format[header].align == :right) ?
    value.rjust(cell_width, ' ') :
    value.to_s + (' ' * (cell_width - value.to_s.length))
end
render_headers() click to toggle source
# File lib/legitable/table.rb, line 63
def render_headers
  headers.map do |header|
    render_cell(header, header_formatter.call(header))
  end.join(delimiter) + "\n" + render_separator
end
render_row(row) click to toggle source
# File lib/legitable/table.rb, line 80
def render_row(row)
  headers.map { |header| render_cell header, row[header] }.join(delimiter)
end
render_rows() click to toggle source
# File lib/legitable/table.rb, line 76
def render_rows
  rows.map { |row| render_row(row) }.join("\n")
end
render_separator() click to toggle source
# File lib/legitable/table.rb, line 84
def render_separator
  if style == :markdown
    headers.map do |header|
      separator * format[header].width
    end.join('-|-')
  else
    separator * row_width
  end
end
row_width() click to toggle source
# File lib/legitable/table.rb, line 69
def row_width
  width = (headers.size - 1) * delimiter.length
  headers.sum(width) do |header|
    format[header].width
  end
end