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 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: []