termtable 0.1.0
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.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/.rspec +3 -0
- data/.rubocop.yml +5 -0
- data/.travis.yml +5 -0
- data/Gemfile +14 -0
- data/README.md +97 -0
- data/Rakefile +8 -0
- data/bin/console +7 -0
- data/bin/setup +8 -0
- data/lib/termtable.rb +13 -0
- data/lib/termtable/border.rb +13 -0
- data/lib/termtable/cell.rb +51 -0
- data/lib/termtable/core_ext/array.rb +14 -0
- data/lib/termtable/error.rb +5 -0
- data/lib/termtable/header.rb +13 -0
- data/lib/termtable/render.rb +53 -0
- data/lib/termtable/row.rb +13 -0
- data/lib/termtable/table.rb +46 -0
- data/lib/termtable/version.rb +3 -0
- data/termtable.gemspec +22 -0
- metadata +78 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 581a5dfb715ea7eaa47ae23d6da376276673c819
|
4
|
+
data.tar.gz: f1af2c524a24227dac39693ff4075221fc7d7324
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2b97cb4bf4fc1b4eed5e8f562d0bd884466e316f149801b0afbc5689cca51358ddd8a7e089ec7f08f941fc868d2c5e47ab9b8644ba1a0ba0aa8444e836f7fb6c
|
7
|
+
data.tar.gz: e9de018cf87eb659e1afb57b81e474d5bfceccb7f9631e96d88199a3f35217289bb9be6028ccb6771353983d868f564a038e7f605e8a593b53924ba11642c274
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rubocop.yml
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
# Termtable
|
2
|
+
|
3
|
+
## Installation
|
4
|
+
|
5
|
+
Add this line to your application's Gemfile:
|
6
|
+
|
7
|
+
```ruby
|
8
|
+
gem 'termtable'
|
9
|
+
```
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install termtable
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
A table instance can take a 2 dimensional array for the rows.
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
table = Termtable::Table.new [[1, 2, 3], [4, 5, 6]]
|
25
|
+
```
|
26
|
+
|
27
|
+
This can also be given as a hash with a rows key.
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
table = Termtable::Table.new rows: [[1, 2, 3], [4, 5, 6]]
|
31
|
+
|
32
|
+
puts table.render
|
33
|
+
|
34
|
+
+--+--+--+
|
35
|
+
|1 |2 |3 |
|
36
|
+
|4 |5 |6 |
|
37
|
+
+--+--+--+
|
38
|
+
```
|
39
|
+
|
40
|
+
### Headers
|
41
|
+
|
42
|
+
Headers can be given as the first array
|
43
|
+
|
44
|
+
```ruby
|
45
|
+
Termtable::Table.new ['Header A', 'Header B'], [['a1', 'a2'], ['b1', 'b2']]
|
46
|
+
```
|
47
|
+
|
48
|
+
Also as a headers key
|
49
|
+
|
50
|
+
```ruby
|
51
|
+
Termtable::Table.new headers: ['Header A', 'Header B'], rows: [['a1', 'a2'], ['b1', 'b2']]
|
52
|
+
|
53
|
+
+---------+---------+
|
54
|
+
|Header A |Header B |
|
55
|
+
+---------+---------+
|
56
|
+
|a1 |a2 |
|
57
|
+
|b1 |b2 |
|
58
|
+
+---------+---------+
|
59
|
+
```
|
60
|
+
|
61
|
+
### Padding
|
62
|
+
|
63
|
+
It is possible to pass a padding argument to the render method
|
64
|
+
|
65
|
+
```ruby
|
66
|
+
table = Termtable::Table.new rows: [['a1', 'a2'], ['b1', 12345]]
|
67
|
+
puts table.render(padding: 3)
|
68
|
+
|
69
|
+
+-----+--------+
|
70
|
+
|a1 |a2 |
|
71
|
+
|b1 |12345 |
|
72
|
+
+-----+--------+
|
73
|
+
```
|
74
|
+
|
75
|
+
### Alignment
|
76
|
+
|
77
|
+
It is possible to pass an alignment argument to render
|
78
|
+
|
79
|
+
```ruby
|
80
|
+
table = Termtable::Table.new rows: [['a1', 'a2'], ['b1', 123456]]
|
81
|
+
puts table.render(alignment: 'center')
|
82
|
+
|
83
|
+
+----+--------+
|
84
|
+
| a1 | a2 |
|
85
|
+
| b1 | 123456 |
|
86
|
+
+----+--------+
|
87
|
+
```
|
88
|
+
|
89
|
+
## Development
|
90
|
+
|
91
|
+
To run the tests
|
92
|
+
|
93
|
+
$ rake
|
94
|
+
|
95
|
+
## Contributing
|
96
|
+
|
97
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/nikkypx/termtable.
|
data/Rakefile
ADDED
data/bin/console
ADDED
data/bin/setup
ADDED
data/lib/termtable.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'termtable/border'
|
2
|
+
require 'termtable/cell'
|
3
|
+
require 'termtable/core_ext/array'
|
4
|
+
require 'termtable/error'
|
5
|
+
require 'termtable/header'
|
6
|
+
require 'termtable/render'
|
7
|
+
require 'termtable/row'
|
8
|
+
require 'termtable/table'
|
9
|
+
require 'termtable/version'
|
10
|
+
|
11
|
+
module Termtable
|
12
|
+
Array.include(CoreExt::Array)
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Termtable
|
2
|
+
class Border
|
3
|
+
def initialize(**opts)
|
4
|
+
@columns = opts.delete(:columns)
|
5
|
+
@style = opts.delete(:style) || '-'
|
6
|
+
@corner = opts.delete(:corners) || '+'
|
7
|
+
end
|
8
|
+
|
9
|
+
def render
|
10
|
+
@corner + @columns.map { |col| @style * col }.join(@corner) << @corner
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Termtable
|
2
|
+
class Cell
|
3
|
+
attr_reader :value
|
4
|
+
attr_accessor :max_column_size,
|
5
|
+
:padding,
|
6
|
+
:alignment,
|
7
|
+
:total_padding
|
8
|
+
|
9
|
+
def initialize(value)
|
10
|
+
@value = value.to_s
|
11
|
+
end
|
12
|
+
|
13
|
+
def expand?
|
14
|
+
max_column_size != value.to_s.size + total_padding
|
15
|
+
end
|
16
|
+
|
17
|
+
def left_padding
|
18
|
+
count = case alignment
|
19
|
+
when 'right'
|
20
|
+
expand? ? max_column_size - value.to_s.size : padding
|
21
|
+
when 'center'
|
22
|
+
expand? ? (max_column_size - value.to_s.size) / 2 : padding
|
23
|
+
else
|
24
|
+
0
|
25
|
+
end
|
26
|
+
' ' * count
|
27
|
+
end
|
28
|
+
|
29
|
+
def right_padding
|
30
|
+
count = case alignment
|
31
|
+
when 'right'
|
32
|
+
0
|
33
|
+
when 'center'
|
34
|
+
if expand? && max_column_size.even?
|
35
|
+
(max_column_size - value.to_s.size) / 2
|
36
|
+
elsif expand? && max_column_size.odd?
|
37
|
+
(max_column_size - value.to_s.size) / 2 + 1
|
38
|
+
else
|
39
|
+
padding
|
40
|
+
end
|
41
|
+
else
|
42
|
+
expand? ? max_column_size - value.to_s.size : padding
|
43
|
+
end
|
44
|
+
' ' * count
|
45
|
+
end
|
46
|
+
|
47
|
+
def render
|
48
|
+
"#{left_padding}#{value}#{right_padding}"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Termtable
|
2
|
+
class Render
|
3
|
+
DEFAULT_PADDING = 1
|
4
|
+
DEFAULT_ALIGNMENT = 'left'.freeze
|
5
|
+
|
6
|
+
def initialize(rows, opts)
|
7
|
+
@rows = rows
|
8
|
+
@padding = opts.delete(:padding) || DEFAULT_PADDING
|
9
|
+
@alignment = opts.delete(:alignment) || DEFAULT_ALIGNMENT
|
10
|
+
@border_options = opts.delete(:border)
|
11
|
+
@column_lengths = column_widths(rows)
|
12
|
+
end
|
13
|
+
|
14
|
+
def set_metadata!
|
15
|
+
@rows.each do |row|
|
16
|
+
row.cells.each_with_index do |cell, idx|
|
17
|
+
cell.max_column_size = @column_lengths[idx]
|
18
|
+
cell.padding = @padding
|
19
|
+
cell.alignment = @alignment
|
20
|
+
cell.total_padding = total_padding
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def set_borders!
|
26
|
+
@rows.unshift(Termtable::Border.new(columns: @column_lengths))
|
27
|
+
@rows.push(Termtable::Border.new(columns: @column_lengths))
|
28
|
+
end
|
29
|
+
|
30
|
+
def set_headers_border!
|
31
|
+
@rows.insert(2, Termtable::Border.new(columns: @column_lengths)) if @rows[1].is_a?(Termtable::Header)
|
32
|
+
end
|
33
|
+
|
34
|
+
def total_padding
|
35
|
+
@alignment == 'center' ? @padding * 2 : @padding
|
36
|
+
end
|
37
|
+
|
38
|
+
def column_widths(rows)
|
39
|
+
column_values = rows.map { |r| r.cells.map(&:value) }.transpose
|
40
|
+
column_values.map do |col|
|
41
|
+
col.max_by(&:length).size + total_padding
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def exec
|
46
|
+
set_metadata!
|
47
|
+
set_borders!
|
48
|
+
set_headers_border!
|
49
|
+
|
50
|
+
@rows.map(&:render).join("\n")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Termtable
|
2
|
+
class Table
|
3
|
+
def initialize(*args)
|
4
|
+
if args.first.is_a?(Array) && args.depth == 1
|
5
|
+
raise Termtable::Error::InitializationError, '2d array required for initialization'
|
6
|
+
end
|
7
|
+
|
8
|
+
if args.empty?
|
9
|
+
@rows = []
|
10
|
+
|
11
|
+
yield(self) if block_given?
|
12
|
+
else
|
13
|
+
if args.first.is_a?(Hash)
|
14
|
+
headers = args.first.delete(:headers)
|
15
|
+
@rows = args.first.delete(:rows)
|
16
|
+
elsif args.size == 2
|
17
|
+
headers, @rows = args
|
18
|
+
else
|
19
|
+
@rows = args.first
|
20
|
+
end
|
21
|
+
|
22
|
+
buffer_jagged_array!
|
23
|
+
|
24
|
+
@rows = @rows.map { |row| Row.new(row) }
|
25
|
+
@rows.unshift(Header.new(headers)) unless headers.nil?
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def buffer_jagged_array!
|
30
|
+
max = @rows.map(&:size).max
|
31
|
+
@rows.map { |row| (max - row.size).times { row << ' ' } }
|
32
|
+
end
|
33
|
+
|
34
|
+
def row_count
|
35
|
+
@rows.size
|
36
|
+
end
|
37
|
+
|
38
|
+
def <<(row)
|
39
|
+
@rows << Row.new(row)
|
40
|
+
end
|
41
|
+
|
42
|
+
def render(**opts)
|
43
|
+
Render.new(@rows, opts).exec
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/termtable.gemspec
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'termtable/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'termtable'
|
7
|
+
spec.version = Termtable::VERSION
|
8
|
+
spec.authors = ['Nicholas Palaniuk']
|
9
|
+
spec.email = ['npalaniuk+github@gmail.com']
|
10
|
+
spec.summary = 'Table generator for the terminal'
|
11
|
+
spec.description = 'Table generator for the terminal'
|
12
|
+
spec.homepage = 'https://github.com/nikkypx/termtable'
|
13
|
+
|
14
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
15
|
+
f.match(%r{^(test|spec|features)/})
|
16
|
+
end
|
17
|
+
spec.bindir = 'exe'
|
18
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.add_development_dependency 'bundler'
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: termtable
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Nicholas Palaniuk
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-09-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: Table generator for the terminal
|
28
|
+
email:
|
29
|
+
- npalaniuk+github@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- ".gitignore"
|
35
|
+
- ".rspec"
|
36
|
+
- ".rubocop.yml"
|
37
|
+
- ".travis.yml"
|
38
|
+
- Gemfile
|
39
|
+
- Gemfile.lock
|
40
|
+
- README.md
|
41
|
+
- Rakefile
|
42
|
+
- bin/console
|
43
|
+
- bin/setup
|
44
|
+
- lib/termtable.rb
|
45
|
+
- lib/termtable/border.rb
|
46
|
+
- lib/termtable/cell.rb
|
47
|
+
- lib/termtable/core_ext/array.rb
|
48
|
+
- lib/termtable/error.rb
|
49
|
+
- lib/termtable/header.rb
|
50
|
+
- lib/termtable/render.rb
|
51
|
+
- lib/termtable/row.rb
|
52
|
+
- lib/termtable/table.rb
|
53
|
+
- lib/termtable/version.rb
|
54
|
+
- termtable.gemspec
|
55
|
+
homepage: https://github.com/nikkypx/termtable
|
56
|
+
licenses: []
|
57
|
+
metadata: {}
|
58
|
+
post_install_message:
|
59
|
+
rdoc_options: []
|
60
|
+
require_paths:
|
61
|
+
- lib
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
requirements: []
|
73
|
+
rubyforge_project:
|
74
|
+
rubygems_version: 2.6.13
|
75
|
+
signing_key:
|
76
|
+
specification_version: 4
|
77
|
+
summary: Table generator for the terminal
|
78
|
+
test_files: []
|