fat_table 0.5.3 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.org +136 -67
- data/TODO.org +28 -1
- data/lib/ext/array.rb +17 -0
- data/lib/fat_table/column.rb +94 -56
- data/lib/fat_table/convert.rb +18 -9
- data/lib/fat_table/evaluator.rb +6 -8
- data/lib/fat_table/footer.rb +73 -33
- data/lib/fat_table/formatters/formatter.rb +153 -31
- data/lib/fat_table/formatters/org_formatter.rb +3 -3
- data/lib/fat_table/formatters/term_formatter.rb +3 -3
- data/lib/fat_table/formatters/text_formatter.rb +3 -3
- data/lib/fat_table/table.rb +12 -5
- data/lib/fat_table/version.rb +1 -1
- metadata +5 -5
data/lib/fat_table/column.rb
CHANGED
@@ -191,12 +191,15 @@ module FatTable
|
|
191
191
|
|
192
192
|
# :category: Aggregates
|
193
193
|
|
194
|
-
# Return the first non-nil item in the Column
|
194
|
+
# Return the first non-nil item in the Column, or nil if all items are
|
195
|
+
# nil. Works with any Column type.
|
195
196
|
def first
|
197
|
+
return nil if items.all?(&:nil?)
|
198
|
+
|
196
199
|
if type == 'String'
|
197
200
|
items.reject(&:blank?).first
|
198
201
|
else
|
199
|
-
items.
|
202
|
+
items.filter_to_type(type).first
|
200
203
|
end
|
201
204
|
end
|
202
205
|
|
@@ -204,83 +207,94 @@ module FatTable
|
|
204
207
|
|
205
208
|
# Return the last non-nil item in the Column. Works with any Column type.
|
206
209
|
def last
|
210
|
+
return nil if items.all?(&:nil?)
|
211
|
+
|
207
212
|
if type == 'String'
|
208
213
|
items.reject(&:blank?).last
|
209
214
|
else
|
210
|
-
items.
|
215
|
+
items.filter_to_type(type).last
|
211
216
|
end
|
212
217
|
end
|
213
218
|
|
214
219
|
# :category: Aggregates
|
215
220
|
|
216
|
-
# Return a count of the non-nil items in the Column
|
217
|
-
# type.
|
221
|
+
# Return a count of the non-nil items in the Column, or the size of the
|
222
|
+
# column if all items are nil. Works with any Column type.
|
218
223
|
def count
|
224
|
+
return items.size if items.all?(&:nil?)
|
225
|
+
|
219
226
|
if type == 'String'
|
220
227
|
items.reject(&:blank?).count.to_d
|
221
228
|
else
|
222
|
-
items.
|
229
|
+
items.filter_to_type(type).count.to_d
|
223
230
|
end
|
224
231
|
end
|
225
232
|
|
226
233
|
# :category: Aggregates
|
227
234
|
|
228
|
-
# Return the smallest non-nil, non-blank item in the Column
|
229
|
-
# numeric, string, and datetime Columns.
|
235
|
+
# Return the smallest non-nil, non-blank item in the Column, or nil if all
|
236
|
+
# items are nil. Works with numeric, string, and datetime Columns.
|
230
237
|
def min
|
231
238
|
only_with('min', 'NilClass', 'Numeric', 'String', 'DateTime')
|
232
239
|
if type == 'String'
|
233
240
|
items.reject(&:blank?).min
|
234
241
|
else
|
235
|
-
items.
|
242
|
+
items.filter_to_type(type).min
|
236
243
|
end
|
237
244
|
end
|
238
245
|
|
239
246
|
# :category: Aggregates
|
240
247
|
|
241
|
-
# Return the largest non-nil, non-blank item in the Column
|
242
|
-
# numeric, string, and datetime Columns.
|
248
|
+
# Return the largest non-nil, non-blank item in the Column, or nil if all
|
249
|
+
# items are nil. Works with numeric, string, and datetime Columns.
|
243
250
|
def max
|
244
251
|
only_with('max', 'NilClass', 'Numeric', 'String', 'DateTime')
|
245
252
|
if type == 'String'
|
246
253
|
items.reject(&:blank?).max
|
247
254
|
else
|
248
|
-
items.
|
255
|
+
items.filter_to_type(type).max
|
249
256
|
end
|
250
257
|
end
|
251
258
|
|
252
259
|
# :category: Aggregates
|
253
260
|
|
254
|
-
# Return a Range object for the smallest to largest value in the column
|
255
|
-
# Works with numeric, string, and datetime
|
261
|
+
# Return a Range object for the smallest to largest value in the column,
|
262
|
+
# or nil if all items are nil. Works with numeric, string, and datetime
|
263
|
+
# Columns.
|
256
264
|
def range
|
257
265
|
only_with('range', 'NilClass', 'Numeric', 'String', 'DateTime')
|
266
|
+
return nil if items.all?(&:nil?)
|
267
|
+
|
258
268
|
Range.new(min, max)
|
259
269
|
end
|
260
270
|
|
261
271
|
# :category: Aggregates
|
262
272
|
|
263
|
-
# Return the sum of the non-nil items in the Column
|
264
|
-
# string Columns. For a string Column, it
|
265
|
-
# the non-nil items.
|
273
|
+
# Return the sum of the non-nil items in the Column, or 0 if all items are
|
274
|
+
# nil. Works with numeric and string Columns. For a string Column, it
|
275
|
+
# will return the concatenation of the non-nil items.
|
266
276
|
def sum
|
277
|
+
return 0 if type == 'NilClass' || items.all?(&:nil?)
|
278
|
+
|
267
279
|
only_with('sum', 'Numeric', 'String')
|
268
280
|
if type == 'String'
|
269
281
|
items.reject(&:blank?).join(' ')
|
270
282
|
else
|
271
|
-
items.
|
283
|
+
items.filter_to_type(type).sum
|
272
284
|
end
|
273
285
|
end
|
274
286
|
|
275
287
|
# :category: Aggregates
|
276
288
|
|
277
|
-
# Return the average value of the non-nil items in the Column
|
278
|
-
# numeric and datetime Columns. For datetime
|
279
|
-
# to its Julian day number, computes the
|
280
|
-
# average back to a DateTime.
|
289
|
+
# Return the average value of the non-nil items in the Column, or 0 if all
|
290
|
+
# items are nil. Works with numeric and datetime Columns. For datetime
|
291
|
+
# Columns, it converts each date to its Julian day number, computes the
|
292
|
+
# average, and then converts the average back to a DateTime.
|
281
293
|
def avg
|
294
|
+
return 0 if type == 'NilClass' || items.all?(&:nil?)
|
295
|
+
|
282
296
|
only_with('avg', 'DateTime', 'Numeric')
|
283
|
-
itms = items.
|
297
|
+
itms = items.filter_to_type(type)
|
284
298
|
size = itms.size.to_d
|
285
299
|
if type == 'DateTime'
|
286
300
|
avg_jd = itms.map(&:jd).sum / size
|
@@ -293,17 +307,20 @@ module FatTable
|
|
293
307
|
# :category: Aggregates
|
294
308
|
|
295
309
|
# Return the sample variance (the unbiased estimator of the population
|
296
|
-
# variance using a divisor of N-1) as the average squared deviation from
|
297
|
-
# mean, of the non-nil items in the Column
|
298
|
-
# Columns. For datetime Columns, it
|
299
|
-
# number and computes the variance of
|
310
|
+
# variance using a divisor of N-1) as the average squared deviation from
|
311
|
+
# the mean, of the non-nil items in the Column, or 0 if all items are
|
312
|
+
# nil. Works with numeric and datetime Columns. For datetime Columns, it
|
313
|
+
# converts each date to its Julian day number and computes the variance of
|
314
|
+
# those numbers.
|
300
315
|
def var
|
316
|
+
return 0 if type == 'NilClass' || items.all?(&:nil?)
|
317
|
+
|
301
318
|
only_with('var', 'DateTime', 'Numeric')
|
302
319
|
all_items =
|
303
320
|
if type == 'DateTime'
|
304
|
-
items.
|
321
|
+
items.filter_to_type(type).map(&:jd)
|
305
322
|
else
|
306
|
-
items.
|
323
|
+
items.filter_to_type(type)
|
307
324
|
end
|
308
325
|
n = count
|
309
326
|
return BigDecimal('0.0') if n <= 1
|
@@ -319,12 +336,15 @@ module FatTable
|
|
319
336
|
|
320
337
|
# Return the population variance (the biased estimator of the population
|
321
338
|
# variance using a divisor of N) as the average squared deviation from the
|
322
|
-
# mean, of the non-nil items in the Column
|
323
|
-
# Columns. For datetime Columns, it
|
324
|
-
# number and computes the variance of
|
339
|
+
# mean, of the non-nil items in the Column, or 0 if all items are
|
340
|
+
# nil. Works with numeric and datetime Columns. For datetime Columns, it
|
341
|
+
# converts each date to its Julian day number and computes the variance of
|
342
|
+
# those numbers.
|
325
343
|
def pvar
|
344
|
+
return 0 if type == 'NilClass' || items.all?(&:nil?)
|
345
|
+
|
326
346
|
only_with('var', 'DateTime', 'Numeric')
|
327
|
-
n = items.
|
347
|
+
n = items.filter_to_type(type).size.to_d
|
328
348
|
return BigDecimal('0.0') if n <= 1
|
329
349
|
var * ((n - 1) / n)
|
330
350
|
end
|
@@ -333,11 +353,13 @@ module FatTable
|
|
333
353
|
|
334
354
|
# Return the sample standard deviation (the unbiased estimator of the
|
335
355
|
# population standard deviation using a divisor of N-1) as the square root
|
336
|
-
# of the sample variance, of the non-nil items in the Column
|
337
|
-
# numeric and datetime Columns. For datetime
|
338
|
-
# to its Julian day number and computes the
|
339
|
-
# numbers.
|
356
|
+
# of the sample variance, of the non-nil items in the Column, or 0 if all
|
357
|
+
# items are nil. Works with numeric and datetime Columns. For datetime
|
358
|
+
# Columns, it converts each date to its Julian day number and computes the
|
359
|
+
# standard deviation of those numbers.
|
340
360
|
def dev
|
361
|
+
return 0 if type == 'NilClass' || items.all?(&:nil?)
|
362
|
+
|
341
363
|
only_with('dev', 'DateTime', 'Numeric')
|
342
364
|
var.sqrt(20)
|
343
365
|
end
|
@@ -345,12 +367,14 @@ module FatTable
|
|
345
367
|
# :category: Aggregates
|
346
368
|
|
347
369
|
# Return the population standard deviation (the biased estimator of the
|
348
|
-
# population standard deviation using a divisor of N) as the square root
|
349
|
-
# the population variance, of the non-nil items in the Column
|
350
|
-
# numeric and datetime Columns. For datetime
|
351
|
-
# to its Julian day number and computes the
|
352
|
-
# numbers.
|
370
|
+
# population standard deviation using a divisor of N) as the square root
|
371
|
+
# of the population variance, of the non-nil items in the Column, or 0 if
|
372
|
+
# all items are nil. Works with numeric and datetime Columns. For datetime
|
373
|
+
# Columns, it converts each date to its Julian day number and computes the
|
374
|
+
# standard deviation of those numbers.
|
353
375
|
def pdev
|
376
|
+
return 0 if type == 'NilClass' || items.all?(&:nil?)
|
377
|
+
|
354
378
|
only_with('dev', 'DateTime', 'Numeric')
|
355
379
|
Math.sqrt(pvar)
|
356
380
|
end
|
@@ -358,28 +382,35 @@ module FatTable
|
|
358
382
|
# :category: Aggregates
|
359
383
|
|
360
384
|
# Return true if any of the items in the Column are true; otherwise return
|
361
|
-
# false. Works only with boolean Columns.
|
385
|
+
# false, or false if all items are nil. Works only with boolean Columns.
|
362
386
|
def any?
|
387
|
+
return false if type == 'NilClass' || items.all?(&:nil?)
|
388
|
+
|
363
389
|
only_with('any?', 'Boolean')
|
364
|
-
items.
|
390
|
+
items.filter_to_type(type).any?
|
365
391
|
end
|
366
392
|
|
367
393
|
# :category: Aggregates
|
368
394
|
|
369
395
|
# Return true if all of the items in the Column are true; otherwise return
|
370
|
-
# false. Works only with boolean Columns.
|
396
|
+
# false, or false if all items are nil. Works only with boolean Columns.
|
371
397
|
def all?
|
398
|
+
return false if type == 'NilClass' || items.all?(&:nil?)
|
399
|
+
|
372
400
|
only_with('all?', 'Boolean')
|
373
|
-
items.
|
401
|
+
items.filter_to_type(type).all?
|
374
402
|
end
|
375
403
|
|
376
404
|
# :category: Aggregates
|
377
405
|
|
378
|
-
# Return true if none of the items in the Column are true; otherwise
|
379
|
-
# false. Works only with boolean
|
406
|
+
# Return true if none of the items in the Column are true; otherwise
|
407
|
+
# return false, or true if all items are nil. Works only with boolean
|
408
|
+
# Columns.
|
380
409
|
def none?
|
410
|
+
return true if type == 'NilClass' || items.all?(&:nil?)
|
411
|
+
|
381
412
|
only_with('none?', 'Boolean')
|
382
|
-
items.
|
413
|
+
items.filter_to_type(type).none?
|
383
414
|
end
|
384
415
|
|
385
416
|
# :category: Aggregates
|
@@ -387,14 +418,17 @@ module FatTable
|
|
387
418
|
# Return true if precisely one of the items in the Column is true;
|
388
419
|
# otherwise return false. Works only with boolean Columns.
|
389
420
|
def one?
|
421
|
+
return false if type == 'NilClass' || items.all?(&:nil?)
|
422
|
+
|
390
423
|
only_with('one?', 'Boolean')
|
391
|
-
items.
|
424
|
+
items.filter_to_type(type).one?
|
392
425
|
end
|
393
426
|
|
394
427
|
private
|
395
428
|
|
396
429
|
def only_with(agg, *valid_types)
|
397
430
|
return self if valid_types.include?(type)
|
431
|
+
|
398
432
|
msg = "aggregate '#{agg}' cannot be applied to a #{type} column"
|
399
433
|
raise UserError, msg
|
400
434
|
end
|
@@ -413,11 +447,10 @@ module FatTable
|
|
413
447
|
# a tolerant column, respond to type errors by converting the column to a
|
414
448
|
# String type.
|
415
449
|
def <<(itm)
|
416
|
-
items <<
|
450
|
+
items << convert_and_set_type(itm)
|
417
451
|
rescue IncompatibleTypeError => ex
|
418
452
|
if tolerant?
|
419
|
-
|
420
|
-
retry
|
453
|
+
items << Convert.convert_to_string(itm)
|
421
454
|
else
|
422
455
|
raise ex
|
423
456
|
end
|
@@ -436,9 +469,14 @@ module FatTable
|
|
436
469
|
|
437
470
|
private
|
438
471
|
|
439
|
-
def
|
440
|
-
|
441
|
-
|
472
|
+
def convert_and_set_type(val)
|
473
|
+
begin
|
474
|
+
new_val = Convert.convert_to_type(val, type, tolerant: tolerant?)
|
475
|
+
rescue IncompatibleTypeError
|
476
|
+
err_msg = "attempt to add '#{val}' to column '#{header}' already typed as #{type}"
|
477
|
+
raise IncompatibleTypeError, err_msg
|
478
|
+
end
|
479
|
+
if new_val && (type == 'NilClass' || type == 'String')
|
442
480
|
@type =
|
443
481
|
if [true, false].include?(new_val)
|
444
482
|
'Boolean'
|
data/lib/fat_table/convert.rb
CHANGED
@@ -10,7 +10,7 @@ module FatTable
|
|
10
10
|
# determined, raise an error if the val cannot be converted to the Column
|
11
11
|
# type. Otherwise, returns the converted val as an object of the correct
|
12
12
|
# class.
|
13
|
-
def self.convert_to_type(val, type)
|
13
|
+
def self.convert_to_type(val, type, tolerant: false)
|
14
14
|
case type
|
15
15
|
when 'NilClass'
|
16
16
|
if val != false && val.blank?
|
@@ -36,8 +36,7 @@ module FatTable
|
|
36
36
|
else
|
37
37
|
new_val = convert_to_boolean(val)
|
38
38
|
if new_val.nil?
|
39
|
-
|
40
|
-
raise IncompatibleTypeError, msg
|
39
|
+
raise IncompatibleTypeError
|
41
40
|
end
|
42
41
|
new_val
|
43
42
|
end
|
@@ -47,8 +46,7 @@ module FatTable
|
|
47
46
|
else
|
48
47
|
new_val = convert_to_date_time(val)
|
49
48
|
if new_val.nil?
|
50
|
-
|
51
|
-
raise IncompatibleTypeError, msg
|
49
|
+
raise IncompatibleTypeError
|
52
50
|
end
|
53
51
|
new_val
|
54
52
|
end
|
@@ -58,19 +56,30 @@ module FatTable
|
|
58
56
|
else
|
59
57
|
new_val = convert_to_numeric(val)
|
60
58
|
if new_val.nil?
|
61
|
-
|
62
|
-
raise IncompatibleTypeError, msg
|
59
|
+
raise IncompatibleTypeError
|
63
60
|
end
|
64
61
|
new_val
|
65
62
|
end
|
66
63
|
when 'String'
|
67
64
|
if val.nil?
|
68
65
|
nil
|
66
|
+
elsif tolerant
|
67
|
+
# Allow String to upgrade to one of Numeric, DateTime, or Boolean if
|
68
|
+
# possible.
|
69
|
+
if (new_val = convert_to_numeric(val))
|
70
|
+
new_val
|
71
|
+
elsif (new_val = convert_to_date_time(val))
|
72
|
+
new_val
|
73
|
+
elsif (new_val = convert_to_boolean(val))
|
74
|
+
new_val
|
75
|
+
else
|
76
|
+
new_val = convert_to_string(val)
|
77
|
+
end
|
78
|
+
new_val
|
69
79
|
else
|
70
80
|
new_val = convert_to_string(val)
|
71
81
|
if new_val.nil?
|
72
|
-
|
73
|
-
raise IncompatibleTypeError, msg
|
82
|
+
raise IncompatibleTypeError
|
74
83
|
end
|
75
84
|
new_val
|
76
85
|
end
|
data/lib/fat_table/evaluator.rb
CHANGED
@@ -45,17 +45,15 @@ module FatTable
|
|
45
45
|
end
|
46
46
|
|
47
47
|
# Return the result of evaluating +expr+ as a Ruby expression in which the
|
48
|
-
# instance variables set in Evaluator.new and any local variables set in
|
49
|
-
# Hash parameter +locals+ are available to the expression.
|
48
|
+
# instance variables set in Evaluator.new and any local variables set in
|
49
|
+
# the Hash parameter +locals+ are available to the expression. Certain
|
50
|
+
# errors simply return nil as the result. This can happen, for example,
|
51
|
+
# when a string gets into an otherwise numeric column because the column
|
52
|
+
# is set to tolerant.
|
50
53
|
def evaluate(expr = '', locals: {})
|
51
54
|
eval(expr, local_vars(binding, locals))
|
52
55
|
rescue NoMethodError, TypeError => ex
|
53
|
-
|
54
|
-
# Likely one of the locals was nil, so let nil be the result.
|
55
|
-
return nil
|
56
|
-
else
|
57
|
-
raise ex
|
58
|
-
end
|
56
|
+
nil
|
59
57
|
end
|
60
58
|
|
61
59
|
private
|
data/lib/fat_table/footer.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module FatTable
|
4
4
|
class Footer
|
5
|
-
attr_reader :table, :
|
5
|
+
attr_reader :table, :label_col, :values, :group
|
6
6
|
|
7
7
|
###########################################################################
|
8
8
|
# Constructors
|
@@ -15,6 +15,7 @@ module FatTable
|
|
15
15
|
# for the footer are added later with the #add_value method.
|
16
16
|
def initialize(label = 'Total', table, label_col: nil, group: false)
|
17
17
|
@label = label
|
18
|
+
|
18
19
|
unless table.is_a?(Table)
|
19
20
|
raise ArgumentError, 'Footer.new needs a table argument'
|
20
21
|
end
|
@@ -30,14 +31,7 @@ module FatTable
|
|
30
31
|
@group = group
|
31
32
|
@group_cols = {}
|
32
33
|
@values = {}
|
33
|
-
|
34
|
-
@values[@label_col] = []
|
35
|
-
table.number_of_groups.times do
|
36
|
-
@values[@label_col] << @label
|
37
|
-
end
|
38
|
-
else
|
39
|
-
@values[@label_col] = [@label]
|
40
|
-
end
|
34
|
+
insert_labels_in_label_col
|
41
35
|
make_accessor_methods
|
42
36
|
end
|
43
37
|
|
@@ -71,6 +65,11 @@ module FatTable
|
|
71
65
|
end
|
72
66
|
end
|
73
67
|
|
68
|
+
# Return the value of the label, for the kth group if grouped.
|
69
|
+
def label(k = 0)
|
70
|
+
calc_label(k)
|
71
|
+
end
|
72
|
+
|
74
73
|
# :category: Accessors
|
75
74
|
|
76
75
|
# Return the value of under the +key+ header, or if this is a group
|
@@ -108,8 +107,10 @@ module FatTable
|
|
108
107
|
if group && k.nil?
|
109
108
|
raise ArgumentError, 'Footer#column(h, k) missing the group number argument k'
|
110
109
|
end
|
110
|
+
|
111
111
|
if group
|
112
|
-
|
112
|
+
@group_cols[h] ||= table.group_cols(h)
|
113
|
+
@group_cols[h][k]
|
113
114
|
else
|
114
115
|
table.column(h)
|
115
116
|
end
|
@@ -151,14 +152,13 @@ module FatTable
|
|
151
152
|
|
152
153
|
# Evaluate the given agg for the header col and, in the case of a group
|
153
154
|
# footer, the group k.
|
154
|
-
def calc_val(agg,
|
155
|
-
column =
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
end
|
155
|
+
def calc_val(agg, h, k = nil)
|
156
|
+
column = column(h, k)
|
157
|
+
|
158
|
+
# Convert Date and Time objects to DateTime
|
159
|
+
if [Date, Time].include?(agg.class)
|
160
|
+
agg = agg.to_datetime
|
161
|
+
end
|
162
162
|
|
163
163
|
case agg
|
164
164
|
when Symbol
|
@@ -166,7 +166,7 @@ module FatTable
|
|
166
166
|
when String
|
167
167
|
begin
|
168
168
|
converted_val = Convert.convert_to_type(agg, column.type)
|
169
|
-
rescue UserError
|
169
|
+
rescue UserError, IncompatibleTypeError
|
170
170
|
converted_val = false
|
171
171
|
end
|
172
172
|
if converted_val
|
@@ -179,29 +179,69 @@ module FatTable
|
|
179
179
|
when Proc
|
180
180
|
result =
|
181
181
|
if group
|
182
|
-
|
183
|
-
|
182
|
+
case agg.arity
|
183
|
+
when 0
|
184
|
+
agg.call
|
185
|
+
when 1
|
186
|
+
agg.call(k)
|
187
|
+
when 2
|
188
|
+
agg.call(k, column)
|
189
|
+
when 3
|
190
|
+
agg.call(k, column, self)
|
191
|
+
else
|
192
|
+
msg = 'a lambda used in a group footer may have 0 to 3 three arguments: (k, c, f)'
|
184
193
|
raise ArgumentError, msg
|
185
194
|
end
|
186
|
-
agg.call(self, col, k)
|
187
195
|
else
|
188
|
-
|
189
|
-
|
196
|
+
case agg.arity
|
197
|
+
when 0
|
198
|
+
agg.call
|
199
|
+
when 1
|
200
|
+
agg.call(column)
|
201
|
+
when 2
|
202
|
+
agg.call(column, self)
|
203
|
+
else
|
204
|
+
msg = 'a lambda used in a non-group footer may have 0 to 2 arguments: (c, f)'
|
190
205
|
raise ArgumentError, msg
|
191
206
|
end
|
192
|
-
agg.call(self, col)
|
193
207
|
end
|
194
|
-
#
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
208
|
+
# Pass the result back into this method as the new agg
|
209
|
+
calc_val(result, h, k)
|
210
|
+
else
|
211
|
+
agg.to_s
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
# Insert a possibly calculated value for the label in the appropriate
|
216
|
+
# @values column.
|
217
|
+
def insert_labels_in_label_col
|
218
|
+
if group
|
219
|
+
@values[@label_col] = []
|
220
|
+
table.number_of_groups.times do |k|
|
221
|
+
@values[@label_col] << calc_label(k)
|
222
|
+
end
|
223
|
+
else
|
224
|
+
@values[@label_col] = [calc_label(0)]
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
# Calculate the label for the kth group, using k = 0 for non-group
|
229
|
+
# footers. If the label is a proc, call it with the group number.
|
230
|
+
def calc_label(k)
|
231
|
+
case @label
|
232
|
+
when Proc
|
233
|
+
case @label.arity
|
234
|
+
when 0
|
235
|
+
@label.call
|
236
|
+
when 1
|
237
|
+
@label.call(k)
|
238
|
+
when 2
|
239
|
+
@label.call(k, self)
|
200
240
|
else
|
201
|
-
raise ArgumentError, "
|
241
|
+
raise ArgumentError, "footer label proc may only have 1 argument for group number k"
|
202
242
|
end
|
203
243
|
else
|
204
|
-
|
244
|
+
@label.to_s
|
205
245
|
end
|
206
246
|
end
|
207
247
|
|