class Spout::Commands::Coverage

Generate a coverage report for the data dictionary.

Public Class Methods

new(standard_version, argv) click to toggle source
# File lib/spout/commands/coverage.rb, line 19
def initialize(standard_version, argv)
  @standard_version = standard_version
  @console = !argv.delete("--console").nil?
  @variable_files = Dir.glob("variables/**/*.json")
  @valid_ids = []
  @number_of_rows = nil
  @config = Spout::Helpers::ConfigReader.new
  @subject_loader = Spout::Helpers::SubjectLoader.new(
    @variable_files, @valid_ids, @standard_version, @number_of_rows, @config.visit
  )
  @subject_loader.load_subjects_from_csvs_part_one! # Not Part Two which is essentially cleaning the data
  @subjects = @subject_loader.subjects
  run_coverage_report!
end

Public Instance Methods

run_coverage_report!() click to toggle source
# File lib/spout/commands/coverage.rb, line 34
def run_coverage_report!
  puts "Generating: index.html\n\n"
  @matching_results = []
  @subject_loader.all_methods.each do |method, csv_files|
    scr = Spout::Models::CoverageResult.new(method, @subjects.collect(&method.to_sym).compact_empty.uniq)
    @matching_results << [csv_files, method, scr]
  end
  variable_ids = Dir.glob("variables/**/*.json").collect { |file| file.gsub(%r{^(.*)/|\.json$}, "").downcase }
  @extra_variable_ids = (variable_ids - @subject_loader.all_methods.keys).sort
  @subject_loader.load_variable_domains!
  domain_ids = Dir.glob("domains/**/*.json").collect { |file| file.gsub(%r{^(.*)/|\.json$}, "").downcase }
  @extra_domain_ids = (domain_ids - @subject_loader.all_domains).sort
  @matching_results.sort! do |a, b|
    [b[2].number_of_errors, a[0].to_s, a[1].to_s] <=> [a[2].number_of_errors, b[0].to_s, b[1].to_s]
  end
  @coverage_results = []
  @subject_loader.csv_files.each do |csv_file|
    total_column_count = @matching_results.select { |mr| mr[0].include?(csv_file) }.count
    mapped_column_count = @matching_results
                          .select { |mr| mr[0].include?(csv_file) && mr[2].number_of_errors.zero? }.count
    @coverage_results << [csv_file, total_column_count, mapped_column_count]
  end
  coverage_folder = File.join(Dir.pwd, "coverage")
  FileUtils.mkpath coverage_folder
  coverage_file = File.join(coverage_folder, "index.html")
  File.open(coverage_file, "w+") do |file|
    erb_location = File.join(File.dirname(__FILE__), "../views/index.html.erb")
    file.puts ERB.new(File.read(erb_location)).result(binding)
  end
  unless @console
    open_command = "open" unless RUBY_PLATFORM.match(/darwin/).nil?
    open_command = "start" unless RUBY_PLATFORM.match(/mingw/).nil?
    system "#{open_command} #{coverage_file}" if %w(start open).include?(open_command)
  end
  puts "#{coverage_file}\n\n"
end