Class: CSVReportGenerator

Inherits:
Object
  • Object
show all
Defined in:
lib/csv_report_generator/csv_report_generator.rb

Constant Summary collapse

DEFAULT_ROW_TRANSFORMER =
proc { |r| r }.freeze
DEFAULT_TOTAL_TRANSFORMER =
proc { |r| r }.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(rows, headers = nil, opts = {}) ⇒ CSVReportGenerator

Returns a new instance of CSVReportGenerator.



21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/csv_report_generator/csv_report_generator.rb', line 21

def initialize(rows, headers = nil, opts = {})
  @headers = headers
  @rows = rows
  @includes_total = opts[:includes_total] || false
  
  if block_given?
    yield(self)
  else
    # setup default transformers
    @row_transformer = DEFAULT_ROW_TRANSFORMER
    @total_transformer = DEFAULT_TOTAL_TRANSFORMER
  end
end

Instance Attribute Details

#headers=(value) ⇒ Object (writeonly)

Sets the attribute headers

Parameters:

  • value

    the value to set the attribute headers to.



6
7
8
# File 'lib/csv_report_generator/csv_report_generator.rb', line 6

def headers=(value)
  @headers = value
end

#rows=(value) ⇒ Object (writeonly)

Sets the attribute rows

Parameters:

  • value

    the value to set the attribute rows to.



7
8
9
# File 'lib/csv_report_generator/csv_report_generator.rb', line 7

def rows=(value)
  @rows = value
end

Instance Method Details

#as_csvObject



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/csv_report_generator/csv_report_generator.rb', line 35

def as_csv
  FasterCSV.generate do |csv|
    unless @headers.nil?
      csv << @headers.map { |h| h.values.first }
    end

    # transform if passed block, otherwise leave as is
    # don't mess with original row data in case we want
    # to redefine 
    rows = @rows.collect do |row|
      if(@includes_total && @rows.last == row)
        self.transform(row, @total_transformer)
      else
        self.transform(row, @row_transformer)
      end
    end
    
    # need to do it this way so headers and data are in sync
    unless @headers.nil?
      rows.map { |r| @headers.map { |h| h.keys.first }.map { |h| r.send(:[], h.to_sym) } }.each { |row| csv << row }
    else
      unless rows.empty?
        cols = rows[0].keys
        rows.map { |r| cols.map { |c| r.send(:[], c.to_sym) } }.each { |row| csv << row }
      end
    end
  end
end

#row_transformer(&block) ⇒ Object



9
10
11
# File 'lib/csv_report_generator/csv_report_generator.rb', line 9

def row_transformer(&block)
  @row_transformer = block
end

#total_transformer(&block) ⇒ Object



13
14
15
# File 'lib/csv_report_generator/csv_report_generator.rb', line 13

def total_transformer(&block)
  @total_transformer = block
end

#transform(row, block) ⇒ Object



17
18
19
# File 'lib/csv_report_generator/csv_report_generator.rb', line 17

def transform(row, block)
  block.call(row)
end