texttable 1.0.6 → 1.1.4

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.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +33 -2
  3. data/lib/texttable.rb +50 -20
  4. data/texttable.gemspec +2 -2
  5. metadata +7 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f2133a18e49c23d4fe537cfcef7e5520d8383e6a5e0f82b331036a88b116e53d
4
- data.tar.gz: da29956feef369aecda57fa30acb70a540881511a6f77b0a5f69889086607208
3
+ metadata.gz: 5c4dbf7e3ed3836d1f3e61665700ca6dc7aaf94c95a1a026b3a84cd613c89ee7
4
+ data.tar.gz: fc17d9a066c413f3c887889ad488ce703381470f6c53992e10f3ff54d47c7b51
5
5
  SHA512:
6
- metadata.gz: 00033ecb47bc67ac9345069267e030ea1aaabd98900937f0487d9e0b81ca223542a9f3816ccd82037db107b69992589c1c0039fcc662e68a29c6cf55ecdf09ce
7
- data.tar.gz: ef134cf6b34d494883724e84641edf9e7edbe316d425808960ffcc46da172a88707f27701120952e437223ebcb3604495dfc3bdf79f8f37d0be7fd6b816d76fb
6
+ metadata.gz: 11639822bf41842b1ee7e8817e53f724ce22cc7fa128391675700a8aa4048e975fe00679bf73d534c276991dcfab242205043d5d20f749b3de0439ab262de300
7
+ data.tar.gz: 42519909f0df28de90b93744fb985e99ae3662395cdc2815767d4a0510108154a632e791b295537ee12efd862a5010f3b2af5165ce351b264e512caacd8c528d
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # texttable
2
2
 
3
- `texttable` is a Ruby gem that provides an easy way to print rows and columns as simple tables.
3
+ `texttable` is a Ruby gem that provides an easy way to ingest, manage, and output rows and columns as simple tables.
4
4
 
5
- ## Examples
5
+ ## Simple Example
6
6
 
7
7
  This code:
8
8
 
@@ -30,3 +30,34 @@ Will produce:
30
30
  +-------+-----+--------------+
31
31
  4 rows displayed
32
32
  ```
33
+
34
+ ## Loading Example
35
+
36
+ This code:
37
+
38
+ ```ruby
39
+ require "texttable"
40
+
41
+ info = TextTable.csv("data.csv")
42
+ info.show!
43
+ ```
44
+
45
+ With the file `data.csv`:
46
+
47
+ ```csv
48
+ id,first_name,last_name,email,cell,dept,photo,status
49
+ 28,Mark,Jones,mark@bigcompany.com,800-555-1000,Finance,mark-jones.jpg,2
50
+ 29,Sally,Miller,sally@bigcompany.com,800-555-2000,Accounting,sally-miller.jpg,1
51
+ ```
52
+
53
+ Will produce:
54
+
55
+ ```text
56
+ +----+------------+-----------+----------------------+--------------+------------+------------------+--------+
57
+ | id | first_name | last_name | email | cell | dept | photo | status |
58
+ +----+------------+-----------+----------------------+--------------+------------+------------------+--------+
59
+ | 28 | Mark | Jones | mark@bigcompany.com | 800-555-1000 | Finance | mark-jones.jpg | 2 |
60
+ | 29 | Sally | Miller | sally@bigcompany.com | 800-555-2000 | Accounting | sally-miller.jpg | 1 |
61
+ +----+------------+-----------+----------------------+--------------+------------+------------------+--------+
62
+ 2 rows displayed
63
+ ```
@@ -1,19 +1,34 @@
1
1
  class TextTable
2
2
  attr_accessor :values, :rows
3
3
 
4
- def initialize(*args)
5
- if args[0].is_a?(Array)
6
- cols, *rows = args
7
- rows = rows[0] if rows[0].is_a?(Array)
8
- else
9
- cols = args
10
- rows = []
4
+ class << self
5
+ def csv(src, sep=',', encoding: nil, **kw)
6
+ require 'csv'
7
+ new CSV.read(src || ARGF, {
8
+ col_sep: sep,
9
+ encoding: encoding ? encoding + ":UTF-8" : nil,
10
+ **kw
11
+ }.compact)
12
+ end
13
+ def tsv(*args, **kw); csv(args.shift, "\t", *args, **kw); end
14
+ def psv(*args, **kw); csv(args.shift, "|" , *args, **kw); end
15
+
16
+ def add(*args)
17
+ new.add(*args)
11
18
  end
19
+ end
20
+
21
+ def initialize(*args)
22
+ cols = args
23
+ cols = cols[0] if cols[0].is_a?(Array) && cols[0][0].is_a?(Array)
24
+ cols, *rows = cols if cols[0].is_a?(Array)
25
+ rows = *rows[0] if rows && rows[0].is_a?(Array) && rows[0][0].is_a?(Array)
26
+ rows = [] if !rows || !rows[0].is_a?(Array) || rows[0].empty?
12
27
  @cols = Hash.new {|h,k| h[k] = h.size}
13
28
  @rows = rows
14
29
  @values = nil
15
30
  @row = 0
16
- cols.each {|col| index!(col) }
31
+ cols.each_with_index {|col, i| index!(col || i) }
17
32
  end
18
33
 
19
34
  def index(field, auto=false)
@@ -104,7 +119,7 @@ class TextTable
104
119
  obj = [obj, *args] if args.size > 0
105
120
  @values = @rows[@row = @rows.size] = []
106
121
  case obj
107
- when Hash then obj.each {|k, v| @values[@cols[k]] = v}
122
+ when Hash then obj.each {|k, v| @values[index(k.to_s, true)] = v }
108
123
  when Array then @values.replace(obj)
109
124
  else raise "unable to add #{obj.class} objects"
110
125
  end
@@ -118,15 +133,20 @@ class TextTable
118
133
  def show!(list=nil)
119
134
  meth = list.is_a?(Array) ? list.method(:push) : method(:puts)
120
135
  join = " | "
121
- both = [@cols.keys] + rows
122
- flip = both.transpose
123
- wide = flip.map {|row| row.map {|col| col.to_s.size }.max }
124
- pict = wide.map {|len| "%-#{len}.#{len}s" }.join(join)
136
+ size = @cols.size
137
+ full = [@cols.keys] + rows
138
+ full.each_with_index do |vals, i| # only when asymmetric
139
+ miss = size - vals.size
140
+ full[i] += [nil] * miss if miss > 0
141
+ full[i] = vals[0...size] if miss < 0
142
+ end
143
+ lens = full.map {|r| r.map {|c| c.to_s.size}}.transpose.map(&:max)
144
+ pict = lens.map {|len| "%-#{len}.#{len}s" }.join(join)
125
145
  pict = [join, pict, join].join.strip
126
- line = (pict % ([""] * @cols.size)).tr("| ", "+-")
146
+ line = (pict % ([""] * size)).tr("| ", "+-")
127
147
  seen = -1
128
148
  meth["", line]
129
- both.each do |vals|
149
+ full.each do |vals|
130
150
  meth[pict % vals]
131
151
  meth[line] if (seen += 1) == 0
132
152
  end
@@ -134,11 +154,20 @@ class TextTable
134
154
  self
135
155
  end
136
156
 
157
+ def lookup!(field)
158
+ @rows or raise "no rows defined"
159
+ index = index(field)
160
+ lookup = {}
161
+ @rows.each_with_index {|cols, i| lookup[cols[index]] = i}
162
+ lookup
163
+ end
164
+
137
165
  def csv(sep=',', encoding: nil)
138
166
  require 'csv'
139
167
  csv = {}
140
- csv[:encoding] = encoding + ":UTF-8" if encoding
141
- csv[:col_sep ] = sep
168
+ csv[:encoding ] = encoding + ":UTF-8" if encoding
169
+ csv[:col_sep ] = sep
170
+ csv[:quote_empty] = false #!# TODO: make this an option
142
171
  csv = CSV.new($stdout, csv)
143
172
  csv << @cols.keys
144
173
  @rows.each {|vals| csv << vals}
@@ -147,7 +176,7 @@ class TextTable
147
176
  def tsv; csv("\t"); end
148
177
  def psv; csv("|" ); end
149
178
 
150
- def sql(table='table', quote: false)
179
+ def sql(table='table', quote: false, timestamps: false, verb: 'insert')
151
180
  q = quote ? '`' : ''
152
181
  flip = @cols.invert
153
182
  @rows.each do |vals|
@@ -156,7 +185,8 @@ class TextTable
156
185
  list << "#{q}#{flip[i]}#{q}='#{item.gsub("'","''")}'" if item =~ /\S/
157
186
  list
158
187
  end
159
- puts "insert into #{q}#{table}#{q} set #{list * ', '};" if !list.empty?
188
+ list.push('created_at=now(), updated_at=now()') if timestamps
189
+ puts "#{verb} into #{q}#{table}#{q} set #{list * ', '};" if !list.empty?
160
190
  end
161
191
  nil
162
192
  end
@@ -166,4 +196,4 @@ class ActiveRecord::Result
166
196
  def +@
167
197
  TextTable.new(columns, rows)
168
198
  end
169
- end
199
+ end if defined?(ActiveRecord)
@@ -2,10 +2,10 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "texttable"
5
- s.version = "1.0.6"
5
+ s.version = "1.1.4"
6
6
  s.author = "Steve Shreeve"
7
7
  s.email = "steve.shreeve@gmail.com"
8
- s.summary = "An easy way to print rows and columns as simple tables"
8
+ s.summary = "An easy way to work with rows and columns as simple tables"
9
9
  s.description = "This gem will auto-size based on column widths."
10
10
  s.homepage = "https://github.com/shreeve/texttable"
11
11
  s.license = "MIT"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: texttable
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.6
4
+ version: 1.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Shreeve
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-10 00:00:00.000000000 Z
11
+ date: 2020-10-06 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: This gem will auto-size based on column widths.
14
14
  email: steve.shreeve@gmail.com
@@ -26,7 +26,7 @@ homepage: https://github.com/shreeve/texttable
26
26
  licenses:
27
27
  - MIT
28
28
  metadata: {}
29
- post_install_message:
29
+ post_install_message:
30
30
  rdoc_options: []
31
31
  require_paths:
32
32
  - lib
@@ -41,8 +41,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
41
41
  - !ruby/object:Gem::Version
42
42
  version: '0'
43
43
  requirements: []
44
- rubygems_version: 3.0.6
45
- signing_key:
44
+ rubygems_version: 3.1.4
45
+ signing_key:
46
46
  specification_version: 4
47
- summary: An easy way to print rows and columns as simple tables
47
+ summary: An easy way to work with rows and columns as simple tables
48
48
  test_files: []