class Reading::Csv::Parse::ParseRegularLine

ParseRegularLine is a function that parses a normal row in a CSV reading log into an array of item data (hashes).

Private Class Methods

name() click to toggle source
# File lib/reading/csv/parse_regular_line.rb, line 50
def self.name
  @name
end
type() click to toggle source
# File lib/reading/csv/parse_regular_line.rb, line 54
def self.type
  @type
end

Private Instance Methods

after_initialize() click to toggle source
# File lib/reading/csv/parse_regular_line.rb, line 20
def after_initialize
  setup_parse_attributes
  setup_custom_parse_attributes
end
before_parse() click to toggle source
# File lib/reading/csv/parse_regular_line.rb, line 25
def before_parse
  set_columns
  ensure_name_column_present
end
call(item_name, columns) click to toggle source
# File lib/reading/csv/parse_regular_line.rb, line 58
def call(item_name, columns)
  value = columns[self.class.name.to_sym]&.strip&.presence
  if self.class.type == :number
    Float(value, exception: false)
  else
    value
  end
end
ensure_name_column_present() click to toggle source
# File lib/reading/csv/parse_regular_line.rb, line 81
def ensure_name_column_present
  if columns[:name].nil? || columns[:name].strip.empty?
    raise InvalidItemError, "The Name column must not be blank"
  end
end
item_data(name) click to toggle source
# File lib/reading/csv/parse_regular_line.rb, line 87
def item_data(name)
  config.fetch(:item).fetch(:template)
        .merge(config.fetch(:csv).fetch(:custom_columns).keys.map { |k| [k, nil] }.to_h)
        .map do |attribute, _template_default|
          parsed = parse_attributes.fetch(attribute).call(name, columns)
          [attribute, parsed || default[attribute]]
        end
        .to_h
end
multi_items_to_be_split_by_format_emojis() click to toggle source
# File lib/reading/csv/parse_regular_line.rb, line 30
def multi_items_to_be_split_by_format_emojis
  columns[:name]
end
set_columns() click to toggle source
# File lib/reading/csv/parse_regular_line.rb, line 72
def set_columns
  @columns =  config.fetch(:csv).fetch(:columns)
                    .select { |_name, enabled| enabled }
                    .keys
                    .concat(config.fetch(:csv).fetch(:custom_columns).keys)
                    .zip(line.split(config.fetch(:csv).fetch(:column_separator)))
                    .to_h
end
setup_custom_parse_attributes() click to toggle source
# File lib/reading/csv/parse_regular_line.rb, line 41
def setup_custom_parse_attributes
  config.fetch(:csv).fetch(:custom_columns).each do |attribute, type|
    class_name = "Parse#{attribute.to_s.downcase.split("_").map(&:capitalize).join}"
    next if self.class.const_defined?(class_name)
    custom_class =
      Class.new ParseAttribute do
        @name = attribute
        @type = type

        def self.name
          @name
        end

        def self.type
          @type
        end

        def call(item_name, columns)
          value = columns[self.class.name.to_sym]&.strip&.presence
          if self.class.type == :number
            Float(value, exception: false)
          else
            value
          end
        end
      end
    self.class.const_set(class_name, custom_class)
    parse_attributes[attribute.to_sym] = custom_class.new(config)
  end
end
setup_parse_attributes() click to toggle source
# File lib/reading/csv/parse_regular_line.rb, line 34
def setup_parse_attributes
  @parse_attributes ||= config.fetch(:item).fetch(:template).map do |attribute, _default|
    parser_class_name = "Parse#{attribute.to_s.split("_").map(&:capitalize).join}"
    [attribute, self.class.const_get(parser_class_name).new(config)]
  end.to_h
end