toasterlovin/csv_party

View on GitHub
lib/csv_party/parsers.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'bigdecimal'

module CSVParty
  module Parsers
    def parse_raw(value)
      value
    end

    def parse_string(value)
      value.to_s.strip
    end

    def parse_boolean(value)
      value = value.to_s.strip.downcase

      if %w[1 t true].include? value
        true
      elsif %w[0 f false].include? value
        false
      else
        nil
      end
    end

    def parse_integer(value)
      prepare_numeric_value(value).to_i
    end

    def parse_decimal(value)
      BigDecimal(prepare_numeric_value(value))
    end

    def parse_date(value, format = nil)
      if format.nil?
        Date.parse(value)
      else
        Date.strptime(value, format)
      end
    rescue ArgumentError
      nil
    end

    def parse_time(value, format = nil)
      if format.nil?
        DateTime.parse(value).to_time
      else
        DateTime.strptime(value, format).to_time
      end
    rescue ArgumentError
      nil
    end

    private

    def prepare_numeric_value(value)
      value = value.to_s.strip
      value = convert_from_accounting_notation(value)
      strip_non_numeric_characters(value)
    end

    def convert_from_accounting_notation(value)
      if value =~ /\A\(.*\)\z/
        value.delete('()').insert(0, '-')
      else
        value
      end
    end

    def strip_non_numeric_characters(value)
      value.gsub(/[^\-0-9.]/, '')
    end
  end
end