Module: Sequel::PrettyTable

Defined in:
lib/sequel_model/pretty_table.rb

Overview

Prints nice-looking plain-text tables --——-+ |id|name | |–+——-| |1 |fasdfas| |2 |test | --——-+

Class Method Summary collapse

Class Method Details

.column_sizes(records, columns) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/sequel_model/pretty_table.rb', line 22

def self.column_sizes(records, columns)
  sizes = Hash.new {0}
  columns.each do |c|
    s = c.to_s.size
    sizes[c.to_sym] = s if s > sizes[c.to_sym]
  end
  records.each do |r|
    columns.each do |c|
      s = r[c].to_s.size
      sizes[c.to_sym] = s if s > sizes[c.to_sym]
    end
  end
  sizes
end

.data_line(columns, sizes, record) ⇒ Object



53
54
55
# File 'lib/sequel_model/pretty_table.rb', line 53

def self.data_line(columns, sizes, record)
  '|' + columns.map {|c| format_cell(sizes[c], record[c])}.join('|') + '|'
end

.format_cell(size, v) ⇒ Object



42
43
44
45
46
47
48
49
50
51
# File 'lib/sequel_model/pretty_table.rb', line 42

def self.format_cell(size, v)
  case v
  when Bignum, Fixnum
    "%#{size}d" % v
  when Float
    "%#{size}g" % v
  else
    "%-#{size}s" % v.to_s
  end
end

.header_line(columns, sizes) ⇒ Object



57
58
59
# File 'lib/sequel_model/pretty_table.rb', line 57

def self.header_line(columns, sizes)
  '|' + columns.map {|c| "%-#{sizes[c]}s" % c.to_s}.join('|') + '|'
end

records is an array of hashes



61
62
63
64
65
66
67
68
69
70
# File 'lib/sequel_model/pretty_table.rb', line 61

def self.print(records, columns = nil) # records is an array of hashes
  columns ||= records_columns(records)
  sizes = column_sizes(records, columns)
  
  puts separator_line(columns, sizes)
  puts header_line(columns, sizes)
  puts separator_line(columns, sizes)
  records.each {|r| puts data_line(columns, sizes, r)}
  puts separator_line(columns, sizes)
end

.records_columns(records) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
# File 'lib/sequel_model/pretty_table.rb', line 10

def self.records_columns(records)
  columns = []
  records.each do |r|
    if Array === r && (k = r.keys)
      return k
    elsif Hash === r
      r.keys.each {|k| columns << k unless columns.include?(k)}
    end
  end
  columns
end

.separator_line(columns, sizes) ⇒ Object



37
38
39
40
# File 'lib/sequel_model/pretty_table.rb', line 37

def self.separator_line(columns, sizes)
  l = ''
  '+' + columns.map {|c| '-' * sizes[c]}.join('+') + '+'
end