columnize 0.3.4 → 0.3.5
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/Makefile +3 -0
- data/NEWS +3 -0
- data/README.md +84 -0
- data/columnize.gemspec +2 -2
- data/lib/columnize.rb +62 -67
- data/lib/version.rb +1 -1
- data/test/test-issue3.rb +37 -0
- metadata +7 -7
- data/README +0 -78
data/Makefile
CHANGED
data/NEWS
CHANGED
data/README.md
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
Columnize - Format an Array as a Column-aligned String
|
2
|
+
============================================================================
|
3
|
+
|
4
|
+
In showing a long lists, sometimes one would prefer to see the value
|
5
|
+
arranged aligned in columns. Some examples include listing methods of
|
6
|
+
an object, listing debugger commands, or showing a numeric array with data
|
7
|
+
aligned.
|
8
|
+
|
9
|
+
Setup
|
10
|
+
-----
|
11
|
+
|
12
|
+
$ irb
|
13
|
+
>> a = (1..10).to_a
|
14
|
+
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
15
|
+
>> require 'columnize'
|
16
|
+
=> true
|
17
|
+
>> include Columnize
|
18
|
+
=> Object
|
19
|
+
>> g = %w(bibrons golden madascar leopard mourning suras tokay)
|
20
|
+
=> ["bibrons", "golden", "madascar", "leopard", "mourning", "suras", "tokay"]
|
21
|
+
|
22
|
+
With numeric data
|
23
|
+
-----------------
|
24
|
+
|
25
|
+
columnize(a)
|
26
|
+
=> "1 2 3 4 5 6 7 8 9 10\n"
|
27
|
+
>> puts Columnize::columnize(a, :arrange_array => true, :displaywidth => 10)
|
28
|
+
[1, 2
|
29
|
+
3, 4
|
30
|
+
5, 6
|
31
|
+
7, 8
|
32
|
+
9, 10
|
33
|
+
]
|
34
|
+
=> nil
|
35
|
+
>> puts Columnize::columnize(a, :arrange_array => true, :displaywidth => 20)
|
36
|
+
[1, 2, 3, 4, 5, 6
|
37
|
+
7, 8, 9, 10
|
38
|
+
]
|
39
|
+
|
40
|
+
With String data
|
41
|
+
----------------
|
42
|
+
|
43
|
+
>> puts columnize g, :displaywidth => 15
|
44
|
+
bibrons suras
|
45
|
+
golden tokay
|
46
|
+
madascar
|
47
|
+
leopard
|
48
|
+
mourning
|
49
|
+
=> nil
|
50
|
+
|
51
|
+
>> puts columnize g, {:displaywidth => 19, :colsep => ' | '}
|
52
|
+
bibrons | suras
|
53
|
+
golden | tokay
|
54
|
+
madascar
|
55
|
+
leopard
|
56
|
+
mourning
|
57
|
+
=> nil
|
58
|
+
|
59
|
+
>> puts columnize g, {:displaywidth => 18, :colsep => ' | ', :ljust=>false}
|
60
|
+
|
61
|
+
bibrons | mourning
|
62
|
+
golden | suras
|
63
|
+
madascar | tokay
|
64
|
+
leopard
|
65
|
+
|
66
|
+
Credits
|
67
|
+
-------
|
68
|
+
|
69
|
+
This is adapted from a method of the same name from Python's cmd module.
|
70
|
+
|
71
|
+
Other stuff
|
72
|
+
-----------
|
73
|
+
|
74
|
+
Author: Rocky Bernstein <rockyb@rubyforge.org>
|
75
|
+
|
76
|
+
License: Copyright (c) 2011 Rocky Bernstein
|
77
|
+
|
78
|
+
Warranty
|
79
|
+
--------
|
80
|
+
|
81
|
+
This program is distributed in the hope that it will be useful,
|
82
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
83
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
84
|
+
GNU General Public License for more details.
|
data/columnize.gemspec
CHANGED
@@ -42,10 +42,10 @@ require "columnize"
|
|
42
42
|
spec.summary = 'Module to format an Array as an Array of String aligned in columns'
|
43
43
|
spec.version = Columnize::VERSION
|
44
44
|
spec.has_rdoc = true
|
45
|
-
spec.extra_rdoc_files = %w(README lib/columnize.rb COPYING)
|
45
|
+
spec.extra_rdoc_files = %w(README.md lib/columnize.rb COPYING)
|
46
46
|
|
47
47
|
# Make the readme file the start page for the generated html
|
48
|
-
spec.rdoc_options += %w(--
|
48
|
+
spec.rdoc_options += %w(--main README)
|
49
49
|
spec.rdoc_options += ['--title', "Columnize #{Columnize::VERSION} Documentation"]
|
50
50
|
|
51
51
|
end
|
data/lib/columnize.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
# Module to format an Array as an Array of String aligned in columns.
|
2
2
|
#
|
3
|
-
# :main:README.md
|
4
|
-
#
|
5
3
|
# == Summary
|
6
4
|
# Display a list of strings as a compact set of columns.
|
7
5
|
#
|
@@ -36,7 +34,7 @@ module Columnize
|
|
36
34
|
DEFAULT_OPTS = {
|
37
35
|
:arrange_array => false,
|
38
36
|
:arrange_vertical => true,
|
39
|
-
:array_prefix =>
|
37
|
+
:array_prefix => '',
|
40
38
|
:array_suffix => '',
|
41
39
|
:colsep => ' ',
|
42
40
|
:displaywidth => 80,
|
@@ -115,22 +113,21 @@ module Columnize
|
|
115
113
|
def columnize(*args)
|
116
114
|
|
117
115
|
list, opts = parse_columnize_options(args)
|
116
|
+
|
118
117
|
# Some degenerate cases
|
119
|
-
if not list.is_a?(Array)
|
120
|
-
|
121
|
-
end
|
122
|
-
if list.size == 0
|
123
|
-
return "<empty>\n"
|
124
|
-
end
|
118
|
+
return '' if not list.is_a?(Array)
|
119
|
+
return "<empty>\n" if list.empty?
|
125
120
|
l = list.map{|li| li.to_s}
|
126
|
-
|
127
|
-
|
128
|
-
end
|
121
|
+
return "%s%s%s\n" % [opts[:array_prefix], l[0],
|
122
|
+
opts[:array_suffix]] if 1 == l.size
|
129
123
|
|
130
124
|
nrows = ncols = 0 # Make nrows, ncols have more global scope
|
131
125
|
colwidths = [] # Same for colwidths
|
132
|
-
opts[:displaywidth]
|
133
|
-
|
126
|
+
if opts[:displaywidth] - opts[:lineprefix].length < 4
|
127
|
+
opts[:displaywidth] = opts[:lineprefix].length + 4
|
128
|
+
else
|
129
|
+
opts[:displaywidth] -= opts[:lineprefix].length
|
130
|
+
end
|
134
131
|
if opts[:arrange_vertical]
|
135
132
|
array_index = lambda {|num_rows, row, col| num_rows*col + row }
|
136
133
|
# Try every row count from 1 upwards
|
@@ -140,57 +137,51 @@ module Columnize
|
|
140
137
|
colwidths = []
|
141
138
|
totwidth = -opts[:colsep].length
|
142
139
|
|
143
|
-
0.upto(ncols-1) do |
|
144
|
-
col = _col
|
140
|
+
0.upto(ncols-1) do |col|
|
145
141
|
# get max column width for this column
|
146
142
|
colwidth = 0
|
147
143
|
0.upto(nrows-1) do |_row|
|
148
144
|
row = _row
|
149
145
|
i = array_index.call(nrows, row, col)
|
150
|
-
if i >= l.size
|
151
|
-
break
|
152
|
-
end
|
146
|
+
break if i >= l.size
|
153
147
|
colwidth = [colwidth, cell_size(l[i], opts[:term_adjust])].max
|
154
148
|
end
|
155
|
-
colwidths
|
149
|
+
colwidths.push(colwidth)
|
156
150
|
totwidth += colwidth + opts[:colsep].length
|
157
151
|
if totwidth > opts[:displaywidth]
|
158
152
|
ncols = col
|
159
153
|
break
|
160
154
|
end
|
161
155
|
end
|
162
|
-
if totwidth <= opts[:displaywidth]
|
163
|
-
break
|
164
|
-
end
|
156
|
+
break if totwidth <= opts[:displaywidth]
|
165
157
|
end
|
166
|
-
|
167
|
-
|
168
|
-
#
|
169
|
-
#
|
158
|
+
ncols = 1 if ncols < 1
|
159
|
+
nrows = l.size if ncols == 1
|
160
|
+
# The smallest number of rows computed and the max widths for
|
161
|
+
# each column has been obtained. Now we just have to format
|
162
|
+
# each of the rows.
|
170
163
|
s = ''
|
171
164
|
0.upto(nrows-1) do |_row|
|
172
165
|
row = _row
|
173
166
|
texts = []
|
174
|
-
0.upto(ncols-1) do |
|
175
|
-
col = _col
|
167
|
+
0.upto(ncols-1) do |col|
|
176
168
|
i = array_index.call(nrows, row, col)
|
177
169
|
if i >= l.size
|
178
170
|
x = ''
|
179
171
|
else
|
180
172
|
x = l[i]
|
181
173
|
end
|
182
|
-
texts
|
183
|
-
end
|
184
|
-
while texts and texts[-1] == ''
|
185
|
-
texts = texts[0..-2]
|
174
|
+
texts.push(x)
|
186
175
|
end
|
176
|
+
texts.pop while !texts.empty? and texts[-1] == ''
|
187
177
|
if texts.size > 0
|
188
|
-
0.upto(texts.size-1) do |
|
189
|
-
|
190
|
-
|
178
|
+
0.upto(texts.size-1) do |col|
|
179
|
+
unless ncols == 1 && opts[:ljust]
|
180
|
+
if opts[:ljust]
|
191
181
|
texts[col] = texts[col].ljust(colwidths[col])
|
192
|
-
|
182
|
+
else
|
193
183
|
texts[col] = texts[col].rjust(colwidths[col])
|
184
|
+
end
|
194
185
|
end
|
195
186
|
end
|
196
187
|
s += "%s%s\n" % [opts[:lineprefix], texts.join(opts[:colsep])]
|
@@ -199,10 +190,10 @@ module Columnize
|
|
199
190
|
return s
|
200
191
|
else
|
201
192
|
array_index = lambda {|num_rows, row, col| ncols*(row-1) + col }
|
202
|
-
#
|
203
|
-
# Assign to make enlarge scope of loop variables
|
193
|
+
# Assign to make enlarge scope of loop variables.
|
204
194
|
totwidth = i = rounded_size = 0
|
205
|
-
|
195
|
+
# Try every column count from size downwards.
|
196
|
+
l.size.downto(1) do |_ncols|
|
206
197
|
ncols = _ncols
|
207
198
|
# Try every row count from 1 upwards
|
208
199
|
min_rows = (l.size+ncols-1) / ncols
|
@@ -212,23 +203,17 @@ module Columnize
|
|
212
203
|
colwidths = []
|
213
204
|
totwidth = -opts[:colsep].length
|
214
205
|
colwidth = row = 0
|
215
|
-
0.upto(ncols-1) do |
|
216
|
-
col = _col
|
206
|
+
0.upto(ncols-1) do |col|
|
217
207
|
# get max column width for this column
|
218
208
|
1.upto(nrows) do |_row|
|
219
209
|
row = _row
|
220
210
|
i = array_index.call(nrows, row, col)
|
221
|
-
if i >=
|
222
|
-
|
223
|
-
elsif i < l.size
|
224
|
-
colwidth = [colwidth, cell_size(l[i], opts[:term_adjust])].max
|
225
|
-
end
|
211
|
+
break if i >= l.size
|
212
|
+
colwidth = [colwidth, cell_size(l[i], opts[:term_adjust])].max
|
226
213
|
end
|
227
|
-
colwidths
|
214
|
+
colwidths.push(colwidth)
|
228
215
|
totwidth += colwidth + opts[:colsep].length
|
229
|
-
if totwidth > opts[:displaywidth]
|
230
|
-
break
|
231
|
-
end
|
216
|
+
break if totwidth > opts[:displaywidth];
|
232
217
|
end
|
233
218
|
if totwidth <= opts[:displaywidth]
|
234
219
|
# Found the right nrows and ncols
|
@@ -239,16 +224,19 @@ module Columnize
|
|
239
224
|
break
|
240
225
|
end
|
241
226
|
end
|
242
|
-
if totwidth <= opts[:displaywidth] and i >= rounded_size-1
|
243
|
-
break
|
244
|
-
end
|
227
|
+
break if totwidth <= opts[:displaywidth] and i >= rounded_size-1
|
245
228
|
end
|
246
|
-
|
247
|
-
|
248
|
-
#
|
249
|
-
#
|
229
|
+
ncols = 1 if ncols < 1
|
230
|
+
nrows = l.size if ncols == 1
|
231
|
+
# The smallest number of rows computed and the max widths for
|
232
|
+
# each column has been obtained. Now we just have to format
|
233
|
+
# each of the rows.
|
250
234
|
s = ''
|
251
|
-
prefix = opts[:array_prefix]
|
235
|
+
prefix = if opts[:array_prefix].empty?
|
236
|
+
opts[:lineprefix]
|
237
|
+
else
|
238
|
+
opts[:array_prefix]
|
239
|
+
end
|
252
240
|
1.upto(nrows) do |row|
|
253
241
|
texts = []
|
254
242
|
0.upto(ncols-1) do |col|
|
@@ -258,13 +246,15 @@ module Columnize
|
|
258
246
|
else
|
259
247
|
x = l[i]
|
260
248
|
end
|
261
|
-
texts
|
249
|
+
texts.push(x)
|
262
250
|
end
|
263
251
|
0.upto(texts.size-1) do |col|
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
252
|
+
unless ncols == 1 && opts[:ljust]
|
253
|
+
if opts[:ljust]
|
254
|
+
texts[col] = texts[col].ljust(colwidths[col]) if ncols != 1
|
255
|
+
else
|
256
|
+
texts[col] = texts[col].rjust(colwidths[col])
|
257
|
+
end
|
268
258
|
end
|
269
259
|
end
|
270
260
|
s += "%s%s\n" % [prefix, texts.join(opts[:colsep])]
|
@@ -279,17 +269,22 @@ if __FILE__ == $0
|
|
279
269
|
#
|
280
270
|
include Columnize
|
281
271
|
|
272
|
+
line = 'require [1;29m"[0m[1;37mirb[0m[1;29m"[0m';
|
273
|
+
puts cell_size(line, true);
|
274
|
+
puts cell_size(line, false);
|
275
|
+
|
282
276
|
[[4, 4], [4, 7], [100, 80]].each do |width, num|
|
283
|
-
data = (1..num).map{|i| i
|
277
|
+
data = (1..num).map{|i| i}
|
284
278
|
[[false, 'horizontal'], [true, 'vertical']].each do |bool, dir|
|
285
279
|
puts "Width: #{width}, direction: #{dir}"
|
286
|
-
print columnize(data, width, ' ',
|
280
|
+
print columnize(data, :displaywidth => width, :colsep => ' ',
|
281
|
+
:arrange_vertical => bool, :ljust => :auto)
|
287
282
|
end
|
288
283
|
end
|
289
284
|
|
290
285
|
puts Columnize::columnize(5)
|
291
286
|
puts columnize([])
|
292
|
-
puts columnize(["a", 2, "c"], 10, ', ')
|
287
|
+
puts columnize(["a", 2, "c"], :displaywidth =>10, :colsep => ', ')
|
293
288
|
puts columnize(["oneitem"])
|
294
289
|
puts columnize(["one", "two", "three"])
|
295
290
|
data = ["one", "two", "three",
|
data/lib/version.rb
CHANGED
data/test/test-issue3.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
# Test of Columnize module
|
5
|
+
class TestIssue3 < Test::Unit::TestCase
|
6
|
+
@@TOP_SRC_DIR = File.join(File.expand_path(File.dirname(__FILE__)),
|
7
|
+
'..', 'lib')
|
8
|
+
require File.join(@@TOP_SRC_DIR, 'columnize.rb')
|
9
|
+
include Columnize
|
10
|
+
# test columnize
|
11
|
+
def test_long_column
|
12
|
+
data = ["what's", "upppppppppppppppppp"]
|
13
|
+
# Try at least one test where we give the module name explicitely.
|
14
|
+
assert_equal("what's\nupppppppppppppppppp\n",
|
15
|
+
Columnize::columnize(data, :arrange_vertical => false,
|
16
|
+
:displaywidth => 7))
|
17
|
+
assert_equal("what's\nupppppppppppppppppp\n",
|
18
|
+
Columnize::columnize(data, :arrange_vertical => true,
|
19
|
+
:displaywidth => 7))
|
20
|
+
data = ["whaaaaaat's", "up"]
|
21
|
+
assert_equal("whaaaaaat's\n up\n",
|
22
|
+
Columnize::columnize(data,
|
23
|
+
:arrange_vertical => false,
|
24
|
+
:ljust => false,
|
25
|
+
:displaywidth => 7))
|
26
|
+
assert_equal("whaaaaaat's\nup\n",
|
27
|
+
Columnize::columnize(data,
|
28
|
+
:arrange_vertical => false,
|
29
|
+
:ljust => true,
|
30
|
+
:displaywidth => 7))
|
31
|
+
assert_equal("whaaaaaat's\nup\n",
|
32
|
+
Columnize::columnize(data,
|
33
|
+
:arrange_vertical => true,
|
34
|
+
:ljust => true,
|
35
|
+
:displaywidth => 7))
|
36
|
+
end
|
37
|
+
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 3
|
8
|
-
-
|
9
|
-
version: 0.3.
|
8
|
+
- 5
|
9
|
+
version: 0.3.5
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- R. Bernstein
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-
|
17
|
+
date: 2011-11-24 00:00:00 -05:00
|
18
18
|
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|
@@ -32,7 +32,7 @@ executables: []
|
|
32
32
|
extensions: []
|
33
33
|
|
34
34
|
extra_rdoc_files:
|
35
|
-
- README
|
35
|
+
- README.md
|
36
36
|
- lib/columnize.rb
|
37
37
|
- COPYING
|
38
38
|
files:
|
@@ -42,7 +42,7 @@ files:
|
|
42
42
|
- ChangeLog
|
43
43
|
- Makefile
|
44
44
|
- NEWS
|
45
|
-
- README
|
45
|
+
- README.md
|
46
46
|
- Rakefile
|
47
47
|
- columnize.gemspec
|
48
48
|
- lib/Makefile
|
@@ -50,6 +50,7 @@ files:
|
|
50
50
|
- lib/version.rb
|
51
51
|
- test/test-columnize.rb
|
52
52
|
- test/test-hashparm.rb
|
53
|
+
- test/test-issue3.rb
|
53
54
|
has_rdoc: true
|
54
55
|
homepage: https://github.com/rocky/columnize
|
55
56
|
licenses:
|
@@ -57,11 +58,10 @@ licenses:
|
|
57
58
|
- GPL2
|
58
59
|
post_install_message:
|
59
60
|
rdoc_options:
|
60
|
-
- --verbose
|
61
61
|
- --main
|
62
62
|
- README
|
63
63
|
- --title
|
64
|
-
- Columnize 0.3.
|
64
|
+
- Columnize 0.3.5 Documentation
|
65
65
|
require_paths:
|
66
66
|
- lib
|
67
67
|
required_ruby_version: !ruby/object:Gem::Requirement
|
data/README
DELETED
@@ -1,78 +0,0 @@
|
|
1
|
-
= Columnize - Module to show an Array formatted as a String aligned in columns.
|
2
|
-
|
3
|
-
== Summary
|
4
|
-
|
5
|
-
In showing a long lists, sometimes one would prefer to see the value
|
6
|
-
arranged aligned in columns. Some examples include listing methods of
|
7
|
-
an object, listing debugger commands, or showing a numeric array with data
|
8
|
-
aligned.
|
9
|
-
|
10
|
-
=== Setup
|
11
|
-
|
12
|
-
$ irb
|
13
|
-
>> a = (1..10).to_a
|
14
|
-
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
15
|
-
>> require 'columnize'
|
16
|
-
=> true
|
17
|
-
>> include Columnize
|
18
|
-
=> Object
|
19
|
-
>> g = %w(bibrons golden madascar leopard mourning suras tokay)
|
20
|
-
=> ["bibrons", "golden", "madascar", "leopard", "mourning", "suras", "tokay"]
|
21
|
-
|
22
|
-
=== With numeric data
|
23
|
-
|
24
|
-
columnize(a)
|
25
|
-
=> "1 2 3 4 5 6 7 8 9 10\n"
|
26
|
-
>> puts Columnize::columnize(a, :arrange_array => true, :displaywidth => 10)
|
27
|
-
[1, 2
|
28
|
-
3, 4
|
29
|
-
5, 6
|
30
|
-
7, 8
|
31
|
-
9, 10
|
32
|
-
]
|
33
|
-
=> nil
|
34
|
-
>> puts Columnize::columnize(a, :arrange_array => true, :displaywidth => 20)
|
35
|
-
[1, 2, 3, 4, 5, 6
|
36
|
-
7, 8, 9, 10
|
37
|
-
]
|
38
|
-
|
39
|
-
=== With String data
|
40
|
-
|
41
|
-
>> puts columnize g, :displaywidth => 15
|
42
|
-
bibrons suras
|
43
|
-
golden tokay
|
44
|
-
madascar
|
45
|
-
leopard
|
46
|
-
mourning
|
47
|
-
=> nil
|
48
|
-
|
49
|
-
>> puts columnize g, {:displaywidth => 18, :colsep => ' | '}
|
50
|
-
bibrons | suras
|
51
|
-
golden | tokay
|
52
|
-
madascar
|
53
|
-
leopard
|
54
|
-
mourning
|
55
|
-
=> nil
|
56
|
-
|
57
|
-
>> puts columnize g, {:displaywidth => 18, :colsep => ' | ', :ljust=>false}
|
58
|
-
bibrons | suras
|
59
|
-
golden | tokay
|
60
|
-
madascar
|
61
|
-
leopard
|
62
|
-
|
63
|
-
== Credits
|
64
|
-
|
65
|
-
This is adapted from a method of the same name from Python's cmd module.
|
66
|
-
|
67
|
-
== Other stuff
|
68
|
-
|
69
|
-
Author:: Rocky Bernstein <rockyb@rubyforge.net>
|
70
|
-
License:: Copyright (c) 2007, 2011 Rocky Bernstein
|
71
|
-
Released under the GNU GPL 2 license
|
72
|
-
|
73
|
-
== Warranty
|
74
|
-
|
75
|
-
This program is distributed in the hope that it will be useful,
|
76
|
-
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
77
|
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
78
|
-
GNU General Public License for more details.
|