texttable 1.0.5 → 1.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +33 -2
  3. data/lib/texttable.rb +42 -21
  4. data/texttable.gemspec +2 -2
  5. metadata +4 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3371472c803832aced833a92b14b5f126bc6610b567a3afd3f845a4c40e5d480
4
- data.tar.gz: 97265de8fbaaab1b17e53a48174abea14230f13ea4e3cf87536d7ac492555e57
3
+ metadata.gz: daf8fb1088ce9570617aea39c1cbbfa3b4b5819af7013e26c2e4680d1ec2ceb1
4
+ data.tar.gz: 343e38b5ff4ed2cb20076af22bcfaedb00fd70702dcc8654b4169736b87a4768
5
5
  SHA512:
6
- metadata.gz: b01e8f14a894c5267a9d348a88c847be6a769aec8741e9b07eae2e3377151c6d3b41ee06798aaf8b3d6ab9734ad9e81ffb211c98ebc513ff7d7d766a832c5f0f
7
- data.tar.gz: 951fce44d2dabb5f6fa6beec146d5fae31da4e2896c3ed3a3c001333bcf84e2ed497452672f67d3899e168dc432c0f2b992fa57669a550be96e9357cc64e21a8
6
+ metadata.gz: dfbd834c7999c0c666c39043f2529b31fa4077292aec331541744cb6fc22a841380914435b75c3462647896969d4b8eb6846e72ebdf6cb3878c761f0ac8005a1
7
+ data.tar.gz: 8b401aab5b7df8d12aa883a7c0932cf5e4713889d5a3f63aa59416cfb3e3c15eb9029257819e9e46aa62e7f23a547239cd2e21e52a35ab91990240c950bdd279
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,14 +1,24 @@
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)
6
+ require 'csv'
7
+ new CSV.read(src || ARGF, {
8
+ col_sep: sep,
9
+ encoding: encoding ? encoding + ":UTF-8" : nil,
10
+ }.compact)
11
11
  end
12
+ def tsv(*args); csv(args.shift, "\t", *args); end
13
+ def psv(*args); csv(args.shift, "|" , *args); end
14
+ end
15
+
16
+ def initialize(*args)
17
+ cols = args
18
+ cols = cols[0] if cols[0].is_a?(Array) && cols[0][0].is_a?(Array)
19
+ cols, *rows = cols if cols[0].is_a?(Array)
20
+ rows = *rows[0] if rows && rows[0].is_a?(Array) && rows[0][0].is_a?(Array)
21
+ rows = [] if !rows || !rows[0].is_a?(Array) || rows[0].empty?
12
22
  @cols = Hash.new {|h,k| h[k] = h.size}
13
23
  @rows = rows
14
24
  @values = nil
@@ -111,21 +121,31 @@ class TextTable
111
121
  self
112
122
  end
113
123
 
114
- def show
124
+ def show(*)
125
+ self
126
+ end
127
+
128
+ def show!(list=nil)
129
+ meth = list.is_a?(Array) ? list.method(:push) : method(:puts)
115
130
  join = " | "
116
- both = [@cols.keys] + rows
117
- flip = both.transpose
118
- wide = flip.map {|row| row.map {|col| col.to_s.size }.max }
119
- pict = wide.map {|len| "%-#{len}.#{len}s" }.join(join)
131
+ size = @cols.size
132
+ full = [@cols.keys] + rows
133
+ full.each_with_index do |vals, i| # only when asymmetric
134
+ miss = size - vals.size
135
+ full[i] += [nil] * miss if miss > 0
136
+ full[i] = vals[0...size] if miss < 0
137
+ end
138
+ lens = full.map {|r| r.map {|c| c.to_s.size}}.transpose.map(&:max)
139
+ pict = lens.map {|len| "%-#{len}.#{len}s" }.join(join)
120
140
  pict = [join, pict, join].join.strip
121
- line = (pict % ([""] * @cols.size)).tr("| ", "+-")
141
+ line = (pict % ([""] * size)).tr("| ", "+-")
122
142
  seen = -1
123
- puts "", line
124
- both.each do |vals|
125
- puts pict % vals
126
- puts line if (seen += 1) == 0
143
+ meth["", line]
144
+ full.each do |vals|
145
+ meth[pict % vals]
146
+ meth[line] if (seen += 1) == 0
127
147
  end
128
- puts line, "#{seen} rows displayed", ""
148
+ meth[line, "#{seen} rows displayed", ""]
129
149
  self
130
150
  end
131
151
 
@@ -142,7 +162,7 @@ class TextTable
142
162
  def tsv; csv("\t"); end
143
163
  def psv; csv("|" ); end
144
164
 
145
- def sql(table='table', quote: false)
165
+ def sql(table='table', quote: false, timestamps: false, verb: 'insert')
146
166
  q = quote ? '`' : ''
147
167
  flip = @cols.invert
148
168
  @rows.each do |vals|
@@ -151,7 +171,8 @@ class TextTable
151
171
  list << "#{q}#{flip[i]}#{q}='#{item.gsub("'","''")}'" if item =~ /\S/
152
172
  list
153
173
  end
154
- puts "insert into #{q}#{table}#{q} set #{list * ', '};" if !list.empty?
174
+ list.push('created_at=now(), updated_at=now()') if timestamps
175
+ puts "#{verb} into #{q}#{table}#{q} set #{list * ', '};" if !list.empty?
155
176
  end
156
177
  nil
157
178
  end
@@ -161,4 +182,4 @@ class ActiveRecord::Result
161
182
  def +@
162
183
  TextTable.new(columns, rows)
163
184
  end
164
- end
185
+ 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.5"
5
+ s.version = "1.1.3"
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.5
4
+ version: 1.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Shreeve
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-06 00:00:00.000000000 Z
11
+ date: 2020-06-10 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
@@ -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
44
+ rubygems_version: 3.1.2
45
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: []