CLOSER-Cohorts/archivist

View on GitHub
lib/importers/txt/mapper/dv.rb

Summary

Maintainability
B
5 hrs
Test Coverage
class Importers::TXT::Mapper::DV < Importers::TXT::Mapper::Dataset
  def import(options = {})
    set_import_to_running
    vars = @object.variables.includes(:questions, :src_variables, :der_variables, :topic)
    begin
        @doc.each do |variable_dataset, v, source_dataset, s|
          log :input, "#{variable_dataset},#{v},#{source_dataset},#{s}"
          begin
            if variable_dataset.blank? || source_dataset.blank? || v.blank? || s.blank?
              raise StandardError.new(I18n.t('importers.txt.mapper.dv.wrong_number_of_columns', actual_number_of_columns: {a: source_dataset, b: variable_dataset, c: v, d: s}.compact.count))
            elsif variable_dataset != @object.instance_name
              raise StandardError.new(I18n.t('importers.txt.mapper.dv.record_invalid_dataset', dataset_from_line: variable_dataset, dataset_from_object: @object.instance_name))
            end
            var = vars.find_by_name v
            src = vars.find_by_name s
            log :matches, "matched to Variable (#{var}) AND Source (#{src})"

            if var.blank?
              @errors = true
              log :outcome, I18n.t('importers.txt.mapper.dv.no_variable_found')
            elsif src.blank?
              @errors = true
              log :outcome, I18n.t('importers.txt.mapper.dv.no_source_found')
            else
              var.var_type = 'Derived'
              var.src_variables << src
              if var.save
                log :outcome, "Record Saved"
              else
                @errors = true
                log :outcome, "Record Invalid : #{var.errors.full_messages.to_sentence}"
              end
            end
          rescue StandardError => e
            @errors = true
            log :outcome, (e.message =~ /Record Invalid/) ? e.message : "Record Invalid : #{e.message}"
          ensure
            write_to_log
          end
        end
    rescue => exception
      Rails.logger.info exception.message
      Rails.logger.info exception.backtrace
      @errors = true
      log :outcome, (exception.message =~ /Record Invalid/) ? exception.message : "Record Invalid : #{exception.message}"      
      set_import_to_finished
      raise # always reraise
    end
    set_import_to_finished
  end
end