lib/dwc_archive/generator.rb
# frozen_string_literal: true
class DarwinCore
# Creates csv files for core and extensions
class Generator
attr_reader :eml_xml_data, :path
def initialize(dwc_path, tmp_dir = DEFAULT_TMP_DIR)
@dwc_path = dwc_path
@path = DarwinCore.random_path(tmp_dir)
FileUtils.mkdir(@path)
@meta_xml_data = { extensions: [] }
@eml_xml_data = { id: nil, title: nil, authors: [], abstrac: nil,
citation: nil, url: nil }
@write = 'w:utf-8'
end
def clean
DarwinCore.clean(@path)
end
def add_core(data, file_name, keep_headers = true)
opts = { type: 'core', data: data, file_name: file_name,
keep_headers: keep_headers }
prepare_csv_file(opts)
end
def add_extension(data, file_name, keep_headers = true,
row_type = 'http://rs.tdwg.org/dwc/terms/Taxon')
opts = { type: 'extension', data: data, file_name: file_name,
keep_headers: keep_headers, row_type: row_type }
prepare_csv_file(opts)
end
def add_meta_xml
meta = DarwinCore::Generator::MetaXml.new(@meta_xml_data, @path)
meta.create
end
def add_eml_xml(data)
@eml_xml_data = data
eml = DarwinCore::Generator::EmlXml.new(@eml_xml_data, @path)
eml.create
end
def files
DarwinCore.files(@path)
end
def pack
a = "cd #{@path}; tar -zcf #{@dwc_path} *"
system(a)
end
private
def prepare_csv_file(opts)
c = CSV.open(File.join(@path, opts[:file_name]), @write)
attributes = prepare_attributes(opts)
if opts[:type] == 'core'
@meta_xml_data[:core] = attributes
else
@meta_xml_data[:extensions] << attributes
end
opts[:data].each { |d| c << d }
c.close
end
def prepare_attributes(opts)
header = opts[:data].shift
fields = init_fields(header, opts[:type])
opts[:data].unshift(fields) if opts[:keep_headers]
ignore_header_lines = opts[:keep_headers] ? 1 : 0
res = { fields: header, ignoreHeaderLines: ignore_header_lines,
location: opts[:file_name] }
res[:rowType] = opts[:row_type] if opts[:row_type]
res
end
def init_fields(header, file_type)
header.map do |f|
f = f.strip
err = "No header in #{file_type} data, or header fields are not urls"
raise DarwinCore::GeneratorError, err unless f =~ %r{^http://}
f.split('/')[-1]
end
end
end
end