hirb 0.2.2 → 0.2.3
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 +4 -0
- data/VERSION.yml +1 -1
- data/lib/hirb.rb +5 -0
- data/lib/hirb/helpers/table.rb +28 -13
- data/lib/hirb/helpers/vertical_table.rb +2 -2
- data/lib/hirb/pager.rb +4 -4
- data/lib/hirb/string.rb +43 -0
- data/test/formatter_test.rb +3 -3
- data/test/table_test.rb +28 -0
- metadata +3 -2
data/CHANGELOG.rdoc
CHANGED
data/VERSION.yml
CHANGED
data/lib/hirb.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
current_dir = File.dirname(__FILE__)
|
2
2
|
$:.unshift(current_dir) unless $:.include?(current_dir) || $:.include?(File.expand_path(current_dir))
|
3
|
+
|
4
|
+
# Needed by Hirb::String to handle multibyte characters
|
5
|
+
$KCODE = 'u' if RUBY_VERSION < '1.9'
|
6
|
+
|
3
7
|
require 'hirb/util'
|
8
|
+
require 'hirb/string'
|
4
9
|
require 'hirb/hash_struct'
|
5
10
|
require 'hirb/helpers'
|
6
11
|
require 'hirb/view'
|
data/lib/hirb/helpers/table.rb
CHANGED
@@ -24,7 +24,8 @@
|
|
24
24
|
# By default, the fields/columns are the keys of the first hash.
|
25
25
|
#--
|
26
26
|
# derived from http://gist.github.com/72234
|
27
|
-
|
27
|
+
module Hirb
|
28
|
+
class Helpers::Table
|
28
29
|
BORDER_LENGTH = 3 # " | " and "-+-" are the borders
|
29
30
|
class TooManyFieldsForWidthError < StandardError; end
|
30
31
|
|
@@ -44,6 +45,7 @@ class Hirb::Helpers::Table
|
|
44
45
|
# [: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
|
45
46
|
# a given proc or an array containing a method and optional arguments to it.
|
46
47
|
# [:vertical] When set to true, renders a vertical table using Hirb::Helpers::VerticalTable. Default is false.
|
48
|
+
# [:all_fields] When set to true, renders fields in all rows. Valid only in rows that are hashes. Default is false.
|
47
49
|
# Examples:
|
48
50
|
# Hirb::Helpers::Table.render [[1,2], [2,3]]
|
49
51
|
# Hirb::Helpers::Table.render [[1,2], [2,3]], :field_lengths=>{0=>10}
|
@@ -51,11 +53,11 @@ class Hirb::Helpers::Table
|
|
51
53
|
# Hirb::Helpers::Table.render [{:age=>10, :weight=>100}, {:age=>80, :weight=>500}], :headers=>{:weight=>"Weight(lbs)"}
|
52
54
|
# Hirb::Helpers::Table.render [{:age=>10, :weight=>100}, {:age=>80, :weight=>500}], :filters=>{:age=>[:to_f]}
|
53
55
|
def render(rows, options={})
|
54
|
-
options.delete(:vertical) ?
|
56
|
+
options.delete(:vertical) ? Helpers::VerticalTable.render(rows, options) : new(rows, options).render
|
55
57
|
rescue TooManyFieldsForWidthError
|
56
58
|
$stderr.puts "", "** Error: Too many fields for the current width. Configure your width " +
|
57
59
|
"and/or fields to avoid this error. Defaulting to a vertical table. **"
|
58
|
-
|
60
|
+
Helpers::VerticalTable.render(rows, options)
|
59
61
|
end
|
60
62
|
end
|
61
63
|
|
@@ -63,8 +65,7 @@ class Hirb::Helpers::Table
|
|
63
65
|
def initialize(rows, options={})
|
64
66
|
@options = options
|
65
67
|
@options[:filters] ||= {}
|
66
|
-
@fields =
|
67
|
-
rows[0].is_a?(Array) ? (0..rows[0].length - 1).to_a : [])
|
68
|
+
@fields = set_fields(rows)
|
68
69
|
@rows = setup_rows(rows)
|
69
70
|
@headers = @fields.inject({}) {|h,e| h[e] = e.to_s; h}
|
70
71
|
if @options.has_key?(:headers)
|
@@ -76,7 +77,20 @@ class Hirb::Helpers::Table
|
|
76
77
|
@fields.unshift :hirb_number
|
77
78
|
end
|
78
79
|
end
|
79
|
-
|
80
|
+
|
81
|
+
def set_fields(rows)
|
82
|
+
if @options[:fields]
|
83
|
+
@options[:fields].dup
|
84
|
+
else
|
85
|
+
if rows[0].is_a?(Hash)
|
86
|
+
keys = @options[:all_fields] ? rows.map {|e| e.keys}.flatten.uniq : rows[0].keys
|
87
|
+
keys.sort {|a,b| a.to_s <=> b.to_s}
|
88
|
+
else
|
89
|
+
rows[0].is_a?(Array) ? (0..rows[0].length - 1).to_a : []
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
80
94
|
def setup_rows(rows)
|
81
95
|
rows ||= []
|
82
96
|
rows = [rows] unless rows.is_a?(Array)
|
@@ -123,13 +137,13 @@ class Hirb::Helpers::Table
|
|
123
137
|
end
|
124
138
|
|
125
139
|
def format_cell(value, cell_width)
|
126
|
-
text = value
|
140
|
+
text = String.size(value) > cell_width ?
|
127
141
|
(
|
128
|
-
(cell_width < 5) ?
|
142
|
+
(cell_width < 5) ? String.slice(value, 0, cell_width) : String.slice(value, 0, cell_width - 3) + '...'
|
129
143
|
) : value
|
130
|
-
|
144
|
+
String.ljust(text, cell_width)
|
131
145
|
end
|
132
|
-
|
146
|
+
|
133
147
|
def render_rows
|
134
148
|
@rows.map do |row|
|
135
149
|
row = '| ' + @fields.map {|f|
|
@@ -148,7 +162,7 @@ class Hirb::Helpers::Table
|
|
148
162
|
if @options[:field_lengths]
|
149
163
|
@field_lengths.merge!(@options[:field_lengths])
|
150
164
|
else
|
151
|
-
table_max_width = @options.has_key?(:max_width) ? @options[:max_width] :
|
165
|
+
table_max_width = @options.has_key?(:max_width) ? @options[:max_width] : View.width
|
152
166
|
restrict_field_lengths(@field_lengths, table_max_width) if table_max_width
|
153
167
|
end
|
154
168
|
end
|
@@ -200,10 +214,10 @@ class Hirb::Helpers::Table
|
|
200
214
|
|
201
215
|
# find max length for each field; start with the headers
|
202
216
|
def default_field_lengths
|
203
|
-
field_lengths = @headers ? @headers.inject({}) {|h,(k,v)| h[k] = v
|
217
|
+
field_lengths = @headers ? @headers.inject({}) {|h,(k,v)| h[k] = String.size(v); h} : {}
|
204
218
|
@rows.each do |row|
|
205
219
|
@fields.each do |field|
|
206
|
-
len = row[field]
|
220
|
+
len = String.size(row[field])
|
207
221
|
field_lengths[field] = len if len > field_lengths[field].to_i
|
208
222
|
end
|
209
223
|
end
|
@@ -239,3 +253,4 @@ class Hirb::Helpers::Table
|
|
239
253
|
end
|
240
254
|
#:startdoc:
|
241
255
|
end
|
256
|
+
end
|
@@ -16,12 +16,12 @@ class Hirb::Helpers::VerticalTable < Hirb::Helpers::Table
|
|
16
16
|
|
17
17
|
def render_rows
|
18
18
|
i = 0
|
19
|
-
longest_header = @headers.values.sort_by {|e| e
|
19
|
+
longest_header = Hirb::String.size @headers.values.sort_by {|e| Hirb::String.size(e) }.last
|
20
20
|
stars = "*" * [(longest_header + (longest_header / 2)), 3].max
|
21
21
|
@rows.map do |row|
|
22
22
|
row = "#{stars} #{i+1}. row #{stars}\n" +
|
23
23
|
@fields.map {|f|
|
24
|
-
"#{@headers[f]
|
24
|
+
"#{Hirb::String.rjust(@headers[f], longest_header)}: #{row[f]}"
|
25
25
|
}.join("\n")
|
26
26
|
i+= 1
|
27
27
|
row
|
data/lib/hirb/pager.rb
CHANGED
@@ -71,8 +71,8 @@ module Hirb
|
|
71
71
|
def slice!(output, inspect_mode=false) #:nodoc:
|
72
72
|
effective_height = @height - 2 # takes into account pager prompt
|
73
73
|
if inspect_mode
|
74
|
-
sliced_output =
|
75
|
-
output.replace
|
74
|
+
sliced_output = String.slice(output, 0, @width * effective_height)
|
75
|
+
output.replace String.slice(output, @width * effective_height, String.size(output))
|
76
76
|
sliced_output
|
77
77
|
else
|
78
78
|
# could use output.scan(/[^\n]*\n?/) instead of split
|
@@ -84,11 +84,11 @@ module Hirb
|
|
84
84
|
|
85
85
|
# Determines if string should be paged based on configured width and height.
|
86
86
|
def activated_by?(string_to_page, inspect_mode=false)
|
87
|
-
inspect_mode ? (
|
87
|
+
inspect_mode ? (String.size(string_to_page) > @height * @width) : (string_to_page.count("\n") > @height)
|
88
88
|
end
|
89
89
|
|
90
90
|
def resize(width, height) #:nodoc:
|
91
|
-
@width, @height =
|
91
|
+
@width, @height = View.determine_terminal_size(width, height)
|
92
92
|
end
|
93
93
|
end
|
94
94
|
end
|
data/lib/hirb/string.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
module Hirb
|
2
|
+
# Provides string helpers to deal with UTF-8 and ruby 1.8.x
|
3
|
+
module String
|
4
|
+
extend self
|
5
|
+
# :stopdoc:
|
6
|
+
if RUBY_VERSION < '1.9'
|
7
|
+
def size(string)
|
8
|
+
string.scan(/./).length
|
9
|
+
end
|
10
|
+
|
11
|
+
def ljust(string, desired_length)
|
12
|
+
leftover = desired_length - size(string)
|
13
|
+
leftover > 0 ? string + " " * leftover : string
|
14
|
+
end
|
15
|
+
|
16
|
+
def rjust(string, desired_length)
|
17
|
+
leftover = desired_length - size(string)
|
18
|
+
leftover > 0 ? " " * leftover + string : string
|
19
|
+
end
|
20
|
+
|
21
|
+
def slice(string, start, finish)
|
22
|
+
string.scan(/./).slice(start, finish).join('')
|
23
|
+
end
|
24
|
+
else
|
25
|
+
def size(string)
|
26
|
+
string.length
|
27
|
+
end
|
28
|
+
|
29
|
+
def ljust(string, desired_length)
|
30
|
+
string.ljust(desired_length)
|
31
|
+
end
|
32
|
+
|
33
|
+
def rjust(string, desired_length)
|
34
|
+
string.rjust(desired_length)
|
35
|
+
end
|
36
|
+
|
37
|
+
def slice(*args)
|
38
|
+
string.slice(*args)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
#:startdoc:
|
42
|
+
end
|
43
|
+
end
|
data/test/formatter_test.rb
CHANGED
@@ -12,17 +12,17 @@ class FormatterTest < Test::Unit::TestCase
|
|
12
12
|
test "klass_config merges ancestor options" do
|
13
13
|
set_formatter "String"=>{:args=>[1,2]}, "Object"=>{:method=>:object_output, :ancestor=>true}, "Kernel"=>{:method=>:default_output}
|
14
14
|
expected_result = {:method=>:object_output, :args=>[1, 2], :ancestor=>true}
|
15
|
-
@formatter.klass_config(String).should == expected_result
|
15
|
+
@formatter.klass_config(::String).should == expected_result
|
16
16
|
end
|
17
17
|
|
18
18
|
test "klass_config doesn't merge ancestor options" do
|
19
19
|
set_formatter "String"=>{:args=>[1,2]}, "Object"=>{:method=>:object_output}, "Kernel"=>{:method=>:default_output}
|
20
20
|
expected_result = {:args=>[1, 2]}
|
21
|
-
@formatter.klass_config(String).should == expected_result
|
21
|
+
@formatter.klass_config(::String).should == expected_result
|
22
22
|
end
|
23
23
|
|
24
24
|
test "klass_config returns hash when nothing found" do
|
25
|
-
set_formatter.klass_config(String).should == {}
|
25
|
+
set_formatter.klass_config(::String).should == {}
|
26
26
|
end
|
27
27
|
|
28
28
|
test "reload detects new Hirb::Views" do
|
data/test/table_test.rb
CHANGED
@@ -65,6 +65,21 @@ class Hirb::Helpers::TableTest < Test::Unit::TestCase
|
|
65
65
|
test "with no rows renders" do
|
66
66
|
table([]).should == "0 rows in set"
|
67
67
|
end
|
68
|
+
|
69
|
+
test "renders utf8" do
|
70
|
+
expected_table = <<-TABLE.unindent
|
71
|
+
+--------------------+
|
72
|
+
| name |
|
73
|
+
+--------------------+
|
74
|
+
| アイウエオカキ |
|
75
|
+
| クケコサシスセソタチツテ |
|
76
|
+
| Tata l'asticote |
|
77
|
+
| toto létoile PAOLI |
|
78
|
+
+--------------------+
|
79
|
+
4 rows in set
|
80
|
+
TABLE
|
81
|
+
table([{:name=>"アイウエオカキ"}, {:name=>"クケコサシスセソタチツテ"}, {:name=>"Tata l'asticote"}, {:name=>"toto létoile PAOLI"}]).should == expected_table
|
82
|
+
end
|
68
83
|
end
|
69
84
|
|
70
85
|
context "table with" do
|
@@ -263,6 +278,19 @@ class Hirb::Helpers::TableTest < Test::Unit::TestCase
|
|
263
278
|
TABLE
|
264
279
|
table([{:a=>1, :b=>2}, {:a=>3, :b=>4}], :vertical=>true).should == expected_table
|
265
280
|
end
|
281
|
+
|
282
|
+
test "all_fields option renders all fields" do
|
283
|
+
expected_table = <<-TABLE.unindent
|
284
|
+
+---+---+---+
|
285
|
+
| a | b | c |
|
286
|
+
+---+---+---+
|
287
|
+
| 1 | 2 | |
|
288
|
+
| 3 | | 4 |
|
289
|
+
+---+---+---+
|
290
|
+
2 rows in set
|
291
|
+
TABLE
|
292
|
+
table([{:a=>1, :b=>2}, {:a=>3, :c=>4}], :all_fields=>true).should == expected_table
|
293
|
+
end
|
266
294
|
end
|
267
295
|
|
268
296
|
test "restrict_field_lengths ensures columns total doesn't exceed max width" do
|
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.
|
4
|
+
version: 0.2.3
|
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-
|
12
|
+
date: 2009-07-08 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -43,6 +43,7 @@ files:
|
|
43
43
|
- lib/hirb/import_object.rb
|
44
44
|
- lib/hirb/menu.rb
|
45
45
|
- lib/hirb/pager.rb
|
46
|
+
- lib/hirb/string.rb
|
46
47
|
- lib/hirb/util.rb
|
47
48
|
- lib/hirb/view.rb
|
48
49
|
- lib/hirb/views/activerecord_base.rb
|