lib/spout/tasks/engine.rake in spout-0.8.0.beta10 vs lib/spout/tasks/engine.rake in spout-0.8.0.beta11

- old
+ new

@@ -7,198 +7,5 @@ t.warning = true t.verbose = true end task default: :test - -namespace :spout do - require 'csv' - require 'fileutils' - require 'rubygems' - require 'json' - require 'erb' - - desc 'Create Data Dictionary from repository' - task :create do - folder = "dd/#{ENV['VERSION'] || standard_version}" - puts " create".colorize( :green ) + " #{folder}" - FileUtils.mkpath folder - - expanded_export(folder) - end - - desc 'Initialize JSON repository from a CSV file: CSV=datadictionary.csv' - task :import do - puts ENV['CSV'].inspect - if File.exists?(ENV['CSV'].to_s) - ENV['TYPE'] == 'domains' ? import_domains : import_variables - else - puts "\nPlease specify a valid CSV file.".colorize( :red ) + additional_csv_info - end - end - - desc 'Match CSV dataset with JSON repository' - task :coverage do - require 'spout/commands/coverage' - Spout::Commands::Coverage.new(standard_version) - end - - desc 'Identify Outliers in CSV dataset' - task :outliers do - require 'spout/commands/outliers' - outliers = Spout::Commands::Outliers.new(standard_version) - outliers.run_outliers_report! - end - - desc 'Match CSV dataset with JSON repository' - task :images do - require 'spout/commands/images' - types = ENV['types'].to_s.split(',').collect{|t| t.to_s.downcase} - variable_ids = ENV['variable_ids'].to_s.split(',').collect{|vid| vid.to_s.downcase} - sizes = ENV['sizes'].to_s.split(',').collect{|s| s.to_s.downcase} - Spout::Commands::Images.new(types, variable_ids, sizes, standard_version) - end - - desc 'Generate JSON charts and tables' - task :json do - require 'spout/commands/graphs' - variables = ENV['variables'].to_s.split(',').collect{|s| s.to_s.downcase} - Spout::Commands::Graphs.new(variables, standard_version) - end - -end - -def number_with_delimiter(number, delimiter = ",") - number.to_s.gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{delimiter}") -end - -def standard_version - version = File.open('VERSION', &:readline).strip rescue '' - version == '' ? '1.0.0' : version -end - -def expanded_export(folder) - variables_export_file = "variables.csv" - puts " export".colorize( :blue ) + " #{folder}/#{variables_export_file}" - CSV.open("#{folder}/#{variables_export_file}", "wb") do |csv| - keys = %w(id display_name description type units domain labels calculation) - csv << ['folder'] + keys - Dir.glob("variables/**/*.json").each do |file| - if json = JSON.parse(File.read(file)) rescue false - variable_folder = variable_folder_path(file) - csv << [variable_folder] + keys.collect{|key| json[key].kind_of?(Array) ? json[key].join(';') : json[key].to_s} - end - end - end - domains_export_file = "domains.csv" - puts " export".colorize( :blue ) + " #{folder}/#{domains_export_file}" - CSV.open("#{folder}/#{domains_export_file}", "wb") do |csv| - keys = %w(value display_name description) - csv << ['folder', 'domain_id'] + keys - Dir.glob("domains/**/*.json").each do |file| - if json = JSON.parse(File.read(file)) rescue false - domain_folder = domain_folder_path(file) - domain_name = extract_domain_name(file) - json.each do |hash| - csv << [domain_folder, domain_name] + keys.collect{|key| hash[key]} - end - end - end - end -end - -def extract_domain_name(file) - file.gsub(/domains\//, '').split('/').last.to_s.gsub(/.json/, '') -end - -def domain_folder_path(file) - file.gsub(/domains\//, '').split('/')[0..-2].join('/') -end - -def variable_folder_path(file) - file.gsub(/variables\//, '').split('/')[0..-2].join('/') -end - -def import_variables - CSV.parse( File.open(ENV['CSV'].to_s, 'r:iso-8859-1:utf-8'){|f| f.read}, headers: true ) do |line| - row = line.to_hash - if not row.keys.include?('id') - puts "\nMissing column header `".colorize( :red ) + "id".colorize( :light_cyan ) + "` in data dictionary.".colorize( :red ) + additional_csv_info - exit(1) - end - next if row['id'] == '' - folder = File.join('variables', row.delete('folder').to_s) - FileUtils.mkpath folder - hash = {} - id = row.delete('id') - hash['id'] = id - hash['display_name'] = row.delete('display_name') - hash['description'] = row.delete('description').to_s - hash['type'] = row.delete('type') - domain = row.delete('domain').to_s - hash['domain'] = domain if domain != '' - units = row.delete('units').to_s - hash['units'] = units if units != '' - calculation = row.delete('calculation').to_s - hash['calculation'] = calculation if calculation != '' - labels = row.delete('labels').to_s.split(';') - hash['labels'] = labels if labels.size > 0 - hash['other'] = row unless row.empty? - - file_name = File.join(folder, id.to_s.downcase + '.json') - File.open(file_name, 'w') do |file| - file.write(JSON.pretty_generate(hash) + "\n") - end - puts " create".colorize( :green ) + " #{file_name}" - end -end - -def import_domains - domains = {} - - CSV.parse( File.open(ENV['CSV'].to_s, 'r:iso-8859-1:utf-8'){|f| f.read}, headers: true ) do |line| - row = line.to_hash - if not row.keys.include?('domain_id') - puts "\nMissing column header `".colorize( :red ) + "domain_id".colorize( :light_cyan ) + "` in data dictionary.".colorize( :red ) + additional_csv_info - exit(1) - end - if not row.keys.include?('value') - puts "\nMissing column header `".colorize( :red ) + "value".colorize( :light_cyan ) + "` in data dictionary.".colorize( :red ) + additional_csv_info - exit(1) - end - if not row.keys.include?('display_name') - puts "\nMissing column header `".colorize( :red ) + "display_name".colorize( :light_cyan ) + "` in data dictionary.".colorize( :red ) + additional_csv_info - exit(1) - end - - next if row['domain_id'].to_s == '' or row['value'].to_s == '' or row['display_name'].to_s == '' - folder = File.join('domains', row['folder'].to_s).gsub(/[^a-zA-Z0-9_\/\.-]/, '_') - domain_name = row['domain_id'].to_s.gsub(/[^a-zA-Z0-9_\/\.-]/, '_') - domains[domain_name] ||= {} - domains[domain_name]["folder"] = folder - domains[domain_name]["options"] ||= [] - - hash = {} - hash['value'] = row.delete('value').to_s - hash['display_name'] = row.delete('display_name').to_s - hash['description'] = row.delete('description').to_s - - domains[domain_name]["options"] << hash - end - - domains.each do |domain_name, domain_hash| - folder = domain_hash["folder"] - FileUtils.mkpath folder - - file_name = File.join(folder, domain_name.to_s.downcase + '.json') - - File.open(file_name, 'w') do |file| - file.write(JSON.pretty_generate(domain_hash["options"]) + "\n") - end - puts " create".colorize( :green ) + " #{file_name}" - end - -end - -def additional_csv_info - "\n\nFor additional information on specifying CSV column headers before import see:\n\n " + "https://github.com/sleepepi/spout#generate-a-new-repository-from-an-existing-csv-file".colorize( :light_cyan ) + "\n\n" -end