fat_table 0.2.6 → 0.2.7

Sign up to get free protection for your applications and to get access to all the features.
data/TODO.org CHANGED
@@ -1,3 +1,10 @@
1
+ * DONE Ensure that columns resulting from aggregates have proper type
2
+ CLOSED: [2017-12-29 Fri 05:34]
3
+ - State "WAIT" from "TODO" [2017-12-29 Fri 05:34]
4
+ - State "TODO" from [2017-11-27 Mon 04:46]
5
+ After applying avg, does the column have the proper Numeric or Date, or DateTime
6
+ type. How about Boolean aggregates?
7
+
1
8
  * TODO Conversion to Spreadsheets
2
9
  - State "TODO" from [2017-04-21 Fri 10:36]
3
10
  This is a [[https://github.com/westonganger/spreadsheet_architect][gem]] that I can include into the Table model to convert a table into
@@ -4,22 +4,23 @@ require 'bundler/setup'
4
4
  require 'fat_table'
5
5
  require 'pry'
6
6
 
7
- @data =
8
- [['Date', 'Code', 'Raw', 'Shares', 'Price', 'Info', 'Ok'],
9
- ['2013-05-29', 'S', 15_700.00, 6601.85, 24.7790, 'ENTITY3', 'F'],
10
- ['2013-05-02', 'P', 118_186.40, 118_186.4, 11.8500, 'ENTITY1', 'T'],
11
- ['2013-05-20', 'S', 12_000.00, 5046.00, 28.2804, 'ENTITY3', 'F'],
12
- ['2013-05-23', 'S', 8000.00, 3364.00, 27.1083, 'ENTITY3', 'T'],
13
- ['2013-05-23', 'S', 39_906.00, 16_780.47, 25.1749, 'ENTITY3', 'T'],
14
- ['2013-05-20', 'S', 85_000.00, 35_742.50, 28.3224, 'ENTITY3', 'T'],
15
- ['2013-05-02', 'P', 795_546.20, 795_546.2, 1.1850, 'ENTITY1', 'T'],
16
- ['2013-05-29', 'S', 13_459.00, 5659.51, 24.7464, 'ENTITY3', 'T'],
17
- ['2013-05-20', 'S', 33_302.00, 14_003.49, 28.6383, 'ENTITY3', 'T'],
18
- ['2013-05-29', 'S', 15_900.00, 6685.95, 24.5802, 'ENTITY3', 'T'],
19
- ['2013-05-30', 'S', 6_679.00, 2808.52, 25.0471, 'ENTITY3', 'T'],
20
- ['2013-05-23', 'S', 23_054.00, 9694.21, 26.8015, 'ENTITY3', 'F']]
7
+ @data = [
8
+ %w[Date Code Raw Shares Price Info Ok],
9
+ ['2013-05-29', 'S', 15_700.00, 6601.85, 24.7790, 'ENTITY3', 'F'],
10
+ ['2013-05-02', 'P', 118_186.40, 118_186.4, 11.8500, 'ENTITY1', 'T'],
11
+ ['2013-05-20', 'S', 12_000.00, 5046.00, 28.2804, 'ENTITY3', 'F'],
12
+ ['2013-05-23', 'S', 8000.00, 3364.00, 27.1083, 'ENTITY3', 'T'],
13
+ ['2013-05-23', 'S', 39_906.00, 16_780.47, 25.1749, 'ENTITY3', 'T'],
14
+ ['2013-05-20', 'S', 85_000.00, 35_742.50, 28.3224, 'ENTITY3', 'T'],
15
+ ['2013-05-02', 'P', 795_546.20, 795_546.2, 1.1850, 'ENTITY1', 'T'],
16
+ ['2013-05-29', 'S', 13_459.00, 5659.51, 24.7464, 'ENTITY3', 'T'],
17
+ ['2013-05-20', 'S', 33_302.00, 14_003.49, 28.6383, 'ENTITY3', 'T'],
18
+ ['2013-05-29', 'S', 15_900.00, 6685.95, 24.5802, 'ENTITY3', 'T'],
19
+ ['2013-05-30', 'S', 6_679.00, 2808.52, 25.0471, 'ENTITY3', 'T'],
20
+ ['2013-05-23', 'S', 23_054.00, 9694.21, 26.8015, 'ENTITY3', 'F']
21
+ ]
21
22
 
22
- @tab_a_str = <<-EOS
23
+ @tab_a_str = <<~TABLE
23
24
  | Id | Name | Age | Address | Salary | Join Date |
24
25
  |----+-------+-----+------------+--------+------------|
25
26
  | 1 | Paul | 32 | California | 20000 | 2001-07-13 |
@@ -30,85 +31,87 @@ require 'pry'
30
31
  | 8 | Paul | 24 | Houston | 20000 | 2005-07-13 |
31
32
  | 9 | James | 44 | Norway | 5000 | 2005-07-13 |
32
33
  | 10 | James | 45 | Texas | 5000 | |
33
- EOS
34
+ TABLE
34
35
 
35
- @tab_b_str = <<-EOS
36
+ @tab_b_str = <<~TABLE
36
37
  | Id | Dept | Emp Id |
37
38
  |----+-------------+--------|
38
39
  | 1 | IT Billing | 1 |
39
40
  | 2 | Engineering | 2 |
40
41
  | 3 | Finance | 7 |
41
- EOS
42
+ TABLE
42
43
 
43
44
  @tab_a = FatTable.from_org_string(@tab_a_str)
44
45
  @tab_b = FatTable.from_org_string(@tab_b_str)
45
46
 
46
- @tab1_str = <<-EOS
47
- | Ref | Date | Code | Price | G10 | QP10 | Shares | LP | QP | IPLP | IPQP |
48
- |------+------------------+------+--------+-----+------+--------+------+-------+--------+--------|
49
- | T001 | [2016-11-01 Tue] | P | 7.7000 | T | F | 100 | 14 | 86 | 0.2453 | 0.1924 |
50
- | T002 | [2016-11-01 Tue] | P | 7.7500 | T | F | 200 | 28 | 172 | 0.2453 | 0.1924 |
51
- | T003 | [2016-11-01 Tue] | P | 7.5000 | F | T | 800 | 112 | 688 | 0.2453 | 0.1924 |
52
- | T003 | [2016-11-01 Tue] | P | 7.5000 | F | T | 800 | 112 | 688 | 0.2453 | 0.1924 |
53
- |------+------------------+------+--------+-----+------+--------+------+-------+--------+--------|
54
- | T004 | [2016-11-01 Tue] | S | 7.5500 | T | F | 6811 | 966 | 5845 | 0.2453 | 0.1924 |
55
- | T005 | [2016-11-01 Tue] | S | 7.5000 | F | F | 4000 | 572 | 3428 | 0.2453 | 0.1924 |
56
- | T006 | [2016-11-01 Tue] | S | 7.6000 | F | T | 1000 | 143 | 857 | 0.2453 | 0.1924 |
57
- | T006 | [2016-11-01 Tue] | S | 7.6000 | F | T | 1000 | 143 | 857 | 0.2453 | 0.1924 |
58
- | T007 | [2016-11-01 Tue] | S | 7.6500 | T | F | 200 | 28 | 172 | 0.2453 | 0.1924 |
59
- | T008 | [2016-11-01 Tue] | P | 7.6500 | F | F | 2771 | 393 | 2378 | 0.2453 | 0.1924 |
60
- | T009 | [2016-11-01 Tue] | P | 7.6000 | F | F | 9550 | 1363 | 8187 | 0.2453 | 0.1924 |
61
- |------+------------------+------+--------+-----+------+--------+------+-------+--------+--------|
62
- | T010 | [2016-11-01 Tue] | P | 7.5500 | F | T | 3175 | 451 | 2724 | 0.2453 | 0.1924 |
63
- | T011 | [2016-11-02 Wed] | P | 7.4250 | T | F | 100 | 14 | 86 | 0.2453 | 0.1924 |
64
- | T012 | [2016-11-02 Wed] | P | 7.5500 | F | F | 4700 | 677 | 4023 | 0.2453 | 0.1924 |
65
- | T012 | [2016-11-02 Wed] | P | 7.5500 | F | F | 4700 | 677 | 4023 | 0.2453 | 0.1924 |
66
- | T013 | [2016-11-02 Wed] | P | 7.3500 | T | T | 53100 | 7656 | 45444 | 0.2453 | 0.1924 |
67
- |------+------------------+------+--------+-----+------+--------+------+-------+--------+--------|
68
- | T014 | [2016-11-02 Wed] | P | 7.4500 | F | T | 5847 | 835 | 5012 | 0.2453 | 0.1924 |
69
- | T015 | [2016-11-02 Wed] | P | 7.7500 | F | F | 500 | 72 | 428 | 0.2453 | 0.1924 |
70
- | T016 | [2016-11-02 Wed] | P | 8.2500 | T | T | 100 | 14 | 86 | 0.2453 | 0.1924 |
71
- EOS
47
+ @tab1_str = <<~TABLE
48
+ | Ref | Date | Code | Price | G10 | QP10 | Shares | LP | QP | IPLP | IPQP |
49
+ |------+------------------+------+--------+-----+------+--------+------+-------+--------+--------|
50
+ | T001 | [2016-11-01 Tue] | P | 7.7000 | T | F | 100 | 14 | 86 | 0.2453 | 0.1924 |
51
+ | T002 | [2016-11-01 Tue] | P | 7.7500 | T | F | 200 | 28 | 172 | 0.2453 | 0.1924 |
52
+ | T003 | [2016-11-01 Tue] | P | 7.5000 | F | T | 800 | 112 | 688 | 0.2453 | 0.1924 |
53
+ | T003 | [2016-11-01 Tue] | P | 7.5000 | F | T | 800 | 112 | 688 | 0.2453 | 0.1924 |
54
+ |------+------------------+------+--------+-----+------+--------+------+-------+--------+--------|
55
+ | T004 | [2016-11-01 Tue] | S | 7.5500 | T | F | 6811 | 966 | 5845 | 0.2453 | 0.1924 |
56
+ | T005 | [2016-11-01 Tue] | S | 7.5000 | F | F | 4000 | 572 | 3428 | 0.2453 | 0.1924 |
57
+ | T006 | [2016-11-01 Tue] | S | 7.6000 | F | T | 1000 | 143 | 857 | 0.2453 | 0.1924 |
58
+ | T006 | [2016-11-01 Tue] | S | 7.6000 | F | T | 1000 | 143 | 857 | 0.2453 | 0.1924 |
59
+ | T007 | [2016-11-01 Tue] | S | 7.6500 | T | F | 200 | 28 | 172 | 0.2453 | 0.1924 |
60
+ | T008 | [2016-11-01 Tue] | P | 7.6500 | F | F | 2771 | 393 | 2378 | 0.2453 | 0.1924 |
61
+ | T009 | [2016-11-01 Tue] | P | 7.6000 | F | F | 9550 | 1363 | 8187 | 0.2453 | 0.1924 |
62
+ |------+------------------+------+--------+-----+------+--------+------+-------+--------+--------|
63
+ | T010 | [2016-11-01 Tue] | P | 7.5500 | F | T | 3175 | 451 | 2724 | 0.2453 | 0.1924 |
64
+ | T011 | [2016-11-02 Wed] | P | 7.4250 | T | F | 100 | 14 | 86 | 0.2453 | 0.1924 |
65
+ | T012 | [2016-11-02 Wed] | P | 7.5500 | F | F | 4700 | 677 | 4023 | 0.2453 | 0.1924 |
66
+ | T012 | [2016-11-02 Wed] | P | 7.5500 | F | F | 4700 | 677 | 4023 | 0.2453 | 0.1924 |
67
+ | T013 | [2016-11-02 Wed] | P | 7.3500 | T | T | 53100 | 7656 | 45444 | 0.2453 | 0.1924 |
68
+ |------+------------------+------+--------+-----+------+--------+------+-------+--------+--------|
69
+ | T014 | [2016-11-02 Wed] | P | 7.4500 | F | T | 5847 | 835 | 5012 | 0.2453 | 0.1924 |
70
+ | T015 | [2016-11-02 Wed] | P | 7.7500 | F | F | 500 | 72 | 428 | 0.2453 | 0.1924 |
71
+ | T016 | [2016-11-02 Wed] | P | 8.2500 | T | T | 100 | 14 | 86 | 0.2453 | 0.1924 |
72
+ TABLE
72
73
 
73
- @tab2_str = <<-EOS
74
- | Ref | Date | Code | Price | G10 | QP10 | Shares | LP | QP | IPLP | IPQP |
75
- |------+------------------+------+--------+-----+------+--------+-------+------+--------+--------|
76
- | T003 | [2016-11-01 Tue] | P | 7.5000 | F | T | 800 | 112 | 688 | 0.2453 | 0.1924 |
77
- | T003 | [2016-11-01 Tue] | P | 7.5000 | F | T | 800 | 112 | 688 | 0.2453 | 0.1924 |
78
- | T017 | [2016-11-01 Tue] | P | 8.3 | F | T | 1801 | 1201 | 600 | 0.2453 | 0.1924 |
79
- |------+------------------+------+--------+-----+------+--------+-------+------+--------+--------|
80
- | T018 | [2016-11-01 Tue] | S | 7.152 | T | F | 2516 | 2400 | 116 | 0.2453 | 0.1924 |
81
- | T018 | [2016-11-01 Tue] | S | 7.152 | T | F | 2516 | 2400 | 116 | 0.2453 | 0.1924 |
82
- | T006 | [2016-11-01 Tue] | S | 7.6000 | F | T | 1000 | 143 | 857 | 0.2453 | 0.1924 |
83
- | T007 | [2016-11-01 Tue] | S | 7.6500 | T | F | 200 | 28 | 172 | 0.2453 | 0.1924 |
84
- |------+------------------+------+--------+-----+------+--------+-------+------+--------+--------|
85
- | T014 | [2016-11-02 Wed] | P | 7.4500 | F | T | 5847 | 835 | 5012 | 0.2453 | 0.1924 |
86
- | T015 | [2016-11-02 Wed] | P | 7.7500 | F | F | 500 | 72 | 428 | 0.2453 | 0.1924 |
87
- | T015 | [2016-11-02 Wed] | P | 7.7500 | F | F | 500 | 72 | 428 | 0.2453 | 0.1924 |
88
- | T016 | [2016-11-02 Wed] | P | 8.2500 | T | T | 100 | 14 | 86 | 0.2453 | 0.1924 |
89
- |------+------------------+------+--------+-----+------+--------+-------+------+--------+--------|
90
- | T019 | [2017-01-15 Sun] | S | 8.75 | T | F | 300 | 175 | 125 | 0.2453 | 0.1924 |
91
- | T020 | [2017-01-19 Thu] | S | 8.25 | F | T | 700 | 615 | 85 | 0.2453 | 0.1924 |
92
- | T021 | [2017-01-23 Mon] | P | 7.16 | T | T | 12100 | 11050 | 1050 | 0.2453 | 0.1924 |
93
- | T021 | [2017-01-23 Mon] | P | 7.16 | T | T | 12100 | 11050 | 1050 | 0.2453 | 0.1924 |
94
- EOS
74
+ @tab2_str = <<~TABLE
75
+ | Ref | Date | Code | Price | G10 | QP10 | Shares | LP | QP | IPLP | IPQP |
76
+ |------+------------------+------+--------+-----+------+--------+-------+------+--------+--------|
77
+ | T003 | [2016-11-01 Tue] | P | 7.5000 | F | T | 800 | 112 | 688 | 0.2453 | 0.1924 |
78
+ | T003 | [2016-11-01 Tue] | P | 7.5000 | F | T | 800 | 112 | 688 | 0.2453 | 0.1924 |
79
+ | T017 | [2016-11-01 Tue] | P | 8.3 | F | T | 1801 | 1201 | 600 | 0.2453 | 0.1924 |
80
+ |------+------------------+------+--------+-----+------+--------+-------+------+--------+--------|
81
+ | T018 | [2016-11-01 Tue] | S | 7.152 | T | F | 2516 | 2400 | 116 | 0.2453 | 0.1924 |
82
+ | T018 | [2016-11-01 Tue] | S | 7.152 | T | F | 2516 | 2400 | 116 | 0.2453 | 0.1924 |
83
+ | T006 | [2016-11-01 Tue] | S | 7.6000 | F | T | 1000 | 143 | 857 | 0.2453 | 0.1924 |
84
+ | T007 | [2016-11-01 Tue] | S | 7.6500 | T | F | 200 | 28 | 172 | 0.2453 | 0.1924 |
85
+ |------+------------------+------+--------+-----+------+--------+-------+------+--------+--------|
86
+ | T014 | [2016-11-02 Wed] | P | 7.4500 | F | T | 5847 | 835 | 5012 | 0.2453 | 0.1924 |
87
+ | T015 | [2016-11-02 Wed] | P | 7.7500 | F | F | 500 | 72 | 428 | 0.2453 | 0.1924 |
88
+ | T015 | [2016-11-02 Wed] | P | 7.7500 | F | F | 500 | 72 | 428 | 0.2453 | 0.1924 |
89
+ | T016 | [2016-11-02 Wed] | P | 8.2500 | T | T | 100 | 14 | 86 | 0.2453 | 0.1924 |
90
+ |------+------------------+------+--------+-----+------+--------+-------+------+--------+--------|
91
+ | T019 | [2017-01-15 Sun] | S | 8.75 | T | F | 300 | 175 | 125 | 0.2453 | 0.1924 |
92
+ | T020 | [2017-01-19 Thu] | S | 8.25 | F | T | 700 | 615 | 85 | 0.2453 | 0.1924 |
93
+ | T021 | [2017-01-23 Mon] | P | 7.16 | T | T | 12100 | 11050 | 1050 | 0.2453 | 0.1924 |
94
+ | T021 | [2017-01-23 Mon] | P | 7.16 | T | T | 12100 | 11050 | 1050 | 0.2453 | 0.1924 |
95
+ TABLE
95
96
 
96
97
  @tab1 = FatTable.from_org_string(@tab1_str)
97
98
  @tab2 = FatTable.from_org_string(@tab2_str)
98
99
 
99
- @aoa = [['Ref', 'Date', 'Code', 'Raw', 'Shares', 'Price', 'Info', 'Bool'],
100
- [1, '2013-05-02', 'P', 795_546.20, 795_546.2, 1.1850, 'YLPEF1', 'T'],
101
- [2, '2013-05-02', 'P', 118_186.40, 118_186.4, 11.8500, 'YLPEF1', 'T'],
102
- [7, '2013-05-20', 'S', 12_000.00, 5046.00, 28.2804, 'YLEAC', 'F'],
103
- [8, '2013-05-20', 'S', 85_000.00, 35_742.50, 28.3224, 'YLEAC', 'T'],
104
- [9, '2013-05-20', 'S', 33_302.00, 14_003.49, 28.6383, 'YLEAC', 'T'],
105
- [10, '2013-05-23', 'S', 8000.00, 3364.00, 27.1083, 'YLEAC', 'T'],
106
- [11, '2013-05-23', 'S', 23_054.00, 9694.21, 26.8015, 'YLEAC', 'F'],
107
- [12, '2013-05-23', 'S', 39_906.00, 16_780.47, 25.1749, 'YLEAC', 'T'],
108
- [13, '2013-05-29', 'S', 13_459.00, 5659.51, 24.7464, 'YLEAC', 'T'],
109
- [14, '2013-05-29', 'S', 15_700.00, 6601.85, 24.7790, 'YLEAC', 'F'],
110
- [15, '2013-05-29', 'S', 15_900.00, 6685.95, 24.5802, 'YLEAC', 'T'],
111
- [16, '2013-05-30', 'S', 6_679.00, 2808.52, 25.0471, 'YLEAC', 'T']]
100
+ @aoa = [
101
+ %w[Ref Date Code Raw Shares Price Info Bool],
102
+ [1, '2013-05-02', 'P', 795_546.20, 795_546.2, 1.1850, 'YLPEF1', 'T'],
103
+ [2, '2013-05-02', 'P', 118_186.40, 118_186.4, 11.8500, 'YLPEF1', 'T'],
104
+ [7, '2013-05-20', 'S', 12_000.00, 5046.00, 28.2804, 'YLEAC', 'F'],
105
+ [8, '2013-05-20', 'S', 85_000.00, 35_742.50, 28.3224, 'YLEAC', 'T'],
106
+ [9, '2013-05-20', 'S', 33_302.00, 14_003.49, 28.6383, 'YLEAC', 'T'],
107
+ [10, '2013-05-23', 'S', 8000.00, 3364.00, 27.1083, 'YLEAC', 'T'],
108
+ [11, '2013-05-23', 'S', 23_054.00, 9694.21, 26.8015, 'YLEAC', 'F'],
109
+ [12, '2013-05-23', 'S', 39_906.00, 16_780.47, 25.1749, 'YLEAC', 'T'],
110
+ [13, '2013-05-29', 'S', 13_459.00, 5659.51, 24.7464, 'YLEAC', 'T'],
111
+ [14, '2013-05-29', 'S', 15_700.00, 6601.85, 24.7790, 'YLEAC', 'F'],
112
+ [15, '2013-05-29', 'S', 15_900.00, 6685.95, 24.5802, 'YLEAC', 'T'],
113
+ [16, '2013-05-30', 'S', 6_679.00, 2808.52, 25.0471, 'YLEAC', 'T']
114
+ ]
112
115
  @tt = FatTable.from_aoa(@aoa)
113
116
 
114
117
  Pry.start
@@ -1,48 +1,50 @@
1
- # coding: utf-8
2
-
3
1
  lib = File.expand_path('../lib', __FILE__)
4
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
3
  require 'fat_table/version'
4
+ require 'fat_table/patches'
6
5
 
7
6
  Gem::Specification.new do |spec|
8
- spec.name = "fat_table"
7
+ spec.name = 'fat_table'
9
8
  spec.version = FatTable::VERSION
10
- spec.authors = ["Daniel E. Doherty"]
11
- spec.email = ["ded-law@ddoherty.net"]
9
+ spec.authors = ['Daniel E. Doherty']
10
+ spec.email = ['ded-law@ddoherty.net']
11
+
12
+ spec.summary = 'Provides tools for working with tables as a data type.'
13
+ spec.description = <<-DESC.strip_heredoc
14
+ FatTable is a gem that treats tables as a data type. It provides methods for
15
+ constructing tables from a variety of sources, building them row-by-row,
16
+ extracting rows, columns, and cells, and performing aggregate operations on
17
+ columns. It also provides as set of SQL-esque methods for manipulating table
18
+ objects: select for filtering by columns or for creating new columns, where
19
+ for filtering by rows, order_by for sorting rows, distinct for eliminating
20
+ duplicate rows, group_by for aggregating multiple rows into single rows and
21
+ applying column aggregate methods to ungrouped columns, a collection of join
22
+ methods for combining tables, and more.
12
23
 
13
- spec.summary = %q{Provides tools for working with tables as a data type.}
14
- spec.description = %q{
15
- FatTable is a gem that treats tables as a data type. It provides methods for
16
- constructing tables from a variety of sources, building them row-by-row,
17
- extracting rows, columns, and cells, and performing aggregate operations on
18
- columns. It also provides as set of SQL-esque methods for manipulating table
19
- objects: select for filtering by columns or for creating new columns, where
20
- for filtering by rows, order_by for sorting rows, distinct for eliminating
21
- duplicate rows, group_by for aggregating multiple rows into single rows and
22
- applying column aggregate methods to ungrouped columns, a collection of join
23
- methods for combining tables, and more.
24
+ Furthermore, FatTable provides methods for formatting tables and producing
25
+ output that targets various output media: text, ANSI terminals, ruby data
26
+ structures, LaTeX tables, Emacs org-mode tables, and more. The formatting
27
+ methods can specify cell formatting in a way that is uniform across all the
28
+ output methods and can also decorate the output with any number of footers,
29
+ including group footers. FatTable applies formatting directives to the extent
30
+ they makes sense for the output medium and treats other formatting directives as
31
+ no-ops.
24
32
 
25
- Furthermore, FatTable provides methods for formatting tables and producing
26
- output that targets various output media: text, ANSI terminals, ruby data
27
- structures, LaTeX tables, Emacs org-mode tables, and more. The formatting
28
- methods can specify cell formatting in a way that is uniform across all the
29
- output methods and can also decorate the output with any number of footers,
30
- including group footers. FatTable applies formatting directives to the extent
31
- they makes sense for the output medium and treats other formatting directives as
32
- no-ops.
33
+ FatTable can be used to perform operations on data that are naturally best
34
+ conceived of as tables, which in my experience is quite often. It can also serve
35
+ as a foundation for providing reporting functions where flexibility about the
36
+ output medium can be quite useful. Finally FatTable can be used within Emacs
37
+ org-mode files in code blocks targeting the Ruby language. Org mode tables are
38
+ presented to a ruby code block as an array of arrays, so FatTable can read
39
+ them in with its .from_aoa constructor. A FatTable table can output as an
40
+ array of arrays with its .to_aoa output function and will be rendered in an
41
+ org-mode buffer as an org-table, ready for processing by other code blocks.
42
+ DESC
33
43
 
34
- FatTable can be used to perform operations on data that are naturally best
35
- conceived of as tables, which in my experience is quite often. It can also serve
36
- as a foundation for providing reporting functions where flexibility about the
37
- output medium can be quite useful. Finally FatTable can be used within Emacs
38
- org-mode files in code blocks targeting the Ruby language. Org mode tables are
39
- presented to a ruby code block as an array of arrays, so FatTable can read
40
- them in with its .from_aoa constructor. A FatTable table can output as an
41
- array of arrays with its .to_aoa output function and will be rendered in an
42
- org-mode buffer as an org-table, ready for processing by other code blocks.
43
- }
44
+ spec.homepage = 'https://github.com/ddoherty03/fat_table'
44
45
 
45
- spec.homepage = 'https://github.com/ddoherty03/fat_table'
46
+ # Use of squiggle heredocs knocks out older versions.
47
+ spec.required_ruby_version = '>= 2.2.2'
46
48
 
47
49
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the
48
50
  # 'allowed_push_host' to allow pushing to a single host or delete this section
@@ -54,7 +56,7 @@ org-mode buffer as an org-table, ready for processing by other code blocks.
54
56
  'public gem pushes.'
55
57
  end
56
58
 
57
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
59
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
58
60
  f.match(%r{^(test|spec|features)/})
59
61
  end
60
62
  spec.bindir = 'bin'
@@ -62,21 +64,21 @@ org-mode buffer as an org-table, ready for processing by other code blocks.
62
64
  spec.require_paths = ['lib']
63
65
  spec.metadata['yard.run'] = 'yri' # use "yard" to build full HTML docs.
64
66
 
65
- spec.add_development_dependency 'simplecov'
66
67
  spec.add_development_dependency 'bundler', '~> 1.14'
67
- spec.add_development_dependency 'rake', '~> 10.0'
68
- spec.add_development_dependency 'rspec', '~> 3.0'
69
68
  spec.add_development_dependency 'byebug'
70
69
  spec.add_development_dependency 'pry'
71
- spec.add_development_dependency 'pry-doc'
72
70
  spec.add_development_dependency 'pry-byebug'
71
+ spec.add_development_dependency 'pry-doc'
72
+ spec.add_development_dependency 'rake', '~> 10.0'
73
73
  spec.add_development_dependency 'redcarpet'
74
+ spec.add_development_dependency 'rspec', '~> 3.0'
75
+ spec.add_development_dependency 'simplecov'
74
76
 
77
+ spec.add_runtime_dependency 'activesupport', '>3.0'
75
78
  spec.add_runtime_dependency 'fat_core', '~> 4.0', '>= 4.1'
76
- spec.add_runtime_dependency 'activesupport'
79
+ spec.add_runtime_dependency 'mysql2'
80
+ spec.add_runtime_dependency 'pg'
77
81
  spec.add_runtime_dependency 'rainbow'
78
82
  spec.add_runtime_dependency 'sequel'
79
- spec.add_runtime_dependency 'pg'
80
83
  spec.add_runtime_dependency 'sqlite3'
81
- spec.add_runtime_dependency 'mysql2'
82
84
  end
@@ -25,7 +25,7 @@ module FatTable
25
25
  require 'fat_table/errors'
26
26
 
27
27
  # Valid output formats as symbols.
28
- FORMATS = [:psv, :aoa, :aoh, :latex, :org, :term, :text].freeze
28
+ FORMATS = %i[psv aoa aoh latex org term text].freeze
29
29
 
30
30
  class << self
31
31
  # Set a default output format to use when FatTable.to_format is invoked.
@@ -28,7 +28,7 @@ module FatTable
28
28
  attr_reader :items
29
29
 
30
30
  # Valid Column types as strings.
31
- TYPES = %w(NilClass Boolean DateTime Numeric String).freeze
31
+ TYPES = %w[NilClass Boolean DateTime Numeric String].freeze
32
32
 
33
33
  # :category: Constructors
34
34
 
@@ -36,8 +36,8 @@ module FatTable
36
36
  # +items+, as an array of either strings or ruby objects that are one of the
37
37
  # permissible types or strings parsable as one of the permissible types. If
38
38
  # no +items+ are passed, returns an empty Column to which items may be added
39
- # with the Column#<< method. The item types must be one of the following types or
40
- # strings parseable as one of them:
39
+ # with the Column#<< method. The item types must be one of the following
40
+ # types or strings parseable as one of them:
41
41
  #
42
42
  # Boolean::
43
43
  # an object of type TrueClass or FalseClass or a string that is either
@@ -48,9 +48,8 @@ module FatTable
48
48
  # an object of class Date, DateTime, or a string that matches
49
49
  # +/\d\d\d\d[-\/]\d\d?[-\/]\d\d?/+ and is parseable by DateTime.parse.
50
50
  #
51
- # Numeric::
52
- # on object that is of class Numeric, or a string that looks
53
- # like a number after removing '+$+', '+,+', and '+_+' as well as Rationals
51
+ # Numeric:: on object that is of class Numeric, or a string that looks like
52
+ # a number after removing '+$+', '+,+', and '+_+' as well as Rationals
54
53
  # in the form /<number>:<number>/ or <number>/<number>, where <number>
55
54
  # is an integer.
56
55
  #
@@ -91,7 +90,8 @@ module FatTable
91
90
  @raw_header.to_s.as_sym
92
91
  end
93
92
  @type = 'NilClass'
94
- raise UserError, "Unknown column type '#{type}" unless TYPES.include?(@type.to_s)
93
+ msg = "unknown column type '#{type}"
94
+ raise UserError, msg unless TYPES.include?(@type.to_s)
95
95
  @items = []
96
96
  items.each { |i| self << i }
97
97
  end
@@ -342,7 +342,8 @@ module FatTable
342
342
 
343
343
  def only_with(agg, *valid_types)
344
344
  return self if valid_types.include?(type)
345
- raise UserError, "Aggregate '#{agg}' cannot be applied to a #{type} column"
345
+ msg = "aggregate '#{agg}' cannot be applied to a #{type} column"
346
+ raise UserError, msg
346
347
  end
347
348
 
348
349
  public
@@ -366,7 +367,8 @@ module FatTable
366
367
  # checking for type compatibility. Use the header of this Column as the
367
368
  # header of the new Column.
368
369
  def +(other)
369
- raise UserError, 'Cannot combine columns with different types' unless type == other.type
370
+ msg = 'cannot combine columns with different types'
371
+ raise UserError, msg unless type == other.type
370
372
  Column.new(header: header, items: items + other.items)
371
373
  end
372
374
 
@@ -401,7 +403,7 @@ module FatTable
401
403
  bool_val
402
404
  end
403
405
  @type =
404
- if new_val == true || new_val == false
406
+ if [true, false].include?(new_val)
405
407
  'Boolean'
406
408
  elsif new_val.is_a?(Date) || new_val.is_a?(DateTime)
407
409
  'DateTime'
@@ -410,17 +412,19 @@ module FatTable
410
412
  elsif new_val.is_a?(String)
411
413
  'String'
412
414
  else
413
- raise UserError, "Cannot add #{val} of type #{new_val.class.name} to a column"
415
+ msg = "can't add #{val} of type #{new_val.class.name} to a column"
416
+ raise UserError, msg
414
417
  end
415
418
  end
416
419
  new_val
417
420
  when 'Boolean'
418
- if (val.is_a?(String) && val.blank? || val.nil?)
421
+ if val.is_a?(String) && val.blank? || val.nil?
419
422
  nil
420
423
  else
421
424
  new_val = convert_to_boolean(val)
422
425
  if new_val.nil?
423
- raise UserError, "Attempt to add '#{val}' to a column already typed as #{type}"
426
+ msg = "attempt to add '#{val}' to a column already typed as #{type}"
427
+ raise UserError, msg
424
428
  end
425
429
  new_val
426
430
  end
@@ -430,7 +434,8 @@ module FatTable
430
434
  else
431
435
  new_val = convert_to_date_time(val)
432
436
  if new_val.nil?
433
- raise UserError, "Attempt to add '#{val}' to a column already typed as #{type}"
437
+ msg = "attempt to add '#{val}' to a column already typed as #{type}"
438
+ raise UserError, msg
434
439
  end
435
440
  new_val
436
441
  end
@@ -440,7 +445,8 @@ module FatTable
440
445
  else
441
446
  new_val = convert_to_numeric(val)
442
447
  if new_val.nil?
443
- raise UserError, "Attempt to add '#{val}' to a column already typed as #{type}"
448
+ msg = "attempt to add '#{val}' to a column already typed as #{type}"
449
+ raise UserError, msg
444
450
  end
445
451
  new_val
446
452
  end
@@ -450,7 +456,8 @@ module FatTable
450
456
  else
451
457
  new_val = convert_to_string(val)
452
458
  if new_val.nil?
453
- raise UserError, "Attempt to add '#{val}' to a column already typed as #{type}"
459
+ msg = "attempt to add '#{val}' to a column already typed as #{type}"
460
+ raise UserError, msg
454
461
  end
455
462
  new_val
456
463
  end
@@ -466,15 +473,17 @@ module FatTable
466
473
  return val if val.is_a?(TrueClass) || val.is_a?(FalseClass)
467
474
  val = val.to_s.clean
468
475
  return nil if val.blank?
469
- if val =~ /\A(false|f|n|no)\z/i
476
+ if val.match?(/\A(false|f|n|no)\z/i)
470
477
  false
471
- elsif val =~ /\A(true|t|y|yes)\z/i
478
+ elsif val.match?(/\A(true|t|y|yes)\z/i)
472
479
  true
473
480
  end
474
481
  end
475
482
 
476
- IS0_DATE_RE = %r{\b(\d\d\d\d)[-/](\d\d?)[-/](\d\d?)\s*(T\d\d:\d\d:\d\d(\+\d\d:\d\d)?)?\b}
477
- AMR_DATE_RE = %r{\b(\d\d?)[-/](\d\d?)[-/](\d\d\d\d)\s*(T\d\d:\d\d:\d\d(\+\d\d:\d\d)?)?\b}
483
+ IS0_DATE_RE = %r{\b(\d\d\d\d)[-/](\d\d?)[-/](\d\d?)\s*
484
+ (T\d\d:\d\d:\d\d(\+\d\d:\d\d)?)?\b}x
485
+ AMR_DATE_RE = %r{\b(\d\d?)[-/](\d\d?)[-/](\d\d\d\d)\s*
486
+ (T\d\d:\d\d:\d\d(\+\d\d:\d\d)?)?\b}x
478
487
 
479
488
  # Convert the val to a DateTime if it is either a DateTime, a Date, or a
480
489
  # String that can be parsed as a DateTime, otherwise return nil. It only
@@ -488,7 +497,7 @@ module FatTable
488
497
  begin
489
498
  val = val.to_s.clean
490
499
  return nil if val.blank?
491
- if val =~ IS0_DATE_RE
500
+ if val.match?(IS0_DATE_RE)
492
501
  val = DateTime.parse(val)
493
502
  elsif val =~ AMR_DATE_RE
494
503
  val = DateTime.new($3.to_i, $1.to_i, $2.to_i)
@@ -502,7 +511,7 @@ module FatTable
502
511
  end
503
512
  end
504
513
 
505
- # Convert the val to a Numeric if is already a Numberic or is a String that
514
+ # Convert the val to a Numeric if is already a Numeric or is a String that
506
515
  # looks like one. Any Float is promoted to a BigDecimal. Otherwise return
507
516
  # nil.
508
517
  def convert_to_numeric(val)