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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: d6086efaf0670225d0febbaad3691f73445ff490
4
- data.tar.gz: 2728c004d3cec600a73ef0f94158271630a1f5b1
2
+ SHA256:
3
+ metadata.gz: f3691facd3a9d75752074edc878b8b4a838a448057786b0fc63e743dd1c7d779
4
+ data.tar.gz: b4376d57b9cf0d17cf00821fcc47a9769dd6c4f4962f6140f1b44c0f85ff5dbc
5
5
  SHA512:
6
- metadata.gz: ff2a9c168c2da2d4f6caaaf979308b41ae44d0f76764ad68a4e630affb537b33144eb58ea16e6c7afc62b7d166a34e1ae83f3484b526366bf8f8eee510a36fe6
7
- data.tar.gz: 8978a1b77ffe9b5ee7b9664c8d4cc26e645c4d7151a9cca47037a49126bd19a40ea8b9985e7a75d92a0d678db42c7539f5721e6aad4b727e01e083fc4304e35e
6
+ metadata.gz: a8683049e85e94342dc26f77642f2023ab58dcfd0ae481e11d2f3bd70fb4e31b61ed518e79c035dc9f1d3a3a45cdfce1b35092636ea97b29b67eb148b5742289
7
+ data.tar.gz: f8db001d5bda976b36b2d93be151434fb988224c2a6aeb16c9d1b12d893db9da203e4e9b7a59898df4e17d68a105ca888e5d91b0358b7e0dbd973c6d8bccc83a
@@ -0,0 +1,8 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: bundler
4
+ directory: "/"
5
+ schedule:
6
+ interval: daily
7
+ time: "10:00"
8
+ open-pull-requests-limit: 10
@@ -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
@@ -10,3 +10,4 @@
10
10
  # rspec failure tracking
11
11
  .rspec_status
12
12
  Gemfile.lock
13
+ legitable*.gem
data/README.md CHANGED
@@ -1,3 +1,4 @@
1
+ ![Tests](https://github.com/joelhelbling/legitable/actions/workflows/ruby.yml/badge.svg)
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
- title = Legitable::Table.new do
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 = "legitable"
8
- spec.version = Legitable::VERSION
9
- spec.authors = ["Joel Helbling"]
10
- spec.email = ["joel@joelhelbling.com"]
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 = %q{Easy plain text tables}
13
- spec.description = %q{Tables are easier to read. Legitable makes it easy to display plain text output in tabular form.}
14
- spec.homepage = "https://github.com/joelhelbling/legitable"
15
- spec.license = "MIT"
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 = `git ls-files -z`.split("\x0").reject do |f|
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 = "exe"
21
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
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", "~> 1.16.a"
25
- spec.add_development_dependency "rake", "~> 10.0"
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"
@@ -1,10 +1,10 @@
1
- require 'ostruct'
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: ' | ', separator: '-', &block)
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
- self.instance_eval(&block) unless block.nil?
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 <<(row)
20
- initialize_headers(row) if headers.empty?
21
- add_row row
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
- render_headers +
27
- rows.map do |row|
28
- headers.map do |header|
29
- render_cell(header, row[header])
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.inject({}) do |memo, header|
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" + (separator * row_width) + "\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
- (format[header].align == :right) ?
76
- value.rjust(cell_width, ' ') :
77
- value.to_s + (' ' * (cell_width - value.to_s.length))
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 ? block : default_formatter
109
+ @formatters[header] = block || default_formatter
82
110
  end
83
111
 
84
112
  def default_formatter
85
- @default_formatter ||= Proc.new {|value| value.to_s }
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 ||= Proc.new {|header| header.to_s.upcase }
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
@@ -1,3 +1,3 @@
1
1
  module Legitable
2
- VERSION = "0.1.0"
2
+ VERSION = "0.3.0"
3
3
  end
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.1.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: 2017-12-12 00:00:00.000000000 Z
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: 1.16.a
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: 1.16.a
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: '10.0'
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: '10.0'
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
- rubyforge_project:
124
- rubygems_version: 2.6.13
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: []
data/.travis.yml DELETED
@@ -1,5 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.4.2
5
- before_install: gem install bundler -v 1.16.0.pre.3