fat_table 0.3.3 → 0.5.1
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/.rspec +2 -1
- data/.rubocop.yml +3 -5
- data/README.org +1334 -457
- data/README.rdoc +1 -2
- data/TODO.org +17 -10
- data/examples/create_trans.sql +14 -0
- data/examples/quick.pdf +0 -0
- data/examples/quick.png +0 -0
- data/examples/quick.ppm +0 -0
- data/examples/quick.tex +8 -0
- data/examples/quick_small.png +0 -0
- data/examples/quicktable.tex +123 -0
- data/examples/trades.db +0 -0
- data/examples/trans.csv +13 -0
- data/fat_table.gemspec +2 -2
- data/lib/ext/array.rb +15 -0
- data/lib/fat_table/column.rb +71 -208
- data/lib/fat_table/convert.rb +173 -0
- data/lib/fat_table/evaluator.rb +7 -0
- data/lib/fat_table/footer.rb +228 -0
- data/lib/fat_table/formatters/formatter.rb +200 -163
- data/lib/fat_table/formatters/latex_formatter.rb +9 -7
- data/lib/fat_table/table.rb +229 -57
- data/lib/fat_table/version.rb +1 -1
- data/lib/fat_table.rb +5 -2
- data/md/README.md +1 -2
- metadata +30 -18
@@ -91,7 +91,7 @@ module FatTable
|
|
91
91
|
else
|
92
92
|
''
|
93
93
|
end
|
94
|
-
result += "\\usepackage[pdftex,x11names]{xcolor}\n"
|
94
|
+
result += "\\usepackage[pdftex,table,x11names]{xcolor}\n"
|
95
95
|
result
|
96
96
|
end
|
97
97
|
|
@@ -113,12 +113,14 @@ module FatTable
|
|
113
113
|
# default.
|
114
114
|
def decorate_string(str, istruct)
|
115
115
|
str = quote(str)
|
116
|
-
result =
|
117
|
-
result
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
116
|
+
result = istruct.italic ? "\\itshape{#{str}}" : str
|
117
|
+
result = istruct.bold ? "\\bfseries{#{result}}" : result
|
118
|
+
if istruct.color && istruct.color != 'none'
|
119
|
+
result = "{\\textcolor{#{istruct.color}}{#{result}}}"
|
120
|
+
end
|
121
|
+
if istruct.bgcolor && istruct.bgcolor != 'none'
|
122
|
+
result = "\\cellcolor{#{istruct.bgcolor}}#{result}"
|
123
|
+
end
|
122
124
|
unless istruct.alignment == format_at[:body][istruct._h].alignment
|
123
125
|
ac = alignment_code(istruct.alignment)
|
124
126
|
result = "\\multicolumn{1}{#{ac}}{#{result}}"
|
data/lib/fat_table/table.rb
CHANGED
@@ -62,11 +62,33 @@ module FatTable
|
|
62
62
|
# :category: Constructors
|
63
63
|
|
64
64
|
# Return an empty FatTable::Table object.
|
65
|
-
def initialize
|
65
|
+
def initialize(*heads)
|
66
66
|
@columns = []
|
67
67
|
@boundaries = []
|
68
|
+
unless heads.empty?
|
69
|
+
heads.each do |h|
|
70
|
+
@columns << Column.new(header: h)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# :category: Constructors
|
76
|
+
|
77
|
+
# Return an empty duplicate of self. This allows the library to create an
|
78
|
+
# empty table that preserves all the instance variables from self. Even
|
79
|
+
# though FatTable::Table objects have no instance variables, a class that
|
80
|
+
# inherits from it might.
|
81
|
+
def empty_dup
|
82
|
+
self.dup.__empty!
|
83
|
+
end
|
84
|
+
|
85
|
+
def __empty!
|
86
|
+
@columns = []
|
87
|
+
@boundaries = []
|
88
|
+
self
|
68
89
|
end
|
69
90
|
|
91
|
+
|
70
92
|
# :category: Constructors
|
71
93
|
|
72
94
|
# Construct a Table from the contents of a CSV file named +fname+. Headers
|
@@ -188,6 +210,7 @@ module FatTable
|
|
188
210
|
end
|
189
211
|
result << hsh.to_h
|
190
212
|
end
|
213
|
+
result.normalize_boundaries
|
191
214
|
result
|
192
215
|
end
|
193
216
|
|
@@ -236,6 +259,7 @@ module FatTable
|
|
236
259
|
hash_row = Hash[headers.zip(row)]
|
237
260
|
result << hash_row
|
238
261
|
end
|
262
|
+
result.normalize_boundaries
|
239
263
|
result
|
240
264
|
end
|
241
265
|
|
@@ -245,6 +269,7 @@ module FatTable
|
|
245
269
|
skip_blanks: true).each do |row|
|
246
270
|
result << row.to_h
|
247
271
|
end
|
272
|
+
result.normalize_boundaries
|
248
273
|
result
|
249
274
|
end
|
250
275
|
|
@@ -317,8 +342,11 @@ module FatTable
|
|
317
342
|
# Set the column type for Column with the given +key+ as a String type,
|
318
343
|
# but only if empty. Otherwise, we would have to worry about converting
|
319
344
|
# existing items in the column to String. Perhaps that's a TODO.
|
320
|
-
def
|
321
|
-
|
345
|
+
def force_string!(*keys)
|
346
|
+
keys.each do |h|
|
347
|
+
column(h).force_string!
|
348
|
+
end
|
349
|
+
self
|
322
350
|
end
|
323
351
|
|
324
352
|
# :category: Attributes
|
@@ -506,6 +534,46 @@ module FatTable
|
|
506
534
|
groups
|
507
535
|
end
|
508
536
|
|
537
|
+
# Return the number of groups in the table.
|
538
|
+
def number_of_groups
|
539
|
+
boundaries.size
|
540
|
+
end
|
541
|
+
|
542
|
+
# Return the range of row indexes for boundary number +k+
|
543
|
+
def group_row_range(k)
|
544
|
+
last_k = boundaries.size - 1
|
545
|
+
if k < 0 || k > last_k
|
546
|
+
raise ArgumentError, "boundary number '#{k}' out of range in boundary_row_range"
|
547
|
+
end
|
548
|
+
|
549
|
+
if boundaries.empty?
|
550
|
+
(0..size-1)
|
551
|
+
elsif boundaries.size == 1
|
552
|
+
(0..boundaries.first)
|
553
|
+
else
|
554
|
+
# Keep index at or above zero
|
555
|
+
if k.zero?
|
556
|
+
(0..boundaries[k])
|
557
|
+
else
|
558
|
+
(boundaries[k-1]+1..boundaries[k])
|
559
|
+
end
|
560
|
+
end
|
561
|
+
end
|
562
|
+
|
563
|
+
# Return an Array of Column objects for header +col+ representing a
|
564
|
+
# sub-column for each group in the table under that header.
|
565
|
+
def group_cols(col)
|
566
|
+
normalize_boundaries
|
567
|
+
cols = []
|
568
|
+
(0..boundaries.size - 1).each do |k|
|
569
|
+
range = group_row_range(k)
|
570
|
+
tab_col = column(col)
|
571
|
+
gitems = tab_col.items[range]
|
572
|
+
cols << Column.new(header: col, items: gitems, type: tab_col.type)
|
573
|
+
end
|
574
|
+
cols
|
575
|
+
end
|
576
|
+
|
509
577
|
# :category: Operators
|
510
578
|
|
511
579
|
# Return this table mutated with all groups removed. Useful after something
|
@@ -528,8 +596,6 @@ module FatTable
|
|
528
596
|
end
|
529
597
|
end
|
530
598
|
|
531
|
-
protected
|
532
|
-
|
533
599
|
# :stopdoc:
|
534
600
|
|
535
601
|
# Make sure size - 1 is last boundary and that they are unique and sorted.
|
@@ -541,6 +607,8 @@ module FatTable
|
|
541
607
|
boundaries
|
542
608
|
end
|
543
609
|
|
610
|
+
protected
|
611
|
+
|
544
612
|
# Concatenate the array of argument bounds to this table's boundaries, but
|
545
613
|
# increase each of the indexes in bounds by shift. This is used in the
|
546
614
|
# #union_all method.
|
@@ -587,22 +655,43 @@ module FatTable
|
|
587
655
|
# After sorting, the output Table will have group boundaries added after
|
588
656
|
# each row where the sort key changes.
|
589
657
|
def order_by(*sort_heads)
|
590
|
-
|
591
|
-
|
592
|
-
sort_heads = sort_heads.map { |h| h.to_s.sub(/\!\z/, '').to_sym }
|
593
|
-
rev_heads = rev_heads.map { |h| h.to_s.sub(/\!\z/, '').to_sym }
|
658
|
+
# Sort the rows in order and add to new_rows.
|
659
|
+
key_hash = partition_sort_keys(sort_heads)
|
594
660
|
new_rows = rows.sort do |r1, r2|
|
595
|
-
|
596
|
-
|
597
|
-
|
661
|
+
# Set the sort keys based on direction
|
662
|
+
key1 = []
|
663
|
+
key2 = []
|
664
|
+
key_hash.each_pair do |h, dir|
|
665
|
+
if dir == :forward
|
666
|
+
key1 << r1[h]
|
667
|
+
key2 << r2[h]
|
668
|
+
else
|
669
|
+
key1 << r2[h]
|
670
|
+
key2 << r1[h]
|
671
|
+
end
|
672
|
+
end
|
673
|
+
# Make any booleans comparable with <=>
|
674
|
+
key1 = key1.map_booleans
|
675
|
+
key2 = key2.map_booleans
|
676
|
+
|
677
|
+
# If there are any nils, <=> will return nil, and we have to use the
|
678
|
+
# special comparison method, compare_with_nils, instead.
|
679
|
+
result = (key1 <=> key2)
|
680
|
+
result.nil? ? compare_with_nils(key1, key2) : result
|
598
681
|
end
|
599
|
-
|
600
|
-
#
|
601
|
-
|
682
|
+
|
683
|
+
# Add the new_rows to the table, but mark a group boundary at the points
|
684
|
+
# where the sort key changes value. NB: I use self.class.new here
|
685
|
+
# rather than Table.new because if this class is inherited, I want the
|
686
|
+
# new_tab to be an instance of the subclass. With Table.new, this
|
687
|
+
# method's result will be an instance of FatTable::Table rather than of
|
688
|
+
# the subclass.
|
689
|
+
new_tab = empty_dup
|
602
690
|
last_key = nil
|
603
691
|
new_rows.each_with_index do |nrow, k|
|
604
692
|
new_tab << nrow
|
605
|
-
key = nrow.fetch_values(*sort_heads)
|
693
|
+
# key = nrow.fetch_values(*sort_heads)
|
694
|
+
key = nrow.fetch_values(*key_hash.keys)
|
606
695
|
new_tab.mark_boundary(k - 1) if last_key && key != last_key
|
607
696
|
last_key = key
|
608
697
|
end
|
@@ -610,6 +699,33 @@ module FatTable
|
|
610
699
|
new_tab
|
611
700
|
end
|
612
701
|
|
702
|
+
# :category: Operators
|
703
|
+
|
704
|
+
# Return a new Table sorting the rows of this Table on an any expression
|
705
|
+
# +expr+ that is valid with the +select+ method, except that they
|
706
|
+
# expression may end with an exclamation mark +!+ to indicate a reverse
|
707
|
+
# sort. The new table will have an additional column called +sort_key+
|
708
|
+
# populated with the result of evaluating the given expression and will be
|
709
|
+
# sorted (or reverse sorted) on that column.
|
710
|
+
#
|
711
|
+
# tab.order_with('date.year') => table sorted by date's year
|
712
|
+
# tab.order_with('date.year!') => table reverse sorted by date's year
|
713
|
+
#
|
714
|
+
# After sorting, the output Table will have group boundaries added after
|
715
|
+
# each row where the sort key changes.
|
716
|
+
def order_with(expr)
|
717
|
+
unless expr.is_a?(String)
|
718
|
+
raise "must call FatTable::Table\#order_with with a single string expression"
|
719
|
+
end
|
720
|
+
rev = false
|
721
|
+
if expr.match?(/\s*!\s*\z/)
|
722
|
+
rev = true
|
723
|
+
expr = expr.sub(/\s*!\s*\z/, '')
|
724
|
+
end
|
725
|
+
sort_sym = rev ? :sort_key! : :sort_key
|
726
|
+
dup.select(*headers, sort_key: expr).order_by(sort_sym)
|
727
|
+
end
|
728
|
+
|
613
729
|
# :category: Operators
|
614
730
|
#
|
615
731
|
# Return a Table having the selected column expressions. Each expression can
|
@@ -713,7 +829,7 @@ module FatTable
|
|
713
829
|
before: before_hook,
|
714
830
|
after: after_hook)
|
715
831
|
# Compute the new Table from this Table
|
716
|
-
result =
|
832
|
+
result = empty_dup
|
717
833
|
normalize_boundaries
|
718
834
|
rows.each_with_index do |old_row, old_k|
|
719
835
|
# Set the group number in the before hook and run the hook with the
|
@@ -723,7 +839,15 @@ module FatTable
|
|
723
839
|
ev.eval_before_hook(locals: old_row)
|
724
840
|
# Compute the new row.
|
725
841
|
new_row = {}
|
726
|
-
|
842
|
+
# Allow the :omni col to stand for all columns if it is alone and
|
843
|
+
# first.
|
844
|
+
cols_to_include =
|
845
|
+
if cols.size == 1 && cols.first.as_sym == :omni
|
846
|
+
headers
|
847
|
+
else
|
848
|
+
cols
|
849
|
+
end
|
850
|
+
cols_to_include.each do |k|
|
727
851
|
h = k.as_sym
|
728
852
|
msg = "Column '#{h}' in select does not exist"
|
729
853
|
raise UserError, msg unless column?(h)
|
@@ -770,7 +894,7 @@ module FatTable
|
|
770
894
|
# tab.where('@row.even? && shares > 500') => even rows with lots of shares
|
771
895
|
def where(expr)
|
772
896
|
expr = expr.to_s
|
773
|
-
result =
|
897
|
+
result = empty_dup
|
774
898
|
headers.each do |h|
|
775
899
|
col = Column.new(header: h)
|
776
900
|
result.add_column(col)
|
@@ -792,7 +916,7 @@ module FatTable
|
|
792
916
|
# Return a new table with all duplicate rows eliminated. Resets groups. Same
|
793
917
|
# as #uniq.
|
794
918
|
def distinct
|
795
|
-
result =
|
919
|
+
result = empty_dup
|
796
920
|
uniq_rows = rows.uniq
|
797
921
|
uniq_rows.each do |row|
|
798
922
|
result << row
|
@@ -889,36 +1013,6 @@ module FatTable
|
|
889
1013
|
set_operation(other, :difference, distinct: false)
|
890
1014
|
end
|
891
1015
|
|
892
|
-
private
|
893
|
-
|
894
|
-
# Apply the set operation given by ~oper~ between this table and the other
|
895
|
-
# table given in the first argument. If distinct is true, eliminate
|
896
|
-
# duplicates from the result.
|
897
|
-
def set_operation(other, oper = :+, distinct: true, add_boundaries: true, inherit_boundaries: false)
|
898
|
-
unless columns.size == other.columns.size
|
899
|
-
msg = "can't apply set ops to tables with a different number of columns"
|
900
|
-
raise UserError, msg
|
901
|
-
end
|
902
|
-
unless columns.map(&:type) == other.columns.map(&:type)
|
903
|
-
msg = "can't apply a set ops to tables with different column types."
|
904
|
-
raise UserError, msg
|
905
|
-
end
|
906
|
-
other_rows = other.rows.map { |r| r.replace_keys(headers) }
|
907
|
-
result = Table.new
|
908
|
-
new_rows = rows.send(oper, other_rows)
|
909
|
-
new_rows.each_with_index do |row, k|
|
910
|
-
result << row
|
911
|
-
result.mark_boundary if k == size - 1 && add_boundaries
|
912
|
-
end
|
913
|
-
if inherit_boundaries
|
914
|
-
result.boundaries = normalize_boundaries
|
915
|
-
other.normalize_boundaries
|
916
|
-
result.append_boundaries(other.boundaries, shift: size)
|
917
|
-
end
|
918
|
-
result.normalize_boundaries
|
919
|
-
distinct ? result.distinct : result
|
920
|
-
end
|
921
|
-
|
922
1016
|
public
|
923
1017
|
|
924
1018
|
# An Array of symbols for the valid join types.
|
@@ -1011,7 +1105,7 @@ module FatTable
|
|
1011
1105
|
join_exp, other_common_heads =
|
1012
1106
|
build_join_expression(exps, other, join_type)
|
1013
1107
|
ev = Evaluator.new
|
1014
|
-
result =
|
1108
|
+
result = empty_dup
|
1015
1109
|
other_rows = other.rows
|
1016
1110
|
other_row_matches = Array.new(other_rows.size, false)
|
1017
1111
|
rows.each do |self_row|
|
@@ -1259,7 +1353,7 @@ module FatTable
|
|
1259
1353
|
groups = sorted_tab.rows.group_by do |r|
|
1260
1354
|
group_cols.map { |k| r[k] }
|
1261
1355
|
end
|
1262
|
-
result =
|
1356
|
+
result = empty_dup
|
1263
1357
|
groups.each_pair do |_vals, grp_rows|
|
1264
1358
|
result << row_from_group(grp_rows, group_cols, agg_cols)
|
1265
1359
|
end
|
@@ -1304,12 +1398,20 @@ module FatTable
|
|
1304
1398
|
# is set true, mark this row as a boundary. All tables should be built
|
1305
1399
|
# ultimately using this method as a primitive.
|
1306
1400
|
def add_row(row, mark: false)
|
1307
|
-
row.
|
1308
|
-
|
1309
|
-
|
1310
|
-
|
1401
|
+
row.transform_keys!(&:as_sym)
|
1402
|
+
# Make sure there is a column for each known header and each new key
|
1403
|
+
# present in row.
|
1404
|
+
new_heads = row.keys - headers
|
1405
|
+
new_heads.each do |h|
|
1406
|
+
# This column is new, so it needs nil items for all prior rows lest
|
1407
|
+
# the value be added to a prior row.
|
1408
|
+
items = Array.new(size, nil)
|
1409
|
+
columns << Column.new(header: h, items: items)
|
1410
|
+
end
|
1411
|
+
headers.each do |h|
|
1412
|
+
# NB: This adds a nil if h is not in row.
|
1413
|
+
column(h) << row[h]
|
1311
1414
|
end
|
1312
|
-
add_boundary if mark
|
1313
1415
|
self
|
1314
1416
|
end
|
1315
1417
|
|
@@ -1478,5 +1580,75 @@ module FatTable
|
|
1478
1580
|
yield fmt if block_given?
|
1479
1581
|
fmt.output
|
1480
1582
|
end
|
1583
|
+
|
1584
|
+
private
|
1585
|
+
|
1586
|
+
# Apply the set operation given by ~oper~ between this table and the other
|
1587
|
+
# table given in the first argument. If distinct is true, eliminate
|
1588
|
+
# duplicates from the result.
|
1589
|
+
def set_operation(other, oper = :+, distinct: true, add_boundaries: true, inherit_boundaries: false)
|
1590
|
+
unless columns.size == other.columns.size
|
1591
|
+
msg = "can't apply set ops to tables with a different number of columns"
|
1592
|
+
raise UserError, msg
|
1593
|
+
end
|
1594
|
+
unless columns.map(&:type) == other.columns.map(&:type)
|
1595
|
+
msg = "can't apply a set ops to tables with different column types."
|
1596
|
+
raise UserError, msg
|
1597
|
+
end
|
1598
|
+
other_rows = other.rows.map { |r| r.replace_keys(headers) }
|
1599
|
+
result = empty_dup
|
1600
|
+
new_rows = rows.send(oper, other_rows)
|
1601
|
+
new_rows.each_with_index do |row, k|
|
1602
|
+
result << row
|
1603
|
+
result.mark_boundary if k == size - 1 && add_boundaries
|
1604
|
+
end
|
1605
|
+
if inherit_boundaries
|
1606
|
+
result.boundaries = normalize_boundaries
|
1607
|
+
other.normalize_boundaries
|
1608
|
+
result.append_boundaries(other.boundaries, shift: size)
|
1609
|
+
end
|
1610
|
+
result.normalize_boundaries
|
1611
|
+
distinct ? result.distinct : result
|
1612
|
+
end
|
1613
|
+
|
1614
|
+
# Return a hash with the key being the header to sort on and the value
|
1615
|
+
# being either :forward or :reverse to indicate the sort order on that
|
1616
|
+
# key.
|
1617
|
+
def partition_sort_keys(keys)
|
1618
|
+
result = {}
|
1619
|
+
[keys].flatten.each do |h|
|
1620
|
+
if h.to_s.match?(/\s*!\s*\z/)
|
1621
|
+
result[h.to_s.sub(/\s*!\s*\z/, '').to_sym] = :reverse
|
1622
|
+
else
|
1623
|
+
result[h] = :forward
|
1624
|
+
end
|
1625
|
+
end
|
1626
|
+
result
|
1627
|
+
end
|
1628
|
+
|
1629
|
+
# The <=> operator cannot handle nils without some help. Treat a nil as
|
1630
|
+
# smaller than any other value, but equal to other nils. The two keys are assumed to be arrays of values to be
|
1631
|
+
# compared with <=>.
|
1632
|
+
def compare_with_nils(key1, key2)
|
1633
|
+
result = nil
|
1634
|
+
key1.zip(key2) do |k1, k2|
|
1635
|
+
if k1.nil? && k2.nil?
|
1636
|
+
result = 0
|
1637
|
+
next
|
1638
|
+
elsif k1.nil?
|
1639
|
+
result = -1
|
1640
|
+
break
|
1641
|
+
elsif k2.nil?
|
1642
|
+
result = 1
|
1643
|
+
break
|
1644
|
+
elsif (k1 <=> k2) == 0
|
1645
|
+
next
|
1646
|
+
else
|
1647
|
+
result = (k1 <=> k2)
|
1648
|
+
break
|
1649
|
+
end
|
1650
|
+
end
|
1651
|
+
result
|
1652
|
+
end
|
1481
1653
|
end
|
1482
1654
|
end
|
data/lib/fat_table/version.rb
CHANGED
data/lib/fat_table.rb
CHANGED
@@ -19,9 +19,12 @@ module FatTable
|
|
19
19
|
|
20
20
|
require 'fat_table/version'
|
21
21
|
require 'fat_table/patches'
|
22
|
+
require 'ext/array'
|
22
23
|
require 'fat_table/evaluator'
|
24
|
+
require 'fat_table/convert'
|
23
25
|
require 'fat_table/column'
|
24
26
|
require 'fat_table/table'
|
27
|
+
require 'fat_table/footer'
|
25
28
|
require 'fat_table/formatters'
|
26
29
|
require 'fat_table/db_handle'
|
27
30
|
require 'fat_table/errors'
|
@@ -58,8 +61,8 @@ module FatTable
|
|
58
61
|
|
59
62
|
# Return an empty FatTable::Table object. You can use FatTable::Table#add_row
|
60
63
|
# or FatTable::Table#add_column to populate the table with data.
|
61
|
-
def self.new
|
62
|
-
Table.new
|
64
|
+
def self.new(*args)
|
65
|
+
Table.new(*args)
|
63
66
|
end
|
64
67
|
|
65
68
|
# Construct a FatTable::Table from the contents of a CSV file given by the
|
data/md/README.md
CHANGED
@@ -1109,8 +1109,7 @@ will raise an exception.
|
|
1109
1109
|
|
1110
1110
|
- **`first`:** the first non-nil item in the column,
|
1111
1111
|
- **`last`:** the last non-nil item in the column,
|
1112
|
-
- **`
|
1113
|
-
values in the column,
|
1112
|
+
- **`range`:** form a Range ~~{min}..{max}~ to show the range of values in the column,
|
1114
1113
|
- **`sum`:** for `Numeric` and `String` columns, apply ’+’ to all the non-nil
|
1115
1114
|
values,
|
1116
1115
|
- **`count`:** the number of non-nil values in the column,
|
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.
|
4
|
+
version: 0.5.1
|
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: 2022-01-
|
11
|
+
date: 2022-01-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -25,19 +25,19 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: debug
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 1.0.0
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 1.0.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: pry
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -53,7 +53,7 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name: pry-
|
56
|
+
name: pry-doc
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
@@ -67,35 +67,35 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: rake
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
75
|
+
version: '13.0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
82
|
+
version: '13.0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: redcarpet
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
89
|
+
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
96
|
+
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
98
|
+
name: pg
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - ">="
|
@@ -109,7 +109,7 @@ dependencies:
|
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
112
|
+
name: sqlite3
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - ">="
|
@@ -297,12 +297,24 @@ files:
|
|
297
297
|
- TODO.org
|
298
298
|
- bin/ft_console
|
299
299
|
- bin/setup
|
300
|
+
- examples/create_trans.sql
|
301
|
+
- examples/quick.pdf
|
302
|
+
- examples/quick.png
|
303
|
+
- examples/quick.ppm
|
304
|
+
- examples/quick.tex
|
305
|
+
- examples/quick_small.png
|
306
|
+
- examples/quicktable.tex
|
307
|
+
- examples/trades.db
|
308
|
+
- examples/trans.csv
|
300
309
|
- fat_table.gemspec
|
310
|
+
- lib/ext/array.rb
|
301
311
|
- lib/fat_table.rb
|
302
312
|
- lib/fat_table/column.rb
|
313
|
+
- lib/fat_table/convert.rb
|
303
314
|
- lib/fat_table/db_handle.rb
|
304
315
|
- lib/fat_table/errors.rb
|
305
316
|
- lib/fat_table/evaluator.rb
|
317
|
+
- lib/fat_table/footer.rb
|
306
318
|
- lib/fat_table/formatters.rb
|
307
319
|
- lib/fat_table/formatters/aoa_formatter.rb
|
308
320
|
- lib/fat_table/formatters/aoh_formatter.rb
|