module RCsvLoader::Core::ClassMethods

Attributes

headers[R]

Public Instance Methods

column(column_name, alias_name = nil) click to toggle source

Define accessor names for csv column.

# File lib/rcsv_loader/core.rb, line 33
def column column_name, alias_name = nil
  alias_name = column_name.to_sym unless alias_name
  @headers = all_headers
  @headers.merge!(alias_name => column_name)
  define_row(@headers)

  @has_headers = true
end
headers?() click to toggle source
# File lib/rcsv_loader/core.rb, line 52
def headers?
  !!@has_headers
end
insert_headers(headers = []) click to toggle source

Define headers for no headers csv.

# File lib/rcsv_loader/core.rb, line 45
def insert_headers headers = []
  @headers = Hash[headers.map.with_index { |e, i| [e, i] }]
  define_row(@headers)

  @has_headers = false
end
load_csv(file, options = {}) { |rows| ... } click to toggle source

Laod a csv file

options: The options for 'csv' which is Ruby's built-in library.
# File lib/rcsv_loader/core.rb, line 19
def load_csv file, options = {}

  rows = CSV.readlines file, options

  rows = yield rows if block_given?

  self.new rows.map { |row| self::Row.new row }
end

Private Instance Methods

all_headers(current_class = nil) click to toggle source

Get headers that include super class's one.

# File lib/rcsv_loader/core.rb, line 60
def all_headers current_class = nil
  current_class ||= self
  return {} if current_class == Object
  current_header = current_class.headers || {}
  return current_header.merge all_headers(current_class.superclass)
end
define_row(headers) click to toggle source

Define a class which represent a row of csv.

# File lib/rcsv_loader/core.rb, line 70
def define_row headers
  headers ||= {}

  # get the superclass for Row
  baseclass = if superclass.const_defined? :Row
                superclass::Row
              else
                Object
              end

  # remove class definition
  if const_defined? :Row and baseclass != self::Row
    self.send :remove_const, :Row
  end

  # define Row class
  const_set :Row, (Class.new(baseclass) do

    attr_accessor *headers.keys

    define_method :initialize do |line = {}|
      headers.each do |k, v|
        instance_variable_set "@#{k.to_s}", line[v]
      end
    end

    define_method :to_csv do
      CSV.generate_line headers.map { |k, v| self.send k }
    end

  end)
end