Sha256: 434412d1fa5c738816283a021327170f8ec969ef8cdeaf0408c507847a3ce917

Contents?: true

Size: 1.53 KB

Versions: 5

Compression:

Stored size: 1.53 KB

Contents

require "cascade/complex_fields"
require "cascade/exceptions"
require "cascade/helpers/configuration"

module Cascade
  class RowProcessor
    extend Configuration

    DEFAULT_PROCESSOR = ->(value) { value }

    define_setting :use_default_presenter, false
    define_setting :deafult_presenter, -> { DEFAULT_PROCESSOR }

    def initialize(options = {})
      @columns_matching = options[:columns_matching] || ColumnsMatching.new
      @presenters       = options.reverse_merge(defined_presenters)
    end

    # Iterates through object using columns values supported keys as keys for
    # iterating, then parse it by curresponding parser.
    #
    # @param row [Hash] the object retrieved from CSV
    # @return [Hash] the object with parsed columns
    def call(row)
      @columns_matching.supported_keys.inject({}) do |result, key|
        raw_value = row.fetch(@columns_matching.index(key))
        value     = receive_presenter(key).call(raw_value)
        result.merge(key => value)
      end
    end

    private

    def receive_presenter(column_name)
      presenter = @presenters[@columns_matching.column_type(column_name)]
      if presenter.nil? && !self.class.use_default_presenter
        raise Cascade::UnknownPresenterType.new
      end
      presenter || self.class.deafult_presenter
    end

    def defined_presenters
      {
        string:      DEFAULT_PROCESSOR,
        currency:    ComplexFields::Currency.new,
        country_iso: ComplexFields::CountryIso.new,
        boolean:     ComplexFields::Boolean.new,
      }
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
cascade-rb-0.1.5 lib/cascade/row_processor.rb
cascade-rb-0.1.4 lib/cascade/row_processor.rb
cascade-rb-0.1.2 lib/cascade/row_processor.rb
cascade-rb-0.1.1 lib/cascade/row_processor.rb
cascade-rb-0.1.0 lib/cascade/row_processor.rb