class Kontena::Cli::TableGenerator

Constants

DEFAULT_HEADER_FORMAT_PROC
DEFAULT_RENDER_OPTS

Attributes

data[R]
fields[R]
header[R]
header_format_proc[R]
render_mode[R]
render_options[R]
row_format_proc[R]

Public Class Methods

new(data, fields = nil, row_format_proc: nil, header_format_proc: nil, render_options: nil) click to toggle source

@param data [Array<Hash>,Array<Array>] an array of hashes or arrays @param fields [Array] an array of field names found in the data hashes. @param fields [Hash] a hash of field_title => field_name_in_the_data_hash, for example 'Users' => 'user_count' @param fields [NilClass] try to auto detect fields (all fields!) from the data hashes @return [TTY::Table]

# File lib/kontena/cli/table_generator.rb, line 49
def initialize(data, fields = nil, row_format_proc: nil, header_format_proc: nil, render_options: nil)
  @data = data
  @render_options = render_options || { }
  @render_mode = @render_options.delete(:mode) || :basic
  @row_format_proc = row_format_proc
  @header_format_proc = header_format_proc || DEFAULT_HEADER_FORMAT_PROC
  @fields = parse_fields(fields)
  @header = generate_header(fields || @fields)
end

Public Instance Methods

create_table(header, rows) click to toggle source
# File lib/kontena/cli/table_generator.rb, line 59
def create_table(header, rows)
  TTY::Table.new(
    header: header,
    rows: rows
  )
end
detect_fields() click to toggle source

Collect all the unique keys from the hashes if the data is an array of hashes.

# File lib/kontena/cli/table_generator.rb, line 95
def detect_fields
  if data.first.respond_to?(:keys)
    data.flat_map(&:keys).uniq
  else
    []
  end
end
format_header_item(field_name) click to toggle source
# File lib/kontena/cli/table_generator.rb, line 85
def format_header_item(field_name)
  header_format_proc.call(field_name)
end
format_row(row) click to toggle source
# File lib/kontena/cli/table_generator.rb, line 78
def format_row(row)
  return row if row_format_proc.nil?
  row_clone = row.dup
  row_format_proc.call(row_clone)
  row_clone
end
generate_header(fields) click to toggle source
# File lib/kontena/cli/table_generator.rb, line 113
def generate_header(fields)
  if fields.kind_of?(Hash)
    header = fields.keys
  else
    header = Array(fields)
  end

  if header.size < 2
    nil
  else
    header.map { |head| format_header_item(head) }
  end
end
parse_fields(fields) click to toggle source
# File lib/kontena/cli/table_generator.rb, line 103
def parse_fields(fields)
  if fields.nil? || fields.empty?
    detect_fields
  elsif fields.kind_of?(Hash)
    fields.values
  else
    fields
  end
end
render() click to toggle source
# File lib/kontena/cli/table_generator.rb, line 70
def render
  if data.empty?
    fields.size > 1 ? fields.map(&method(:format_header_item)).join('  ') : ''
  else
    table.render(render_mode, render_options).gsub(/\s+$/, '')
  end
end
rows() click to toggle source
# File lib/kontena/cli/table_generator.rb, line 89
def rows
  fields.empty? ? data.map { |row| format_row(row).map(&:values) } : data.map { |row| format_row(row).values_at(*fields) }
end
table() click to toggle source
# File lib/kontena/cli/table_generator.rb, line 66
def table
  create_table(header, rows)
end