Sha256: aa153b02234bd3eed6e18914fe2d57660291fce21c9a170321fecc06df5a7167

Contents?: true

Size: 1.84 KB

Versions: 3

Compression:

Stored size: 1.84 KB

Contents

module Csv2hash
  class Definition

    MAPPING = 'mapping'.freeze
    COLLECTION = 'collection'.freeze

    TYPES = [MAPPING, COLLECTION]

    attr_accessor :rules, :type, :header_size, :structure_rules

    def initialize rules, type, options = {}
      self.rules, self.type = rules, type
      self.header_size, self.structure_rules = options.fetch(:header_size) { 0 }, options.fetch(:structure_rules) { {} }
    end

    def validate!
      unless TYPES.include?(type)
        raise "not suitable type, please use '#{MAPPING}' or '#{COLLECTION}'"
      end
      raise 'rules must be an Array of rules' unless rules.class == Array
      raise 'structure rules must be a Hash of rules' unless structure_rules.class == Hash
    end

    def default!
      rules.each do |rule|
        default_position rule
        unless rule.has_key? :message
          if rule.has_key? :values
            rule.merge! message: ':key not supported, please use one of :values'
          else
            rule.merge! message: 'undefined :key on :position'
          end
        end
        rule.merge! mappable:    true    unless rule.has_key? :mappable
        rule.merge! type:       'string' unless rule.has_key? :type
        rule.merge! values:      nil     unless rule.has_key? :values
        rule.merge! nested:      nil     unless rule.has_key? :nested
        rule.merge! allow_blank: false   unless rule.has_key? :allow_blank
        rule.merge! extra_validator: nil unless rule.has_key? :extra_validator
      end
    end

    private

    def default_position rule
      case type
      when MAPPING
        y, x = rule.fetch(:position, ['undefined', 'undefined'])
        rule.merge! key: "key_#{y}_#{x}" unless rule.has_key? :key
      when COLLECTION
        x = rule.fetch :position
        rule.merge! key: "key_undefined_#{x}" unless rule.has_key? :key
      end
    end

  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
csv2hash-0.5.0 lib/csv2hash/definition.rb
csv2hash-0.4.0 lib/csv2hash/definition.rb
csv2hash-0.3.0 lib/csv2hash/definition.rb