diff --git a/README.rdoc b/README.rdoc index c929211..46509b1 100644 --- a/README.rdoc +++ b/README.rdoc @@ -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]. diff --git a/lib/hirb/helpers.rb b/lib/hirb/helpers.rb index 50ff4ac..7e08ea4 100644 --- a/lib/hirb/helpers.rb +++ b/lib/hirb/helpers.rb @@ -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 \ No newline at end of file diff --git a/lib/hirb/helpers/table.rb b/lib/hirb/helpers/table.rb index 4310b74..78da5cf 100644 --- a/lib/hirb/helpers/table.rb +++ b/lib/hirb/helpers/table.rb @@ -43,6 +43,7 @@ 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} @@ -50,7 +51,7 @@ class << self # 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 @@ -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(' | ') + ' |' diff --git a/lib/hirb/helpers/vertical_table.rb b/lib/hirb/helpers/vertical_table.rb new file mode 100644 index 0000000..e5b554f --- /dev/null +++ b/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 \ No newline at end of file diff --git a/test/table_test.rb b/test/table_test.rb index 5e5e4e8..8a1eee0 100644 --- a/test/table_test.rb +++ b/test/table_test.rb @@ -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