Sha256: 4eb63fee4addf29ae9f9861f34b86a2fbe0518cb5d9c0f5d0a874a03e8c0179b

Contents?: true

Size: 858 Bytes

Versions: 5

Compression:

Stored size: 858 Bytes

Contents

require "csv"
require "active_support/core_ext/string/inflections"

module Decisive
  class StreamCSVContext < Struct.new(:records, :filename, :block)
    class Column < Struct.new(:label, :block); end

    def initialize *args
      super
      @columns = []
      instance_eval &block
    end

    attr_reader :columns

    def column label, value=nil, &block # field, label: field.to_s.humanize, &block
      value ||= label.parameterize.underscore.to_sym
      block ||= ->(record) { record.send(value) }
      columns << Column.new(label, block)
    end

    def each
      yield header

      records.map do |record|
        row = columns.map do |column|
          column.block.call(record).to_s
        end
        yield row
      end
    end

    def csv?
      true
    end

    private

    def header
      columns.map(&:label)
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
decisive-0.8.5 lib/decisive/stream_csv_context.rb
decisive-0.8.4 lib/decisive/stream_csv_context.rb
decisive-0.8.2 lib/decisive/stream_csv_context.rb
decisive-0.8.1 lib/decisive/stream_csv_context.rb
decisive-0.8.0 lib/decisive/stream_csv_context.rb