tabulo 0.6.1 → 0.6.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.
- checksums.yaml +4 -4
- data/.travis.yml +4 -2
- data/CHANGELOG.md +4 -0
- data/README.md +14 -11
- data/Rakefile +6 -0
- data/VERSION +1 -0
- data/lib/tabulo/row.rb +0 -2
- data/lib/tabulo/table.rb +41 -54
- data/lib/tabulo/version.rb +1 -1
- data/tabulo.gemspec +3 -2
- metadata +21 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5a2f88a15024f1728f244d9f72a14b6f88a893fc
|
4
|
+
data.tar.gz: c6f23f4a1568575083122f501d2e61492057b2b7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 703ef06a5ea3c9c0dbf1b01b1572b02f0eca2e9ef6dc64508cb7a93459211c1c420f32af29c95a22581dd31c6a02ed3308ee7e913dfa37be65cf592633650b14
|
7
|
+
data.tar.gz: f17355d77642115e8bca70c5601164dfe16e186d1b5c79e3577d1e292eda46942a1fd9f0f9ccd730bbedaf2c4ce2a526832425715ae0c6d13e11a470ff018a2c
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
# Tabulo
|
2
2
|
|
3
3
|
[![Gem Version][GV img]][Gem Version]
|
4
|
-
[![Build Status][BS img]][Build Status]
|
5
4
|
[![Dependency Status][DS img]][Dependency Status]
|
6
5
|
[![Coverage Status][CS img]][Coverage Status]
|
6
|
+
[![Build Status][BS img]][Build Status]
|
7
7
|
[![Code Climate][CC img]][Code Climate]
|
8
|
+
[![Documentation][DC img]][Documentation]
|
8
9
|
|
9
10
|
## Overview
|
10
11
|
|
@@ -29,11 +30,11 @@ end
|
|
29
30
|
|
30
31
|
## Features
|
31
32
|
|
32
|
-
* Set [fixed widths](#fixed-column-widths)
|
33
|
+
* Set [fixed column widths](#fixed-column-widths), then either [wrap](#overflow-handling) or
|
33
34
|
[truncate](#overflow-handling) the overflow.
|
34
|
-
* Alternatively, [shrinkwrap](#shrinkwrap) the table so that each column is just wide enough for its
|
35
|
-
|
36
|
-
|
35
|
+
* Alternatively, [shrinkwrap](#shrinkwrap) the table so that each column is just wide enough for its contents.
|
36
|
+
* Put an upper limit on total table width when shrinkwrapping, to
|
37
|
+
[stop it overflowing your terminal horizontally](#max-table-width).
|
37
38
|
* Alignment of cell content is [configurable](#cell-alignment), but has helpful content-based defaults
|
38
39
|
(numbers right, strings left).
|
39
40
|
* Headers are [repeatable](#repeating-headers).
|
@@ -390,9 +391,11 @@ License](http://opensource.org/licenses/MIT).
|
|
390
391
|
[Dependency Status]: https://gemnasium.com/matt-harvey/tabulo
|
391
392
|
[Coverage Status]: https://coveralls.io/r/matt-harvey/tabulo
|
392
393
|
[Code Climate]: https://codeclimate.com/github/matt-harvey/tabulo
|
393
|
-
|
394
|
-
|
395
|
-
[
|
396
|
-
[
|
397
|
-
[
|
398
|
-
[
|
394
|
+
[Documentation]: http://www.rubydoc.info/gems/tabulo/0.6.2
|
395
|
+
|
396
|
+
[GV img]: https://img.shields.io/gem/v/tabulo.svg?style=plastic
|
397
|
+
[BS img]: https://img.shields.io/travis/matt-harvey/tabulo.svg?style=plastic
|
398
|
+
[DS img]: https://img.shields.io/gemnasium/matt-harvey/tabulo.svg?style=plastic
|
399
|
+
[CS img]: https://img.shields.io/coveralls/matt-harvey/tabulo.svg?style=plastic
|
400
|
+
[CC img]: https://img.shields.io/codeclimate/github/matt-harvey/tabulo.svg?style=plastic
|
401
|
+
[DC img]: https://img.shields.io/badge/docs-v0.6.2-blue.svg?style=plastic
|
data/Rakefile
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
2
|
require "rspec/core/rake_task"
|
3
|
+
require 'rake-version'
|
3
4
|
|
4
5
|
RSpec::Core::RakeTask.new(:spec)
|
5
6
|
|
6
7
|
task :default => :spec
|
8
|
+
|
9
|
+
RakeVersion::Tasks.new do |v|
|
10
|
+
v.copy "lib/tabulo/version.rb"
|
11
|
+
v.copy "README.md", all: true
|
12
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.6.2
|
data/lib/tabulo/row.rb
CHANGED
@@ -40,12 +40,10 @@ module Tabulo
|
|
40
40
|
|
41
41
|
# @return a Hash representation of the {Row}, with column labels acting
|
42
42
|
# as keys and the calculated cell values (before formatting) providing the values.
|
43
|
-
#
|
44
43
|
# @example
|
45
44
|
# table = Tabulo::Table.new([1, 10], columns: %i(itself even?))
|
46
45
|
# row = table.first
|
47
46
|
# row.to_h # => { :itself => 1, :even? => false }
|
48
|
-
#
|
49
47
|
def to_h
|
50
48
|
@table.columns.map(&:label).zip(to_a).to_h
|
51
49
|
end
|
data/lib/tabulo/table.rb
CHANGED
@@ -7,9 +7,11 @@ module Tabulo
|
|
7
7
|
include Enumerable
|
8
8
|
|
9
9
|
DEFAULT_COLUMN_WIDTH = 12
|
10
|
-
|
11
10
|
HORIZONTAL_RULE_CHARACTER = "-"
|
11
|
+
VERTICAL_RULE_CHARACTER = "|"
|
12
12
|
CORNER_CHARACTER = "+"
|
13
|
+
PADDING_CHARACTER = " "
|
14
|
+
TRUNCATION_INDICATOR = "~"
|
13
15
|
|
14
16
|
# @!visibility private
|
15
17
|
attr_reader :columns
|
@@ -33,7 +35,6 @@ module Tabulo
|
|
33
35
|
# headers), if their content is longer than the column's fixed width. If passed <tt>nil</tt>, content will
|
34
36
|
# be wrapped for as many rows as required to accommodate it. If passed a Fixnum N (> 0), content will be
|
35
37
|
# wrapped up to N rows and then truncated thereafter.
|
36
|
-
#
|
37
38
|
# @return [Table] a new Table
|
38
39
|
def initialize(sources, columns: [], column_width: nil, header_frequency: :start,
|
39
40
|
wrap_header_cells_to: nil, wrap_body_cells_to: nil)
|
@@ -45,10 +46,6 @@ module Tabulo
|
|
45
46
|
|
46
47
|
@default_column_width = (column_width || DEFAULT_COLUMN_WIDTH)
|
47
48
|
|
48
|
-
@joiner = "|"
|
49
|
-
@truncation_indicator = "~"
|
50
|
-
@padding_character = " "
|
51
|
-
|
52
49
|
@columns = []
|
53
50
|
columns.each { |item| add_column(item) }
|
54
51
|
|
@@ -62,7 +59,6 @@ module Tabulo
|
|
62
59
|
# extractor argument is not also provided, then the label argument should correspond to
|
63
60
|
# a method to be called on each item in the table sources to provide the content
|
64
61
|
# for this column.
|
65
|
-
#
|
66
62
|
# @param [nil, #to_s] header (nil) Text to be displayed in the column header. If passed nil,
|
67
63
|
# the column's label will also be used as its header text.
|
68
64
|
# @param [:left, :center, :right] align_header (:center) Specifies how the header text
|
@@ -85,7 +81,6 @@ module Tabulo
|
|
85
81
|
# that will be passed each of the Table sources to determine the value in each cell of this
|
86
82
|
# column. If this is not provided, then the column label will be treated as a method to be
|
87
83
|
# called on each source item to determine each cell's value.
|
88
|
-
#
|
89
84
|
def add_column(label, header: nil, align_header: :center, align_body: nil,
|
90
85
|
width: nil, formatter: :to_s.to_proc, &extractor)
|
91
86
|
|
@@ -136,12 +131,12 @@ module Tabulo
|
|
136
131
|
|
137
132
|
# @return [String] an "ASCII" graphical representation of the Table column headers.
|
138
133
|
def formatted_header
|
139
|
-
|
134
|
+
cells = @columns.map(&:header_subcells)
|
135
|
+
format_row(cells, @wrap_header_cells_to)
|
140
136
|
end
|
141
137
|
|
142
138
|
# @return [String] an "ASCII" graphical representation of a horizontal
|
143
139
|
# dividing line suitable for printing at any point in the table.
|
144
|
-
#
|
145
140
|
# @example Print a horizontal divider after every row:
|
146
141
|
# table.each do |row|
|
147
142
|
# puts row
|
@@ -173,7 +168,6 @@ module Tabulo
|
|
173
168
|
# in each column, together with border characters (1 on each side of the table and 1 between
|
174
169
|
# adjacent columns). I.e. there is a certain width below width the Table will refuse to
|
175
170
|
# shrink itself.
|
176
|
-
#
|
177
171
|
# @return [Table] the Table itself
|
178
172
|
def shrinkwrap!(max_table_width: nil)
|
179
173
|
return self if columns.none?
|
@@ -218,7 +212,8 @@ module Tabulo
|
|
218
212
|
|
219
213
|
# @!visibility private
|
220
214
|
def formatted_body_row(source, with_header: false)
|
221
|
-
|
215
|
+
cells = @columns.map { |column| column.body_subcells(source) }
|
216
|
+
inner = format_row(cells, @wrap_body_cells_to)
|
222
217
|
if with_header
|
223
218
|
join_lines([horizontal_rule, formatted_header, horizontal_rule, inner])
|
224
219
|
else
|
@@ -235,52 +230,44 @@ module Tabulo
|
|
235
230
|
|
236
231
|
# @!visibility private
|
237
232
|
#
|
238
|
-
#
|
239
|
-
#
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
233
|
+
# Formats a single header row or body row as a String.
|
234
|
+
#
|
235
|
+
# @param [String[][]] cells an Array of Array-of-Strings, each of which represents a
|
236
|
+
# "stack" of "subcells". Each such stack represents the wrapped content of a given
|
237
|
+
# "cell" in this row, from the top down, one String for each "line".
|
238
|
+
# Each String includes the spaces, if any, on either side required for the
|
239
|
+
# "internal padding" of the cell to carry out the cell content alignment -- but
|
240
|
+
# does not include the single character of padding around each column.
|
241
|
+
# @param [Fixnum] wrap_cells_to the number of "lines" of wrapped content to allow
|
242
|
+
# before truncating.
|
243
|
+
# @return [String] the entire formatted row including all padding and borders.
|
244
|
+
def format_row(cells, wrap_cells_to)
|
245
|
+
row_height = ([wrap_cells_to, cells.map(&:size).max].compact.min || 1)
|
246
|
+
|
247
|
+
subrows = (0...row_height).map do |subrow_index|
|
248
|
+
subrow_components = cells.map.with_index do |cell, column_index|
|
249
|
+
num_subcells = cell.size
|
250
|
+
cell_truncated = (num_subcells > row_height)
|
251
|
+
append_truncator = (cell_truncated && subrow_index + 1 == row_height)
|
252
|
+
|
253
|
+
lpad = PADDING_CHARACTER
|
254
|
+
rpad = (append_truncator ? TRUNCATION_INDICATOR : PADDING_CHARACTER)
|
255
|
+
|
256
|
+
inner =
|
257
|
+
if subrow_index < num_subcells
|
258
|
+
cell[subrow_index]
|
259
|
+
else
|
260
|
+
column_width = @columns[column_index].width
|
261
|
+
PADDING_CHARACTER * column_width
|
262
|
+
end
|
263
|
+
|
264
|
+
"#{lpad}#{inner}#{rpad}"
|
260
265
|
end
|
261
|
-
end
|
262
266
|
|
263
|
-
|
264
|
-
|
265
|
-
# A subrow is a string representing a single horizontal slice of this row that's
|
266
|
-
# strictly one character high.
|
267
|
-
subrows = (0...max_cell_stack_height).map do |subrow_index|
|
268
|
-
cell_stacks.map.with_index do |cell_stack, column_index|
|
269
|
-
if subrow_index < cell_stack.size
|
270
|
-
# This cell stack is at least as "deep" as the subrow we're on. So just
|
271
|
-
# grab the subcell for this subrow from this cell stack.
|
272
|
-
cell_stack[subrow_index]
|
273
|
-
else
|
274
|
-
# This cell stack is not "deep" enough. So we make an empty subcell to
|
275
|
-
# add to this subrow for this column
|
276
|
-
surround(' ' * @columns[column_index].width, @padding_character)
|
277
|
-
end
|
278
|
-
end
|
267
|
+
surround_join(subrow_components, VERTICAL_RULE_CHARACTER)
|
279
268
|
end
|
280
269
|
|
281
|
-
|
282
|
-
# the wrapped, formatted row as a single string.
|
283
|
-
join_lines(subrows.map { |subrow| surround_join(subrow, @joiner) })
|
270
|
+
join_lines(subrows)
|
284
271
|
end
|
285
272
|
|
286
273
|
# @!visibility private
|
data/lib/tabulo/version.rb
CHANGED
data/tabulo.gemspec
CHANGED
@@ -21,14 +21,15 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
22
|
spec.require_paths = ["lib"]
|
23
23
|
|
24
|
-
spec.required_ruby_version = "
|
24
|
+
spec.required_ruby_version = ">= 2.1.10"
|
25
25
|
|
26
26
|
spec.add_development_dependency "bundler", "~> 1.14.6"
|
27
|
-
spec.add_development_dependency "rake", "~>
|
27
|
+
spec.add_development_dependency "rake", "~> 11.0"
|
28
28
|
spec.add_development_dependency "rspec", "~> 3.0"
|
29
29
|
spec.add_development_dependency "simplecov"
|
30
30
|
spec.add_development_dependency "coveralls"
|
31
31
|
spec.add_development_dependency "yard"
|
32
32
|
spec.add_development_dependency "redcarpet"
|
33
33
|
spec.add_development_dependency "github-markup"
|
34
|
+
spec.add_development_dependency "rake-version", "~> 1.0"
|
34
35
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tabulo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew Harvey
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-05-
|
11
|
+
date: 2017-05-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '11.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '11.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,6 +122,20 @@ dependencies:
|
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rake-version
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '1.0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '1.0'
|
125
139
|
description: Enumerable ASCII table
|
126
140
|
email:
|
127
141
|
- software@matthewharvey.net
|
@@ -140,6 +154,7 @@ files:
|
|
140
154
|
- LICENSE.txt
|
141
155
|
- README.md
|
142
156
|
- Rakefile
|
157
|
+
- VERSION
|
143
158
|
- bin/console
|
144
159
|
- bin/setup
|
145
160
|
- lib/tabulo.rb
|
@@ -158,9 +173,9 @@ require_paths:
|
|
158
173
|
- lib
|
159
174
|
required_ruby_version: !ruby/object:Gem::Requirement
|
160
175
|
requirements:
|
161
|
-
- - "
|
176
|
+
- - ">="
|
162
177
|
- !ruby/object:Gem::Version
|
163
|
-
version:
|
178
|
+
version: 2.1.10
|
164
179
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
165
180
|
requirements:
|
166
181
|
- - ">="
|