Skip to content

Commit

Permalink
cldwalker#5: added vertical table helper thanks to @chrononaut
Browse files Browse the repository at this point in the history
  • Loading branch information
cldwalker committed Jun 29, 2009
1 parent 84d51a6 commit 38eb74f
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 5 deletions.
3 changes: 3 additions & 0 deletions README.rdoc
Expand Up @@ -149,6 +149,9 @@ If using Wirble, you should call Hirb after it since they both override irb's de
Table code from http://gist.github.com/72234 and {my console
app's needs}[http://github.com/cldwalker/tag-tree].

== Credits
Chrononaut for vertical table helper.

== Bugs/Issues
Please report them {on github}[http://github.com/cldwalker/hirb/issues].

Expand Down
2 changes: 1 addition & 1 deletion lib/hirb/helpers.rb
Expand Up @@ -2,6 +2,6 @@ module Hirb
module Helpers #:nodoc:
end
end
%w{table object_table active_record_table auto_table tree parent_child_tree}.each do |e|
%w{table object_table active_record_table auto_table tree parent_child_tree vertical_table}.each do |e|
require "hirb/helpers/#{e}"
end
17 changes: 13 additions & 4 deletions lib/hirb/helpers/table.rb
Expand Up @@ -43,14 +43,15 @@ class << self
# [:number] When set to true, numbers rows by adding a :hirb_number column as the first column. Default is false.
# [:filters] A hash of fields and the filters that each row in the field must run through. The filter converts the cell's value by applying
# a given proc or an array containing a method and optional arguments to it.
# [:vertical] When set to true, renders a vertical table using Hirb::Helpers::VerticalTable. Default is false.
# Examples:
# Hirb::Helpers::Table.render [[1,2], [2,3]]
# Hirb::Helpers::Table.render [[1,2], [2,3]], :field_lengths=>{0=>10}
# Hirb::Helpers::Table.render [{:age=>10, :weight=>100}, {:age=>80, :weight=>500}]
# Hirb::Helpers::Table.render [{:age=>10, :weight=>100}, {:age=>80, :weight=>500}], :headers=>{:weight=>"Weight(lbs)"}
# Hirb::Helpers::Table.render [{:age=>10, :weight=>100}, {:age=>80, :weight=>500}], :filters=>{:age=>[:to_f]}
def render(rows, options={})
new(rows,options).render
options.delete(:vertical) ? Hirb::Helpers::VerticalTable.new(rows, options).render : new(rows, options).render
end
end

Expand Down Expand Up @@ -90,15 +91,23 @@ def render
body = []
unless @rows.length == 0
setup_field_lengths
body += @headers ? render_header : [render_border]
body += render_header
body += render_rows
body << render_border
body += render_footer
end
body << render_table_description
body.join("\n")
end

def render_header
@headers ? render_table_header : [render_border]
end

def render_footer
[render_border]
end

def render_table_header
title_row = '| ' + @fields.map {|f|
format_cell(@headers[f], @field_lengths[f])
}.join(' | ') + ' |'
Expand Down
31 changes: 31 additions & 0 deletions lib/hirb/helpers/vertical_table.rb
@@ -0,0 +1,31 @@
class Hirb::Helpers::VerticalTable < Hirb::Helpers::Table

# Renders a vertical table using the same options as Hirb::Helpers::Table.render except for :field_lengths,
# :vertical and :max_width which aren't used.
def self.render(rows, options={})
new(rows, options).render
end

#:stopdoc:
def setup_field_lengths
@field_lengths = default_field_lengths
end

def render_header; []; end
def render_footer; []; end

def render_rows
i = 0
longest_header = @headers.values.sort_by {|e| e.length}.last.length
stars = "*" * [(longest_header + (longest_header / 2)), 3].max
@rows.map do |row|
row = "#{stars} #{i+1}. row #{stars}\n" +
@fields.map {|f|
"#{@headers[f].rjust(longest_header)}: #{row[f]}"
}.join("\n")
i+= 1
row
end
#:startdoc:
end
end
13 changes: 13 additions & 0 deletions test/table_test.rb
Expand Up @@ -248,6 +248,19 @@ def table(*args)
TABLE
table([['a','b'], ['c', 'd']], :number=>true).should == expected_table
end

test "vertical option renders vertical table" do
expected_table = <<-TABLE.unindent
*** 1. row ***
a: 1
b: 2
*** 2. row ***
a: 3
b: 4
2 rows in set
TABLE
table([{:a=>1, :b=>2}, {:a=>3, :b=>4}], :vertical=>true).should == expected_table
end
end

test "restrict_field_lengths ensures columns total doesn't exceed max width" do
Expand Down

0 comments on commit 38eb74f

Please sign in to comment.