class Libis::Metadata::Mapper

New style parsers and converters for metadata. New, not finished and untested.

Attributes

format_parser[R]
mapping[R]
selection_parser[R]
tables[R]
target_parser[R]

Public Class Methods

new(selection_parser, target_parser, format_parser, config_xlsx) click to toggle source
# File lib/libis/metadata/mapper.rb, line 18
def initialize(selection_parser, target_parser, format_parser, config_xlsx)
  @selection_parser = selection_parser
  @target_parser = target_parser
  @format_parser = format_parser
  @mapping = []
  @tables = {}
  doc = SimpleXlsxReader.open(config_xlsx)
  doc.sheets.each do |sheet|
    if sheet.name == 'Mapping'
      mapping = sheet_to_hash(sheet)
      mapping.each do |rule|
        # noinspection RubyStringKeysInHashInspection
        @mapping << {
            'Selection' => begin
              selection_parser.parse(rule['Selection'])
            rescue Parslet::ParseFailed => error
              puts "Error parsing '#{rule['Selection']}'"
              puts error.cause.ascii_tree
            end,
            'Target' => begin
              target_parser.parse(rule['Target'])
            rescue Parslet::ParseFailed => error
              puts "Error parsing '#{rule['Target']}'"
              puts error.cause.ascii_tree
            end,
            'Format' => begin
              format_parser.parse(rule['Format'])
            rescue Parslet::ParseFailed => error
              puts "Error parsing '#{rule['Format']}'"
              puts error.cause.ascii_tree
            end,
        }
      end
    else
      @tables[sheet.name] = sheet_to_hash(sheet)
    end
  end
  if @mapping.empty?
    raise RuntimeError, "Failure: config file '#{config_xlsx}' does not contain a 'Mapping' sheet."
  end
end

Private Instance Methods

lookup(table, key, constraints = {}) click to toggle source
# File lib/libis/metadata/mapper.rb, line 74
def lookup(table, key, constraints = {})
  @tables[table].select {|value| constraints.map {|k, v| value[k] == v}.all?}.map {|v| v[key]}
end
sheet_to_hash(sheet) click to toggle source
# File lib/libis/metadata/mapper.rb, line 62
def sheet_to_hash(sheet)
  data = sheet.rows
  header = data.shift
  result = []
  data.each do |row|
    x = {}
    header.each_with_index {|col_name, col_index| x[col_name] = row[col_index]}
    result << x
  end
  result
end