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