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