Module: DBI::Utils::TableFormatter
- Defined in:
- lib/dbi/utils/tableformatter.rb
Overview
Formats a resultset in a textual table, suitable for printing.
Class Method Summary collapse
-
.ascii(header, rows, header_orient = :left, rows_orient = :left, indent = 2, cellspace = 1, pagebreak_after = nil, output = STDOUT) ⇒ Object
Perform the formatting.
-
.coerce(obj) ⇒ Object
:nodoc:.
Class Method Details
.ascii(header, rows, header_orient = :left, rows_orient = :left, indent = 2, cellspace = 1, pagebreak_after = nil, output = STDOUT) ⇒ Object
Perform the formatting.
-
header
: table headers, as you’d expect they correspond to each column in the row. -
rows
: array of array (or DBI::Row) which represent the data. -
header_orient
: jusification of the header. :left, :right, or :center. -
rows_orient
: justification of the rows. same asheader_orient
. -
indent
: number of spaces to indent each line in the output. -
cellspace
: number of spaces to pad the cell on the left and right. -
pagebreak_after
: introduce a pagebreak eachn
rows. -
output
: object that responds to ‘<<` which will contain the output. Default is STDOUT.
If a block is provided, output
will be yielded each row if pagebreak
is nil, otherwise it will be yielded when the output is complete. – TODO: add a nr-column where the number of the column is shown ++
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/dbi/utils/tableformatter.rb', line 30 def self.ascii(header, rows, header_orient=:left, rows_orient=:left, indent=2, cellspace=1, pagebreak_after=nil, output=STDOUT) if rows.size == 0 or rows[0].size == 0 output.puts "No rows selected" return end header_orient ||= :left rows_orient ||= :left indent ||= 2 cellspace ||= 1 # pagebreak_after n-rows (without counting header or split-lines) # yield block with output as param after each pagebreak (not at the end) col_lengths = (0...(header.size)).collect do |colnr| [ (0...rows.size).collect { |rownr| value = rows[rownr][colnr] coerce(value).size }.max, header[colnr].size ].max end indent = " " * indent split_line = indent + "+" col_lengths.each {|col| split_line << "-" * (col+cellspace*2) + "+" } cellspace = " " * cellspace output_row = proc {|row, orient| output << indent + "|" row.each_with_index {|c,i| output << cellspace str = coerce(c) output << case orient when :left then str.ljust(col_lengths[i]) when :right then str.rjust(col_lengths[i]) when :center then str.center(col_lengths[i]) end output << cellspace output << "|" } output << "\n" } rownr = 0 loop do output << split_line + "\n" output_row.call(header, header_orient) output << split_line + "\n" if pagebreak_after.nil? rows.each {|ar| output_row.call(ar, rows_orient)} output << split_line + "\n" break end rows[rownr,pagebreak_after].each {|ar| output_row.call(ar, rows_orient)} output << split_line + "\n" rownr += pagebreak_after break if rownr >= rows.size yield output if block_given? end end |
.coerce(obj) ⇒ Object
:nodoc:
6 7 8 9 10 11 |
# File 'lib/dbi/utils/tableformatter.rb', line 6 def self.coerce(obj) # :nodoc: # FIXME this is probably short-sighted. obj = "NULL" if obj.nil? obj = (obj.kind_of?(Array) or obj.kind_of?(Hash)) ? obj.inspect : obj.to_s return obj end |