fat_table 0.6.0 → 0.6.3
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/.simplecov +18 -0
- data/README.org +71 -5
- data/fat_table.gemspec +0 -1
- data/lib/fat_table/column.rb +6 -1
- data/lib/fat_table/convert.rb +10 -1
- data/lib/fat_table/footer.rb +15 -7
- data/lib/fat_table/table.rb +18 -8
- data/lib/fat_table/version.rb +1 -1
- metadata +3 -16
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9f247f30e6f34d7eb429f43a9375fdd9c61cc2be02fecf35916c896c831966a1
|
|
4
|
+
data.tar.gz: 97932270075de281d3f34414b991795d553ca6fd28f32766bf718942001c8d68
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 951fd4ef3540fc7dacce89f73fa9fad6185e50cff664511b8038633608357dbd70277a464c0cb27a25fbcb801f4ef738a065c66addfa0a11887cec9a0013b9bf
|
|
7
|
+
data.tar.gz: 88d4a6479af8e384ed33d631bfad5085971f53c9a40413f751ae421524dba65552c305a5566ce7a19a19f9f5b35406bdf5ae961ddb4edccd6e7a0784deef60ce
|
data/.simplecov
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# -*- mode: ruby -*-
|
|
2
|
+
|
|
3
|
+
SimpleCov.start do
|
|
4
|
+
# any custom configs like groups and filters can be here at a central place
|
|
5
|
+
add_filter '/spec/'
|
|
6
|
+
add_filter '/tmp/'
|
|
7
|
+
add_group "Models", "lib/fat_table"
|
|
8
|
+
add_group "Core Extension", "lib/ext"
|
|
9
|
+
# After this many seconds between runs, old coverage stats are thrown out,
|
|
10
|
+
# so 3600 => 1 hour
|
|
11
|
+
merge_timeout 3600
|
|
12
|
+
# Make this true to merge rspec and cucumber coverage together
|
|
13
|
+
use_merging false
|
|
14
|
+
command_name 'Rspec'
|
|
15
|
+
nocov_token 'no_cover'
|
|
16
|
+
# Branch coverage
|
|
17
|
+
enable_coverage :branch
|
|
18
|
+
end
|
data/README.org
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#+TITLE: FatTable User Guide
|
|
2
2
|
#+OPTIONS: toc:4
|
|
3
3
|
#+LATEX_HEADER: \usepackage[margin=0.75in]{geometry}
|
|
4
|
+
#+LATEX_HEADER: \usepackage[utf8]{inputenc}
|
|
4
5
|
#+PROPERTY: header-args:ruby :colnames no :session readme :hlines yes :exports both
|
|
5
6
|
#+PROPERTY: header-args:sh :exports code
|
|
6
7
|
#+STARTUP: inlineimages
|
|
@@ -33,7 +34,7 @@ The following is for org.
|
|
|
33
34
|
|
|
34
35
|
#+RESULTS:
|
|
35
36
|
#+begin_EXAMPLE
|
|
36
|
-
Current version is: 0.6.
|
|
37
|
+
Current version is: 0.6.3
|
|
37
38
|
#+end_EXAMPLE
|
|
38
39
|
|
|
39
40
|
* Introduction
|
|
@@ -105,8 +106,9 @@ org-mode buffer as an org-table, ready for processing by other code blocks.
|
|
|
105
106
|
- [[#example-input-tables][Example Input Tables]]
|
|
106
107
|
- [[#select][Select]]
|
|
107
108
|
- [[#selecting-existing-columns-also-of-omni][Selecting Existing Columns (Also of :omni)]]
|
|
108
|
-
- [[#copying-and-renaming-existing-columns][Copying and Renaming Existing Columns]]
|
|
109
|
+
- [[#copying-and-renaming-existing-columns][Copying and Renaming Existing Columns.]]
|
|
109
110
|
- [[#adding-new-columns][Adding New Columns]]
|
|
111
|
+
- [[#adding-constant-strings-and-other-types-in-select][Adding Constant Strings and Other Types in select]]
|
|
110
112
|
- [[#custom-instance-variables-and-hooks][Custom Instance Variables and Hooks]]
|
|
111
113
|
- [[#argument-order-and-boundaries][Argument Order and Boundaries]]
|
|
112
114
|
- [[#where][Where]]
|
|
@@ -531,6 +533,7 @@ each group.
|
|
|
531
533
|
** Constructing Tables
|
|
532
534
|
*** Empty Tables
|
|
533
535
|
**** Without Headers
|
|
536
|
+
|
|
534
537
|
You can create an empty table with ~FatTable::Table.new~ or, the shorter form,
|
|
535
538
|
~FatTable.new~, and then add rows with the ~<<~ operator and a Hash. The keys
|
|
536
539
|
in the added rows determine the names of the headers:
|
|
@@ -586,6 +589,7 @@ for which no key was give are assigned ~nil~ as well:
|
|
|
586
589
|
#+end_EXAMPLE
|
|
587
590
|
|
|
588
591
|
**** With Headers
|
|
592
|
+
|
|
589
593
|
Alternatively, you can specify the headers at the outset, in which case,
|
|
590
594
|
headers in added rows that do not match any of the initial headers cause new
|
|
591
595
|
columns to be created:
|
|
@@ -619,6 +623,7 @@ columns to be created:
|
|
|
619
623
|
#+end_EXAMPLE
|
|
620
624
|
|
|
621
625
|
**** Forcing String Type
|
|
626
|
+
|
|
622
627
|
Occasionally, ~FatTable~'s automatic type detection can get in the way and you
|
|
623
628
|
just want it to treat one or more columns as Strings regardless of their
|
|
624
629
|
appearance. Think, for example, of zip codes. If headers are given when a
|
|
@@ -658,6 +663,7 @@ exisiting items in the column are converted to strings with the #to_s method.
|
|
|
658
663
|
#+end_EXAMPLE
|
|
659
664
|
|
|
660
665
|
**** Designating "Tolerant" Columns
|
|
666
|
+
|
|
661
667
|
Related to the problem just discussed is the problem of reading files in from
|
|
662
668
|
the wild where a column may get typed as, say Numeric, but then contain
|
|
663
669
|
something that can't be parsed as a Numeric. ~FatTable~ raises an exception
|
|
@@ -790,12 +796,13 @@ header row, and the headers are converted to symbols as described above.
|
|
|
790
796
|
|
|
791
797
|
*** From Arrays of Arrays
|
|
792
798
|
**** In Ruby Code
|
|
799
|
+
|
|
793
800
|
You can also initialize a table directly from ruby data structures. You can,
|
|
794
801
|
for example, build a table from an array of arrays. Remember that you can
|
|
795
802
|
make any column tolerant with a ~tolerant_columns:~ keyword argument or make
|
|
796
803
|
them all tolerant by designating the pseudo-column ~:*~ as tolerant.
|
|
797
804
|
|
|
798
|
-
#+BEGIN_SRC ruby
|
|
805
|
+
#+BEGIN_SRC ruby :eval never
|
|
799
806
|
aoa = [
|
|
800
807
|
['Ref', 'Date', 'Code', 'Raw', 'Shares', 'Price', 'Info', 'Bool'],
|
|
801
808
|
[1, '2013-05-02', 'P', 795_546.20, 795_546.2, 1.1850, 'ENTITY1', 'T'],
|
|
@@ -818,11 +825,14 @@ Notice that the values can either be ruby objects, such as the Integer ~85_000~,
|
|
|
818
825
|
or strings that can be parsed into one of the permissible column types.
|
|
819
826
|
|
|
820
827
|
**** In Emacs Org Files
|
|
828
|
+
|
|
821
829
|
This method of building a table, ~.from_aoa~, is particularly useful in dealing
|
|
822
830
|
with Emacs org-mode code blocks. Tables in org-mode are passed to code blocks as
|
|
823
831
|
arrays of arrays. Likewise, a result of a code block in the form of an array of
|
|
824
832
|
arrays is displayed as an org-mode table:
|
|
825
833
|
|
|
834
|
+
#+ATTR_LATEX: :environment footnotesize
|
|
835
|
+
#+ATTR_LATEX: :environment verbatim
|
|
826
836
|
#+BEGIN_EXAMPLE
|
|
827
837
|
#+NAME: trades1
|
|
828
838
|
| Ref | Date | Code | Price | G10 | QP10 | Shares | LP | QP | IPLP | IPQP |
|
|
@@ -985,6 +995,7 @@ keyword argument or make them all tolerant by designating the pseudo-column
|
|
|
985
995
|
|
|
986
996
|
*** Marking Groups in Input
|
|
987
997
|
**** Manually
|
|
998
|
+
|
|
988
999
|
At any point, you can add a boundary to a table by invokong the
|
|
989
1000
|
~mark_boundary~ method. Without an argument, it adds the boundary to the end
|
|
990
1001
|
of the table; with a numeric argument, ~n~, it adds the boundary after row
|
|
@@ -1180,6 +1191,7 @@ table, rearrange their order, and create new columns that are a function of
|
|
|
1180
1191
|
other columns.
|
|
1181
1192
|
|
|
1182
1193
|
**** Selecting Existing Columns (Also of :omni)
|
|
1194
|
+
|
|
1183
1195
|
Here we select three existing columns by simply passing header symbols in the
|
|
1184
1196
|
order we want them to appear in the output. Thus, one use of =select= is to
|
|
1185
1197
|
filter and permute the order of existing columns. The =select= method preserves
|
|
@@ -1256,7 +1268,8 @@ you cannot add additional column names:
|
|
|
1256
1268
|
| T016 | 2016-11-02 | P | 8.25 | T | T | 100 | 14 | 86 | 0.2453 | 0.1924 | 825.0 |
|
|
1257
1269
|
#+end_EXAMPLE
|
|
1258
1270
|
|
|
1259
|
-
**** Copying and Renaming Existing Columns
|
|
1271
|
+
**** Copying and Renaming Existing Columns.
|
|
1272
|
+
|
|
1260
1273
|
After the list of selected column names in the call to ~select~, you can add
|
|
1261
1274
|
any number of hash-like arguments. You can use these to add a copy of an
|
|
1262
1275
|
existing column. By calling select again, you can include only the copied
|
|
@@ -1296,6 +1309,7 @@ changed to ~:id~, just add an argument to define the new ~:id~ column:
|
|
|
1296
1309
|
#+end_EXAMPLE
|
|
1297
1310
|
|
|
1298
1311
|
**** Adding New Columns
|
|
1312
|
+
|
|
1299
1313
|
More interesting is that ~select~ can take hash-like keyword arguments after
|
|
1300
1314
|
the symbol arguments to create new columns in the output as functions of other
|
|
1301
1315
|
columns. For each hash-like parameter, the keyword given must be a symbol,
|
|
@@ -1387,7 +1401,32 @@ second, chained call to ~select~:
|
|
|
1387
1401
|
| T016 | 2016-11-02 | 8.25 | 100 | 825.0 |
|
|
1388
1402
|
#+end_EXAMPLE
|
|
1389
1403
|
|
|
1404
|
+
**** Adding Constant Strings and Other Types in select
|
|
1405
|
+
|
|
1406
|
+
Because ~select~'s hash-like parameters evaluate a string as a ruby
|
|
1407
|
+
expression, as just described, it must provide a way to set a new column to a
|
|
1408
|
+
string literal. To indicate that a string should be inserted literally, add a
|
|
1409
|
+
~:~ as the first non-blank character in the string. This will supress
|
|
1410
|
+
evaluation and insert the remainder of the string in the named column.
|
|
1411
|
+
|
|
1412
|
+
#+BEGIN_SRC ruby :wrap EXAMPLE
|
|
1413
|
+
tab1.select(:ref, :price, :shares, traded_on: :date, cost: ':the price of freedom').
|
|
1414
|
+
select(:ref, :traded_on, :price, :shares, :cost).to_aoa
|
|
1415
|
+
#+END_SRC
|
|
1416
|
+
|
|
1417
|
+
This sets the ~:cost~ column to the string constant 'the price of freedom' for
|
|
1418
|
+
the whole table.
|
|
1419
|
+
|
|
1420
|
+
You can set a column to a constant of any of the acceptable types, ~Numeric~,
|
|
1421
|
+
~Date~, ~DateTime~, true, false, or nil.
|
|
1422
|
+
|
|
1423
|
+
#+BEGIN_SRC ruby :wrap EXAMPLE
|
|
1424
|
+
tab1.select(:ref, :price, :shares, traded_on: :date, cost: Math::PI, today: Date.today).
|
|
1425
|
+
select(:ref, :traded_on, :price, :shares, :cost, :today).to_aoa
|
|
1426
|
+
#+END_SRC
|
|
1427
|
+
|
|
1390
1428
|
**** Custom Instance Variables and Hooks
|
|
1429
|
+
|
|
1391
1430
|
As the above examples demonstrate, the instance variables ~@row~ and ~@group~
|
|
1392
1431
|
are available when evaluating expressions that add new columns. You can also set
|
|
1393
1432
|
up your own instance variables as well for keeping track of things that cross
|
|
@@ -1446,6 +1485,7 @@ of the running cost of shares, then formats the table.
|
|
|
1446
1485
|
#+END_EXAMPLE
|
|
1447
1486
|
|
|
1448
1487
|
**** Argument Order and Boundaries
|
|
1488
|
+
|
|
1449
1489
|
Notice that ~select~ can take any number of arguments but all the symbol
|
|
1450
1490
|
arguments must come first followed by all the hash-like keyword arguments,
|
|
1451
1491
|
including the special arguments for instance variables and hooks.
|
|
@@ -1581,7 +1621,6 @@ row, and the table is sorted as with ~order_by~ on that column.
|
|
|
1581
1621
|
| T013 | 2016-11-02 | P | 7.35 | T | T | 53100 | 7656 | 45444 | 0.2453 | 0.1924 | 390285.0 |
|
|
1582
1622
|
#+end_EXAMPLE
|
|
1583
1623
|
|
|
1584
|
-
|
|
1585
1624
|
*** Group_by
|
|
1586
1625
|
Like ~order_by~, ~group_by~ takes a set of parameters of column header symbols,
|
|
1587
1626
|
the "grouping parameters", by which to sort the table into a set of groups that
|
|
@@ -1669,6 +1708,7 @@ implicit ~order_by~ on the grouping columns is collapsed into a single row.
|
|
|
1669
1708
|
|
|
1670
1709
|
*** Join
|
|
1671
1710
|
**** Join Types
|
|
1711
|
+
|
|
1672
1712
|
So far, all the operations have operated on a single table. ~FatTable~ provides
|
|
1673
1713
|
several ~join~ methods for combining two tables, each of which takes as
|
|
1674
1714
|
parameters (1) a second table and (2) except in the case of ~cross_join~, zero
|
|
@@ -1705,6 +1745,7 @@ for inclusion in the joined output table.
|
|
|
1705
1745
|
M~ rows.
|
|
1706
1746
|
|
|
1707
1747
|
**** Join Expressions
|
|
1748
|
+
|
|
1708
1749
|
For each of the join types, if no join expressions are given, the tables will be
|
|
1709
1750
|
joined on columns having the same column header in both tables, and the join
|
|
1710
1751
|
condition is satisfied when all the values in those columns are equal. If the
|
|
@@ -1732,6 +1773,7 @@ local variables within the expression, but the instance variables ~@row~ and
|
|
|
1732
1773
|
~@group~ are not.
|
|
1733
1774
|
|
|
1734
1775
|
**** Join Examples
|
|
1776
|
+
|
|
1735
1777
|
The following examples are taken from the [[https://www.tutorialspoint.com/postgresql/postgresql_using_joins.htm][Postgresql tutorial]], with some slight
|
|
1736
1778
|
modifications. The examples will use the following two tables, which are also
|
|
1737
1779
|
available in ~ft_console~ as ~@tab_a~ and ~@tab_b~:
|
|
@@ -2008,6 +2050,7 @@ set operations on duplicates and groups.
|
|
|
2008
2050
|
#+END_EXAMPLE
|
|
2009
2051
|
|
|
2010
2052
|
**** Unions
|
|
2053
|
+
|
|
2011
2054
|
Two tables that are set-compatible can be combined with the ~union~ or
|
|
2012
2055
|
~union_all~ methods so that the rows of both tables appear in the output. In the
|
|
2013
2056
|
output table, the headers of the receiver table are used. You can use ~select~
|
|
@@ -2099,6 +2142,7 @@ group boundary between the rows of the two input tables.
|
|
|
2099
2142
|
#+END_EXAMPLE
|
|
2100
2143
|
|
|
2101
2144
|
**** Intersections
|
|
2145
|
+
|
|
2102
2146
|
The ~intersect~ method returns a table having only rows common to both tables,
|
|
2103
2147
|
eliminating any duplicate rows in the result.
|
|
2104
2148
|
|
|
@@ -2160,6 +2204,7 @@ operation matters.
|
|
|
2160
2204
|
#+END_EXAMPLE
|
|
2161
2205
|
|
|
2162
2206
|
**** Set Differences with Except
|
|
2207
|
+
|
|
2163
2208
|
You can use the ~except~ method to delete from a table any rows that occur in
|
|
2164
2209
|
another table, that is, compute the set difference between the tables.
|
|
2165
2210
|
|
|
@@ -2322,6 +2367,7 @@ but ruby data structures, and for them, things such as alignment are irrelevant.
|
|
|
2322
2367
|
|
|
2323
2368
|
*** Available Formatter Output Targets
|
|
2324
2369
|
**** Output Media
|
|
2370
|
+
|
|
2325
2371
|
~FatTable~ supports the following output targets for its tables:
|
|
2326
2372
|
|
|
2327
2373
|
- Text :: form the table with ACSII characters,
|
|
@@ -2342,6 +2388,7 @@ formats can be defined by adding additional classes.
|
|
|
2342
2388
|
|
|
2343
2389
|
**** Examples
|
|
2344
2390
|
***** To Text
|
|
2391
|
+
|
|
2345
2392
|
This formatter uses nothing by ASCII characters to draw the table. Notice
|
|
2346
2393
|
that, unlike to ~to_org~ formatter shown below, the intersections of lines are
|
|
2347
2394
|
represented by a ~+~ character. Embelishments such as color, bold, and so
|
|
@@ -2367,6 +2414,7 @@ forth are ignored.
|
|
|
2367
2414
|
#+END_EXAMPLE
|
|
2368
2415
|
|
|
2369
2416
|
***** To Org
|
|
2417
|
+
|
|
2370
2418
|
This formatter is designed to format tables in a manner consistent with the
|
|
2371
2419
|
way tables are drawn within Emacs Org Mode. It also uses nothing by ASCII
|
|
2372
2420
|
characters to draw the table, but, the intersections of lines are represented
|
|
@@ -2395,6 +2443,7 @@ it may be better to use that formatter as shown below.
|
|
|
2395
2443
|
#+end_EXAMPLE
|
|
2396
2444
|
|
|
2397
2445
|
***** To Term
|
|
2446
|
+
|
|
2398
2447
|
When outputting to a terminal or other device that can interpret ANSI
|
|
2399
2448
|
characters and escape codes, you can use this formatter to get a prettier
|
|
2400
2449
|
table. It also allows embelishments such as color and text styles to the
|
|
@@ -2420,6 +2469,7 @@ extent the device supports it.
|
|
|
2420
2469
|
#+end_EXAMPLE
|
|
2421
2470
|
|
|
2422
2471
|
***** To LaTeX
|
|
2472
|
+
|
|
2423
2473
|
This formatter outputs a table in the form suitable for inclusion in a LaTeX
|
|
2424
2474
|
document using the ~logtable~ package. Natualy it allows embelishments such
|
|
2425
2475
|
as color and text styles to the full extent of LaTeX's formatting prowess.
|
|
@@ -2447,6 +2497,7 @@ Finance&
|
|
|
2447
2497
|
#+end_EXAMPLE
|
|
2448
2498
|
|
|
2449
2499
|
***** To AoA (Array of Arrays)
|
|
2500
|
+
|
|
2450
2501
|
#+begin_SRC ruby :wrap EXAMPLE
|
|
2451
2502
|
tab_b.to_aoa
|
|
2452
2503
|
#+end_SRC
|
|
@@ -2457,6 +2508,7 @@ Finance&
|
|
|
2457
2508
|
#+end_EXAMPLE
|
|
2458
2509
|
|
|
2459
2510
|
***** To AoH (Array of Hashes)
|
|
2511
|
+
|
|
2460
2512
|
#+begin_SRC ruby :wrap EXAMPLE
|
|
2461
2513
|
tab_b.to_aoh
|
|
2462
2514
|
#+end_SRC
|
|
@@ -2477,6 +2529,7 @@ order, so '$R,' and ',$R' are equivalent.
|
|
|
2477
2529
|
Here is a list of all the formatting directives that apply to each cell type:
|
|
2478
2530
|
|
|
2479
2531
|
**** String
|
|
2532
|
+
|
|
2480
2533
|
For a string element, the following instructions are valid. Note that these can
|
|
2481
2534
|
also be applied to all the other cell types as well since they are all converted
|
|
2482
2535
|
to a string in forming the output.
|
|
@@ -2505,6 +2558,7 @@ columns of a given type, it can be countermanded in formatting directives for
|
|
|
2505
2558
|
particular columns.
|
|
2506
2559
|
|
|
2507
2560
|
**** Numeric
|
|
2561
|
+
|
|
2508
2562
|
For a numeric element, all the instructions valid for string are available, in
|
|
2509
2563
|
addition to the following:
|
|
2510
2564
|
|
|
@@ -2523,6 +2577,7 @@ For example, the directive 'R5.0c[blue]' would right-align the numeric
|
|
|
2523
2577
|
element, pad it on the left with zeros, and color it blue.
|
|
2524
2578
|
|
|
2525
2579
|
**** DateTime
|
|
2580
|
+
|
|
2526
2581
|
For a ~DateTime~, all the instructions valid for string are available, in
|
|
2527
2582
|
addition to the following:
|
|
2528
2583
|
|
|
@@ -2538,6 +2593,7 @@ For example, 'c[pink]d[%b %-d, %Y]C', would format a date element like 'Sep
|
|
|
2538
2593
|
22, 1957', center it, and color it pink.
|
|
2539
2594
|
|
|
2540
2595
|
**** Boolean
|
|
2596
|
+
|
|
2541
2597
|
For a boolean cell, all the instructions valid for string are available, in
|
|
2542
2598
|
addition to the following:
|
|
2543
2599
|
|
|
@@ -2555,6 +2611,7 @@ render a true boolean as ~Yeppers~ colored green on pink and render a false
|
|
|
2555
2611
|
boolean as ~Nope~ colored red on pink. See [[https://www.youtube.com/watch?v=oLdFFD8II8U][Yeppers]] for additional information.
|
|
2556
2612
|
|
|
2557
2613
|
**** NilClass
|
|
2614
|
+
|
|
2558
2615
|
By default, ~nil~ elements are rendered as blank cells, but you can make them
|
|
2559
2616
|
visible with the following, and in that case, all the formatting instructions
|
|
2560
2617
|
valid for strings are also available:
|
|
@@ -2565,6 +2622,7 @@ For example, you might want to use 'n[-]Cc[purple]' to make nils visible as a
|
|
|
2565
2622
|
centered purple hyphen.
|
|
2566
2623
|
|
|
2567
2624
|
*** The ~format~ and ~format_for~ methods
|
|
2625
|
+
|
|
2568
2626
|
Formatters take only two kinds of methods, those that attach footers to a
|
|
2569
2627
|
table, which are discussed in the next section, and those that specify
|
|
2570
2628
|
formatting for table cells, which are the subject of this section.
|
|
@@ -2706,6 +2764,7 @@ but not for other nils, such as in the last row of the ~:join_date~ column.
|
|
|
2706
2764
|
|
|
2707
2765
|
*** Footers
|
|
2708
2766
|
**** Adding Footers
|
|
2767
|
+
|
|
2709
2768
|
You can call the ~foot~, ~gfoot~, ~footer,~ or ~gfooter~, methods on
|
|
2710
2769
|
~Formatter~ objects to add footers and group footers. Note that all of these
|
|
2711
2770
|
methods return a ~Footer~ object that can be accessed to extract the computed
|
|
@@ -2763,6 +2822,7 @@ There are also a number of convenience methods for adding common footers:
|
|
|
2763
2822
|
columns with the label 'Group Maximum'.
|
|
2764
2823
|
|
|
2765
2824
|
**** Dynamic Labels
|
|
2825
|
+
|
|
2766
2826
|
Most of the time, you will want a fixed string as the label. However,
|
|
2767
2827
|
especially in the case of a group footer, you might want a dynamically
|
|
2768
2828
|
contructed label. You can use a proc or lambda for a label, and it will be
|
|
@@ -2796,6 +2856,7 @@ This would add the group's year to label, assuming the :date column of the
|
|
|
2796
2856
|
footer's table had the same year for each item in the group.
|
|
2797
2857
|
|
|
2798
2858
|
**** Aggregators
|
|
2859
|
+
|
|
2799
2860
|
When adding a footer with the above methods, you can specify an aggregator for
|
|
2800
2861
|
each column named in the ~agg_cols~ parameter. There are several candidates
|
|
2801
2862
|
for what you can use for an aggregator:
|
|
@@ -2840,6 +2901,7 @@ for what you can use for an aggregator:
|
|
|
2840
2901
|
itself.
|
|
2841
2902
|
|
|
2842
2903
|
**** Footer objects
|
|
2904
|
+
|
|
2843
2905
|
Each of the methods for adding a footer to a ~Formatter~ returns a ~Footer~ object
|
|
2844
2906
|
that you can query for attributes of the generated footer, including accessing
|
|
2845
2907
|
their computed values. Here are the accessors available on a
|
|
@@ -2862,6 +2924,7 @@ their computed values. Here are the accessors available on a
|
|
|
2862
2924
|
~k~ to specify which group to access in the case of a group footer.
|
|
2863
2925
|
|
|
2864
2926
|
**** Footer Examples
|
|
2927
|
+
|
|
2865
2928
|
As a reminder, here is the table, ~tab_a~ defined earlier:
|
|
2866
2929
|
|
|
2867
2930
|
#+BEGIN_SRC ruby :wrap EXAMPLE
|
|
@@ -3116,6 +3179,7 @@ call one of the ~to_xxx~ methods directly on a table, which will yield a
|
|
|
3116
3179
|
convenient way to do it. But there are a few other ways.
|
|
3117
3180
|
|
|
3118
3181
|
**** By Instantiating a Formatter
|
|
3182
|
+
|
|
3119
3183
|
You can instantiate a ~XXXFormatter~ object and feed it a table as a
|
|
3120
3184
|
parameter. There is a Formatter subclass for each target output medium, for
|
|
3121
3185
|
example, ~AoaFormatter~ will produce a ruby array of arrays. You can then call
|
|
@@ -3161,6 +3225,7 @@ you can call methods on it to affect the formatting of the output:
|
|
|
3161
3225
|
#+END_EXAMPLE
|
|
3162
3226
|
|
|
3163
3227
|
**** By Using ~FatTable~ module-level method calls
|
|
3228
|
+
|
|
3164
3229
|
The ~FatTable~ module provides a set of methods of the form ~to_aoa~, ~to_text~,
|
|
3165
3230
|
etc., to access a ~Formatter~ without having to create an instance yourself.
|
|
3166
3231
|
Without a block, they apply the default formatting to the table and call the
|
|
@@ -3207,6 +3272,7 @@ automatically after the block:
|
|
|
3207
3272
|
#+END_EXAMPLE
|
|
3208
3273
|
|
|
3209
3274
|
**** By Calling Methods on Table Objects
|
|
3275
|
+
|
|
3210
3276
|
Finally, as in many of the examples, you can call methods such as ~to_aoa~,
|
|
3211
3277
|
~to_text~, etc., directly on a Table:
|
|
3212
3278
|
|
data/fat_table.gemspec
CHANGED
|
@@ -76,7 +76,6 @@ Gem::Specification.new do |spec|
|
|
|
76
76
|
spec.add_development_dependency 'rubocop-performance'
|
|
77
77
|
spec.add_development_dependency 'simplecov'
|
|
78
78
|
|
|
79
|
-
spec.add_runtime_dependency 'activesupport', '>3.0'
|
|
80
79
|
spec.add_runtime_dependency 'fat_core', '>= 4.9.0'
|
|
81
80
|
spec.add_runtime_dependency 'rainbow'
|
|
82
81
|
spec.add_runtime_dependency 'sequel'
|
data/lib/fat_table/column.rb
CHANGED
|
@@ -173,7 +173,12 @@ module FatTable
|
|
|
173
173
|
# Column. This makes Columns Enumerable, so all the Enumerable methods are
|
|
174
174
|
# available on a Column.
|
|
175
175
|
def each
|
|
176
|
-
|
|
176
|
+
if block_given?
|
|
177
|
+
items.each { |itm| yield itm }
|
|
178
|
+
self
|
|
179
|
+
else
|
|
180
|
+
to_enum(:each)
|
|
181
|
+
end
|
|
177
182
|
end
|
|
178
183
|
|
|
179
184
|
##########################################################################
|
data/lib/fat_table/convert.rb
CHANGED
|
@@ -161,13 +161,22 @@ module FatTable
|
|
|
161
161
|
def self.convert_to_numeric(val)
|
|
162
162
|
return BigDecimal(val, Float::DIG) if val.is_a?(Float)
|
|
163
163
|
return val if val.is_a?(Numeric)
|
|
164
|
+
|
|
164
165
|
# Eliminate any commas, $'s (or other currency symbol), or _'s.
|
|
165
166
|
cursym = Regexp.quote(FatTable.currency_symbol)
|
|
166
167
|
clean_re = /[,_#{cursym}]/
|
|
167
168
|
val = val.to_s.clean.gsub(clean_re, '')
|
|
168
169
|
return nil if val.blank?
|
|
170
|
+
|
|
169
171
|
case val
|
|
170
|
-
when
|
|
172
|
+
when /\A[-+]?\d+\.\z/
|
|
173
|
+
# Catch quirk in Ruby's BigDecimal converter where a number ending in
|
|
174
|
+
# a decimal but with no digits after the decimal throws an
|
|
175
|
+
# ArgumentError as an invalid value for BigDecimal(). Just append a
|
|
176
|
+
# '0'.
|
|
177
|
+
val += '0'
|
|
178
|
+
BigDecimal(val.to_s.clean)
|
|
179
|
+
when /(\A[-+]?\d+\.\d+\z)|(\A[-+]?\d*\.\d+\z)/
|
|
171
180
|
BigDecimal(val.to_s.clean)
|
|
172
181
|
when /\A[-+]?[\d]+\z/
|
|
173
182
|
val.to_i
|
data/lib/fat_table/footer.rb
CHANGED
|
@@ -67,7 +67,7 @@ module FatTable
|
|
|
67
67
|
|
|
68
68
|
# Return the value of the label, for the kth group if grouped.
|
|
69
69
|
def label(k = 0)
|
|
70
|
-
|
|
70
|
+
@values[@label_col][k]
|
|
71
71
|
end
|
|
72
72
|
|
|
73
73
|
# :category: Accessors
|
|
@@ -221,24 +221,32 @@ module FatTable
|
|
|
221
221
|
@values[@label_col] << calc_label(k)
|
|
222
222
|
end
|
|
223
223
|
else
|
|
224
|
-
@values[@label_col] = [calc_label
|
|
224
|
+
@values[@label_col] = [calc_label]
|
|
225
225
|
end
|
|
226
226
|
end
|
|
227
227
|
|
|
228
|
-
# Calculate the label for the kth group, using k =
|
|
228
|
+
# Calculate the label for the kth group, using k = nil for non-group
|
|
229
229
|
# footers. If the label is a proc, call it with the group number.
|
|
230
|
-
def calc_label(k)
|
|
230
|
+
def calc_label(k = nil)
|
|
231
231
|
case @label
|
|
232
232
|
when Proc
|
|
233
233
|
case @label.arity
|
|
234
234
|
when 0
|
|
235
235
|
@label.call
|
|
236
236
|
when 1
|
|
237
|
-
@label.call(k)
|
|
237
|
+
k ? @label.call(k) : @label.call(self)
|
|
238
238
|
when 2
|
|
239
|
-
|
|
239
|
+
if k
|
|
240
|
+
@label.call(k, self)
|
|
241
|
+
else
|
|
242
|
+
raise ArgumentError, "a non-group footer label proc may only have 1 argument for the containing footer f"
|
|
243
|
+
end
|
|
240
244
|
else
|
|
241
|
-
|
|
245
|
+
if k
|
|
246
|
+
raise ArgumentError, "group footer label proc may only have 0, 1, or 2 arguments for group number k and containing footer f"
|
|
247
|
+
else
|
|
248
|
+
raise ArgumentError, "a non-group footer label proc may only have 0 or 1 arguments for the containing footer f"
|
|
249
|
+
end
|
|
242
250
|
end
|
|
243
251
|
else
|
|
244
252
|
@label.to_s
|
data/lib/fat_table/table.rb
CHANGED
|
@@ -530,8 +530,13 @@ module FatTable
|
|
|
530
530
|
|
|
531
531
|
# Yield each row of the table as a Hash with the column symbols as keys.
|
|
532
532
|
def each
|
|
533
|
-
|
|
534
|
-
|
|
533
|
+
if block_given?
|
|
534
|
+
rows.each do |row|
|
|
535
|
+
yield row
|
|
536
|
+
end
|
|
537
|
+
self
|
|
538
|
+
else
|
|
539
|
+
to_enum(:each)
|
|
535
540
|
end
|
|
536
541
|
end
|
|
537
542
|
|
|
@@ -947,20 +952,25 @@ module FatTable
|
|
|
947
952
|
vars = old_row.merge(new_row)
|
|
948
953
|
case expr
|
|
949
954
|
when Symbol
|
|
950
|
-
msg = "
|
|
955
|
+
msg = "select column '#{expr}' does not exist"
|
|
951
956
|
raise UserError, msg unless vars.key?(expr)
|
|
952
957
|
|
|
953
958
|
new_row[key] = vars[expr]
|
|
954
959
|
when String
|
|
955
|
-
|
|
960
|
+
if expr.match?(/\A\s*:/)
|
|
961
|
+
# Leading colon signal a literal string
|
|
962
|
+
new_row[key] = expr.sub(/\A\s*:/, '')
|
|
963
|
+
else
|
|
964
|
+
# Otherwise, evaluate the string.
|
|
965
|
+
new_row[key] = ev.evaluate(expr, locals: vars)
|
|
966
|
+
end
|
|
967
|
+
when Numeric, DateTime, Date, TrueClass, FalseClass
|
|
968
|
+
new_row[key] = expr
|
|
956
969
|
else
|
|
957
|
-
msg = "
|
|
970
|
+
msg = "select can't set column at '#{key}' to '#{expr}' of class #{expr.class}"
|
|
958
971
|
raise UserError, msg
|
|
959
972
|
end
|
|
960
973
|
end
|
|
961
|
-
# Set the group number and run the hook with the local variables set to
|
|
962
|
-
# the row after the new row is evaluated.
|
|
963
|
-
# vars = new_row.merge(__group: grp)
|
|
964
974
|
ev.eval_after_hook(locals: new_row)
|
|
965
975
|
result << new_row
|
|
966
976
|
end
|
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.6.
|
|
4
|
+
version: 0.6.3
|
|
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-
|
|
11
|
+
date: 2022-06-04 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -178,20 +178,6 @@ dependencies:
|
|
|
178
178
|
- - ">="
|
|
179
179
|
- !ruby/object:Gem::Version
|
|
180
180
|
version: '0'
|
|
181
|
-
- !ruby/object:Gem::Dependency
|
|
182
|
-
name: activesupport
|
|
183
|
-
requirement: !ruby/object:Gem::Requirement
|
|
184
|
-
requirements:
|
|
185
|
-
- - ">"
|
|
186
|
-
- !ruby/object:Gem::Version
|
|
187
|
-
version: '3.0'
|
|
188
|
-
type: :runtime
|
|
189
|
-
prerelease: false
|
|
190
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
191
|
-
requirements:
|
|
192
|
-
- - ">"
|
|
193
|
-
- !ruby/object:Gem::Version
|
|
194
|
-
version: '3.0'
|
|
195
181
|
- !ruby/object:Gem::Dependency
|
|
196
182
|
name: fat_core
|
|
197
183
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -287,6 +273,7 @@ files:
|
|
|
287
273
|
- ".gitignore"
|
|
288
274
|
- ".rspec"
|
|
289
275
|
- ".rubocop.yml"
|
|
276
|
+
- ".simplecov"
|
|
290
277
|
- ".travis.yml"
|
|
291
278
|
- ".yardopts"
|
|
292
279
|
- Gemfile
|