texttable 1.1.3 → 1.1.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: daf8fb1088ce9570617aea39c1cbbfa3b4b5819af7013e26c2e4680d1ec2ceb1
4
- data.tar.gz: 343e38b5ff4ed2cb20076af22bcfaedb00fd70702dcc8654b4169736b87a4768
3
+ metadata.gz: 79e3c725b088a02d42d7096862e6087d090ba057b66e28297bf796597da59f16
4
+ data.tar.gz: 7a07a8a529036fe884d27290576c530b29c990a606866f09d8aa24526a7e1661
5
5
  SHA512:
6
- metadata.gz: dfbd834c7999c0c666c39043f2529b31fa4077292aec331541744cb6fc22a841380914435b75c3462647896969d4b8eb6846e72ebdf6cb3878c761f0ac8005a1
7
- data.tar.gz: 8b401aab5b7df8d12aa883a7c0932cf5e4713889d5a3f63aa59416cfb3e3c15eb9029257819e9e46aa62e7f23a547239cd2e21e52a35ab91990240c950bdd279
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
- @values = nil
25
- @row = 0
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[@cols[k]] = v}
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 csv(sep=',', encoding: nil)
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
- csv = {}
155
- csv[:encoding] = encoding + ":UTF-8" if encoding
156
- csv[:col_sep ] = sep
157
- csv = CSV.new($stdout, csv)
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
- nil
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
- puts "#{verb} into #{q}#{table}#{q} set #{list * ', '};" if !list.empty?
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
- nil
226
+ out
178
227
  end
179
228
  end
180
229
 
data/texttable.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "texttable"
5
- s.version = "1.1.3"
5
+ s.version = "1.1.9"
6
6
  s.author = "Steve Shreeve"
7
7
  s.email = "steve.shreeve@gmail.com"
8
8
  s.summary = "An easy way to work with rows and columns as simple tables"
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.3
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: 2020-06-10 00:00:00.000000000 Z
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.1.2
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: []