hirb 0.2.8 → 0.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGELOG.rdoc CHANGED
@@ -1,5 +1,10 @@
1
+ == 0.2.9
2
+ * Added newline filtering and :no_newlines option for table helper.
3
+ * Added default filters for hashes that have hash values.
4
+ * Bug fix for deprecated to_a call.
5
+
1
6
  == 0.2.8
2
- * Added callbacks to Hirb::Helper::Table.
7
+ * Added callbacks to Hirb::Helpers::Table.
3
8
  * Added :change_fields option to Hirb::Helpers::Table.
4
9
  * Added terminal size detection for jruby.
5
10
  * Bug fix for paging long outputs.
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  :major: 0
3
3
  :minor: 2
4
- :patch: 8
4
+ :patch: 9
@@ -2,14 +2,15 @@
2
2
  class Hirb::Helpers::AutoTable
3
3
  # Same options as Hirb::Helpers::Table.render.
4
4
  def self.render(output, options={})
5
- output = output.to_a if !output.is_a?(Array) && output.respond_to?(:to_a)
6
- klass = if ((output.is_a?(Array) && output[0].is_a?(ActiveRecord::Base)) or output.is_a?(ActiveRecord::Base) rescue false)
5
+ options[:_original_class] = output.class
6
+ output = Array(output)
7
+ klass = if (output[0].is_a?(ActiveRecord::Base) rescue false)
7
8
  Hirb::Helpers::ActiveRecordTable
8
- elsif (output.is_a?(Array) && !(output[0].is_a?(Hash) || output[0].is_a?(Array)))
9
+ elsif !(output[0].is_a?(Hash) || output[0].is_a?(Array))
9
10
  Hirb::Helpers::ObjectTable
10
11
  else
11
12
  Hirb::Helpers::Table
12
13
  end
13
14
  klass.render(output, options)
14
15
  end
15
- end
16
+ end
@@ -23,6 +23,35 @@ module Hirb
23
23
  # +-----+--------+
24
24
  #
25
25
  # By default, the fields/columns are the keys of the first hash.
26
+ #
27
+ # === Custom Callbacks
28
+ # Callback methods can be defined to add your own options that modify rows right before they are rendered.
29
+ # Here's an example that allows for searching with a :query option:
30
+ # module Query
31
+ # # Searches fields given a query hash
32
+ # def query_callback(rows, options)
33
+ # return rows unless options[:query]
34
+ # options[:query].map {|field,query|
35
+ # rows.select {|e| e[field].to_s =~ /#{query}/i }
36
+ # }.flatten.uniq
37
+ # end
38
+ # end
39
+ # Hirb::Helpers::Table.send :include, Query
40
+ #
41
+ # >> puts Hirb::Helpers::Table.render [{:name=>'batman'}, {:name=>'robin'}], :query=>{:name=>'rob'}
42
+ # +-------+
43
+ # | name |
44
+ # +-------+
45
+ # | robin |
46
+ # +-------+
47
+ # 1 row in set
48
+ #
49
+ # Callback methods:
50
+ # * must be defined in Helpers::Table and end in '_callback'.
51
+ # * should expect rows and a hash of render options. Rows will be an array of hashes.
52
+ # * are expected to return an array of hashes.
53
+ # * are invoked in alphabetical order.
54
+ # For a thorough example, see {Boson::Pipe}[http://github.com/cldwalker/boson/blob/master/lib/boson/pipe.rb].
26
55
  #--
27
56
  # derived from http://gist.github.com/72234
28
57
  class Helpers::Table
@@ -42,16 +71,19 @@ module Hirb
42
71
  # [:max_width] The maximum allowed width of all fields put together. This option is enforced except when the field_lengths option is set.
43
72
  # This doesn't count field borders as part of the total.
44
73
  # [:number] When set to true, numbers rows by adding a :hirb_number column as the first column. Default is false.
45
- # [:change_fields] A hash to change old field names to new field names. This is useful when wanting to change auto-generated keys to
46
- # more user-friendly names i.e. for array of arrays.
74
+ # [:change_fields] A hash to change old field names to new field names. This can also be an array of new names but only for array rows.
75
+ # This is useful when wanting to change auto-generated keys to more user-friendly names i.e. for array rows.
47
76
  # [: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
48
77
  # a given proc or an array containing a method and optional arguments to it.
49
78
  # [:vertical] When set to true, renders a vertical table using Hirb::Helpers::VerticalTable. Default is false.
50
79
  # [:all_fields] When set to true, renders fields in all rows. Valid only in rows that are hashes. Default is false.
51
80
  # [:description] When set to true, renders row count description at bottom. Default is true.
81
+ # [:no_newlines] When set to true, stringifies newlines so they don't disrupt tables. Default is false for vertical tables
82
+ # and true for anything else.
52
83
  # Examples:
53
84
  # Hirb::Helpers::Table.render [[1,2], [2,3]]
54
85
  # Hirb::Helpers::Table.render [[1,2], [2,3]], :field_lengths=>{0=>10}
86
+ # Hirb::Helpers::Table.render [['a',1], ['b',2]], :change_fields=>%w{letters numbers}
55
87
  # Hirb::Helpers::Table.render [{:age=>10, :weight=>100}, {:age=>80, :weight=>500}]
56
88
  # Hirb::Helpers::Table.render [{:age=>10, :weight=>100}, {:age=>80, :weight=>500}], :headers=>{:weight=>"Weight(lbs)"}
57
89
  # Hirb::Helpers::Table.render [{:age=>10, :weight=>100}, {:age=>80, :weight=>500}], :filters=>{:age=>[:to_f]}
@@ -66,7 +98,8 @@ module Hirb
66
98
 
67
99
  #:stopdoc:
68
100
  def initialize(rows, options={})
69
- @options = {:description=>true, :filters=>{}, :change_fields=>{}}.merge(options)
101
+ @options = {:description=>true, :filters=>{}, :change_fields=>{}, :no_newlines=>true}.merge(options)
102
+ @options[:change_fields] = array_to_indices_hash(@options[:change_fields]) if @options[:change_fields].is_a?(Array)
70
103
  @fields = set_fields(rows)
71
104
  @rows = setup_rows(rows)
72
105
  @headers = @fields.inject({}) {|h,e| h[e] = e.to_s; h}
@@ -235,7 +268,14 @@ module Hirb
235
268
  field_lengths
236
269
  end
237
270
 
271
+ def set_filter_defaults(rows)
272
+ if @options[:_original_class] == Hash && @fields[1] && rows.any? {|e| e[@fields[1]].is_a?(Hash) }
273
+ (@options[:filters] ||= {})[@fields[1]] ||= :inspect
274
+ end
275
+ end
276
+
238
277
  def filter_values(rows)
278
+ set_filter_defaults(rows)
239
279
  rows.map {|row|
240
280
  new_row = {}
241
281
  @fields.each {|f|
@@ -254,6 +294,7 @@ module Hirb
254
294
  rows.each {|row|
255
295
  @fields.each {|f|
256
296
  row[f] = row[f].to_s || ''
297
+ row[f].gsub!("\n", '\n') if @options[:no_newlines]
257
298
  }
258
299
  }
259
300
  end
@@ -3,7 +3,7 @@ class Hirb::Helpers::VerticalTable < Hirb::Helpers::Table
3
3
  # Renders a vertical table using the same options as Hirb::Helpers::Table.render except for :field_lengths,
4
4
  # :vertical and :max_width which aren't used.
5
5
  def self.render(rows, options={})
6
- new(rows, options).render
6
+ new(rows, {:no_newlines=>false}.merge(options)).render
7
7
  end
8
8
 
9
9
  #:stopdoc:
@@ -16,5 +16,32 @@ class Hirb::Helpers::AutoTableTest < Test::Unit::TestCase
16
16
  TABLE
17
17
  Hirb::Helpers::AutoTable.render(::Set.new([1,2,3])).should == expected_table
18
18
  end
19
+
20
+ test "converts hash with any value hashes to inspected values" do
21
+ expected_table = <<-TABLE.unindent
22
+ +---+---------+
23
+ | 0 | 1 |
24
+ +---+---------+
25
+ | c | "ok" |
26
+ | a | {:b=>1} |
27
+ +---+---------+
28
+ 2 rows in set
29
+ TABLE
30
+ Hirb::Helpers::AutoTable.render({:a=>{:b=>1}, :c=>'ok'}).should == expected_table
31
+ end
32
+
33
+ test "doesn't convert hash with value hashes if filter exists for value" do
34
+ expected_table = <<-TABLE.unindent
35
+ +------+-------+
36
+ | name | value |
37
+ +------+-------+
38
+ | c | ok |
39
+ | a | b1 |
40
+ +------+-------+
41
+ 2 rows in set
42
+ TABLE
43
+ Hirb::Helpers::AutoTable.render({:a=>{:b=>1}, :c=>'ok'}, :change_fields=>['name', 'value'],
44
+ :filters=>{'value'=>:to_s}).should == expected_table
45
+ end
19
46
  end
20
47
  end
data/test/table_test.rb CHANGED
@@ -80,6 +80,19 @@ class Hirb::Helpers::TableTest < Test::Unit::TestCase
80
80
  TABLE
81
81
  table([{:name=>"アイウエオカキ"}, {:name=>"クケコサシスセソタチツテ"}, {:name=>"Tata l'asticote"}, {:name=>"toto létoile PAOLI"}]).should == expected_table
82
82
  end
83
+
84
+ test "with newlines renders with newlines stringified" do
85
+ expected_table = <<-TABLE.unindent
86
+ +-----+---+
87
+ | a | b |
88
+ +-----+---+
89
+ | 1#{'\n'} | 2 |
90
+ | 3 | 4 |
91
+ +-----+---+
92
+ 2 rows in set
93
+ TABLE
94
+ table([{'a'=>"1\n", 'b'=>2}, {'a'=>3, 'b'=>4}]).should == expected_table
95
+ end
83
96
  end
84
97
 
85
98
  context "table with" do
@@ -291,6 +304,20 @@ class Hirb::Helpers::TableTest < Test::Unit::TestCase
291
304
  table([{:a=>1, :b=>2}, {:a=>3, :b=>4}], :vertical=>true).should == expected_table
292
305
  end
293
306
 
307
+ test "vertical option renders vertical table with newlines" do
308
+ expected_table = <<-TABLE.unindent
309
+ *** 1. row ***
310
+ a: 1
311
+ b: 2
312
+ *** 2. row ***
313
+ a: 3
314
+ b: 4
315
+ and one
316
+ 2 rows in set
317
+ TABLE
318
+ table([{:a=>1, :b=>2}, {:a=>3, :b=>"4\nand one"}], :vertical=>true).should == expected_table
319
+ end
320
+
294
321
  test "vertical option renders vertical table successively" do
295
322
  expected_table = <<-TABLE.unindent
296
323
  *** 1. row ***
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hirb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.8
4
+ version: 0.2.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gabriel Horner
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-07 00:00:00 -05:00
12
+ date: 2009-11-19 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies: []
15
15