texttable 1.1.3 → 1.1.9
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/.ruby-version +1 -1
- data/lib/texttable.rb +67 -18
- data/texttable.gemspec +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 79e3c725b088a02d42d7096862e6087d090ba057b66e28297bf796597da59f16
|
4
|
+
data.tar.gz: 7a07a8a529036fe884d27290576c530b29c990a606866f09d8aa24526a7e1661
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5ac2b2ece811fc38432cec0ad1315c211030b9effef406d7e715eff94243c5a4535ab6935dab23e0b926f23d70082daa55000253ad6d3a7597050498c6800cf8
|
7
|
+
data.tar.gz: 30345f8c02e6ec6169bb82e06ba19be129e6d74c4edb254ff308a989e2fe70cb6a6a0c422e8b87e16e6a5d8f991aad25950a4475a4a4f5cb36c6be4b3f415c48
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.5
|
1
|
+
2.6.5
|
data/lib/texttable.rb
CHANGED
@@ -2,15 +2,41 @@ class TextTable
|
|
2
2
|
attr_accessor :values, :rows
|
3
3
|
|
4
4
|
class << self
|
5
|
-
def csv(src, sep=',', encoding: nil)
|
5
|
+
def csv(src, sep=',', encoding: nil, **kw)
|
6
6
|
require 'csv'
|
7
7
|
new CSV.read(src || ARGF, {
|
8
8
|
col_sep: sep,
|
9
9
|
encoding: encoding ? encoding + ":UTF-8" : nil,
|
10
|
+
**kw
|
10
11
|
}.compact)
|
11
12
|
end
|
12
|
-
def tsv(*args); csv(args.shift, "\t", *args); end
|
13
|
-
def psv(*args); csv(args.shift, "|" , *args); 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)
|
18
|
+
end
|
19
|
+
|
20
|
+
def load(data, delim="\t", headers=true)
|
21
|
+
case data
|
22
|
+
when String
|
23
|
+
if data.include?(delim) # string
|
24
|
+
text = data
|
25
|
+
elsif File.exist?(data) # filename
|
26
|
+
text = File.read(data)
|
27
|
+
end
|
28
|
+
when File, ARGF
|
29
|
+
text = data.read
|
30
|
+
end
|
31
|
+
|
32
|
+
text or raise "unable to load #{data.inspect}"
|
33
|
+
rows = text.split(/\r?\n/).map {|line| line.split(delim).map {|part| part.strip}}
|
34
|
+
info = new
|
35
|
+
rows.shift.each_with_index {|col, i| info.index!(col || i) } if headers
|
36
|
+
info.rows = rows
|
37
|
+
info.row(0)
|
38
|
+
info
|
39
|
+
end
|
14
40
|
end
|
15
41
|
|
16
42
|
def initialize(*args)
|
@@ -21,9 +47,8 @@ class TextTable
|
|
21
47
|
rows = [] if !rows || !rows[0].is_a?(Array) || rows[0].empty?
|
22
48
|
@cols = Hash.new {|h,k| h[k] = h.size}
|
23
49
|
@rows = rows
|
24
|
-
|
25
|
-
|
26
|
-
cols.each {|col| index!(col) }
|
50
|
+
row(0)
|
51
|
+
cols.each_with_index {|col, i| index!(col || i) }
|
27
52
|
end
|
28
53
|
|
29
54
|
def index(field, auto=false)
|
@@ -42,6 +67,14 @@ class TextTable
|
|
42
67
|
index(field, true)
|
43
68
|
end
|
44
69
|
|
70
|
+
def lookup!(field)
|
71
|
+
@rows or raise "no rows defined"
|
72
|
+
index = index(field)
|
73
|
+
lookup = {}
|
74
|
+
@rows.each_with_index {|cols, i| lookup[cols[index]] = i}
|
75
|
+
lookup
|
76
|
+
end
|
77
|
+
|
45
78
|
def convert_key(key)
|
46
79
|
key.
|
47
80
|
gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
|
@@ -86,6 +119,10 @@ class TextTable
|
|
86
119
|
@rows.each_with_index {|_, row| yield(row(row)) }
|
87
120
|
end
|
88
121
|
|
122
|
+
def each_pair
|
123
|
+
@cols.each {|col, pos| yield col, @values[pos] }
|
124
|
+
end
|
125
|
+
|
89
126
|
def [](field, val=nil)
|
90
127
|
index = index(field)
|
91
128
|
value = vals[index] if index
|
@@ -114,13 +151,15 @@ class TextTable
|
|
114
151
|
obj = [obj, *args] if args.size > 0
|
115
152
|
@values = @rows[@row = @rows.size] = []
|
116
153
|
case obj
|
117
|
-
when Hash then obj.each {|k, v| @values[
|
154
|
+
when Hash then obj.each {|k, v| @values[index(k.to_s, true)] = v }
|
118
155
|
when Array then @values.replace(obj)
|
119
156
|
else raise "unable to add #{obj.class} objects"
|
120
157
|
end
|
121
158
|
self
|
122
159
|
end
|
123
160
|
|
161
|
+
alias :<< :add
|
162
|
+
|
124
163
|
def show(*)
|
125
164
|
self
|
126
165
|
end
|
@@ -149,20 +188,27 @@ class TextTable
|
|
149
188
|
self
|
150
189
|
end
|
151
190
|
|
152
|
-
def
|
191
|
+
def as_json(obj = defined?(ConfigHash) ? +{} : {})
|
192
|
+
(@rows || []).map {|r| r.each_with_index.inject(obj) {|h, (v, c)| h[fields[c]] = v; h }}
|
193
|
+
end
|
194
|
+
|
195
|
+
def csv(sep=',', encoding: nil, **kw)
|
153
196
|
require 'csv'
|
154
|
-
|
155
|
-
csv
|
156
|
-
|
157
|
-
|
197
|
+
out = kw.key?(:out) ? (kw.delete(:out) || "").dup : nil
|
198
|
+
csv = CSV.new(out || $stdout, {
|
199
|
+
col_sep: sep,
|
200
|
+
encoding: encoding ? encoding + ":UTF-8" : nil,
|
201
|
+
quote_empty: false, #!# TODO: make this an option
|
202
|
+
**kw
|
203
|
+
})
|
158
204
|
csv << @cols.keys
|
159
205
|
@rows.each {|vals| csv << vals}
|
160
|
-
|
206
|
+
out
|
161
207
|
end
|
162
|
-
def tsv; csv("\t"); end
|
163
|
-
def psv; csv("|" ); end
|
208
|
+
def tsv(**kw); csv("\t", **kw); end
|
209
|
+
def psv(**kw); csv("|" , **kw); end
|
164
210
|
|
165
|
-
def sql(table='table', quote: false, timestamps: false, verb: 'insert')
|
211
|
+
def sql(table='table', quote: false, timestamps: false, verb: 'insert', out: nil)
|
166
212
|
q = quote ? '`' : ''
|
167
213
|
flip = @cols.invert
|
168
214
|
@rows.each do |vals|
|
@@ -172,9 +218,12 @@ class TextTable
|
|
172
218
|
list
|
173
219
|
end
|
174
220
|
list.push('created_at=now(), updated_at=now()') if timestamps
|
175
|
-
|
221
|
+
if !list.empty?
|
222
|
+
line = "#{verb} into #{q}#{table}#{q} set #{list * ', '};"
|
223
|
+
out ? (out << line) : puts(line)
|
224
|
+
end
|
176
225
|
end
|
177
|
-
|
226
|
+
out
|
178
227
|
end
|
179
228
|
end
|
180
229
|
|
data/texttable.gemspec
CHANGED
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.1.
|
4
|
+
version: 1.1.9
|
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:
|
11
|
+
date: 2021-04-26 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.
|
45
|
-
signing_key:
|
44
|
+
rubygems_version: 3.2.16
|
45
|
+
signing_key:
|
46
46
|
specification_version: 4
|
47
47
|
summary: An easy way to work with rows and columns as simple tables
|
48
48
|
test_files: []
|