Sha256: c4df71c8f05565368adf07564625444221c4a57b036fba272036c7ad89415534
Contents?: true
Size: 1.39 KB
Versions: 1
Compression:
Stored size: 1.39 KB
Contents
require 'csv' module HoneyFormat class MissingCSVHeaderError < StandardError; end class CSVHeaderColumnError < StandardError; end class CSV attr_reader :header, :columns def initialize(csv, header: nil, valid_columns: :all) csv = ::CSV.parse(csv) @head = build_header(header || csv.shift) @csv_body = csv @columns = build_columns(@head, valid_columns) @struct_klass = Struct.new(*@columns) end def header @head end def rows @rows ||= @csv_body.map { |row| create_object(row) } end def row_count rows.length end private def build_header(head) head || fail(MissingCSVHeaderError, 'CSV header must be present.') clean_row(head) end def build_columns(keys, valid_columns) columns = keys.map do |raw_col| col = raw_col.downcase.gsub(/ /, '').to_sym validate_column!(raw_col, col, valid_columns) col end end def create_object(row) @struct_klass.new(*clean_row(row)) end def clean_row(row) row.map { |column| clean(column) } end def clean(column) column.strip unless column.nil? end def validate_column!(c, col, valid_columns) unless valid_columns == :all valid_columns.include?(col) || fail(CSVHeaderColumnError, "column :#{col} (\"#{c}\") not in #{valid_columns.inspect}") end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
honey_format-0.1.0 | lib/honey_format/csv.rb |