formatador 0.2.1 → 0.2.2
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/README.rdoc +27 -0
- data/formatador.gemspec +2 -2
- data/lib/formatador.rb +1 -1
- data/lib/formatador/progressbar.rb +2 -2
- data/lib/formatador/table.rb +32 -12
- data/tests/basic_tests.rb +2 -1
- data/tests/table_tests.rb +40 -5
- data/tests/tests_helper.rb +1 -0
- metadata +39 -59
data/README.rdoc
CHANGED
@@ -27,6 +27,33 @@ You use tags, similar to html, to set formatting options:
|
|
27
27
|
* display_compact_table: Same as display_table, execpt that split lines are not drawn by default in the body of the table. If you need a split line, put a :split constant in the body array.
|
28
28
|
* redisplay_progressbar: takes the current and total values as its first two arguments and redisplays a progressbar (until current = total and then it display_lines). An optional third argument represents the start time and will add an elapsed time counter.
|
29
29
|
|
30
|
+
=== Table examples
|
31
|
+
|
32
|
+
table_data = [{:name => "Joe", :food => "Burger"}, {:name => "Bill", :food => "French fries"}]
|
33
|
+
Formatador.display_table(table_data)
|
34
|
+
|
35
|
+
+------+--------------+
|
36
|
+
| name | food |
|
37
|
+
+------+--------------+
|
38
|
+
| Joe | Burger |
|
39
|
+
+------+--------------+
|
40
|
+
| Bill | French fries |
|
41
|
+
+------+--------------+
|
42
|
+
|
43
|
+
table_data = [
|
44
|
+
{:name => "Joe", :meal => {:main_dish => "Burger", :drink => "water"},
|
45
|
+
{:name => "Bill", :meal => {:main_dish => "Chicken", drink => "soda"}
|
46
|
+
]
|
47
|
+
Formatador.display_table(table_data, [:name, :"meal.drink"])
|
48
|
+
|
49
|
+
+------+------------+
|
50
|
+
| name | meal.drink |
|
51
|
+
+------+------------+
|
52
|
+
| Joe | water |
|
53
|
+
+------+------------+
|
54
|
+
| Bill | soda |
|
55
|
+
+------+------------+
|
56
|
+
|
30
57
|
== Indentation
|
31
58
|
|
32
59
|
By initializing a formatador object you can keep track of indentation:
|
data/formatador.gemspec
CHANGED
@@ -13,8 +13,8 @@ Gem::Specification.new do |s|
|
|
13
13
|
## If your rubyforge_project name is different, then edit it and comment out
|
14
14
|
## the sub! line in the Rakefile
|
15
15
|
s.name = 'formatador'
|
16
|
-
s.version = '0.2.
|
17
|
-
s.date = '
|
16
|
+
s.version = '0.2.2'
|
17
|
+
s.date = '2012-05-16'
|
18
18
|
s.rubyforge_project = 'formatador'
|
19
19
|
|
20
20
|
## Make sure your summary is short. The description may be as long
|
data/lib/formatador.rb
CHANGED
@@ -4,9 +4,9 @@ class Formatador
|
|
4
4
|
options = { :color => 'white', :width => 50, :new_line => true }.merge!(options)
|
5
5
|
data = progressbar(current, total, options)
|
6
6
|
if current < total
|
7
|
-
redisplay(data)
|
7
|
+
redisplay(data, options[:width])
|
8
8
|
else
|
9
|
-
redisplay("#{data}")
|
9
|
+
redisplay("#{data}", options[:width])
|
10
10
|
if options[:new_line]
|
11
11
|
new_line
|
12
12
|
end
|
data/lib/formatador/table.rb
CHANGED
@@ -10,54 +10,61 @@ class Formatador
|
|
10
10
|
def display_compact_table(hashes, keys = nil, &block)
|
11
11
|
headers = keys || []
|
12
12
|
widths = {}
|
13
|
+
|
14
|
+
# Calculate Widths
|
13
15
|
if hashes.empty? && keys
|
14
|
-
|
16
|
+
keys.each do |key|
|
15
17
|
widths[key] = key.to_s.length
|
16
18
|
end
|
17
19
|
else
|
18
|
-
|
20
|
+
hashes.each do |hash|
|
19
21
|
next unless hash.respond_to?(:keys)
|
20
22
|
|
21
|
-
|
22
|
-
|
23
|
+
(headers + hash.keys).each do |key|
|
24
|
+
if !keys
|
23
25
|
headers << key
|
24
26
|
end
|
25
|
-
widths[key] = [ length(key), widths[key] || 0,
|
27
|
+
widths[key] = [ length(key), widths[key] || 0, length(calculate_datum(key, hash)) || 0].max
|
26
28
|
end
|
27
29
|
headers = headers.uniq
|
28
30
|
end
|
29
31
|
end
|
30
32
|
|
33
|
+
# Determine order of headers
|
31
34
|
if block_given?
|
32
35
|
headers = headers.sort(&block)
|
33
36
|
elsif !keys
|
34
37
|
headers = headers.sort {|x,y| x.to_s <=> y.to_s}
|
35
38
|
end
|
36
39
|
|
40
|
+
# Display separator row
|
37
41
|
split = "+"
|
38
42
|
if headers.empty?
|
39
43
|
split << '--+'
|
40
44
|
else
|
41
|
-
|
45
|
+
headers.each do |header|
|
42
46
|
widths[header] ||= length(header)
|
43
47
|
split << ('-' * (widths[header] + 2)) << '+'
|
44
48
|
end
|
45
49
|
end
|
46
|
-
|
47
50
|
display_line(split)
|
51
|
+
|
52
|
+
# Display data row
|
48
53
|
columns = []
|
49
|
-
|
54
|
+
headers.each do |header|
|
50
55
|
columns << "[bold]#{header}[/]#{' ' * (widths[header] - header.to_s.length)}"
|
51
56
|
end
|
52
57
|
display_line("| #{columns.join(' | ')} |")
|
53
58
|
display_line(split)
|
54
59
|
|
55
|
-
|
60
|
+
hashes.each do |hash|
|
56
61
|
if hash.respond_to? :keys
|
57
62
|
columns = []
|
58
|
-
|
59
|
-
datum =
|
60
|
-
|
63
|
+
headers.each do |header|
|
64
|
+
datum = calculate_datum(header, hash)
|
65
|
+
width = widths[header] - length(datum)
|
66
|
+
width = width < 0 ? 0 : width
|
67
|
+
columns << "#{datum}#{' ' * width}"
|
61
68
|
end
|
62
69
|
display_line("| #{columns.join(' | ')} |")
|
63
70
|
else
|
@@ -75,4 +82,17 @@ class Formatador
|
|
75
82
|
def length(value)
|
76
83
|
value.to_s.gsub(PARSE_REGEX, '').length
|
77
84
|
end
|
85
|
+
|
86
|
+
def calculate_datum(header, hash)
|
87
|
+
if (splits = header.to_s.split('.')).length > 1
|
88
|
+
datum = nil
|
89
|
+
splits.each do |split|
|
90
|
+
d = (datum||hash)
|
91
|
+
datum = d[split] || d[split.to_sym] || ''
|
92
|
+
end
|
93
|
+
else
|
94
|
+
datum = hash[header] || ''
|
95
|
+
end
|
96
|
+
datum
|
97
|
+
end
|
78
98
|
end
|
data/tests/basic_tests.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Shindo.tests("Formatador") do
|
1
|
+
Shindo.tests("Formatador: basics") do
|
2
2
|
|
3
3
|
tests("#display_line(Formatador)").returns(" Formatador\n") do
|
4
4
|
capture_stdout do
|
@@ -10,6 +10,7 @@ output = <<-OUTPUT
|
|
10
10
|
one
|
11
11
|
two
|
12
12
|
OUTPUT
|
13
|
+
output = Formatador.parse(output)
|
13
14
|
|
14
15
|
tests("#display_lines(['one', 'two']").returns(output) do
|
15
16
|
capture_stdout do
|
data/tests/table_tests.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
|
-
Shindo.tests("Formatador") do
|
1
|
+
Shindo.tests("Formatador: tables") do
|
2
2
|
|
3
3
|
output = <<-OUTPUT
|
4
4
|
+---+
|
5
|
-
|
|
5
|
+
| [bold]a[/] |
|
6
6
|
+---+
|
7
7
|
| 1 |
|
8
8
|
+---+
|
9
9
|
| 2 |
|
10
10
|
+---+
|
11
11
|
OUTPUT
|
12
|
+
output = Formatador.parse(output)
|
12
13
|
|
13
14
|
tests("#display_table([{:a => 1}, {:a => 2}])").returns(output) do
|
14
15
|
capture_stdout do
|
@@ -18,10 +19,11 @@ OUTPUT
|
|
18
19
|
|
19
20
|
output = <<-OUTPUT
|
20
21
|
+--------+
|
21
|
-
|
|
22
|
+
| [bold]header[/] |
|
22
23
|
+--------+
|
23
24
|
+--------+
|
24
25
|
OUTPUT
|
26
|
+
output = Formatador.parse(output)
|
25
27
|
|
26
28
|
tests("#display_table([], [:header])").returns(output) do
|
27
29
|
capture_stdout do
|
@@ -31,11 +33,12 @@ OUTPUT
|
|
31
33
|
|
32
34
|
output = <<-OUTPUT
|
33
35
|
+--------+
|
34
|
-
|
|
36
|
+
| [bold]header[/] |
|
35
37
|
+--------+
|
36
38
|
| |
|
37
39
|
+--------+
|
38
40
|
OUTPUT
|
41
|
+
output = Formatador.parse(output)
|
39
42
|
|
40
43
|
tests("#display_table([{:a => 1}], [:header])").returns(output) do
|
41
44
|
capture_stdout do
|
@@ -43,4 +46,36 @@ OUTPUT
|
|
43
46
|
end
|
44
47
|
end
|
45
48
|
|
46
|
-
|
49
|
+
|
50
|
+
|
51
|
+
output = <<-OUTPUT
|
52
|
+
+---+------------+
|
53
|
+
| [bold]a[/] | [bold]nested.key[/] |
|
54
|
+
+---+------------+
|
55
|
+
| 1 | value |
|
56
|
+
+---+------------+
|
57
|
+
OUTPUT
|
58
|
+
output = Formatador.parse(output)
|
59
|
+
|
60
|
+
tests("#display_table([{:a => 1, :nested => {:key => 'value'}}], [:header, :'nested.key'])").returns(output) do
|
61
|
+
capture_stdout do
|
62
|
+
Formatador.display_table([{:a => 1, :nested => {:key => 'value'}}], [:a, :'nested.key'])
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
output = <<-OUTPUT
|
67
|
+
+---+-----------------+
|
68
|
+
| [bold]a[/] | [bold]nested[/] |
|
69
|
+
+---+-----------------+
|
70
|
+
| 1 | {:key=>"value"} |
|
71
|
+
+---+-----------------+
|
72
|
+
OUTPUT
|
73
|
+
output = Formatador.parse(output)
|
74
|
+
|
75
|
+
tests("#display_table([{:a => 1, :nested => {:key => 'value'}}])").returns(output) do
|
76
|
+
capture_stdout do
|
77
|
+
Formatador.display_table([{:a => 1, :nested => {:key => 'value'}}])
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
data/tests/tests_helper.rb
CHANGED
metadata
CHANGED
@@ -1,59 +1,45 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: formatador
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.2
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 2
|
9
|
-
- 1
|
10
|
-
version: 0.2.1
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- geemus (Wesley Beary)
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-05-16 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: rake
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &70155363939860 !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
segments:
|
30
|
-
- 0
|
31
|
-
version: "0"
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
32
22
|
type: :development
|
33
|
-
version_requirements: *id001
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: shindo
|
36
23
|
prerelease: false
|
37
|
-
|
24
|
+
version_requirements: *70155363939860
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: shindo
|
27
|
+
requirement: &70155363961280 !ruby/object:Gem::Requirement
|
38
28
|
none: false
|
39
|
-
requirements:
|
40
|
-
- -
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
|
43
|
-
segments:
|
44
|
-
- 0
|
45
|
-
version: "0"
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
46
33
|
type: :development
|
47
|
-
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70155363961280
|
48
36
|
description: STDOUT text formatting
|
49
37
|
email: geemus@gmail.com
|
50
38
|
executables: []
|
51
|
-
|
52
39
|
extensions: []
|
53
|
-
|
54
|
-
extra_rdoc_files:
|
40
|
+
extra_rdoc_files:
|
55
41
|
- README.rdoc
|
56
|
-
files:
|
42
|
+
files:
|
57
43
|
- Gemfile
|
58
44
|
- README.rdoc
|
59
45
|
- Rakefile
|
@@ -66,36 +52,30 @@ files:
|
|
66
52
|
- tests/tests_helper.rb
|
67
53
|
homepage: http://github.com/geemus/NAME
|
68
54
|
licenses: []
|
69
|
-
|
70
55
|
post_install_message:
|
71
|
-
rdoc_options:
|
56
|
+
rdoc_options:
|
72
57
|
- --charset=UTF-8
|
73
|
-
require_paths:
|
58
|
+
require_paths:
|
74
59
|
- lib
|
75
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
76
61
|
none: false
|
77
|
-
requirements:
|
78
|
-
- -
|
79
|
-
- !ruby/object:Gem::Version
|
80
|
-
|
81
|
-
segments:
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
segments:
|
82
67
|
- 0
|
83
|
-
|
84
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
hash: -794223940542750498
|
69
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
70
|
none: false
|
86
|
-
requirements:
|
87
|
-
- -
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
|
90
|
-
segments:
|
91
|
-
- 0
|
92
|
-
version: "0"
|
71
|
+
requirements:
|
72
|
+
- - ! '>='
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
93
75
|
requirements: []
|
94
|
-
|
95
76
|
rubyforge_project: formatador
|
96
|
-
rubygems_version: 1.8.
|
77
|
+
rubygems_version: 1.8.15
|
97
78
|
signing_key:
|
98
79
|
specification_version: 2
|
99
80
|
summary: Ruby STDOUT text formatting
|
100
81
|
test_files: []
|
101
|
-
|