class GnCrossmap::ColumnCollector

Assemble data from CSV reader by checking column fields

Constants

RANKS
SPECIES_RANKS

Public Class Methods

new(fields) click to toggle source
# File lib/gn_crossmap/column_collector.rb, line 12
def initialize(fields)
  @fields = fields
  err = "At least some of these fields must exist in " \
    "the CSV header: '#{RANKS.join('\', \'')}'"
  raise GnCrossmapError, err if (RANKS - @fields).size == RANKS.size
end

Public Instance Methods

id_name_rank(row) click to toggle source
# File lib/gn_crossmap/column_collector.rb, line 19
def id_name_rank(row)
  @row = row
  rank = find_rank
  return nil unless rank
  name = assemble_name(rank)
  return nil unless name
  id = GnCrossmap.find_id(@row, name)
  return nil if id.strip.to_s == ""
  { id: id, name: name, rank: rank.to_s }
end

Private Instance Methods

add_infrarank(name, rank) click to toggle source

rubocop:disable Metrics/MethodLength

# File lib/gn_crossmap/column_collector.rb, line 67
def add_infrarank(name, rank)
  case rank
  when :species
    name.downcase
  when :subspecies
    "subsp. #{name.downcase}"
  when :variety
    "var. #{name.downcase}"
  when :form
    "f. #{name.downcase}"
  else
    name.capitalize
  end
end
assemble_name(name_rank) click to toggle source
# File lib/gn_crossmap/column_collector.rb, line 42
def assemble_name(name_rank)
  name = @row[name_rank]
  if SPECIES_RANKS[1..-1].include?(name_rank)
    assemble_species_name(name, name_rank)
  else
    name.capitalize
  end
end
assemble_species_name(name, name_rank) click to toggle source
# File lib/gn_crossmap/column_collector.rb, line 51
def assemble_species_name(name, name_rank)
  ending = [add_infrarank(name, name_rank), @row[:scientificnameauthorship]]
  ranks = SPECIES_RANKS[0...SPECIES_RANKS.index(name_rank)]
  starting = name_start(ranks)
  (starting + ending).flatten.join(" ").strip.gsub(/\s+/, " ")
end
find_rank() click to toggle source
# File lib/gn_crossmap/column_collector.rb, line 32
def find_rank
  name_rank = nil
  RANKS.reverse_each do |rank|
    next if @row[rank].to_s.strip == ""
    name_rank = rank
    break
  end
  name_rank
end
name_start(ranks) click to toggle source
# File lib/gn_crossmap/column_collector.rb, line 58
def name_start(ranks)
  ranks.each_with_object([]) do |rank, ary|
    next unless @row[rank]
    ary << add_infrarank(@row[rank], rank)
  end
end