class Roqua::CsvExport::CsvExportQuestionnaireVersion

Used to write a single csv file for one export_version of one questionnaire.

Attributes

config[R]
export_version_key[R]
export_version_mapping[R]
file[R]

Public Class Methods

new(export_version_key, export_version_mapping:, config:) click to toggle source

@param export_version_key [String] used to build directory name. @param export_version_mapping [Array<Hash>] Information on each column for the csv file in order. @param config [Config] @see ExportVersions#[] ExportsVersions for format of mapping.

# File lib/roqua/csv_export/csv_export_questionnaire_version.rb, line 42
def initialize(export_version_key, export_version_mapping:, config:)
  @config = config
  @export_version_key = export_version_key
  @export_version_mapping = export_version_mapping
end
open(*args) click to toggle source

Creates new object with given params and calls open on it. @return [CsvExportQuestionnaireVersion]

# File lib/roqua/csv_export/csv_export_questionnaire_version.rb, line 32
def self.open(*args)
  self.new(*args).tap do |questionnaire_version|
    questionnaire_version.open
  end
end
with_versions_for(questionnaire_key, config) { |versions| ... } click to toggle source

For each version in export_versions, call {.open}, yield the instances and {#close} them.

@yield [questionnaire_versions] @yieldparam version [Array<CsvExportQuestionnaireVersion>] @return [void]

# File lib/roqua/csv_export/csv_export_questionnaire_version.rb, line 14
def self.with_versions_for(questionnaire_key, config)
  versions = config.export_versions.keys.map do |export_version_key|
    open export_version_key,
         export_version_mapping: config.export_versions.mapping_for(questionnaire_key, export_version_key),
         config: config
  end.compact

  yield versions

ensure

  versions&.each do |version|
    version.close
  end
end

Public Instance Methods

close() click to toggle source

close the file. @return [void]

# File lib/roqua/csv_export/csv_export_questionnaire_version.rb, line 66
def close
  file.close
end
open() click to toggle source

opens file to write and writes headers to it. @return [void]

# File lib/roqua/csv_export/csv_export_questionnaire_version.rb, line 50
def open
  `mkdir -p #{export_version_path}`
  @file = CSV.open(csv_path, "w", col_sep: ';', force_quotes: true)
  @file << export_version_mapping.map { |column| column['header'] }
end
write_response(response) click to toggle source

write the respomse to the file in the format of export_version @param response [Models::Response]

# File lib/roqua/csv_export/csv_export_questionnaire_version.rb, line 58
def write_response(response)
  file << export_version_mapping \
            .map { |column| get_value(column, response) }
            .map { |value| format(value) }
end

Private Instance Methods

csv_path() click to toggle source
# File lib/roqua/csv_export/csv_export_questionnaire_version.rb, line 80
def csv_path
  # find questionnaire key for the export_version (should be added explicitly to export_version json)
  path_key = export_version_mapping.find{ |m| m['key'] == 'completed_at'}['header'][0..-14]
  export_version_path.join("#{path_key}_#{Time.now.strftime("%Y-%m-%d")}.csv")
end
export_version_path() click to toggle source
# File lib/roqua/csv_export/csv_export_questionnaire_version.rb, line 76
def export_version_path
  config.output_path.join("#{config.organization_key}_#{export_version_key}")
end
format(value) click to toggle source
# File lib/roqua/csv_export/csv_export_questionnaire_version.rb, line 96
def format(value)
  case value
  when Time, Date, DateTime
    value.strftime("%d-%m-%Y %H:%M:%S")
  when Hash
    value.to_json
  when String
    value.tr("\r\n", ' ')
  else
    value
  end
end
get_value(column, response) click to toggle source
# File lib/roqua/csv_export/csv_export_questionnaire_version.rb, line 86
def get_value(column, response)
  case column['source_type']
  when 'metadata' then MetaData.send(column['key'], response)
  when 'variable' then response.variable(column['key'])
  when 'score'    then response.score(column['key'], column['sub_key'])
  when 'flag'     then response.flag(column['key']) == '1' ? 'true' : ''
  when 'textvar'  then response.textvar(column['key'])
  end
end