columnize 0.3.6 → 0.8.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/.travis.yml +9 -0
- data/AUTHORS +1 -0
- data/COPYING +3 -3
- data/Gemfile +3 -0
- data/Gemfile.lock +20 -0
- data/Makefile +5 -1
- data/NEWS +16 -9
- data/README.md +57 -33
- data/Rakefile +31 -19
- data/THANKS +8 -0
- data/columnize.gemspec +7 -5
- data/lib/columnize.rb +95 -260
- data/lib/columnize/columnize.rb +159 -0
- data/lib/columnize/opts.rb +35 -0
- data/lib/columnize/version.rb +1 -1
- data/test/test-columnize-array.rb +48 -0
- data/test/test-columnize.rb +24 -38
- data/test/test-columnizer.rb +112 -0
- data/test/test-hashparm.rb +22 -59
- data/test/test-issue3.rb +13 -26
- data/test/test-min_rows_and_colwidths.rb +65 -0
- metadata +75 -45
data/.travis.yml
ADDED
data/AUTHORS
CHANGED
data/COPYING
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Columnize is copyrighted free software by Rocky Bernstein <rocky@rubyforge.org>.
|
2
2
|
|
3
3
|
You can redistribute it and/or modify it under either the terms of the GPL
|
4
|
-
version 2
|
4
|
+
version 2, or the conditions below:
|
5
5
|
|
6
6
|
1. You may make and give away verbatim copies of the source form of the
|
7
7
|
software without restriction, provided that you duplicate all of the
|
@@ -45,9 +45,9 @@ version 2 (see the file GPL), or the conditions below:
|
|
45
45
|
For the list of those files and their copying conditions, see the
|
46
46
|
file LEGAL.
|
47
47
|
|
48
|
-
5. The scripts and library files supplied as input to or produced as
|
48
|
+
5. The scripts and library files supplied as input to or produced as
|
49
49
|
output from the software do not automatically fall under the
|
50
|
-
copyright of the software, but belong to whomever generated them,
|
50
|
+
copyright of the software, but belong to whomever generated them,
|
51
51
|
and may be sold commercially, and may be aggregated with this
|
52
52
|
software.
|
53
53
|
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
data/Makefile
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# I'll admit it -- I'm an absent-minded old-timer who has trouble
|
2
2
|
# learning new tricks.
|
3
|
+
|
4
|
+
RUBY ?= ruby
|
5
|
+
RAKE ?= rake
|
6
|
+
|
3
7
|
test: check
|
4
8
|
|
5
9
|
#: Default target; same as "make check"
|
@@ -8,4 +12,4 @@ all: check
|
|
8
12
|
|
9
13
|
#: Same as corresponding rake task
|
10
14
|
%:
|
11
|
-
|
15
|
+
$(RAKE) $@
|
data/NEWS
CHANGED
@@ -1,12 +1,19 @@
|
|
1
|
-
0.
|
2
|
-
-
|
1
|
+
0.8.9 Apr 19, 2014
|
2
|
+
- Add columnize method to Array class and a place to set its default options
|
3
|
+
- Add option :colfmt to allow a format specifier to use (e.g. '%02d') in stringifying
|
4
|
+
list items
|
5
|
+
- Add option linesuffix (default is "\n")
|
6
|
+
- When using arrange_array each line now has trailing ","
|
7
|
+
|
8
|
+
0.3.6 Dec 17, 2011
|
9
|
+
- rename version.rb columnize/version.rb so as not to conflict with
|
3
10
|
another package called version
|
4
11
|
- Administrivia - shorten gemcutter description
|
5
12
|
|
6
|
-
0.3.5 Nov 24, 2011
|
13
|
+
0.3.5 Nov 24, 2011
|
7
14
|
- Handle situation where an array element is larger than the display width.
|
8
15
|
|
9
|
-
0.3.4 July 4, 2011
|
16
|
+
0.3.4 July 4, 2011
|
10
17
|
|
11
18
|
- Change to Ruby License
|
12
19
|
- Add option 'term_adjust' to ignore terminal sequences in text
|
@@ -19,15 +26,15 @@
|
|
19
26
|
- More general but simpler inteface using an options
|
20
27
|
hash. Compatibility is maintaind though.
|
21
28
|
|
22
|
-
0.3.2
|
29
|
+
0.3.2
|
23
30
|
|
24
|
-
- Mostly Administrivia.
|
25
|
-
* Add .gemspec, correct description field and add a summary.
|
26
|
-
* Add Columnize::VERSION
|
31
|
+
- Mostly Administrivia.
|
32
|
+
* Add .gemspec, correct description field and add a summary.
|
33
|
+
* Add Columnize::VERSION
|
27
34
|
* Simplify Rakefile
|
28
35
|
* Add stub Makefiles
|
29
36
|
|
30
|
-
0.3.1 (01-07-26)
|
37
|
+
0.3.1 (01-07-26)
|
31
38
|
|
32
39
|
- Correct for Ruby 1.9 (Mark Moseley)
|
33
40
|
|
data/README.md
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
[](https://travis-ci.org/rocky/columnize)
|
2
|
+
|
1
3
|
Columnize - Format an Array as a Column-aligned String
|
2
4
|
============================================================================
|
3
5
|
|
@@ -10,58 +12,82 @@ Setup
|
|
10
12
|
-----
|
11
13
|
|
12
14
|
$ irb
|
13
|
-
>> a = (1..10).to_a
|
14
|
-
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
15
15
|
>> require 'columnize'
|
16
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
17
|
|
22
18
|
With numeric data
|
23
19
|
-----------------
|
24
20
|
|
25
|
-
|
26
|
-
=>
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
21
|
+
>> a = (1..10).to_a
|
22
|
+
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
23
|
+
|
24
|
+
>> a.columnize
|
25
|
+
=> "1 2 3 4 5 6 7 8 9 10"
|
26
|
+
|
27
|
+
>> puts a.columnize :arrange_array => true, :displaywidth => 10
|
28
|
+
[1, 2, 3,
|
29
|
+
4, 5, 6,
|
30
|
+
7, 8, 9,
|
31
|
+
10]
|
32
|
+
=> nil
|
33
|
+
|
34
|
+
>> puts a.columnize :arrange_array => true, :displaywidth => 20
|
35
|
+
[1, 2, 3, 4, 5, 6,
|
36
|
+
7, 8, 9, 10]
|
34
37
|
=> 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
38
|
|
40
39
|
With String data
|
41
40
|
----------------
|
42
41
|
|
43
|
-
>>
|
42
|
+
>> g = %w(bibrons golden madascar leopard mourning suras tokay)
|
43
|
+
=> ["bibrons", "golden", "madascar", "leopard", "mourning", "suras", "tokay"]
|
44
|
+
|
45
|
+
>> puts g.columnize :displaywidth => 15
|
44
46
|
bibrons suras
|
45
47
|
golden tokay
|
46
48
|
madascar
|
47
|
-
leopard
|
49
|
+
leopard
|
48
50
|
mourning
|
49
51
|
=> nil
|
50
52
|
|
51
|
-
>> puts columnize
|
53
|
+
>> puts g.columnize :displaywidth => 19, :colsep => ' | '
|
52
54
|
bibrons | suras
|
53
55
|
golden | tokay
|
54
56
|
madascar
|
55
|
-
leopard
|
57
|
+
leopard
|
56
58
|
mourning
|
57
59
|
=> nil
|
58
60
|
|
59
|
-
>> puts columnize
|
61
|
+
>> puts g.columnize :displaywidth => 18, :colsep => ' | ', :ljust => false
|
62
|
+
bibrons | mourning
|
63
|
+
golden | suras
|
64
|
+
madascar | tokay
|
65
|
+
leopard
|
66
|
+
=> nil
|
67
|
+
|
68
|
+
Using Columnize.columnize
|
69
|
+
-------------------------
|
70
|
+
|
71
|
+
>> Columnize.columnize(a)
|
72
|
+
=> "1 2 3 4 5 6 7 8 9 10"
|
60
73
|
|
74
|
+
>> puts Columnize.columnize(a, :displaywidth => 10)
|
75
|
+
1 5 9
|
76
|
+
2 6 10
|
77
|
+
3 7
|
78
|
+
4 8
|
79
|
+
=> nil
|
80
|
+
|
81
|
+
>> Columnize.columnize(g)
|
82
|
+
=> "bibrons golden madascar leopard mourning suras tokay"
|
83
|
+
|
84
|
+
>> puts Columnize.columnize(g, :displaywidth => 19, :colsep => ' | ')
|
61
85
|
bibrons | mourning
|
62
|
-
golden | suras
|
63
|
-
madascar | tokay
|
64
|
-
leopard
|
86
|
+
golden | suras
|
87
|
+
madascar | tokay
|
88
|
+
leopard
|
89
|
+
=> nil
|
90
|
+
|
65
91
|
|
66
92
|
Credits
|
67
93
|
-------
|
@@ -71,14 +97,12 @@ This is adapted from a method of the same name from Python's cmd module.
|
|
71
97
|
Other stuff
|
72
98
|
-----------
|
73
99
|
|
74
|
-
|
100
|
+
Authors: Rocky Bernstein <rockyb@rubyforge.org> [](https://coderwall.com/rocky) and [Martin Davis](https://github.com/waslogic)
|
75
101
|
|
76
|
-
License:
|
102
|
+
License: Copyright (c) 2011,2013 Rocky Bernstein
|
77
103
|
|
78
104
|
Warranty
|
79
105
|
--------
|
80
106
|
|
81
|
-
|
82
|
-
|
83
|
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
84
|
-
GNU General Public License for more details.
|
107
|
+
You can redistribute it and/or modify it under either the terms of the GPL
|
108
|
+
version 2 or the conditions listed in COPYING
|
data/Rakefile
CHANGED
@@ -1,47 +1,49 @@
|
|
1
1
|
#!/usr/bin/env rake
|
2
2
|
# -*- Ruby -*-
|
3
3
|
require 'rubygems'
|
4
|
-
require 'rake/gempackagetask'
|
5
|
-
require 'rake/rdoctask'
|
6
|
-
require 'rake/testtask'
|
7
4
|
require 'fileutils'
|
8
5
|
|
9
6
|
ROOT_DIR = File.dirname(__FILE__)
|
10
|
-
|
7
|
+
Gemspec_filename = 'columnize.gemspec'
|
8
|
+
require File.join %W(#{ROOT_DIR} lib columnize version)
|
11
9
|
|
12
10
|
def gemspec
|
13
|
-
@gemspec ||= eval(File.read(
|
14
|
-
binding, 'columnize.gemspec')
|
11
|
+
@gemspec ||= eval(File.read(Gemspec_filename), binding, Gemspec_filename)
|
15
12
|
end
|
16
13
|
|
14
|
+
require 'rubygems/package_task'
|
17
15
|
desc "Build the gem"
|
18
16
|
task :package=>:gem
|
19
17
|
task :gem=>:gemspec do
|
20
18
|
Dir.chdir(ROOT_DIR) do
|
21
19
|
sh "gem build columnize.gemspec"
|
22
20
|
FileUtils.mkdir_p 'pkg'
|
23
|
-
FileUtils.mv
|
21
|
+
FileUtils.mv gemspec.file_name, 'pkg'
|
24
22
|
end
|
25
23
|
end
|
26
24
|
|
27
25
|
desc "Install the gem locally"
|
28
26
|
task :install => :gem do
|
29
27
|
Dir.chdir(ROOT_DIR) do
|
30
|
-
sh %{gem install --local pkg/#{gemspec.
|
28
|
+
sh %{gem install --local pkg/#{gemspec.file_name}}
|
31
29
|
end
|
32
30
|
end
|
33
31
|
|
32
|
+
require 'rake/testtask'
|
34
33
|
desc "Test everything."
|
35
34
|
Rake::TestTask.new(:test) do |t|
|
36
35
|
t.libs << './lib'
|
37
|
-
t.
|
36
|
+
t.test_files = FileList['test/test-*.rb']
|
38
37
|
t.verbose = true
|
39
38
|
end
|
40
|
-
task :test => :lib
|
39
|
+
task :test => :lib
|
41
40
|
|
42
41
|
desc "same as test"
|
43
42
|
task :check => :test
|
44
43
|
|
44
|
+
desc "same as test"
|
45
|
+
task :columnize => :test
|
46
|
+
|
45
47
|
desc 'Create a GNU-style ChangeLog via git2cl'
|
46
48
|
task :ChangeLog do
|
47
49
|
system('git log --pretty --numstat --summary | git2cl > ChangeLog')
|
@@ -49,17 +51,11 @@ end
|
|
49
51
|
|
50
52
|
task :default => [:test]
|
51
53
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
task :rm_patch_residue do
|
57
|
-
FileUtils.rm_rf FileList['**/*.{rej,orig}'].to_a
|
54
|
+
desc 'Create a GNU-style ChangeLog via git2cl'
|
55
|
+
task :ChangeLog do
|
56
|
+
system('git log --pretty --numstat --summary | git2cl > ChangeLog')
|
58
57
|
end
|
59
58
|
|
60
|
-
desc "Remove built files"
|
61
|
-
task :clean => [:clobber_package, :clobber_rdoc, :rm_patch_residue]
|
62
|
-
|
63
59
|
desc "Generate the gemspec"
|
64
60
|
task :generate do
|
65
61
|
puts gemspec.to_ruby
|
@@ -71,6 +67,7 @@ task :gemspec do
|
|
71
67
|
end
|
72
68
|
|
73
69
|
# --------- RDoc Documentation ------
|
70
|
+
require 'rdoc/task'
|
74
71
|
desc "Generate rdoc documentation"
|
75
72
|
Rake::RDocTask.new("rdoc") do |rdoc|
|
76
73
|
rdoc.rdoc_dir = 'doc'
|
@@ -81,6 +78,7 @@ Rake::RDocTask.new("rdoc") do |rdoc|
|
|
81
78
|
|
82
79
|
rdoc.rdoc_files.include('lib/*.rb', 'README.md', 'COPYING')
|
83
80
|
end
|
81
|
+
|
84
82
|
desc "Same as rdoc"
|
85
83
|
task :doc => :rdoc
|
86
84
|
|
@@ -91,3 +89,17 @@ end
|
|
91
89
|
task :clobber_rdoc do
|
92
90
|
FileUtils.rm_rf File.join(ROOT_DIR, 'doc')
|
93
91
|
end
|
92
|
+
|
93
|
+
desc 'Remove residue from running patch'
|
94
|
+
task :rm_patch_residue do
|
95
|
+
FileUtils.rm_rf Dir.glob('**/*.{rej,orig}'), :verbose => true
|
96
|
+
end
|
97
|
+
|
98
|
+
desc 'Remove ~ backup files'
|
99
|
+
task :rm_tilde_backups do
|
100
|
+
FileUtils.rm_rf Dir.glob('**/*~'), :verbose => true
|
101
|
+
end
|
102
|
+
|
103
|
+
desc 'Remove built files'
|
104
|
+
task :clean => [:clobber_package, :clobber_rdoc, :rm_patch_residue,
|
105
|
+
:rm_tilde_backups]
|
data/THANKS
ADDED
data/columnize.gemspec
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
# -*- Ruby -*-
|
2
2
|
# -*- encoding: utf-8 -*-
|
3
3
|
require 'rake'
|
4
|
-
require 'rubygems' unless
|
4
|
+
require 'rubygems' unless
|
5
5
|
Object.const_defined?(:Gem)
|
6
|
-
require File.dirname(__FILE__) + "/lib/columnize/version" unless
|
6
|
+
require File.dirname(__FILE__) + "/lib/columnize/version" unless
|
7
7
|
Object.const_defined?(:'Columnize')
|
8
8
|
|
9
9
|
Gem::Specification.new do |spec|
|
10
|
-
spec.authors = ['
|
10
|
+
spec.authors = ['Rocky Bernstein']
|
11
11
|
spec.date = Time.now
|
12
12
|
spec.description = '
|
13
13
|
In showing a long lists, sometimes one would prefer to see the value
|
14
14
|
arranged aligned in columns. Some examples include listing methods
|
15
|
-
of an object or debugger commands.
|
15
|
+
of an object or debugger commands.
|
16
16
|
See Examples in the rdoc documentation for examples.
|
17
17
|
'
|
18
18
|
spec.email = 'rockyb@rubyforge.net'
|
@@ -27,10 +27,12 @@ See Examples in the rdoc documentation for examples.
|
|
27
27
|
spec.summary = 'Module to format an Array as an Array of String aligned in columns'
|
28
28
|
spec.version = Columnize::VERSION
|
29
29
|
spec.has_rdoc = true
|
30
|
-
spec.extra_rdoc_files = %w(README.md lib/columnize.rb COPYING)
|
30
|
+
spec.extra_rdoc_files = %w(README.md lib/columnize.rb COPYING THANKS)
|
31
31
|
|
32
32
|
# Make the readme file the start page for the generated html
|
33
33
|
spec.rdoc_options += %w(--main README)
|
34
34
|
spec.rdoc_options += ['--title', "Columnize #{Columnize::VERSION} Documentation"]
|
35
35
|
|
36
|
+
spec.add_development_dependency 'rdoc'
|
37
|
+
spec.add_development_dependency 'rake'
|
36
38
|
end
|
data/lib/columnize.rb
CHANGED
@@ -1,292 +1,127 @@
|
|
1
|
-
# Module to format an Array
|
1
|
+
# Module to format an Array into a single string with embedded
|
2
|
+
# newlines, On printing the string, the columns are aligned.
|
2
3
|
#
|
3
4
|
# == Summary
|
4
|
-
# Display a list of strings as a compact set of columns.
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
# or arranged horizontally:
|
10
|
-
# ['1', '2,', '3', '4'] => '1 2\n3 4\n'
|
11
|
-
#
|
12
|
-
# Each column is only as wide as necessary. By default, columns are
|
13
|
-
# separated by two spaces. Options are avalable for setting
|
14
|
-
# * the display width
|
15
|
-
# * the column separator
|
16
|
-
# * the line prefix
|
17
|
-
# * whether to ignore terminal codes in text size calculation
|
18
|
-
# * whether to left justify text instead of right justify
|
6
|
+
# Return a string from an array with embedded newlines formatted so
|
7
|
+
# that when printed the columns are aligned.
|
8
|
+
# See below for examples and options to the main method +columnize+.
|
19
9
|
#
|
20
|
-
# == License
|
21
10
|
#
|
22
|
-
#
|
11
|
+
# == License
|
12
|
+
#
|
13
|
+
# Columnize is copyright (C) 2007-2011, 2013 Rocky Bernstein
|
23
14
|
# <rockyb@rubyforge.net>
|
24
15
|
#
|
25
16
|
# All rights reserved. You can redistribute and/or modify it under
|
26
17
|
# the same terms as Ruby.
|
27
18
|
#
|
28
|
-
#
|
19
|
+
# Also available in Python (columnize), and Perl (Array::Columnize)
|
29
20
|
|
30
21
|
module Columnize
|
22
|
+
# Pull in the rest of my pieces
|
23
|
+
ROOT_DIR = File.dirname(__FILE__)
|
24
|
+
%w(opts columnize version).each do |submod|
|
25
|
+
require File.join %W(#{ROOT_DIR} columnize #{submod})
|
26
|
+
end
|
31
27
|
|
32
|
-
#
|
33
|
-
|
34
|
-
DEFAULT_OPTS = {
|
35
|
-
:arrange_array => false,
|
36
|
-
:arrange_vertical => true,
|
37
|
-
:array_prefix => '',
|
38
|
-
:array_suffix => '',
|
39
|
-
:colsep => ' ',
|
40
|
-
:displaywidth => 80,
|
41
|
-
:lineprefix => '',
|
42
|
-
:ljust => :auto,
|
43
|
-
:term_adjust => false
|
44
|
-
}
|
45
|
-
|
46
|
-
module_function
|
28
|
+
# Add +columnize_opts+ instance variable to classes that mix in this module. The type should be a kind of hash in file +columnize/opts+.
|
29
|
+
attr_accessor :columnize_opts
|
47
30
|
|
48
|
-
#
|
49
|
-
#
|
50
|
-
#
|
31
|
+
# Columnize.columize([args]) => String
|
32
|
+
#
|
33
|
+
# Return a string from an array with embedded newlines formatted so
|
34
|
+
# that when printed the columns are aligned.
|
35
|
+
#
|
36
|
+
# For example, for a line width of 4 characters (arranged vertically):
|
37
|
+
# a = (1..4).to_a
|
38
|
+
# Columnize.columnize(a) => '1 3\n2 4\n'
|
39
|
+
#
|
40
|
+
# Alternatively:
|
41
|
+
# a.columnize => '1 3\n2 4\n'
|
42
|
+
#
|
43
|
+
# Arranged horizontally:
|
44
|
+
# a.columnize(:arrange_vertical => false) =>
|
45
|
+
# ['1', '2,', '3', '4'] => '1 2\n3 4\n'
|
46
|
+
#
|
47
|
+
# Formatted as an array using format specifier '%02d':
|
48
|
+
# puts (1..10).to_a.columnize(:arrange_array => true, :colfmt => '%02d',
|
49
|
+
# :displaywidth => 10) =>
|
50
|
+
# [01, 02,
|
51
|
+
# 03, 04,
|
52
|
+
# 05, 06,
|
53
|
+
# 07, 08,
|
54
|
+
# 09, 10,
|
55
|
+
# ]
|
51
56
|
#
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
#
|
56
|
-
#
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
60
|
-
#
|
61
|
-
#
|
62
|
-
|
57
|
+
# Each column is only as wide as necessary. By default, columns are
|
58
|
+
# separated by two spaces. Options are available for setting
|
59
|
+
# * the line display width
|
60
|
+
# * a column separator
|
61
|
+
# * a line prefix
|
62
|
+
# * a line suffix
|
63
|
+
# * A format specify for formatting each item each array item to a string
|
64
|
+
# * whether to ignore terminal codes in text size calculation
|
65
|
+
# * whether to left justify text instead of right justify
|
66
|
+
# * whether to format as an array - with surrounding [] and
|
67
|
+
# separating ', '
|
68
|
+
def self.columnize(*args)
|
63
69
|
list = args.shift
|
64
|
-
|
65
|
-
|
66
|
-
if opts[:arrange_array]
|
67
|
-
opts[:array_prefix] = '['
|
68
|
-
opts[:lineprefix] = ' '
|
69
|
-
opts[:array_suffix] = "]\n"
|
70
|
-
opts[:colsep] = ', '
|
71
|
-
opts[:arrange_vertical] = false
|
72
|
-
end
|
73
|
-
opts[:ljust] = !(list.all?{|datum| datum.kind_of?(Numeric)}) if
|
74
|
-
opts[:ljust] == :auto
|
75
|
-
return list, opts
|
76
|
-
else
|
77
|
-
opts = DEFAULT_OPTS.dup
|
78
|
-
%w(displaywidth colsep arrange_vertical ljust lineprefix
|
79
|
-
).each do |field|
|
80
|
-
break if args.empty?
|
81
|
-
opts[field.to_sym] = args.shift
|
82
|
-
end
|
83
|
-
return list, opts
|
84
|
-
end
|
70
|
+
opts = parse_columnize_options(args)
|
71
|
+
Columnizer.new(list, opts).columnize
|
85
72
|
end
|
86
73
|
|
87
|
-
#
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
end.size
|
74
|
+
# Adds columnize_opts to the singleton level of included class
|
75
|
+
def self.included(base)
|
76
|
+
# screw class variables, we'll use an instance variable on the class singleton
|
77
|
+
class << base
|
78
|
+
attr_accessor :columnize_opts
|
79
|
+
end
|
80
|
+
base.columnize_opts = DEFAULT_OPTS.dup
|
95
81
|
end
|
96
82
|
|
97
|
-
# Return a list of strings with embedded newlines (\n) as a compact
|
98
|
-
# set of columns arranged horizontally or vertically.
|
99
|
-
#
|
100
|
-
# For example, for a line width of 4 characters (arranged vertically):
|
101
|
-
# ['1', '2,', '3', '4'] => '1 3\n2 4\n'
|
102
|
-
|
103
|
-
# or arranged horizontally:
|
104
|
-
# ['1', '2,', '3', '4'] => '1 2\n3 4\n'
|
105
|
-
#
|
106
|
-
# Each column is only as wide possible, no larger than
|
107
|
-
# +displaywidth'. If +list+ is not an array, the empty string, '',
|
108
|
-
# is returned. By default, columns are separated by two spaces - one
|
109
|
-
# was not legible enough. Set +colsep+ to adjust the string separate
|
110
|
-
# columns. If +arrange_vertical+ is set false, consecutive items
|
111
|
-
# will go across, left to right, top to bottom.
|
112
|
-
|
113
83
|
def columnize(*args)
|
84
|
+
return Columnize.columnize(*args) if args.length > 1
|
85
|
+
opts = args.empty? ? {} : args.pop
|
86
|
+
@columnize_opts ||= self.class.columnize_opts.dup
|
87
|
+
@columnizer ||= Columnizer.new(self, @columnize_opts)
|
88
|
+
# make sure that any changes to list or opts get passed to columnizer
|
89
|
+
@columnizer.list = self unless @columnizer.list == self
|
90
|
+
@columnizer.opts = @columnize_opts.merge(opts) unless @columnizer.opts == @columnize_opts and opts.empty?
|
91
|
+
@columnizer.columnize
|
92
|
+
end
|
93
|
+
end
|
114
94
|
|
115
|
-
|
95
|
+
# Mix Columnize into Array
|
96
|
+
Array.send :include, Columnize
|
116
97
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
l = list.map{|li| li.to_s}
|
121
|
-
return "%s%s%s\n" % [opts[:array_prefix], l[0],
|
122
|
-
opts[:array_suffix]] if 1 == l.size
|
98
|
+
# Demo this sucker
|
99
|
+
if __FILE__ == $0
|
100
|
+
# include Columnize
|
123
101
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
opts[:displaywidth] = opts[:lineprefix].length + 4
|
128
|
-
else
|
129
|
-
opts[:displaywidth] -= opts[:lineprefix].length
|
130
|
-
end
|
131
|
-
if opts[:arrange_vertical]
|
132
|
-
array_index = lambda {|num_rows, row, col| num_rows*col + row }
|
133
|
-
# Try every row count from 1 upwards
|
134
|
-
1.upto(l.size-1) do |_nrows|
|
135
|
-
nrows = _nrows
|
136
|
-
ncols = (l.size + nrows-1) / nrows
|
137
|
-
colwidths = []
|
138
|
-
totwidth = -opts[:colsep].length
|
102
|
+
a = (1..80).to_a
|
103
|
+
puts a.columnize :arrange_array => true
|
104
|
+
puts '=' * 50
|
139
105
|
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
i = array_index.call(nrows, row, col)
|
146
|
-
break if i >= l.size
|
147
|
-
colwidth = [colwidth, cell_size(l[i], opts[:term_adjust])].max
|
148
|
-
end
|
149
|
-
colwidths.push(colwidth)
|
150
|
-
totwidth += colwidth + opts[:colsep].length
|
151
|
-
if totwidth > opts[:displaywidth]
|
152
|
-
ncols = col
|
153
|
-
break
|
154
|
-
end
|
155
|
-
end
|
156
|
-
break if totwidth <= opts[:displaywidth]
|
157
|
-
end
|
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.
|
163
|
-
s = ''
|
164
|
-
0.upto(nrows-1) do |_row|
|
165
|
-
row = _row
|
166
|
-
texts = []
|
167
|
-
0.upto(ncols-1) do |col|
|
168
|
-
i = array_index.call(nrows, row, col)
|
169
|
-
if i >= l.size
|
170
|
-
x = ''
|
171
|
-
else
|
172
|
-
x = l[i]
|
173
|
-
end
|
174
|
-
texts.push(x)
|
175
|
-
end
|
176
|
-
texts.pop while !texts.empty? and texts[-1] == ''
|
177
|
-
if texts.size > 0
|
178
|
-
0.upto(texts.size-1) do |col|
|
179
|
-
unless ncols == 1 && opts[:ljust]
|
180
|
-
if opts[:ljust]
|
181
|
-
texts[col] = texts[col].ljust(colwidths[col])
|
182
|
-
else
|
183
|
-
texts[col] = texts[col].rjust(colwidths[col])
|
184
|
-
end
|
185
|
-
end
|
186
|
-
end
|
187
|
-
s += "%s%s\n" % [opts[:lineprefix], texts.join(opts[:colsep])]
|
188
|
-
end
|
189
|
-
end
|
190
|
-
return s
|
191
|
-
else
|
192
|
-
array_index = lambda {|num_rows, row, col| ncols*(row-1) + col }
|
193
|
-
# Assign to make enlarge scope of loop variables.
|
194
|
-
totwidth = i = rounded_size = 0
|
195
|
-
# Try every column count from size downwards.
|
196
|
-
l.size.downto(1) do |_ncols|
|
197
|
-
ncols = _ncols
|
198
|
-
# Try every row count from 1 upwards
|
199
|
-
min_rows = (l.size+ncols-1) / ncols
|
200
|
-
min_rows.upto(l.size) do |_nrows|
|
201
|
-
nrows = _nrows
|
202
|
-
rounded_size = nrows * ncols
|
203
|
-
colwidths = []
|
204
|
-
totwidth = -opts[:colsep].length
|
205
|
-
colwidth = row = 0
|
206
|
-
0.upto(ncols-1) do |col|
|
207
|
-
# get max column width for this column
|
208
|
-
1.upto(nrows) do |_row|
|
209
|
-
row = _row
|
210
|
-
i = array_index.call(nrows, row, col)
|
211
|
-
break if i >= l.size
|
212
|
-
colwidth = [colwidth, cell_size(l[i], opts[:term_adjust])].max
|
213
|
-
end
|
214
|
-
colwidths.push(colwidth)
|
215
|
-
totwidth += colwidth + opts[:colsep].length
|
216
|
-
break if totwidth > opts[:displaywidth];
|
217
|
-
end
|
218
|
-
if totwidth <= opts[:displaywidth]
|
219
|
-
# Found the right nrows and ncols
|
220
|
-
nrows = row
|
221
|
-
break
|
222
|
-
elsif totwidth >= opts[:displaywidth]
|
223
|
-
# Need to reduce ncols
|
224
|
-
break
|
225
|
-
end
|
226
|
-
end
|
227
|
-
break if totwidth <= opts[:displaywidth] and i >= rounded_size-1
|
228
|
-
end
|
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.
|
234
|
-
s = ''
|
235
|
-
prefix = if opts[:array_prefix].empty?
|
236
|
-
opts[:lineprefix]
|
237
|
-
else
|
238
|
-
opts[:array_prefix]
|
239
|
-
end
|
240
|
-
1.upto(nrows) do |row|
|
241
|
-
texts = []
|
242
|
-
0.upto(ncols-1) do |col|
|
243
|
-
i = array_index.call(nrows, row, col)
|
244
|
-
if i >= l.size
|
245
|
-
break
|
246
|
-
else
|
247
|
-
x = l[i]
|
248
|
-
end
|
249
|
-
texts.push(x)
|
250
|
-
end
|
251
|
-
0.upto(texts.size-1) do |col|
|
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
|
258
|
-
end
|
259
|
-
end
|
260
|
-
s += "%s%s\n" % [prefix, texts.join(opts[:colsep])]
|
261
|
-
prefix = opts[:lineprefix]
|
262
|
-
end
|
263
|
-
s += opts[:array_suffix]
|
264
|
-
return s
|
265
|
-
end
|
266
|
-
end
|
267
|
-
end
|
268
|
-
if __FILE__ == $0
|
269
|
-
#
|
270
|
-
include Columnize
|
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);
|
106
|
+
b = (1..10).to_a
|
107
|
+
puts b.columnize(:displaywidth => 10)
|
108
|
+
|
109
|
+
puts '-' * 50
|
110
|
+
puts b.columnize(:arrange_array => true, :colfmt => '%02d', :displaywidth => 10)
|
275
111
|
|
276
112
|
[[4, 4], [4, 7], [100, 80]].each do |width, num|
|
277
|
-
data = (1..num).map{|i| i}
|
113
|
+
data = (1..num).map{|i| i }
|
278
114
|
[[false, 'horizontal'], [true, 'vertical']].each do |bool, dir|
|
279
115
|
puts "Width: #{width}, direction: #{dir}"
|
280
|
-
print columnize(data, :displaywidth => width, :colsep => ' ',
|
281
|
-
:arrange_vertical => bool, :ljust => :auto)
|
116
|
+
print Columnize.columnize(data, :displaywidth => width, :colsep => ' ', :arrange_vertical => bool, :ljust => :auto)
|
282
117
|
end
|
283
118
|
end
|
284
119
|
|
285
|
-
puts Columnize
|
286
|
-
puts columnize([])
|
287
|
-
puts columnize(["a", 2, "c"], :displaywidth =>10, :colsep => ', ')
|
288
|
-
puts columnize(["oneitem"])
|
289
|
-
puts columnize(["one", "two", "three"])
|
120
|
+
puts Columnize.columnize(5)
|
121
|
+
puts Columnize.columnize([])
|
122
|
+
puts Columnize.columnize(["a", 2, "c"], :displaywidth =>10, :colsep => ', ')
|
123
|
+
puts Columnize.columnize(["oneitem"])
|
124
|
+
puts Columnize.columnize(["one", "two", "three"])
|
290
125
|
data = ["one", "two", "three",
|
291
126
|
"for", "five", "six",
|
292
127
|
"seven", "eight", "nine",
|
@@ -296,7 +131,7 @@ if __FILE__ == $0
|
|
296
131
|
"nineteen", "twenty", "twentyone",
|
297
132
|
"twentytwo", "twentythree", "twentyfour",
|
298
133
|
"twentyfive","twentysix", "twentyseven"]
|
299
|
-
|
300
|
-
puts columnize(data)
|
301
|
-
puts columnize(data, 80, ' ', false)
|
134
|
+
|
135
|
+
puts Columnize.columnize(data)
|
136
|
+
puts Columnize.columnize(data, 80, ' ', false)
|
302
137
|
end
|