texttable 1.1.2 → 1.1.7
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/lib/texttable.rb +74 -24
- 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: 7e00f8d89b3eda372e1d263c439bde89c2a49fc514733c03d9d173c27d88a21b
|
4
|
+
data.tar.gz: bd3e7c03b5baa30ad80517ed68ed2cf14937ac037119a49af90e97bc99fe9cf0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8983dbf73e36741f53acb51f953e88bfc2a77068ddd79aef042ed74e608e17d186d6c3f245bc6d8bcf548cfdb34bb3c40774af6df9e7375d8b6255a744affa10
|
7
|
+
data.tar.gz: c85f63f6c92c17475860fac370fb64c5990e7de39ebf471fcc722e099f6c3b36329d2309f3ea919851c48f99a2515f54b4ed3319f05c63e287fb5e30b04e8a8a
|
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)
|
@@ -86,6 +111,10 @@ class TextTable
|
|
86
111
|
@rows.each_with_index {|_, row| yield(row(row)) }
|
87
112
|
end
|
88
113
|
|
114
|
+
def each_pair
|
115
|
+
@cols.each {|col, pos| yield col, @values[pos] }
|
116
|
+
end
|
117
|
+
|
89
118
|
def [](field, val=nil)
|
90
119
|
index = index(field)
|
91
120
|
value = vals[index] if index
|
@@ -114,13 +143,15 @@ class TextTable
|
|
114
143
|
obj = [obj, *args] if args.size > 0
|
115
144
|
@values = @rows[@row = @rows.size] = []
|
116
145
|
case obj
|
117
|
-
when Hash then obj.each {|k, v| @values[
|
146
|
+
when Hash then obj.each {|k, v| @values[index(k.to_s, true)] = v }
|
118
147
|
when Array then @values.replace(obj)
|
119
148
|
else raise "unable to add #{obj.class} objects"
|
120
149
|
end
|
121
150
|
self
|
122
151
|
end
|
123
152
|
|
153
|
+
alias :<< :add
|
154
|
+
|
124
155
|
def show(*)
|
125
156
|
self
|
126
157
|
end
|
@@ -128,15 +159,20 @@ class TextTable
|
|
128
159
|
def show!(list=nil)
|
129
160
|
meth = list.is_a?(Array) ? list.method(:push) : method(:puts)
|
130
161
|
join = " | "
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
162
|
+
size = @cols.size
|
163
|
+
full = [@cols.keys] + rows
|
164
|
+
full.each_with_index do |vals, i| # only when asymmetric
|
165
|
+
miss = size - vals.size
|
166
|
+
full[i] += [nil] * miss if miss > 0
|
167
|
+
full[i] = vals[0...size] if miss < 0
|
168
|
+
end
|
169
|
+
lens = full.map {|r| r.map {|c| c.to_s.size}}.transpose.map(&:max)
|
170
|
+
pict = lens.map {|len| "%-#{len}.#{len}s" }.join(join)
|
135
171
|
pict = [join, pict, join].join.strip
|
136
|
-
line = (pict % ([""] *
|
172
|
+
line = (pict % ([""] * size)).tr("| ", "+-")
|
137
173
|
seen = -1
|
138
174
|
meth["", line]
|
139
|
-
|
175
|
+
full.each do |vals|
|
140
176
|
meth[pict % vals]
|
141
177
|
meth[line] if (seen += 1) == 0
|
142
178
|
end
|
@@ -144,20 +180,31 @@ class TextTable
|
|
144
180
|
self
|
145
181
|
end
|
146
182
|
|
147
|
-
def
|
183
|
+
def lookup!(field)
|
184
|
+
@rows or raise "no rows defined"
|
185
|
+
index = index(field)
|
186
|
+
lookup = {}
|
187
|
+
@rows.each_with_index {|cols, i| lookup[cols[index]] = i}
|
188
|
+
lookup
|
189
|
+
end
|
190
|
+
|
191
|
+
def csv(sep=',', encoding: nil, **kw)
|
148
192
|
require 'csv'
|
149
|
-
|
150
|
-
csv
|
151
|
-
|
152
|
-
|
193
|
+
out = kw.key?(:out) ? (kw.delete(:out) || "").dup : nil
|
194
|
+
csv = CSV.new(out || $stdout, {
|
195
|
+
col_sep: sep,
|
196
|
+
encoding: encoding ? encoding + ":UTF-8" : nil,
|
197
|
+
quote_empty: false, #!# TODO: make this an option
|
198
|
+
**kw
|
199
|
+
})
|
153
200
|
csv << @cols.keys
|
154
201
|
@rows.each {|vals| csv << vals}
|
155
|
-
|
202
|
+
out
|
156
203
|
end
|
157
|
-
def tsv; csv("\t"); end
|
158
|
-
def psv; csv("|" ); end
|
204
|
+
def tsv(**kw); csv("\t", **kw); end
|
205
|
+
def psv(**kw); csv("|" , **kw); end
|
159
206
|
|
160
|
-
def sql(table='table', quote: false, timestamps: false, verb: 'insert')
|
207
|
+
def sql(table='table', quote: false, timestamps: false, verb: 'insert', out: nil)
|
161
208
|
q = quote ? '`' : ''
|
162
209
|
flip = @cols.invert
|
163
210
|
@rows.each do |vals|
|
@@ -167,9 +214,12 @@ class TextTable
|
|
167
214
|
list
|
168
215
|
end
|
169
216
|
list.push('created_at=now(), updated_at=now()') if timestamps
|
170
|
-
|
217
|
+
if !list.empty?
|
218
|
+
line = "#{verb} into #{q}#{table}#{q} set #{list * ', '};"
|
219
|
+
out ? (out << line) : puts(line)
|
220
|
+
end
|
171
221
|
end
|
172
|
-
|
222
|
+
out
|
173
223
|
end
|
174
224
|
end
|
175
225
|
|
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.7
|
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-03-25 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.1.
|
45
|
-
signing_key:
|
44
|
+
rubygems_version: 3.1.4
|
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: []
|