fat_table 0.2.6 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,6 @@
1
+ # Set and access a database by module-level methods.
1
2
  module FatTable
2
- class << self;
3
+ class << self
3
4
  # The +Sequel+ database handle to use in calls to +FatTable.from_sql+.
4
5
  attr_accessor :handle
5
6
  end
@@ -17,21 +18,23 @@ module FatTable
17
18
  # Sequel's adapter-specific connection methods.
18
19
  # http://sequel.jeremyevans.net/rdoc/files/doc/opening_databases_rdoc.html
19
20
  #
20
- # +driver+::
21
- # One of 'pg' (for Postgresql), 'mysql' or 'mysql2' (for Mysql), or 'sqlite' (for
22
- # SQLite3) to specify the +Sequel+ driver to use. You may have to install the
23
- # driver to make this work. By default use 'Pg'.
21
+ # +adapter+::
22
+ # One of 'pg' (for Postgresql), 'mysql' or 'mysql2' (for Mysql), or
23
+ # 'sqlite' (for SQLite3) (or any other adapter supported by the +Sequel+
24
+ # gem) to specify the driver to use. You may have to install the
25
+ # appropriate driver to make this work.
24
26
  #
25
27
  # +database+::
26
28
  # The name of the database to access. There is no default for this.
27
29
  #
28
30
  # +user+::
29
- # The user name to use for accessing the database. It defaults to nil,
30
- # which may be interpreted as a default user by the Sequel driver being used.
31
+ # The user name to use for accessing the database. It defaults to nil,
32
+ # which may be interpreted as a default user by the Sequel driver being
33
+ # used.
31
34
  #
32
35
  # +password+::
33
- # The password to use for accessing the database. It defaults to nil,
34
- # which may be interpreted as a default password by the Sequel driver being used.
36
+ # The password to use for accessing the database. It defaults to nil, which
37
+ # may be interpreted as a default password by the Sequel driver being used.
35
38
  #
36
39
  # +host+::
37
40
  # The name of the host on which to look for the database connection,
@@ -39,52 +42,30 @@ module FatTable
39
42
  #
40
43
  # +port+::
41
44
  # The port number as a string or integer on which to access the database on
42
- # the given host. Defaults to '5432'. Only used if host is not 'localhost'.
45
+ # the given host. Defaults to '5432'. Only used if host is not 'localhost'.
43
46
  #
44
47
  # +socket+::
45
48
  # The socket to use to access the database if the host is 'localhost'.
46
49
  # Defaults to the standard socket for the Pg driver, '/tmp/.s.PGSQL.5432'.
47
50
  #
48
- # If successful the database handle for Sequel is return.
49
- # Once called successfully, this establishes the database handle to use for
50
- # all subsequent calls to FatTable.from_sql or FatTable::Table.from_sql. You
51
- # can then access the handle if needed with FatTable.db.
52
- def self.set_db(db: nil,
53
- driver: 'postgres',
54
- database:,
55
- user: ENV['LOGNAME'],
56
- password: nil,
57
- host: 'localhost',
58
- port: '5432',
59
- socket: '/tmp/.s.PGSQL.5432')
60
- if db
61
- self.handle = db
62
- else
63
- raise UserError, 'must supply database name to set_db' unless database
64
-
65
- valid_drivers = ['postgres', 'mysql', 'mysql2', 'sqlite']
66
- unless valid_drivers.include?(driver)
67
- raise UserError, "'#{driver}' driver must be one of #{valid_drivers.join(' or ')}"
68
- end
69
- if database.blank?
70
- raise UserError, "must supply database parameter to set_db"
71
- end
72
-
73
- if driver == 'sqlite'
74
- dsn = "sqlite://#{database}"
51
+ # If successful the database handle for Sequel is return. Once called
52
+ # successfully, this establishes the database handle to use for all subsequent
53
+ # calls to FatTable.from_sql or FatTable::Table.from_sql. You can then access
54
+ # the handle if needed with FatTable.db.
55
+ def self.connect(args)
56
+ # Set the dsn for Sequel
57
+ begin
58
+ self.handle = Sequel.connect(args)
59
+ rescue Sequel::AdapterNotFound => ex
60
+ case ex.to_s
61
+ when /pg/
62
+ raise TransientError, 'You need to install the postgres adapter pg'
63
+ when /mysql/
64
+ raise TransientError, 'You need to install the mysql adapter'
65
+ when /sqlite/
66
+ raise TransientError, 'You need to install the sqlite adapter'
75
67
  else
76
- pw_part = password ? ":#{password}" : ''
77
- hst_part = host ? "@#{host}" : ''
78
- prt_part = port ? ":#{port}" : ''
79
- dsn = "#{driver}:://#{user}#{pw_part}#{hst_part}#{prt_part}/#{database}"
80
- end
81
-
82
- # Set the dsn for Sequel
83
- begin
84
- # DB = Sequel.connect(dsn)
85
- self.handle = Sequel.connect(dsn)
86
- rescue => ex
87
- raise TransientError, "#{dsn}: #{ex}"
68
+ raise ex
88
69
  end
89
70
  end
90
71
  handle
@@ -96,7 +77,7 @@ module FatTable
96
77
  end
97
78
 
98
79
  # Directly set the db handle to a Sequel connection formed without
99
- # FatTable.set_db.
80
+ # FatTable.connect.
100
81
  def self.db=(db)
101
82
  self.handle = db
102
83
  end
@@ -12,57 +12,59 @@ module FatTable
12
12
  # update values of instance variables for use in subsequent calls to
13
13
  # #evaluate.
14
14
  class Evaluator
15
- # Return a new Evaluator object in which the Hash +vars+ defines the
15
+ # Return a new Evaluator object in which the Hash +ivars+ defines the
16
16
  # bindings for instance variables to be available and maintained across all
17
17
  # subsequent calls to Evaluator.evaluate. The strings +before+ and +after+
18
- # are string expressions that will be evaluated before and after each
18
+ # are string Ruby expressions that will be evaluated before and after each
19
19
  # subsequent call to Evaluator.evaluate.
20
20
  def initialize(ivars: {}, before: nil, after: nil)
21
21
  @before = before
22
22
  @after = after
23
- set_instance_vars(ivars)
23
+ instance_vars(ivars)
24
24
  end
25
25
 
26
- # Run the before hook after setting the @group to grp, passed in as a
27
- # parameter. This is run before any column has been evaluated with the
28
- # evaluate method.
29
- def eval_before_hook(vars)
30
- bdg = binding
31
- set_local_vars(vars, bdg)
32
- @group = vars[:__group]
33
- eval(@before, bdg) if @before
26
+ # Set the @group instance variable to the given value.
27
+ def update_ivars(ivars)
28
+ instance_vars(ivars)
34
29
  end
35
30
 
36
- # Run the after hook. This is run after each column in the row has been
37
- # evaluated with the evaluate method.
38
- def eval_after_hook(vars)
39
- bdg = binding
40
- set_local_vars(vars, bdg)
41
- eval(@after, bdg) if @after
31
+ # Run any before hook in the context of the given local variables.
32
+ def eval_before_hook(locals: {})
33
+ return if @before.blank?
34
+
35
+ evaluate(@before, locals: locals)
36
+ end
37
+
38
+ # Run any after hook in the context of the given local variables.
39
+ def eval_after_hook(locals: {})
40
+ return if @after.blank?
41
+
42
+ evaluate(@after, locals: locals)
42
43
  end
43
44
 
44
45
  # Return the result of evaluating +expr+ as a Ruby expression in which the
45
46
  # instance variables set in Evaluator.new and any local variables set in the
46
- # Hash parameter +vars+ are available to the expression.
47
- def evaluate(expr = '', vars: {})
48
- bdg = binding
49
- set_local_vars(vars, bdg)
50
- eval(expr, bdg)
47
+ # Hash parameter +locals+ are available to the expression.
48
+ def evaluate(expr = '', locals: {})
49
+ eval(expr, local_vars(binding, locals))
51
50
  end
52
51
 
53
52
  private
54
53
 
55
- def set_instance_vars(vars = {})
54
+ # Set the instance variables according to Hash vars.
55
+ def instance_vars(vars = {})
56
56
  vars.each_pair do |name, val|
57
57
  name = "@#{name}" unless name.to_s.start_with?('@')
58
58
  instance_variable_set(name, val)
59
59
  end
60
60
  end
61
61
 
62
- def set_local_vars(vars = {}, bnd)
62
+ # Set the local variables within the binding bnd according to Hash vars.
63
+ def local_vars(bnd, vars = {})
63
64
  vars.each_pair do |name, val|
64
65
  bnd.local_variable_set(name, val)
65
66
  end
67
+ bnd
66
68
  end
67
69
  end
68
70
  end
@@ -4,7 +4,6 @@ module FatTable
4
4
  # directives. All footers are included as extra Arrays of the output.
5
5
  # AoaFormatter supports no +options+
6
6
  class AoaFormatter < Formatter
7
-
8
7
  private
9
8
 
10
9
  def evaluate?
@@ -31,20 +30,20 @@ module FatTable
31
30
  '['
32
31
  end
33
32
 
34
- def pre_cell(_h)
33
+ def pre_cell(_val)
35
34
  "'"
36
35
  end
37
36
 
38
37
  # Because the cell, after conversion to a single-quoted string will be
39
38
  # eval'ed, we need to escape any single-quotes (') that appear in the
40
39
  # string.
41
- def quote_cell(v)
42
- if v =~ /'/
40
+ def quote_cell(val)
41
+ if val.match?(/'/)
43
42
  # Use a negative look-behind to only quote single-quotes that are not
44
43
  # already preceded by a backslash
45
- v.gsub(/(?<!\\)'/, "'" => "\\'")
44
+ val.gsub(/(?<!\\)'/, "'" => "\\'")
46
45
  else
47
- v
46
+ val
48
47
  end
49
48
  end
50
49
 
@@ -6,7 +6,6 @@ module FatTable
6
6
  # footers are included as extra Hashes of the output. AoaFormatter supports no
7
7
  # +options+
8
8
  class AohFormatter < Formatter
9
-
10
9
  private
11
10
 
12
11
  def evaluate?
@@ -31,20 +30,20 @@ module FatTable
31
30
  '{'
32
31
  end
33
32
 
34
- def pre_cell(h)
35
- ":#{h.as_sym} => '"
33
+ def pre_cell(head)
34
+ ":#{head.as_sym} => '"
36
35
  end
37
36
 
38
37
  # Because the cell, after conversion to a single-quoted string will be
39
38
  # eval'ed, we need to escape any single-quotes (') that appear in the
40
39
  # string.
41
- def quote_cell(v)
42
- if v =~ /'/
40
+ def quote_cell(val)
41
+ if val.match?(/'/)
43
42
  # Use a negative look-behind to only quote single-quotes that are not
44
43
  # already preceded by a backslash
45
- v.gsub(/(?<!\\)'/, "'" => "\\'")
44
+ val.gsub(/(?<!\\)'/, "'" => "\\'")
46
45
  else
47
- v
46
+ val
48
47
  end
49
48
  end
50
49
 
@@ -12,7 +12,7 @@ module FatTable
12
12
  # provided by subclasses will override these for different output targets.
13
13
  class Formatter
14
14
  # Valid locations in a Table as an array of symbols.
15
- LOCATIONS = [:header, :body, :bfirst, :gfirst, :gfooter, :footer].freeze
15
+ LOCATIONS = %i[header body bfirst gfirst gfooter footer].freeze
16
16
 
17
17
  # The table that is the subject of the Formatter.
18
18
  attr_reader :table
@@ -45,8 +45,9 @@ module FatTable
45
45
  # footer content. The value is Hash in which the keys are column symbols and
46
46
  # the values are symbols for the aggregate method to be applied to the
47
47
  # group's column to provide a value in the group footer for that column.
48
- # Thus, +gfooters['Average'][:shares]+ might be set to +:avg+ to indicate that
49
- # the +:shares+ column is to be averaged in the group footer labeled 'Average'.
48
+ # Thus, +gfooters['Average'][:shares]+ might be set to +:avg+ to indicate
49
+ # that the +:shares+ column is to be averaged in the group footer labeled
50
+ # 'Average'.
50
51
  attr_reader :gfooters
51
52
 
52
53
  class_attribute :default_format
@@ -91,20 +92,21 @@ module FatTable
91
92
  # Formatter is yielded to the block so that methods for formatting and
92
93
  # adding footers can be called on it.
93
94
  def initialize(table = Table.new, **options)
94
- unless table && table.is_a?(Table)
95
+ unless table&.is_a?(Table)
95
96
  raise UserError, 'must initialize Formatter with a Table'
96
97
  end
98
+
97
99
  @table = table
98
100
  @options = options
99
101
  @footers = {}
100
102
  @gfooters = {}
101
- # Formatting instructions for various "locations" within the Table, as
102
- # a hash of hashes. The outer hash is keyed on the location, and each
103
- # inner hash is keyed on either a column sym or a type sym, :string, :numeric,
104
- # :datetime, :boolean, or :nil. The value of the inner hashes are
103
+ # Formatting instructions for various "locations" within the Table, as a
104
+ # hash of hashes. The outer hash is keyed on the location, and each inner
105
+ # hash is keyed on either a column sym or a type sym, :string, :numeric,
106
+ # :datetime, :boolean, or :nil. The value of the inner hashes are
105
107
  # OpenStruct structs.
106
108
  @format_at = {}
107
- [:header, :bfirst, :gfirst, :body, :footer, :gfooter].each do |loc|
109
+ %i[header bfirst gfirst body footer gfooter].each do |loc|
108
110
  @format_at[loc] = {}
109
111
  table.headers.each do |h|
110
112
  fmt_hash = self.class.default_format
@@ -169,12 +171,14 @@ module FatTable
169
171
  unless table.headers.include?(h)
170
172
  raise UserError, "No '#{h}' column in table to sum in the footer"
171
173
  end
174
+
172
175
  foot[h] = :sum
173
176
  end
174
177
  agg_cols.each do |h, agg|
175
178
  unless table.headers.include?(h)
176
179
  raise UserError, "No '#{h}' column in table to #{agg} in the footer"
177
180
  end
181
+
178
182
  foot[h] = agg
179
183
  end
180
184
  @footers[label] = foot
@@ -205,14 +209,16 @@ module FatTable
205
209
  foot = {}
206
210
  sum_cols.each do |h|
207
211
  unless table.headers.include?(h)
208
- raise UserError, "No '#{h}' column in table to sum in the group footer"
212
+ raise UserError, "No '#{h}' column in table for group sum footer"
209
213
  end
214
+
210
215
  foot[h] = :sum
211
216
  end
212
217
  agg_cols.each do |h, agg|
213
218
  unless table.headers.include?(h)
214
- raise UserError, "No '#{h}' column in table to #{agg} in the group footer"
219
+ raise UserError, "No '#{h}' column in table for #{agg} group footer"
215
220
  end
221
+
216
222
  foot[h] = agg
217
223
  end
218
224
  @gfooters[label] = foot
@@ -241,7 +247,7 @@ module FatTable
241
247
  cols.each do |c|
242
248
  hsh[c] = :avg
243
249
  end
244
- footer('Average', hsh)
250
+ footer('Average', **hsh)
245
251
  end
246
252
 
247
253
  # :category: Footers
@@ -252,7 +258,7 @@ module FatTable
252
258
  cols.each do |c|
253
259
  hsh[c] = :avg
254
260
  end
255
- gfooter('Group Average', hsh)
261
+ gfooter('Group Average', **hsh)
256
262
  end
257
263
 
258
264
  # :category: Footers
@@ -264,7 +270,7 @@ module FatTable
264
270
  cols.each do |c|
265
271
  hsh[c] = :min
266
272
  end
267
- footer('Minimum', hsh)
273
+ footer('Minimum', **hsh)
268
274
  end
269
275
 
270
276
  # :category: Footers
@@ -276,7 +282,7 @@ module FatTable
276
282
  cols.each do |c|
277
283
  hsh[c] = :min
278
284
  end
279
- gfooter('Group Minimum', hsh)
285
+ gfooter('Group Minimum', **hsh)
280
286
  end
281
287
 
282
288
  # :category: Footers
@@ -288,7 +294,7 @@ module FatTable
288
294
  cols.each do |c|
289
295
  hsh[c] = :max
290
296
  end
291
- footer('Maximum', hsh)
297
+ footer('Maximum', **hsh)
292
298
  end
293
299
 
294
300
  # :category: Footers
@@ -300,7 +306,7 @@ module FatTable
300
306
  cols.each do |c|
301
307
  hsh[c] = :max
302
308
  end
303
- gfooter('Group Maximum', hsh)
309
+ gfooter('Group Maximum', **hsh)
304
310
  end
305
311
 
306
312
  # :category: Formatting
@@ -411,8 +417,8 @@ module FatTable
411
417
  #
412
418
  # \n\[niltext\]:: render a nil item with the given text.
413
419
  def format(**fmts)
414
- [:header, :bfirst, :gfirst, :body, :footer, :gfooter].each do |loc|
415
- format_for(loc, fmts)
420
+ %i[header bfirst gfirst body footer gfooter].each do |loc|
421
+ format_for(loc, **fmts)
416
422
  end
417
423
  self
418
424
  end
@@ -465,7 +471,8 @@ module FatTable
465
471
  unless LOCATIONS.include?(location)
466
472
  raise UserError, "unknown format location '#{location}'"
467
473
  end
468
- valid_keys = table.headers + [:string, :numeric, :datetime, :boolean, :nil]
474
+
475
+ valid_keys = table.headers + %i[string numeric datetime boolean nil]
469
476
  invalid_keys = (fmts.keys - valid_keys).uniq
470
477
  unless invalid_keys.empty?
471
478
  msg = "invalid #{location} column or type: #{invalid_keys.join(',')}"
@@ -486,32 +493,33 @@ module FatTable
486
493
  # Merge in string and nil formatting, but not in header. Header is
487
494
  # always typed a string, so it will get formatted in type-based
488
495
  # formatting below. And headers are never nil.
489
- if fmts.keys.include?(:string)
496
+ if fmts.key?(:string)
490
497
  typ_fmt = parse_string_fmt(fmts[:string])
491
498
  format_h = format_h.merge(typ_fmt)
492
499
  end
493
- if fmts.keys.include?(:nil)
500
+ if fmts.key?(:nil)
494
501
  typ_fmt = parse_nil_fmt(fmts[:nil]).first
495
502
  format_h = format_h.merge(typ_fmt)
496
503
  end
497
504
  end
498
505
  typ = location == :header ? :string : table.type(h).as_sym
499
506
  parse_typ_method_name = 'parse_' + typ.to_s + '_fmt'
500
- if fmts.keys.include?(typ)
507
+ if fmts.key?(typ)
501
508
  # Merge in type-based formatting
502
509
  typ_fmt = send(parse_typ_method_name, fmts[typ])
503
510
  format_h = format_h.merge(typ_fmt)
504
511
  end
505
512
  if fmts[h]
506
513
  # Merge in column formatting
507
- col_fmt = send(parse_typ_method_name, fmts[h], strict: location != :header)
514
+ col_fmt = send(parse_typ_method_name, fmts[h],
515
+ strict: location != :header)
508
516
  format_h = format_h.merge(col_fmt)
509
517
  end
510
518
 
511
519
  if location == :body
512
520
  # Copy :body formatting for column h to :bfirst and :gfirst if they
513
- # still have the default formatting. Can be overridden with a format_for
514
- # call with those locations.
521
+ # still have the default formatting. Can be overridden with a
522
+ # format_for call with those locations.
515
523
  format_h.each_pair do |k, v|
516
524
  if format_at[:bfirst][h].send(k) == default_format[k]
517
525
  format_at[:bfirst][h].send("#{k}=", v)
@@ -538,14 +546,14 @@ module FatTable
538
546
  self
539
547
  end
540
548
 
541
- ###############################################################################
549
+ ############################################################################
542
550
  # Parsing and validation routines
543
- ###############################################################################
551
+ ############################################################################
544
552
 
545
553
  private
546
554
 
547
555
  # Re to match a color name
548
- CLR_RE = /(?:[-_a-zA-Z0-9 ]*)/
556
+ CLR_RE = /(?:[-_a-zA-Z0-9 ]*)/.freeze
549
557
 
550
558
  # Return a hash that reflects the formatting instructions given in the
551
559
  # string fmt. Raise an error if it contains invalid formatting instructions.
@@ -556,6 +564,7 @@ module FatTable
556
564
  unless fmt.blank? || !strict
557
565
  raise UserError, "unrecognized string formatting instructions '#{fmt}'"
558
566
  end
567
+
559
568
  format
560
569
  end
561
570
 
@@ -591,11 +600,11 @@ module FatTable
591
600
  fmt = fmt.sub($&, '')
592
601
  end
593
602
  if fmt =~ /(~\s*)?B/
594
- fmt_hash[:bold] = !!!$1
603
+ fmt_hash[:bold] = !$1
595
604
  fmt = fmt.sub($&, '')
596
605
  end
597
606
  if fmt =~ /(~\s*)?I/
598
- fmt_hash[:italic] = !!!$1
607
+ fmt_hash[:italic] = !$1
599
608
  fmt = fmt.sub($&, '')
600
609
  end
601
610
  if fmt =~ /R/
@@ -611,11 +620,11 @@ module FatTable
611
620
  fmt = fmt.sub($&, '')
612
621
  end
613
622
  if fmt =~ /(~\s*)?_/
614
- fmt_hash[:underline] = !!!$1
623
+ fmt_hash[:underline] = !$1
615
624
  fmt = fmt.sub($&, '')
616
625
  end
617
626
  if fmt =~ /(~\s*)?\*/
618
- fmt_hash[:blink] = !!!$1
627
+ fmt_hash[:blink] = !$1
619
628
  fmt = fmt.sub($&, '')
620
629
  end
621
630
  [fmt_hash, fmt]
@@ -652,20 +661,21 @@ module FatTable
652
661
  fmt = fmt.sub($&, '')
653
662
  end
654
663
  if fmt =~ /(~\s*)?,/
655
- fmt_hash[:commas] = !!!$1
664
+ fmt_hash[:commas] = !$1
656
665
  fmt = fmt.sub($&, '')
657
666
  end
658
667
  if fmt =~ /(~\s*)?\$/
659
- fmt_hash[:currency] = !!!$1
668
+ fmt_hash[:currency] = !$1
660
669
  fmt = fmt.sub($&, '')
661
670
  end
662
671
  if fmt =~ /(~\s*)?H/
663
- fmt_hash[:hms] = !!!$1
672
+ fmt_hash[:hms] = !$1
664
673
  fmt = fmt.sub($&, '')
665
674
  end
666
675
  unless fmt.blank? || !strict
667
676
  raise UserError, "unrecognized numeric formatting instructions '#{fmt}'"
668
677
  end
678
+
669
679
  fmt_hash
670
680
  end
671
681
 
@@ -687,7 +697,8 @@ module FatTable
687
697
  fmt = fmt.sub($&, '')
688
698
  end
689
699
  unless fmt.blank? || !strict
690
- raise UserError, "unrecognized datetime formatting instructions '#{fmt}'"
700
+ msg = "unrecognized datetime formatting instructions '#{fmt}'"
701
+ raise UserError, msg
691
702
  end
692
703
  fmt_hash
693
704
  end
@@ -708,7 +719,8 @@ module FatTable
708
719
  end
709
720
  # Since true_text, false_text and nil_text may want to have internal
710
721
  # spaces, defer removing extraneous spaces until after they are parsed.
711
- if fmt =~ /c\[(#{CLR_RE})(\.(#{CLR_RE}))?,\s*(#{CLR_RE})(\.(#{CLR_RE}))?\]/
722
+ if fmt =~ /c\[(#{CLR_RE})(\.(#{CLR_RE}))?,
723
+ \s*(#{CLR_RE})(\.(#{CLR_RE}))?\]/x
712
724
  fmt_hash[:true_color] = $1 unless $1.blank?
713
725
  fmt_hash[:true_bgcolor] = $3 unless $3.blank?
714
726
  fmt_hash[:false_color] = $4 unless $4.blank?
@@ -735,12 +747,13 @@ module FatTable
735
747
  unless fmt.blank? || !strict
736
748
  raise UserError, "unrecognized boolean formatting instructions '#{fmt}'"
737
749
  end
750
+
738
751
  fmt_hash
739
752
  end
740
753
 
741
- ###############################################################################
754
+ ############################################################################
742
755
  # Applying formatting
743
- ###############################################################################
756
+ ############################################################################
744
757
 
745
758
  public
746
759
 
@@ -806,6 +819,7 @@ module FatTable
806
819
  # specializing this method.
807
820
  def format_boolean(val, istruct)
808
821
  return istruct.nil_text if val.nil?
822
+
809
823
  val ? istruct.true_text : istruct.false_text
810
824
  end
811
825
 
@@ -816,6 +830,7 @@ module FatTable
816
830
  # specializing this method.
817
831
  def format_datetime(val, istruct)
818
832
  return istruct.nil_text if val.nil?
833
+
819
834
  if val.to_date == val
820
835
  # It is a Date, with no time component.
821
836
  val.strftime(istruct.date_fmt)
@@ -831,12 +846,13 @@ module FatTable
831
846
  # specializing this method.
832
847
  def format_numeric(val, istruct)
833
848
  return istruct.nil_text if val.nil?
849
+
834
850
  val = val.round(istruct.post_digits) if istruct.post_digits >= 0
835
851
  if istruct.hms
836
852
  result = val.secs_to_hms
837
853
  istruct.commas = false
838
854
  elsif istruct.currency
839
- prec = istruct.post_digits == 0 ? 2 : istruct.post_digits
855
+ prec = istruct.post_digits.zero? ? 2 : istruct.post_digits
840
856
  delim = istruct.commas ? ',' : ''
841
857
  result = val.to_s(:currency, precision: prec, delimiter: delim,
842
858
  unit: FatTable.currency_symbol)
@@ -903,9 +919,9 @@ module FatTable
903
919
  val
904
920
  end
905
921
 
906
- ###############################################################################
922
+ ############################################################################
907
923
  # Output routines
908
- ###############################################################################
924
+ ############################################################################
909
925
 
910
926
  public
911
927
 
@@ -994,6 +1010,7 @@ module FatTable
994
1010
  new_rows.each do |loc_row|
995
1011
  result += hline(widths) if loc_row.nil?
996
1012
  next if loc_row.nil?
1013
+
997
1014
  _loc, row = *loc_row
998
1015
  result += pre_row
999
1016
  cells = []
@@ -1016,7 +1033,7 @@ module FatTable
1016
1033
  # Return a hash mapping the table's headers to their formatted versions. If
1017
1034
  # a hash of column widths is given, perform alignment within the given field
1018
1035
  # widths.
1019
- def build_formatted_headers(widths = {})
1036
+ def build_formatted_headers(_widths = {})
1020
1037
  # Don't decorate if this Formatter calls for alignment. It will be done
1021
1038
  # in the second pass.
1022
1039
  decorate = !aligned?
@@ -1058,7 +1075,8 @@ module FatTable
1058
1075
  grp_col[h] ||= Column.new(header: h)
1059
1076
  grp_col[h] << row[h]
1060
1077
  istruct = format_at[location][h]
1061
- new_row[h] = [row[h], format_cell(row[h], istruct, decorate: decorate)]
1078
+ new_row[h] = [row[h], format_cell(row[h], istruct,
1079
+ decorate: decorate)]
1062
1080
  end
1063
1081
  new_rows << [location, new_row]
1064
1082
  tbl_row_k += 1
@@ -1135,6 +1153,7 @@ module FatTable
1135
1153
  end
1136
1154
  rows.each do |loc_row|
1137
1155
  next if loc_row.nil?
1156
+
1138
1157
  _loc, row = *loc_row
1139
1158
  row.each_pair do |h, (_v, fmt_v)|
1140
1159
  widths[h] ||= 0
@@ -1217,12 +1236,12 @@ module FatTable
1217
1236
  ''
1218
1237
  end
1219
1238
 
1220
- def pre_cell(_h)
1239
+ def pre_cell(_head)
1221
1240
  ''
1222
1241
  end
1223
1242
 
1224
- def quote_cell(v)
1225
- v
1243
+ def quote_cell(val)
1244
+ val
1226
1245
  end
1227
1246
 
1228
1247
  def post_cell