legitable 0.1.0 → 0.3.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 +5 -5
- data/.github/dependabot.yml +8 -0
- data/.github/workflows/ruby.yml +35 -0
- data/.gitignore +1 -0
- data/README.md +21 -1
- data/legitable.gemspec +14 -15
- data/lib/legitable/table.rb +54 -22
- data/lib/legitable/version.rb +1 -1
- metadata +12 -12
- data/.travis.yml +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f3691facd3a9d75752074edc878b8b4a838a448057786b0fc63e743dd1c7d779
|
4
|
+
data.tar.gz: b4376d57b9cf0d17cf00821fcc47a9769dd6c4f4962f6140f1b44c0f85ff5dbc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a8683049e85e94342dc26f77642f2023ab58dcfd0ae481e11d2f3bd70fb4e31b61ed518e79c035dc9f1d3a3a45cdfce1b35092636ea97b29b67eb148b5742289
|
7
|
+
data.tar.gz: f8db001d5bda976b36b2d93be151434fb988224c2a6aeb16c9d1b12d893db9da203e4e9b7a59898df4e17d68a105ca888e5d91b0358b7e0dbd973c6d8bccc83a
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# This workflow uses actions that are not certified by GitHub.
|
2
|
+
# They are provided by a third-party and are governed by
|
3
|
+
# separate terms of service, privacy policy, and support
|
4
|
+
# documentation.
|
5
|
+
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
|
6
|
+
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
|
7
|
+
|
8
|
+
name: Tests
|
9
|
+
|
10
|
+
on:
|
11
|
+
push:
|
12
|
+
branches: [ master ]
|
13
|
+
pull_request:
|
14
|
+
branches: [ master ]
|
15
|
+
|
16
|
+
jobs:
|
17
|
+
test:
|
18
|
+
|
19
|
+
runs-on: ubuntu-latest
|
20
|
+
strategy:
|
21
|
+
matrix:
|
22
|
+
ruby-version: ['2.6', '2.7', '3.0']
|
23
|
+
|
24
|
+
steps:
|
25
|
+
- uses: actions/checkout@v2
|
26
|
+
- name: Set up Ruby
|
27
|
+
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
28
|
+
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
29
|
+
# uses: ruby/setup-ruby@v1
|
30
|
+
uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
|
31
|
+
with:
|
32
|
+
ruby-version: ${{ matrix.ruby-version }}
|
33
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
34
|
+
- name: Run tests
|
35
|
+
run: bundle exec rake
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+

|
1
2
|
# Legitable
|
2
3
|
|
3
4
|
Tables are easier to read. Legitable makes it easy to display plain text output in tabular form.
|
@@ -116,7 +117,7 @@ Which, of course, improves the display of the names column:
|
|
116
117
|
And, of course, you can do something similar for the column headings:
|
117
118
|
|
118
119
|
```ruby
|
119
|
-
|
120
|
+
table = Legitable::Table.new do
|
120
121
|
formatting_headers do |header|
|
121
122
|
header.capitalize
|
122
123
|
end
|
@@ -131,6 +132,25 @@ Which makes the headers a little nicer:
|
|
131
132
|
jj abrams | 333-555-1212
|
132
133
|
|
133
134
|
|
135
|
+
### Markdown Style
|
136
|
+
|
137
|
+
Sometimes your tables end up in a markdown document. Legitable is nice
|
138
|
+
for plain text viewing, but the default table style is not quite legit
|
139
|
+
as a markdown table. You can fix that with the markdown style:
|
140
|
+
|
141
|
+
```ruby
|
142
|
+
table = Legitable::Table.new(style: :markdown)
|
143
|
+
```
|
144
|
+
|
145
|
+
The result is very similar, but adds the delimiter to the header
|
146
|
+
separator, which causes it to render properly as markdown:
|
147
|
+
|
148
|
+
NAME | PHONE
|
149
|
+
------------|-------------
|
150
|
+
joss whedon | 444-555-1212
|
151
|
+
jj abrams | 333-555-1212
|
152
|
+
|
153
|
+
|
134
154
|
## Caveats
|
135
155
|
|
136
156
|
It should be obvious that this utility pulls in all rows, and then
|
data/legitable.gemspec
CHANGED
@@ -1,28 +1,27 @@
|
|
1
|
-
|
2
1
|
lib = File.expand_path("../lib", __FILE__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
3
|
require "legitable/version"
|
5
4
|
|
6
5
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name
|
8
|
-
spec.version
|
9
|
-
spec.authors
|
10
|
-
spec.email
|
6
|
+
spec.name = "legitable"
|
7
|
+
spec.version = Legitable::VERSION
|
8
|
+
spec.authors = ["Joel Helbling"]
|
9
|
+
spec.email = ["joel@joelhelbling.com"]
|
11
10
|
|
12
|
-
spec.summary
|
13
|
-
spec.description
|
14
|
-
spec.homepage
|
15
|
-
spec.license
|
11
|
+
spec.summary = "Easy plain text tables"
|
12
|
+
spec.description = "Tables are easier to read. Legitable makes it easy to display plain text output in tabular form."
|
13
|
+
spec.homepage = "https://github.com/joelhelbling/legitable"
|
14
|
+
spec.license = "MIT"
|
16
15
|
|
17
|
-
spec.files
|
18
|
-
f.match(%r{^(test|spec|features)/})
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
17
|
+
f.match(%r{^(test|spec|features|\.vim.*|\.rspec.*)/})
|
19
18
|
end
|
20
|
-
spec.bindir
|
21
|
-
spec.executables
|
19
|
+
spec.bindir = "exe"
|
20
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
21
|
spec.require_paths = ["lib"]
|
23
22
|
|
24
|
-
spec.add_development_dependency "bundler", "~>
|
25
|
-
spec.add_development_dependency "rake", "~>
|
23
|
+
spec.add_development_dependency "bundler", "~> 2.2.rc"
|
24
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
26
25
|
spec.add_development_dependency "rspec", "~> 3.7"
|
27
26
|
spec.add_development_dependency "rspec-given", "~> 3.8"
|
28
27
|
spec.add_development_dependency "pry", "~> 0.11"
|
data/lib/legitable/table.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
require
|
1
|
+
require "ostruct"
|
2
2
|
|
3
3
|
module Legitable
|
4
4
|
class Table
|
5
|
-
attr_reader :rows, :headers, :delimiter, :separator, :format
|
5
|
+
attr_reader :rows, :headers, :delimiter, :separator, :format, :style
|
6
6
|
|
7
|
-
def initialize(alignment: {}, delimiter:
|
7
|
+
def initialize(alignment: {}, delimiter: " | ", separator: "-", style: nil, &block)
|
8
8
|
@rows = []
|
9
9
|
@headers = []
|
10
10
|
@format = {}
|
@@ -12,23 +12,34 @@ module Legitable
|
|
12
12
|
@alignment = alignment
|
13
13
|
@delimiter = delimiter
|
14
14
|
@separator = separator
|
15
|
+
@style = style
|
15
16
|
|
16
|
-
|
17
|
+
if style == :markdown
|
18
|
+
@delimiter = " | "
|
19
|
+
@separator = "-"
|
20
|
+
end
|
21
|
+
|
22
|
+
instance_eval(&block) unless block.nil?
|
17
23
|
end
|
18
24
|
|
19
|
-
def <<(
|
20
|
-
|
21
|
-
|
25
|
+
def <<(data)
|
26
|
+
case data
|
27
|
+
when Array
|
28
|
+
data.each { |row| self << row }
|
29
|
+
when Hash
|
30
|
+
initialize_headers(data) if headers.empty?
|
31
|
+
add_row data
|
32
|
+
when Enumerable
|
33
|
+
data.each { |row| self << row }
|
34
|
+
end
|
22
35
|
self
|
23
36
|
end
|
24
37
|
|
25
38
|
def to_s
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
end.join(delimiter)
|
31
|
-
end.join("\n") + "\n"
|
39
|
+
<<~EOS
|
40
|
+
#{render_headers}
|
41
|
+
#{render_rows}
|
42
|
+
EOS
|
32
43
|
end
|
33
44
|
|
34
45
|
private
|
@@ -45,21 +56,20 @@ module Legitable
|
|
45
56
|
end
|
46
57
|
|
47
58
|
def add_row(row)
|
48
|
-
rows << headers.
|
59
|
+
rows << headers.each_with_object({}) do |header, memo|
|
49
60
|
formatter = format[header].formatter
|
50
61
|
value = formatter.call(row[header].to_s).to_s
|
51
62
|
if format[header].width < value.length
|
52
63
|
format[header].width = value.length
|
53
64
|
end
|
54
65
|
memo[header] = value
|
55
|
-
memo
|
56
66
|
end
|
57
67
|
end
|
58
68
|
|
59
69
|
def render_headers
|
60
70
|
headers.map do |header|
|
61
71
|
render_cell(header, header_formatter.call(header))
|
62
|
-
end.join(delimiter) + "\n" +
|
72
|
+
end.join(delimiter) + "\n" + render_separator
|
63
73
|
end
|
64
74
|
|
65
75
|
def row_width
|
@@ -69,20 +79,38 @@ module Legitable
|
|
69
79
|
end
|
70
80
|
end
|
71
81
|
|
82
|
+
def render_rows
|
83
|
+
rows.map { |row| render_row(row) }.join("\n")
|
84
|
+
end
|
85
|
+
|
86
|
+
def render_row(row)
|
87
|
+
headers.map { |header| render_cell header, row[header] }.join(delimiter)
|
88
|
+
end
|
89
|
+
|
90
|
+
def render_separator
|
91
|
+
if style == :markdown
|
92
|
+
headers.map do |header|
|
93
|
+
separator * format[header].width
|
94
|
+
end.join("-|-")
|
95
|
+
else
|
96
|
+
separator * row_width
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
72
100
|
def render_cell(header, value)
|
73
101
|
cell_width = format[header].width
|
74
102
|
|
75
|
-
|
76
|
-
value.rjust(cell_width,
|
77
|
-
value.to_s + (
|
103
|
+
format[header].align == :right ?
|
104
|
+
value.rjust(cell_width, " ") :
|
105
|
+
value.to_s + (" " * (cell_width - value.to_s.length))
|
78
106
|
end
|
79
107
|
|
80
108
|
def formatting(header, &block)
|
81
|
-
@formatters[header] = block
|
109
|
+
@formatters[header] = block || default_formatter
|
82
110
|
end
|
83
111
|
|
84
112
|
def default_formatter
|
85
|
-
@default_formatter ||=
|
113
|
+
@default_formatter ||= proc { |value| value.to_s }
|
86
114
|
end
|
87
115
|
|
88
116
|
def formatting_headers(&block)
|
@@ -90,7 +118,11 @@ module Legitable
|
|
90
118
|
end
|
91
119
|
|
92
120
|
def header_formatter
|
93
|
-
@header_formatter ||=
|
121
|
+
@header_formatter ||= default_header_formatter
|
122
|
+
end
|
123
|
+
|
124
|
+
def default_header_formatter
|
125
|
+
@default_header_formatter ||= proc { |header| header.to_s.upcase }
|
94
126
|
end
|
95
127
|
end
|
96
128
|
end
|
data/lib/legitable/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: legitable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joel Helbling
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-10-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 2.2.rc
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 2.2.rc
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '13.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: '13.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -88,9 +88,10 @@ executables: []
|
|
88
88
|
extensions: []
|
89
89
|
extra_rdoc_files: []
|
90
90
|
files:
|
91
|
+
- ".github/dependabot.yml"
|
92
|
+
- ".github/workflows/ruby.yml"
|
91
93
|
- ".gitignore"
|
92
94
|
- ".rspec"
|
93
|
-
- ".travis.yml"
|
94
95
|
- Gemfile
|
95
96
|
- LICENSE.txt
|
96
97
|
- README.md
|
@@ -105,7 +106,7 @@ homepage: https://github.com/joelhelbling/legitable
|
|
105
106
|
licenses:
|
106
107
|
- MIT
|
107
108
|
metadata: {}
|
108
|
-
post_install_message:
|
109
|
+
post_install_message:
|
109
110
|
rdoc_options: []
|
110
111
|
require_paths:
|
111
112
|
- lib
|
@@ -120,9 +121,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
120
121
|
- !ruby/object:Gem::Version
|
121
122
|
version: '0'
|
122
123
|
requirements: []
|
123
|
-
|
124
|
-
|
125
|
-
signing_key:
|
124
|
+
rubygems_version: 3.2.22
|
125
|
+
signing_key:
|
126
126
|
specification_version: 4
|
127
127
|
summary: Easy plain text tables
|
128
128
|
test_files: []
|