module Taxonifi::Assessor::RowAssessor

Code to assess the metadata properties of a csv row.

!! Note that there are various !! CSV methods for returning row columns !! that have particular attributes

Public Class Methods

first_available(csv_row, lump = nil) click to toggle source

Return the first column with data, scoped by lump if provided.

# File lib/assessor/row_assessor.rb, line 27
def self.first_available(csv_row, lump = nil)
  if lump.nil?
    csv_row.entries.each do |c,v| 
      return [c,v] if !csv_row[c].nil?
    end
  else
    lump.each do |l|
      return [l, csv_row[l.to_s]] if !csv_row[l.to_s].nil?
    end
  end
end
geog_headers(headers) click to toggle source

Return an Array of headers that represent geographic columns.

# File lib/assessor/row_assessor.rb, line 90
def self.geog_headers(headers)
  Taxonifi::Lumper::LUMPS[:basic_geog] & headers
end
intersecting_lumps_with_data(row, lumps_to_try = nil) click to toggle source

Return lumps for which at least one column has data.

# File lib/assessor/row_assessor.rb, line 95
def self.intersecting_lumps_with_data(row, lumps_to_try = nil)
  lumps_to_try ||= Taxonifi::Lumper::LUMPS.keys 
  lumps = [] 
  lumps_to_try.each do |l|  
    has_data = false 
    Taxonifi::Lumper::LUMPS[l].each do |c|
      if !row[c].nil? && !row[c].empty?
        has_data = true 
        break
      end
    end
    has_data && lumps.push(l) 
  end
  lumps
end
last_available(csv_row, lump = nil) click to toggle source

Return the last column with data, scoped by lump if provided.

# File lib/assessor/row_assessor.rb, line 40
def self.last_available(csv_row, lump = nil)
  if lump.nil?
    csv_row.entries.reverse.each do |c,v| 
      return [c,v] if !csv_row[c].nil?
    end
  else
    lump.reverse.each do |l|
      return [l, csv_row[l.to_s]] if !csv_row[l.to_s].nil?
    end
  end
end
lump_name_rank(csv_row) click to toggle source

Return the rank (symbol) of the taxon name rank. Raises if no name detected.

# File lib/assessor/row_assessor.rb, line 54
def self.lump_name_rank(csv_row)
  lumps = Taxonifi::Lumper.available_lumps(csv_row.headers)        
  if lumps.include?(:species) # has to be a species name
    if csv_row[:subspecies].nil?
      return :species
    else
      return :subspecies
    end
  elsif lumps.include?(:genera)
    if csv_row[:subgenus].nil?
      return :genus
    else
      return :subgenus
    end
  else
    return Taxonifi::Assessor::RowAssessor.last_available(csv_row, Taxonifi::Lumper::LUMPS[:higher]).first.to_sym
  end

  # this far? bad
  raise RowAssessor::RowAssessorError
end
lumps_with_data(row, lumps_to_try = nil) click to toggle source

Return lumps that have data for all columns.

# File lib/assessor/row_assessor.rb, line 112
def self.lumps_with_data(row, lumps_to_try = nil)
  lumps_to_try ||= Taxonifi::Lumper::LUMPS.keys 
  lumps = [] 
  lumps_to_try.each do |l|  
    has_data = true 
    Taxonifi::Lumper::LUMPS[l].each do |c|
      if row[c].nil? || row[c].empty?
        has_data = false 
        break
      end
    end
    has_data && lumps.push(l) 
  end
  lumps
end
parent_taxon_column(csv_row) click to toggle source

Return the column representing the parent of the name represented in this row.

# File lib/assessor/row_assessor.rb, line 78
def self.parent_taxon_column(csv_row)
  lumps = Taxonifi::Lumper.available_lumps(csv_row.headers)
  last = last_available(csv_row, Taxonifi::RANKS)
  last_available(csv_row, Taxonifi::RANKS[0..Taxonifi::RANKS.index(last[0])-1])
end
rank_headers(headers) click to toggle source

Return an Array of headers that represent taxonomic ranks.

# File lib/assessor/row_assessor.rb, line 85
def self.rank_headers(headers)
  Taxonifi::RANKS & headers
end