tabled 0.0.2 → 0.0.3
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/.github/workflows/linters.yml +14 -2
- data/.rubocop.yml +7 -0
- data/.rubocop_todo.yml +69 -0
- data/CHANGELOG.md +11 -0
- data/Gemfile +3 -1
- data/Gemfile.lock +80 -1
- data/README.md +22 -12
- data/demo.rb +145 -89
- data/lib/content_shaper.rb +30 -28
- data/lib/helpers.rb +31 -15
- data/lib/tabled.rb +6 -5
- data/lib/template.rb +21 -6
- data/tabled.gemspec +16 -10
- metadata +50 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4e5d0c20e1b0c91a2798fe10ae7f2d5da0de98c01bfff7d8af7e2cdc1e5673a2
|
|
4
|
+
data.tar.gz: fa10431595f5bb1dbcd57867cb6e8993424445b30c9d5939e9be523fec215f50
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 31f4a75497f308e805bfe282534bdd04fe37d2ddabb299eda69c1170fd353145b2b716d1991db5bcd173703ba4492e292098de242abea4914763421901bb1e50
|
|
7
|
+
data.tar.gz: cc8aee4ae5f3b0e3bfdba62e57e05d03f3fe6381093f370dba6187f0c85811e3a75a5f2363522fbc97f12b5971ac77658bafc402f05205ff2e7175021da9feda
|
|
@@ -17,13 +17,25 @@ permissions:
|
|
|
17
17
|
contents: read
|
|
18
18
|
|
|
19
19
|
jobs:
|
|
20
|
+
linters:
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
strategy:
|
|
23
|
+
matrix:
|
|
24
|
+
ruby-version: ['3.0']
|
|
25
|
+
steps:
|
|
26
|
+
- uses: actions/checkout@v3
|
|
27
|
+
- name: Set up Ruby
|
|
28
|
+
uses: ruby/setup-ruby@2b019609e2b0f1ea1a2bc8ca11cb82ab46ada124
|
|
29
|
+
with:
|
|
30
|
+
ruby-version: ${{ matrix.ruby-version }}
|
|
31
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
|
32
|
+
- name: Run tests
|
|
33
|
+
run: bundle exec rubocop
|
|
20
34
|
test:
|
|
21
|
-
|
|
22
35
|
runs-on: ubuntu-latest
|
|
23
36
|
strategy:
|
|
24
37
|
matrix:
|
|
25
38
|
ruby-version: ['2.6', '2.7', '3.0']
|
|
26
|
-
|
|
27
39
|
steps:
|
|
28
40
|
- uses: actions/checkout@v3
|
|
29
41
|
- name: Set up Ruby
|
data/.rubocop.yml
ADDED
data/.rubocop_todo.yml
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# This configuration was generated by
|
|
2
|
+
# `rubocop --auto-gen-config --auto-gen-only-exclude`
|
|
3
|
+
# on 2022-05-23 07:45:44 UTC using RuboCop version 1.29.1.
|
|
4
|
+
# The point is for the user to remove these configuration records
|
|
5
|
+
# one by one as the offenses are removed from the code base.
|
|
6
|
+
# Note that changes in the inspected code, or installation of new
|
|
7
|
+
# versions of RuboCop, may require this file to be generated again.
|
|
8
|
+
|
|
9
|
+
# Offense count: 1
|
|
10
|
+
# Configuration parameters: Include.
|
|
11
|
+
# Include: **/*.gemspec
|
|
12
|
+
Gemspec/RequiredRubyVersion:
|
|
13
|
+
Exclude:
|
|
14
|
+
- 'tabled.gemspec'
|
|
15
|
+
|
|
16
|
+
# Offense count: 3
|
|
17
|
+
# Configuration parameters: IgnoredMethods, CountRepeatedAttributes, Max.
|
|
18
|
+
Metrics/AbcSize:
|
|
19
|
+
Exclude:
|
|
20
|
+
- 'lib/content_shaper.rb'
|
|
21
|
+
- 'lib/helpers.rb'
|
|
22
|
+
|
|
23
|
+
# Offense count: 3
|
|
24
|
+
# Configuration parameters: CountComments, Max, CountAsOne, ExcludedMethods, IgnoredMethods.
|
|
25
|
+
# IgnoredMethods: refine
|
|
26
|
+
Metrics/BlockLength:
|
|
27
|
+
Exclude:
|
|
28
|
+
- '**/*.gemspec'
|
|
29
|
+
- 'spec/framed/tabled_spec.rb'
|
|
30
|
+
- 'spec/non_framed/tabled_spec.rb'
|
|
31
|
+
|
|
32
|
+
# Offense count: 2
|
|
33
|
+
# Configuration parameters: IgnoredMethods, Max.
|
|
34
|
+
Metrics/CyclomaticComplexity:
|
|
35
|
+
Exclude:
|
|
36
|
+
- 'lib/content_shaper.rb'
|
|
37
|
+
- 'lib/helpers.rb'
|
|
38
|
+
|
|
39
|
+
# Offense count: 4
|
|
40
|
+
# Configuration parameters: CountComments, Max, CountAsOne, ExcludedMethods, IgnoredMethods.
|
|
41
|
+
Metrics/MethodLength:
|
|
42
|
+
Exclude:
|
|
43
|
+
- 'lib/content_shaper.rb'
|
|
44
|
+
- 'lib/helpers.rb'
|
|
45
|
+
- 'spec/factories/factory_data.rb'
|
|
46
|
+
|
|
47
|
+
# Offense count: 2
|
|
48
|
+
# Configuration parameters: IgnoredMethods, Max.
|
|
49
|
+
Metrics/PerceivedComplexity:
|
|
50
|
+
Exclude:
|
|
51
|
+
- 'lib/content_shaper.rb'
|
|
52
|
+
- 'lib/helpers.rb'
|
|
53
|
+
|
|
54
|
+
# Offense count: 1
|
|
55
|
+
# Configuration parameters: Max, CountAsOne.
|
|
56
|
+
RSpec/ExampleLength:
|
|
57
|
+
Exclude:
|
|
58
|
+
- 'spec/framed/tabled_spec.rb'
|
|
59
|
+
|
|
60
|
+
# Offense count: 6
|
|
61
|
+
# Configuration parameters: AllowedConstants.
|
|
62
|
+
Style/Documentation:
|
|
63
|
+
Exclude:
|
|
64
|
+
- 'spec/**/*'
|
|
65
|
+
- 'test/**/*'
|
|
66
|
+
- 'lib/content_shaper.rb'
|
|
67
|
+
- 'lib/helpers.rb'
|
|
68
|
+
- 'lib/tabled.rb'
|
|
69
|
+
- 'lib/template.rb'
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
### Version 0.0.3 (May 23, 2022)
|
|
2
|
+
1. Printing titles of columns
|
|
3
|
+
2. Fixing layout (amount of spaces for row separators)
|
|
4
|
+
|
|
5
|
+
### Version 0.0.2 (May 16, 2022)
|
|
6
|
+
1. Rendering footers of rows
|
|
7
|
+
2. Adding optional frame to tables
|
|
8
|
+
3. Adding row separator
|
|
9
|
+
|
|
10
|
+
### Version 0.0.1 (May 11, 2022)
|
|
11
|
+
1. Basic rendering tables to console
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,14 +1,72 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
tabled (0.0.
|
|
4
|
+
tabled (0.0.2)
|
|
5
5
|
|
|
6
6
|
GEM
|
|
7
7
|
remote: http://rubygems.org/
|
|
8
8
|
specs:
|
|
9
|
+
addressable (2.4.0)
|
|
10
|
+
ast (2.4.2)
|
|
11
|
+
builder (3.2.4)
|
|
9
12
|
byebug (11.1.3)
|
|
13
|
+
descendants_tracker (0.0.4)
|
|
14
|
+
thread_safe (~> 0.3, >= 0.3.1)
|
|
10
15
|
diff-lcs (1.5.0)
|
|
11
16
|
docile (1.4.0)
|
|
17
|
+
faraday (0.9.2)
|
|
18
|
+
multipart-post (>= 1.2, < 3)
|
|
19
|
+
git (1.11.0)
|
|
20
|
+
rchardet (~> 1.8)
|
|
21
|
+
github_api (0.16.0)
|
|
22
|
+
addressable (~> 2.4.0)
|
|
23
|
+
descendants_tracker (~> 0.0.4)
|
|
24
|
+
faraday (~> 0.8, < 0.10)
|
|
25
|
+
hashie (>= 3.4)
|
|
26
|
+
mime-types (>= 1.16, < 3.0)
|
|
27
|
+
oauth2 (~> 1.0)
|
|
28
|
+
hashie (5.0.0)
|
|
29
|
+
highline (2.0.3)
|
|
30
|
+
jeweler (2.3.9)
|
|
31
|
+
builder
|
|
32
|
+
bundler
|
|
33
|
+
git (>= 1.2.5)
|
|
34
|
+
github_api (~> 0.16.0)
|
|
35
|
+
highline (>= 1.6.15)
|
|
36
|
+
nokogiri (>= 1.5.10)
|
|
37
|
+
psych
|
|
38
|
+
rake
|
|
39
|
+
rdoc
|
|
40
|
+
semver2
|
|
41
|
+
jwt (2.3.0)
|
|
42
|
+
mime-types (2.99.3)
|
|
43
|
+
mini_portile2 (2.8.0)
|
|
44
|
+
multi_json (1.15.0)
|
|
45
|
+
multi_xml (0.6.0)
|
|
46
|
+
multipart-post (2.1.1)
|
|
47
|
+
nokogiri (1.13.6)
|
|
48
|
+
mini_portile2 (~> 2.8.0)
|
|
49
|
+
racc (~> 1.4)
|
|
50
|
+
oauth2 (1.4.8)
|
|
51
|
+
faraday (>= 0.8, < 3.0)
|
|
52
|
+
jwt (>= 1.0, < 3.0)
|
|
53
|
+
multi_json (~> 1.3)
|
|
54
|
+
multi_xml (~> 0.5)
|
|
55
|
+
rack (>= 1.2, < 3)
|
|
56
|
+
parallel (1.22.1)
|
|
57
|
+
parser (3.1.2.0)
|
|
58
|
+
ast (~> 2.4.1)
|
|
59
|
+
psych (4.0.4)
|
|
60
|
+
stringio
|
|
61
|
+
racc (1.6.0)
|
|
62
|
+
rack (2.2.3)
|
|
63
|
+
rainbow (3.1.1)
|
|
64
|
+
rake (13.0.6)
|
|
65
|
+
rchardet (1.8.0)
|
|
66
|
+
rdoc (6.4.0)
|
|
67
|
+
psych (>= 4.0.0)
|
|
68
|
+
regexp_parser (2.4.0)
|
|
69
|
+
rexml (3.2.5)
|
|
12
70
|
rspec (3.11.0)
|
|
13
71
|
rspec-core (~> 3.11.0)
|
|
14
72
|
rspec-expectations (~> 3.11.0)
|
|
@@ -22,19 +80,40 @@ GEM
|
|
|
22
80
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
23
81
|
rspec-support (~> 3.11.0)
|
|
24
82
|
rspec-support (3.11.0)
|
|
83
|
+
rubocop (1.29.1)
|
|
84
|
+
parallel (~> 1.10)
|
|
85
|
+
parser (>= 3.1.0.0)
|
|
86
|
+
rainbow (>= 2.2.2, < 4.0)
|
|
87
|
+
regexp_parser (>= 1.8, < 3.0)
|
|
88
|
+
rexml (>= 3.2.5, < 4.0)
|
|
89
|
+
rubocop-ast (>= 1.17.0, < 2.0)
|
|
90
|
+
ruby-progressbar (~> 1.7)
|
|
91
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
|
92
|
+
rubocop-ast (1.18.0)
|
|
93
|
+
parser (>= 3.1.1.0)
|
|
94
|
+
rubocop-rspec (2.10.0)
|
|
95
|
+
rubocop (~> 1.19)
|
|
96
|
+
ruby-progressbar (1.11.0)
|
|
97
|
+
semver2 (3.4.2)
|
|
25
98
|
simplecov (0.21.2)
|
|
26
99
|
docile (~> 1.1)
|
|
27
100
|
simplecov-html (~> 0.11)
|
|
28
101
|
simplecov_json_formatter (~> 0.1)
|
|
29
102
|
simplecov-html (0.12.3)
|
|
30
103
|
simplecov_json_formatter (0.1.4)
|
|
104
|
+
stringio (3.0.2)
|
|
105
|
+
thread_safe (0.3.6)
|
|
106
|
+
unicode-display_width (2.1.0)
|
|
31
107
|
|
|
32
108
|
PLATFORMS
|
|
33
109
|
ruby
|
|
34
110
|
|
|
35
111
|
DEPENDENCIES
|
|
36
112
|
byebug
|
|
113
|
+
jeweler
|
|
37
114
|
rspec
|
|
115
|
+
rubocop
|
|
116
|
+
rubocop-rspec
|
|
38
117
|
simplecov
|
|
39
118
|
tabled!
|
|
40
119
|
|
data/README.md
CHANGED
|
@@ -1,14 +1,23 @@
|
|
|
1
|
-
[](https://badge.fury.io/rb/tabled) 
|
|
1
|
+
[](https://badge.fury.io/rb/tabled)  
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
# Description
|
|
5
|
-
|
|
5
|
+
Library can be used to render your data to a console. Though it's quite simple, but has many features.
|
|
6
6
|
|
|
7
7
|
# How to use
|
|
8
8
|
1. Install the gem `bundle add tabled` or `gem install tabled`
|
|
9
9
|
2. Add to the application `require 'tabled''`
|
|
10
10
|
3. Pass to the application array of rows. Each row may have any amount of columns and optional footer text.
|
|
11
11
|
|
|
12
|
+
### Params for Tabled instance
|
|
13
|
+
Tabled accepts two params. Data which is prohibited and options.
|
|
14
|
+
Available options:
|
|
15
|
+
1. `framed` - optional, default is true
|
|
16
|
+
2. `row_separator` - optional, default is `-`. Can be `nil` if you don't need separate rows.
|
|
17
|
+
3. `titles` - optional parameter with list of columns titles
|
|
18
|
+
|
|
19
|
+
More examples in [demo.rb](./demo.rb)
|
|
20
|
+
|
|
12
21
|
### Simple data structure
|
|
13
22
|
```ruby
|
|
14
23
|
data = [
|
|
@@ -17,7 +26,8 @@ data = [
|
|
|
17
26
|
["Alan", "23 years", "Male"],
|
|
18
27
|
]
|
|
19
28
|
|
|
20
|
-
Tabled.new(data
|
|
29
|
+
Tabled.new(data, framed: false,
|
|
30
|
+
row_separator: nil).print_to_console
|
|
21
31
|
```
|
|
22
32
|
|
|
23
33
|
Result
|
|
@@ -31,25 +41,25 @@ Alan 23 years Male
|
|
|
31
41
|
```ruby
|
|
32
42
|
data = [
|
|
33
43
|
["Helena", "20 years", "Female"],
|
|
34
|
-
["John", "18 years", "Male", { footer: "Legendary assassin John Wick (Keanu Reeves)
|
|
44
|
+
["John", "18 years", "Male", { footer: "Legendary assassin John Wick (Keanu Reeves)." }],
|
|
35
45
|
["Alan", "23 years", "Male"],
|
|
36
46
|
]
|
|
37
47
|
|
|
38
|
-
Tabled.new(data).print_to_console
|
|
48
|
+
Tabled.new(data, row_separator: nil).print_to_console
|
|
39
49
|
```
|
|
40
50
|
|
|
41
51
|
Result
|
|
42
52
|
```shell
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
John
|
|
46
|
-
Legendary assassin John Wick.
|
|
47
|
-
|
|
48
|
-
|
|
53
|
+
----------------------------------------------------------------
|
|
54
|
+
| Helena 20 years Female |
|
|
55
|
+
| John 18 years Male |
|
|
56
|
+
| Legendary assassin John Wick (Keanu Reeves). |
|
|
57
|
+
| Alan 23 years Male |
|
|
58
|
+
----------------------------------------------------------------
|
|
49
59
|
```
|
|
50
60
|
|
|
51
61
|
# Contributing
|
|
52
|
-
1. Fork it ( http://github.com/
|
|
62
|
+
1. Fork it ( http://github.com/rukomoynikov/tabled/fork )
|
|
53
63
|
2. Create your feature branch (git checkout -b my-new-feature)
|
|
54
64
|
3. Commit your changes (git commit -am 'Add some feature')
|
|
55
65
|
4. Push to the branch (git push origin my-new-feature)
|
data/demo.rb
CHANGED
|
@@ -1,130 +1,186 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require_relative './lib/tabled'
|
|
2
4
|
|
|
3
5
|
STAR_WARS_CHARACTERS = [
|
|
4
6
|
{
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
7
|
+
name: 'Luke Skywalker',
|
|
8
|
+
height: '172',
|
|
9
|
+
mass: '77',
|
|
10
|
+
hair_color: 'blond',
|
|
11
|
+
skin_color: 'fair',
|
|
12
|
+
eye_color: 'blue',
|
|
13
|
+
birth_year: '19BBY',
|
|
14
|
+
gender: 'male'
|
|
13
15
|
},
|
|
14
16
|
{
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
17
|
+
name: 'C-3PO',
|
|
18
|
+
height: '167',
|
|
19
|
+
mass: '75',
|
|
20
|
+
hair_color: 'n/a',
|
|
21
|
+
skin_color: 'gold',
|
|
22
|
+
eye_color: 'yellow',
|
|
23
|
+
birth_year: '112BBY',
|
|
24
|
+
gender: 'n/a'
|
|
23
25
|
},
|
|
24
26
|
{
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
name: 'R2-D2',
|
|
28
|
+
height: '96',
|
|
29
|
+
mass: '32',
|
|
30
|
+
hair_color: 'n/a',
|
|
31
|
+
skin_color: 'white, blue',
|
|
32
|
+
eye_color: 'red',
|
|
33
|
+
birth_year: '33BBY',
|
|
34
|
+
gender: 'n/a'
|
|
33
35
|
},
|
|
34
36
|
{
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
37
|
+
name: 'Darth Vader',
|
|
38
|
+
height: '202',
|
|
39
|
+
mass: '136',
|
|
40
|
+
hair_color: 'none',
|
|
41
|
+
skin_color: 'white',
|
|
42
|
+
eye_color: 'yellow',
|
|
43
|
+
birth_year: '41.9BBY',
|
|
44
|
+
gender: 'male'
|
|
43
45
|
},
|
|
44
46
|
{
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
47
|
+
name: 'Leia Organa',
|
|
48
|
+
height: '150',
|
|
49
|
+
mass: '49',
|
|
50
|
+
hair_color: 'brown',
|
|
51
|
+
skin_color: 'light',
|
|
52
|
+
eye_color: 'brown',
|
|
53
|
+
birth_year: '19BBY',
|
|
54
|
+
gender: 'female'
|
|
53
55
|
},
|
|
54
56
|
{
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
57
|
+
name: 'Owen Lars',
|
|
58
|
+
height: '178',
|
|
59
|
+
mass: '120',
|
|
60
|
+
hair_color: 'brown, grey',
|
|
61
|
+
skin_color: 'light',
|
|
62
|
+
eye_color: 'blue',
|
|
63
|
+
birth_year: '52BBY',
|
|
64
|
+
gender: 'male'
|
|
63
65
|
},
|
|
64
66
|
{
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
67
|
+
name: 'Beru Whitesun lars',
|
|
68
|
+
height: '165',
|
|
69
|
+
mass: '75',
|
|
70
|
+
hair_color: 'brown',
|
|
71
|
+
skin_color: 'light',
|
|
72
|
+
eye_color: 'blue',
|
|
73
|
+
birth_year: '47BBY',
|
|
74
|
+
gender: 'female'
|
|
73
75
|
},
|
|
74
76
|
{
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
77
|
+
name: 'R5-D4',
|
|
78
|
+
height: '97',
|
|
79
|
+
mass: '32',
|
|
80
|
+
hair_color: 'n/a',
|
|
81
|
+
skin_color: 'white, red',
|
|
82
|
+
eye_color: 'red',
|
|
83
|
+
birth_year: 'unknown',
|
|
84
|
+
gender: 'n/a'
|
|
83
85
|
},
|
|
84
86
|
{
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
87
|
+
name: 'Biggs Darklighter',
|
|
88
|
+
height: '183',
|
|
89
|
+
mass: '84',
|
|
90
|
+
hair_color: 'black',
|
|
91
|
+
skin_color: 'light',
|
|
92
|
+
eye_color: 'brown',
|
|
93
|
+
birth_year: '24BBY',
|
|
94
|
+
gender: 'male'
|
|
93
95
|
},
|
|
94
96
|
{
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
97
|
+
name: 'Obi-Wan Kenobi',
|
|
98
|
+
height: '182',
|
|
99
|
+
mass: '77',
|
|
100
|
+
hair_color: 'auburn, white',
|
|
101
|
+
skin_color: 'fair',
|
|
102
|
+
eye_color: 'blue-gray',
|
|
103
|
+
birth_year: '57BBY',
|
|
104
|
+
gender: 'male'
|
|
103
105
|
}
|
|
104
|
-
]
|
|
106
|
+
].freeze
|
|
105
107
|
|
|
106
108
|
print "Printing without any params: \n"
|
|
107
109
|
|
|
108
|
-
data = STAR_WARS_CHARACTERS.map
|
|
110
|
+
data = STAR_WARS_CHARACTERS.map do |character|
|
|
109
111
|
[character[:name], character[:height], character[:gender]]
|
|
110
|
-
|
|
112
|
+
end
|
|
111
113
|
|
|
112
114
|
Tabled.new(data).print_to_console
|
|
113
115
|
|
|
116
|
+
# ---------------------------------
|
|
117
|
+
# | Luke Skywalker 172 male |
|
|
118
|
+
# ---------------------------------
|
|
119
|
+
# | C-3PO 167 n/a |
|
|
120
|
+
# ---------------------------------
|
|
121
|
+
# | R2-D2 96 n/a |
|
|
122
|
+
# ---------------------------------
|
|
123
|
+
# | Darth Vader 202 male |
|
|
124
|
+
# ---------------------------------
|
|
125
|
+
# | Leia Organa 150 female |
|
|
126
|
+
# ---------------------------------
|
|
127
|
+
# | Owen Lars 178 male |
|
|
128
|
+
# ---------------------------------
|
|
129
|
+
# | Beru Whitesun lars 165 female |
|
|
130
|
+
# ---------------------------------
|
|
131
|
+
# | R5-D4 97 n/a |
|
|
132
|
+
# ---------------------------------
|
|
133
|
+
# | Biggs Darklighter 183 male |
|
|
134
|
+
# ---------------------------------
|
|
135
|
+
# | Obi-Wan Kenobi 182 male |
|
|
136
|
+
# ---------------------------------
|
|
137
|
+
|
|
114
138
|
print "\n\n############################\n\n"
|
|
115
139
|
print "Printing without frame: \n"
|
|
116
140
|
|
|
117
|
-
data = STAR_WARS_CHARACTERS.map
|
|
141
|
+
data = STAR_WARS_CHARACTERS.map do |character|
|
|
118
142
|
[character[:name], character[:height], character[:gender]]
|
|
119
|
-
|
|
143
|
+
end
|
|
120
144
|
|
|
121
145
|
Tabled.new(data, framed: false).print_to_console
|
|
122
146
|
|
|
147
|
+
# Luke Skywalker 172 male
|
|
148
|
+
# ---------------------------------
|
|
149
|
+
# C-3PO 167 n/a
|
|
150
|
+
# ---------------------------------
|
|
151
|
+
# R2-D2 96 n/a
|
|
152
|
+
# ---------------------------------
|
|
153
|
+
# Darth Vader 202 male
|
|
154
|
+
# ---------------------------------
|
|
155
|
+
# Leia Organa 150 female
|
|
156
|
+
# ---------------------------------
|
|
157
|
+
# Owen Lars 178 male
|
|
158
|
+
# ---------------------------------
|
|
159
|
+
# Beru Whitesun lars 165 female
|
|
160
|
+
# ---------------------------------
|
|
161
|
+
# R5-D4 97 n/a
|
|
162
|
+
# ---------------------------------
|
|
163
|
+
# Biggs Darklighter 183 male
|
|
164
|
+
# ---------------------------------
|
|
165
|
+
# Obi-Wan Kenobi 182 male
|
|
166
|
+
# ---------------------------------
|
|
167
|
+
|
|
123
168
|
print "\n\n############################\n\n"
|
|
124
169
|
print "Printing without frame: and row separator\n"
|
|
125
170
|
|
|
126
|
-
data = STAR_WARS_CHARACTERS.map
|
|
127
|
-
[character[:name], character[:height], character[:gender]]
|
|
128
|
-
|
|
171
|
+
data = STAR_WARS_CHARACTERS.map do |character|
|
|
172
|
+
[character[:name], character[:height], character[:gender], { footer: 'One very long footer! Be carefull' }]
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
Tabled.new(data, titles: %w[Name Height Gender]).print_to_console
|
|
129
176
|
|
|
130
|
-
|
|
177
|
+
# Luke Skywalker 172 male
|
|
178
|
+
# C-3PO 167 n/a
|
|
179
|
+
# R2-D2 96 n/a
|
|
180
|
+
# Darth Vader 202 male
|
|
181
|
+
# Leia Organa 150 female
|
|
182
|
+
# Owen Lars 178 male
|
|
183
|
+
# Beru Whitesun lars 165 female
|
|
184
|
+
# R5-D4 97 n/a
|
|
185
|
+
# Biggs Darklighter 183 male
|
|
186
|
+
# Obi-Wan Kenobi 182 male
|
data/lib/content_shaper.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
class Tabled
|
|
2
4
|
class ContentShaper
|
|
3
5
|
attr_accessor :data, :options, :columns_width
|
|
@@ -9,25 +11,27 @@ class Tabled
|
|
|
9
11
|
end
|
|
10
12
|
|
|
11
13
|
def shape
|
|
12
|
-
content =
|
|
13
|
-
data
|
|
14
|
-
.inject([]) { |enumerator, row|
|
|
15
|
-
enumerator << Tabled::Template::Row.render(row, columns_width, options[:framed])
|
|
16
|
-
enumerator << Tabled::Template::RowFooter.render(row, columns_width, options[:framed])
|
|
14
|
+
content = []
|
|
17
15
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
unless options[:titles].empty?
|
|
17
|
+
content << Tabled::Template::Titles.render(options[:titles], columns_width, options[:framed])
|
|
18
|
+
content << (options[:row_separator].to_s * row_length) unless options[:row_separator].nil?
|
|
19
|
+
end
|
|
22
20
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
content.concat(
|
|
22
|
+
data
|
|
23
|
+
.each_with_object([]) do |row, enumerator|
|
|
24
|
+
enumerator << Tabled::Template::Row.render(row, columns_width, options[:framed])
|
|
25
|
+
enumerator << Tabled::Template::RowFooter.render(row, columns_width, options[:framed])
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
# Row separator
|
|
28
|
+
enumerator << (options[:row_separator].to_s * row_length) unless options[:row_separator].nil?
|
|
29
|
+
end
|
|
30
|
+
.compact
|
|
31
|
+
)
|
|
29
32
|
|
|
30
|
-
content
|
|
33
|
+
content = add_left_and_right_borders(content)
|
|
34
|
+
add_top_bottom_borders(content)
|
|
31
35
|
end
|
|
32
36
|
|
|
33
37
|
private
|
|
@@ -37,19 +41,17 @@ class Tabled
|
|
|
37
41
|
end
|
|
38
42
|
|
|
39
43
|
def add_left_and_right_borders(content)
|
|
40
|
-
content.
|
|
44
|
+
content.each_with_object([]) do |row, enumerator|
|
|
41
45
|
# For a row separator all symbols are the same
|
|
42
|
-
row_is_separator = row.
|
|
43
|
-
if row_is_separator && !options[:row_separator].nil?
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
enumerator
|
|
52
|
-
}
|
|
46
|
+
row_is_separator = row.chars.uniq.size == 1
|
|
47
|
+
enumerator << if row_is_separator && !options[:row_separator].nil? && options[:framed]
|
|
48
|
+
(options[:row_separator] * 2) + row + options[:row_separator]
|
|
49
|
+
elsif !options[:framed]
|
|
50
|
+
row
|
|
51
|
+
else
|
|
52
|
+
('| ' if options[:framed]) + row + ('|' if options[:framed])
|
|
53
|
+
end
|
|
54
|
+
end
|
|
53
55
|
end
|
|
54
56
|
|
|
55
57
|
def add_top_bottom_borders(content)
|
|
@@ -65,4 +67,4 @@ class Tabled
|
|
|
65
67
|
end
|
|
66
68
|
end
|
|
67
69
|
end
|
|
68
|
-
end
|
|
70
|
+
end
|
data/lib/helpers.rb
CHANGED
|
@@ -1,31 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
class Tabled
|
|
2
4
|
class Helpers
|
|
3
5
|
# Calculates columns size
|
|
4
|
-
def self.calculate_columns_width(data)
|
|
6
|
+
def self.calculate_columns_width(data:, options:)
|
|
5
7
|
columns_width = []
|
|
6
8
|
|
|
7
9
|
data.each do |row|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
10
|
+
# [0..-2] Due to reason last item is always hash with row params
|
|
11
|
+
row[0..-2].each_with_index do |column, index|
|
|
12
|
+
columns_width[index] = column.to_s.size if column.to_s.size > (columns_width[index] || 0)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# If titles longer than data use titles column width
|
|
17
|
+
columns_width.each_with_index do |_column_size, index|
|
|
18
|
+
title_size = options[:titles].fetch(index, '').size
|
|
19
|
+
|
|
20
|
+
columns_width[index] = title_size > columns_width[index] ? title_size : columns_width[index]
|
|
18
21
|
end
|
|
19
22
|
|
|
20
|
-
|
|
23
|
+
# Add 1 space in the end of each column
|
|
24
|
+
columns_width = columns_width.map { |column_width| column_width + 1 }
|
|
25
|
+
# Space in the last column is extra when table isn't framed
|
|
26
|
+
columns_width[-1] = columns_width[-1] - 1 unless options[:framed]
|
|
27
|
+
|
|
28
|
+
# Add to the last column footer spaces if needed
|
|
29
|
+
longest_footer_size = # longest footers
|
|
30
|
+
data.map do |row|
|
|
31
|
+
row.last.fetch(:footer, '')
|
|
32
|
+
end.max.to_s.size + 1
|
|
33
|
+
last_col_spaces = longest_footer_size - columns_width.sum # spaces required to the end
|
|
34
|
+
columns_width[-1] = columns_width.last + last_col_spaces if last_col_spaces.positive?
|
|
35
|
+
|
|
36
|
+
columns_width
|
|
21
37
|
end
|
|
22
38
|
|
|
23
39
|
# Add hash as a last element of the row
|
|
24
40
|
def self.convert_to_required_structure(data)
|
|
25
|
-
data.map
|
|
41
|
+
data.map do |row|
|
|
26
42
|
row << {} unless row.last.is_a?(Hash)
|
|
27
43
|
row
|
|
28
|
-
|
|
44
|
+
end
|
|
29
45
|
end
|
|
30
46
|
end
|
|
31
|
-
end
|
|
47
|
+
end
|
data/lib/tabled.rb
CHANGED
|
@@ -1,21 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'byebug'
|
|
2
4
|
require_relative './template'
|
|
3
5
|
require_relative './helpers'
|
|
4
6
|
require_relative './content_shaper'
|
|
5
7
|
|
|
6
8
|
class Tabled
|
|
7
|
-
DEFAULT_OPTIONS = { framed: true, row_separator: '-' }
|
|
9
|
+
DEFAULT_OPTIONS = { framed: true, row_separator: '-', titles: [] }.freeze
|
|
8
10
|
attr_accessor :data, :columns_width, :content, :options
|
|
9
11
|
|
|
10
12
|
def initialize(data, **options)
|
|
11
13
|
@options = DEFAULT_OPTIONS.merge(options)
|
|
12
14
|
@data = Tabled::Helpers.convert_to_required_structure(data)
|
|
13
|
-
@columns_width = Tabled::Helpers.calculate_columns_width(data)
|
|
14
|
-
@content = Tabled::ContentShaper.new(data, @columns_width, @options).shape
|
|
15
|
+
@columns_width = Tabled::Helpers.calculate_columns_width(data: data, options: @options)
|
|
16
|
+
@content = Tabled::ContentShaper.new(data, @columns_width, @options).shape
|
|
15
17
|
end
|
|
16
18
|
|
|
17
|
-
|
|
18
19
|
def print_to_console
|
|
19
20
|
print content.join("\n")
|
|
20
21
|
end
|
|
21
|
-
end
|
|
22
|
+
end
|
data/lib/template.rb
CHANGED
|
@@ -1,22 +1,37 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
class Tabled
|
|
2
4
|
class Template
|
|
3
5
|
class Row
|
|
4
|
-
|
|
5
|
-
|
|
6
|
+
# | Luke Skywalker 172 male |
|
|
7
|
+
def self.render(row, columns_width, _is_framed)
|
|
8
|
+
row[0..-2].map.with_index do |column, index|
|
|
9
|
+
spaces = ' ' * (columns_width[index] - column.to_s.size)
|
|
10
|
+
column.to_s + spaces
|
|
11
|
+
end.join
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class Titles
|
|
16
|
+
# ------------------------------------
|
|
17
|
+
# | Name Height Gender |
|
|
18
|
+
# ------------------------------------
|
|
19
|
+
def self.render(row, columns_width, _is_framed)
|
|
20
|
+
row.map.with_index do |column, index|
|
|
6
21
|
spaces = ' ' * (columns_width[index] - column.to_s.size)
|
|
7
22
|
column.to_s + spaces
|
|
8
|
-
|
|
23
|
+
end.join
|
|
9
24
|
end
|
|
10
25
|
end
|
|
11
26
|
|
|
12
27
|
class RowFooter
|
|
13
|
-
def self.render(row, columns_width,
|
|
28
|
+
def self.render(row, columns_width, _is_framed)
|
|
14
29
|
return nil unless row.last.fetch(:footer, false)
|
|
15
30
|
|
|
16
31
|
footer = row.last.fetch(:footer)
|
|
17
|
-
required_spaces = columns_width.sum
|
|
32
|
+
required_spaces = columns_width.sum - footer.size
|
|
18
33
|
footer + (' ' * required_spaces)
|
|
19
34
|
end
|
|
20
35
|
end
|
|
21
36
|
end
|
|
22
|
-
end
|
|
37
|
+
end
|
data/tabled.gemspec
CHANGED
|
@@ -1,19 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
Gem::Specification.new do |s|
|
|
2
4
|
s.name = 'tabled'
|
|
3
|
-
s.version = '0.0.
|
|
4
|
-
s.summary =
|
|
5
|
-
s.description = "
|
|
6
|
-
s.authors = [
|
|
5
|
+
s.version = '0.0.3'
|
|
6
|
+
s.summary = 'Library for rendering pretty tables in console'
|
|
7
|
+
s.description = "Library can be used to render your data to a console. Though it's quite simple, but has many features."
|
|
8
|
+
s.authors = ['Max Rukomoynikov']
|
|
7
9
|
s.email = 'rukomoynikov@gmail.com'
|
|
8
10
|
s.files =
|
|
9
11
|
Dir.chdir(File.expand_path(__dir__)) do
|
|
10
12
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
|
|
11
13
|
end
|
|
12
14
|
s.homepage = 'https://rubygems.org/gems/tabled'
|
|
13
|
-
s.metadata = {
|
|
14
|
-
|
|
15
|
+
s.metadata = { 'source_code_uri' => 'https://github.com/Rukomoynikov/tabled',
|
|
16
|
+
'rubygems_mfa_required' => 'true' }
|
|
17
|
+
s.license = 'MIT'
|
|
15
18
|
|
|
16
|
-
s.add_development_dependency
|
|
17
|
-
s.add_development_dependency
|
|
18
|
-
s.add_development_dependency
|
|
19
|
-
|
|
19
|
+
s.add_development_dependency 'byebug'
|
|
20
|
+
s.add_development_dependency 'jeweler'
|
|
21
|
+
s.add_development_dependency 'rspec'
|
|
22
|
+
s.add_development_dependency 'rubocop'
|
|
23
|
+
s.add_development_dependency 'rubocop-rspec'
|
|
24
|
+
s.add_development_dependency 'simplecov'
|
|
25
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: tabled
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Max Rukomoynikov
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-05-
|
|
11
|
+
date: 2022-05-23 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: byebug
|
|
@@ -24,6 +24,20 @@ dependencies:
|
|
|
24
24
|
- - ">="
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
26
|
version: '0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: jeweler
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - ">="
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '0'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - ">="
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '0'
|
|
27
41
|
- !ruby/object:Gem::Dependency
|
|
28
42
|
name: rspec
|
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -38,6 +52,34 @@ dependencies:
|
|
|
38
52
|
- - ">="
|
|
39
53
|
- !ruby/object:Gem::Version
|
|
40
54
|
version: '0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: rubocop
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ">="
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0'
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: rubocop-rspec
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - ">="
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '0'
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - ">="
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '0'
|
|
41
83
|
- !ruby/object:Gem::Dependency
|
|
42
84
|
name: simplecov
|
|
43
85
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -52,8 +94,8 @@ dependencies:
|
|
|
52
94
|
- - ">="
|
|
53
95
|
- !ruby/object:Gem::Version
|
|
54
96
|
version: '0'
|
|
55
|
-
description:
|
|
56
|
-
simple
|
|
97
|
+
description: Library can be used to render your data to a console. Though it's quite
|
|
98
|
+
simple, but has many features.
|
|
57
99
|
email: rukomoynikov@gmail.com
|
|
58
100
|
executables: []
|
|
59
101
|
extensions: []
|
|
@@ -62,6 +104,9 @@ files:
|
|
|
62
104
|
- ".github/workflows/linters.yml"
|
|
63
105
|
- ".gitignore"
|
|
64
106
|
- ".rspec"
|
|
107
|
+
- ".rubocop.yml"
|
|
108
|
+
- ".rubocop_todo.yml"
|
|
109
|
+
- CHANGELOG.md
|
|
65
110
|
- Gemfile
|
|
66
111
|
- Gemfile.lock
|
|
67
112
|
- README.md
|
|
@@ -76,6 +121,7 @@ licenses:
|
|
|
76
121
|
- MIT
|
|
77
122
|
metadata:
|
|
78
123
|
source_code_uri: https://github.com/Rukomoynikov/tabled
|
|
124
|
+
rubygems_mfa_required: 'true'
|
|
79
125
|
post_install_message:
|
|
80
126
|
rdoc_options: []
|
|
81
127
|
require_paths:
|