fat_table 0.9.2 → 0.9.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.org +13 -10
- data/lib/fat_table/errors.rb +3 -0
- data/lib/fat_table/formatters/formatter.rb +0 -6
- data/lib/fat_table/table.rb +41 -14
- data/lib/fat_table/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 10cc3b0171ec07f74b9e7067c0204c4f828271d18e648bf540664fdaa33b7af9
|
4
|
+
data.tar.gz: a95c4ab0fc7bfda4a00df537c2ad06383d67c77eb9b5b5007c9033008459d679
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c3dd880a234f88c9c507b01854397e458b4987786cac9c5667f4697253dc4781b1833976251c95cfdfdd3c4ff6e9d033911e2ba02bcb6d04b92567f1beab8c3b
|
7
|
+
data.tar.gz: 6fb2f3309586c0053dc89cddee3509e934943ee70a2ffc105fd1b257eaec1ce81ff3deffce5ae5a389cf4461f716c54d6ae661102530ad4f3624bec34632e74e
|
data/README.org
CHANGED
@@ -2614,19 +2614,22 @@ parameter. See below at [[*Table Locations][Table Locations]] for an explanatio
|
|
2614
2614
|
locations available.
|
2615
2615
|
|
2616
2616
|
Other than that first parameter, the two methods take the same types of
|
2617
|
-
parameters. The remaining parameters are hash-like parameters that use either
|
2618
|
-
column name or a type as the key and a string with the formatting directives
|
2619
|
-
apply as the value.
|
2620
|
-
|
2621
|
-
|
2622
|
-
|
2623
|
-
|
2624
|
-
|
2625
|
-
|
2617
|
+
parameters. The remaining parameters are hash-like parameters that use either
|
2618
|
+
a column name or a type as the key and a string with the formatting directives
|
2619
|
+
to apply as the value. If a key represents neither a column name nor a valid
|
2620
|
+
type, it is silently ignored. The following example says to set the
|
2621
|
+
formatting for all locations in the table and to format all numeric fields as
|
2622
|
+
strings that are rounded to whole numbers (the '0.0' part), that are
|
2623
|
+
right-aligned (the 'R' part), and have grouping commas inserted (the ','
|
2624
|
+
part). But the ~:id~ column is numeric, and the second parameter overrides the
|
2625
|
+
formatting for numerics in general and calls for the ~:id~ column to be padded
|
2626
|
+
to three digits with zeros on the left (the '3.0' part) and to be centered
|
2627
|
+
(the 'C' part).
|
2626
2628
|
|
2627
2629
|
#+BEGIN_SRC ruby :wrap EXAMPLE
|
2628
2630
|
tab_a.to_text do |f|
|
2629
|
-
|
2631
|
+
# Note: blat: is silently ignored
|
2632
|
+
f.format(numeric: '0.0,R', id: '3.0C', blat: 'B')
|
2630
2633
|
f.format_for(:body, string: 'R')
|
2631
2634
|
f.format_for(:header, string: 'C')
|
2632
2635
|
end
|
data/lib/fat_table/errors.rb
CHANGED
@@ -16,4 +16,7 @@ module FatTable
|
|
16
16
|
# Raised when an external resource is not available due to caller or
|
17
17
|
# programmer error or some failure of the external resource to be available.
|
18
18
|
class TransientError < StandardError; end
|
19
|
+
|
20
|
+
# Raise when an expected table was not found.
|
21
|
+
class NoTable < UserError; end
|
19
22
|
end
|
@@ -648,12 +648,6 @@ module FatTable
|
|
648
648
|
k
|
649
649
|
end
|
650
650
|
end
|
651
|
-
valid_keys = table.headers + %i[string numeric datetime boolean nil]
|
652
|
-
invalid_keys = (fmts.keys - valid_keys).uniq
|
653
|
-
unless invalid_keys.empty?
|
654
|
-
msg = "invalid #{location} column or type: #{invalid_keys.join(', ')}"
|
655
|
-
raise UserError, msg
|
656
|
-
end
|
657
651
|
|
658
652
|
@format_at[location] ||= {}
|
659
653
|
table.headers.each do |h|
|
data/lib/fat_table/table.rb
CHANGED
@@ -156,14 +156,18 @@ module FatTable
|
|
156
156
|
File.open(fname, 'r') do |io|
|
157
157
|
from_csv_io(io, **types)
|
158
158
|
end
|
159
|
+
rescue NoTable
|
160
|
+
raise NoTable, "no table found in CSV file '#{fname}'"
|
159
161
|
end
|
160
162
|
|
161
163
|
# :category: Constructors
|
162
164
|
|
163
165
|
# Construct a Table from a CSV string +str+, treated in the same manner as
|
164
166
|
# the input from a CSV file in ::from_org_file.
|
165
|
-
def self.from_csv_string(str, **
|
166
|
-
from_csv_io(StringIO.new(str), **
|
167
|
+
def self.from_csv_string(str, has_headers: true, **)
|
168
|
+
from_csv_io(StringIO.new(str), has_headers:, **)
|
169
|
+
rescue NoTable
|
170
|
+
raise NoTable, "no table found in string '#{str[0..20]}...'"
|
167
171
|
end
|
168
172
|
|
169
173
|
# :category: Constructors
|
@@ -176,6 +180,8 @@ module FatTable
|
|
176
180
|
File.open(fname, 'r') do |io|
|
177
181
|
from_org_io(io, **types)
|
178
182
|
end
|
183
|
+
rescue NoTable
|
184
|
+
raise NoTable, "no table found in file '#{fname}'"
|
179
185
|
end
|
180
186
|
|
181
187
|
# :category: Constructors
|
@@ -184,6 +190,8 @@ module FatTable
|
|
184
190
|
# contents of an org-mode file in ::from_org_file.
|
185
191
|
def self.from_org_string(str, **types)
|
186
192
|
from_org_io(StringIO.new(str), **types)
|
193
|
+
rescue NoTable
|
194
|
+
raise NoTable, "no table found in string '#{str[0..20]...}'"
|
187
195
|
end
|
188
196
|
|
189
197
|
# :category: Constructors
|
@@ -275,9 +283,9 @@ module FatTable
|
|
275
283
|
# Construct table from an array of hashes or an array of any object that
|
276
284
|
# can respond to #to_h. If an array element is a nil, mark it as a group
|
277
285
|
# boundary in the Table.
|
278
|
-
def from_array_of_hashes(hashes, hlines: false, **
|
286
|
+
def from_array_of_hashes(hashes, hlines: false, **)
|
279
287
|
heads = hashes.first.keys
|
280
|
-
result = new(*heads, **
|
288
|
+
result = new(*heads, **)
|
281
289
|
hashes.each do |hsh|
|
282
290
|
if hsh.nil?
|
283
291
|
unless hlines
|
@@ -305,7 +313,7 @@ module FatTable
|
|
305
313
|
# hlines are stripped from the table, otherwise (:hlines yes) they are
|
306
314
|
# indicated with nil elements in the outer array as expected by this
|
307
315
|
# method when hlines is set true.
|
308
|
-
def from_array_of_arrays(rows, hlines: false, **
|
316
|
+
def from_array_of_arrays(rows, hlines: false, **)
|
309
317
|
headers = []
|
310
318
|
if !hlines
|
311
319
|
# Take the first row as headers
|
@@ -324,7 +332,7 @@ module FatTable
|
|
324
332
|
headers = (1..rows[0].size).to_a.map { |k| "col_#{k}".as_sym }
|
325
333
|
first_data_row = 0
|
326
334
|
end
|
327
|
-
result = new(*headers, **
|
335
|
+
result = new(*headers, **)
|
328
336
|
rows[first_data_row..-1].each do |row|
|
329
337
|
if row.nil?
|
330
338
|
unless hlines
|
@@ -342,24 +350,35 @@ module FatTable
|
|
342
350
|
result
|
343
351
|
end
|
344
352
|
|
345
|
-
def from_csv_io(io, **
|
346
|
-
result = new(**
|
347
|
-
|
348
|
-
|
349
|
-
|
353
|
+
def from_csv_io(io, has_headers: true, **)
|
354
|
+
result = new(**)
|
355
|
+
if has_headers
|
356
|
+
::CSV.new(io, headers: has_headers, header_converters: :symbol, skip_blanks: true).each do |row|
|
357
|
+
result << row.to_h
|
358
|
+
end
|
359
|
+
else
|
360
|
+
nfields = io.readline.split(',').size
|
361
|
+
io.seek(0, IO::SEEK_SET)
|
362
|
+
heads = (1..nfields).map {|n| "col_#{n}"}
|
363
|
+
::CSV.new(io, headers: heads, skip_blanks: true).each do |row|
|
364
|
+
result << row.to_h
|
365
|
+
end
|
350
366
|
end
|
351
367
|
result.normalize_boundaries
|
352
368
|
result
|
369
|
+
rescue StandardError
|
370
|
+
raise NoTable
|
353
371
|
end
|
354
372
|
|
355
373
|
# Form rows of table by reading the first table found in the org file. The
|
356
374
|
# header row must be marked with an hline (i.e, a row that looks like
|
357
375
|
# '|---+--...--|') and groups of rows may be marked with hlines to
|
358
376
|
# indicate group boundaries.
|
359
|
-
def from_org_io(io, **
|
377
|
+
def from_org_io(io, **)
|
360
378
|
table_re = /\A\s*\|/
|
361
379
|
hrule_re = /\A\s*\|[-+]+/
|
362
380
|
rows = []
|
381
|
+
ncols = nil
|
363
382
|
table_found = false
|
364
383
|
header_found = false
|
365
384
|
io.each do |line|
|
@@ -388,10 +407,17 @@ module FatTable
|
|
388
407
|
break
|
389
408
|
else
|
390
409
|
line = line.sub(/\A\s*\|/, '').sub(/\|\s*\z/, '')
|
391
|
-
rows
|
410
|
+
# Don't include any rows with a size different from that
|
411
|
+
# established by the header row.
|
412
|
+
cols = line.split('|').map(&:clean)
|
413
|
+
ncols ||= cols.size
|
414
|
+
next unless cols.size == ncols
|
415
|
+
|
416
|
+
rows << cols
|
392
417
|
end
|
393
418
|
end
|
394
|
-
|
419
|
+
raise NoTable unless table_found
|
420
|
+
from_array_of_arrays(rows, hlines: true, **)
|
395
421
|
end
|
396
422
|
end
|
397
423
|
|
@@ -717,6 +743,7 @@ module FatTable
|
|
717
743
|
self.explicit_boundaries = explicit_boundaries.uniq.sort
|
718
744
|
end
|
719
745
|
explicit_boundaries
|
746
|
+
self
|
720
747
|
end
|
721
748
|
|
722
749
|
# Return the explicit_boundaries, augmented by an implicit boundary for
|
data/lib/fat_table/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fat_table
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel E. Doherty
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-10-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -335,7 +335,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
335
335
|
- !ruby/object:Gem::Version
|
336
336
|
version: '0'
|
337
337
|
requirements: []
|
338
|
-
rubygems_version: 3.4.
|
338
|
+
rubygems_version: 3.4.14
|
339
339
|
signing_key:
|
340
340
|
specification_version: 4
|
341
341
|
summary: Provides tools for working with tables as a data type.
|