features/support/load_tests.rb in csvlint-1.0.0 vs features/support/load_tests.rb in csvlint-1.1.0

- old
+ new

@@ -1,119 +1,123 @@ -require 'json' -require 'open-uri' -require 'uri' +require "json" +require "open-uri" +require "uri" BASE_URI = "https://w3c.github.io/csvw/tests/" BASE_PATH = File.join(File.dirname(__FILE__), "..", "fixtures", "csvw") FEATURE_BASE_PATH = File.join(File.dirname(__FILE__), "..") VALIDATION_FEATURE_FILE_PATH = File.join(FEATURE_BASE_PATH, "csvw_validation_tests.feature") SCRIPT_FILE_PATH = File.join(File.dirname(__FILE__), "..", "..", "bin", "run-csvw-tests") Dir.mkdir(BASE_PATH) unless Dir.exist?(BASE_PATH) def cache_file(filename) - file = File.join(BASE_PATH, filename) - uri = URI.join(BASE_URI, filename) - unless File.exist?(file) - if filename.include? "/" - levels = filename.split("/")[0..-2] - for i in 0..levels.length - dir = File.join(BASE_PATH, levels[0..i].join("/")) - Dir.mkdir(dir) unless Dir.exist?(dir) - end - end - STDERR.puts("storing #{file} locally") - File.open(file, 'wb') do |f| - f.puts URI.open(uri, 'rb').read - end - end - return uri, file + file = File.join(BASE_PATH, filename) + uri = URI.join(BASE_URI, filename) + unless File.exist?(file) + if filename.include? "/" + levels = filename.split("/")[0..-2] + for i in 0..levels.length + dir = File.join(BASE_PATH, levels[0..i].join("/")) + Dir.mkdir(dir) unless Dir.exist?(dir) + end + end + warn("storing #{file} locally") + File.open(file, "wb") do |f| + f.puts URI.open(uri, "rb").read + end + end + [uri, file] end -File.open(SCRIPT_FILE_PATH, 'w') do |file| - File.chmod(0755, SCRIPT_FILE_PATH) - manifest = JSON.parse( URI.open("#{BASE_URI}manifest-validation.jsonld").read ) - manifest["entries"].each do |entry| - type = "valid" - case entry["type"] - when "csvt:WarningValidationTest" - type = "warnings" - when "csvt:NegativeValidationTest" - type = "errors" - end - file.puts "echo \"#{entry["id"].split("#")[-1]}: #{entry["name"].gsub("`", "'")}\"" - file.puts "echo \"#{type}: #{entry["comment"].gsub("\"", "\\\"").gsub("`", "'")}\"" - if entry["action"].end_with?(".json") - file.puts "csvlint --schema=features/fixtures/csvw/#{entry["action"]}" - elsif entry["option"] && entry["option"]["metadata"] - file.puts "csvlint features/fixtures/csvw/#{entry["action"]} --schema=features/fixtures/csvw/#{entry["option"]["metadata"]}" - else - file.puts "csvlint features/fixtures/csvw/#{entry["action"]}" - end - file.puts "echo" - end -end unless File.exist? SCRIPT_FILE_PATH +unless File.exist? SCRIPT_FILE_PATH + File.open(SCRIPT_FILE_PATH, "w") do |file| + File.chmod(0o755, SCRIPT_FILE_PATH) + manifest = JSON.parse(URI.open("#{BASE_URI}manifest-validation.jsonld").read) + manifest["entries"].each do |entry| + type = "valid" + case entry["type"] + when "csvt:WarningValidationTest" + type = "warnings" + when "csvt:NegativeValidationTest" + type = "errors" + end + file.puts "echo \"#{entry["id"].split("#")[-1]}: #{entry["name"].tr("`", "'")}\"" + file.puts "echo \"#{type}: #{entry["comment"].gsub("\"", "\\\"").tr("`", "'")}\"" + if entry["action"].end_with?(".json") + file.puts "csvlint --schema=features/fixtures/csvw/#{entry["action"]}" + elsif entry["option"] && entry["option"]["metadata"] + file.puts "csvlint features/fixtures/csvw/#{entry["action"]} --schema=features/fixtures/csvw/#{entry["option"]["metadata"]}" + else + file.puts "csvlint features/fixtures/csvw/#{entry["action"]}" + end + file.puts "echo" + end + end +end -File.open(VALIDATION_FEATURE_FILE_PATH, 'w') do |file| - file.puts "# Auto-generated file based on standard validation CSVW tests from #{BASE_URI}manifest-validation.jsonld" - file.puts "" +unless File.exist? VALIDATION_FEATURE_FILE_PATH + File.open(VALIDATION_FEATURE_FILE_PATH, "w") do |file| + file.puts "# Auto-generated file based on standard validation CSVW tests from #{BASE_URI}manifest-validation.jsonld" + file.puts "" - manifest = JSON.parse( URI.open("#{BASE_URI}manifest-validation.jsonld").read ) + manifest = JSON.parse(URI.open("#{BASE_URI}manifest-validation.jsonld").read) - file.puts "Feature: #{manifest["label"]}" - file.puts "" + file.puts "Feature: #{manifest["label"]}" + file.puts "" - manifest["entries"].each do |entry| - action_uri, action_file = cache_file(entry["action"]) - metadata = nil - provided_files = [] - missing_files = [] - file.puts "\t# #{entry["id"]}" - file.puts "\t# #{entry["comment"]}" - file.puts "\tScenario: #{entry["id"]} #{entry["name"].gsub("<", "less than")}" - if entry["action"].end_with?(".json") - file.puts "\t\tGiven I have a metadata file called \"csvw/#{entry["action"]}\"" - file.puts "\t\tAnd the metadata is stored at the url \"#{action_uri}\"" - else - file.puts "\t\tGiven I have a CSV file called \"csvw/#{entry["action"]}\"" - file.puts "\t\tAnd it has a Link header holding \"#{entry["httpLink"]}\"" if entry["httpLink"] - file.puts "\t\tAnd it is stored at the url \"#{action_uri}\"" - if entry["option"] && entry["option"]["metadata"] - # no need to store the file here, as it will be listed in the 'implicit' list, which all get stored - metadata = URI.join(BASE_URI, entry["option"]["metadata"]) - file.puts "\t\tAnd I have a metadata file called \"csvw/#{entry["option"]["metadata"]}\"" - file.puts "\t\tAnd the metadata is stored at the url \"#{metadata}\"" - end - provided_files << action_uri.to_s - if entry["name"].include?("/.well-known/csvm") - file.puts "\t\tAnd I have a file called \"w3.org/.well-known/csvm\" at the url \"https://www.w3.org/.well-known/csvm\"" - missing_files << "#{action_uri}.json" - missing_files << URI.join(action_uri, 'csvm.json').to_s - else - missing_files << URI.join(action_uri, '/.well-known/csvm').to_s - end - missing_files << "#{action_uri}-metadata.json" - missing_files << URI.join(action_uri, 'csv-metadata.json').to_s - end - entry["implicit"].each do |implicit| - implicit_uri, implicit_file = cache_file(implicit) - provided_files << implicit_uri.to_s - unless implicit_uri == metadata - file.puts "\t\tAnd I have a file called \"csvw/#{implicit}\" at the url \"#{implicit_uri}\"" - end - end if entry["implicit"] - missing_files.each do |uri| - file.puts "\t\tAnd there is no file at the url \"#{uri}\"" unless provided_files.include? uri - end - file.puts "\t\tWhen I carry out CSVW validation" - if entry["type"] == "csvt:WarningValidationTest" - file.puts "\t\tThen there should not be errors" - file.puts "\t\tAnd there should be warnings" - elsif entry["type"] == "csvt:NegativeValidationTest" - file.puts "\t\tThen there should be errors" - else - file.puts "\t\tThen there should not be errors" - file.puts "\t\tAnd there should not be warnings" - end - file.puts "\t" - end -end unless File.exist? VALIDATION_FEATURE_FILE_PATH + manifest["entries"].each do |entry| + action_uri, action_file = cache_file(entry["action"]) + metadata = nil + provided_files = [] + missing_files = [] + file.puts "\t# #{entry["id"]}" + file.puts "\t# #{entry["comment"]}" + file.puts "\tScenario: #{entry["id"]} #{entry["name"].gsub("<", "less than")}" + if entry["action"].end_with?(".json") + file.puts "\t\tGiven I have a metadata file called \"csvw/#{entry["action"]}\"" + file.puts "\t\tAnd the metadata is stored at the url \"#{action_uri}\"" + else + file.puts "\t\tGiven I have a CSV file called \"csvw/#{entry["action"]}\"" + file.puts "\t\tAnd it has a Link header holding \"#{entry["httpLink"]}\"" if entry["httpLink"] + file.puts "\t\tAnd it is stored at the url \"#{action_uri}\"" + if entry["option"] && entry["option"]["metadata"] + # no need to store the file here, as it will be listed in the 'implicit' list, which all get stored + metadata = URI.join(BASE_URI, entry["option"]["metadata"]) + file.puts "\t\tAnd I have a metadata file called \"csvw/#{entry["option"]["metadata"]}\"" + file.puts "\t\tAnd the metadata is stored at the url \"#{metadata}\"" + end + provided_files << action_uri.to_s + if entry["name"].include?("/.well-known/csvm") + file.puts "\t\tAnd I have a file called \"w3.org/.well-known/csvm\" at the url \"https://www.w3.org/.well-known/csvm\"" + missing_files << "#{action_uri}.json" + missing_files << URI.join(action_uri, "csvm.json").to_s + else + missing_files << URI.join(action_uri, "/.well-known/csvm").to_s + end + missing_files << "#{action_uri}-metadata.json" + missing_files << URI.join(action_uri, "csv-metadata.json").to_s + end + entry["implicit"]&.each do |implicit| + implicit_uri, implicit_file = cache_file(implicit) + provided_files << implicit_uri.to_s + unless implicit_uri == metadata + file.puts "\t\tAnd I have a file called \"csvw/#{implicit}\" at the url \"#{implicit_uri}\"" + end + end + missing_files.each do |uri| + file.puts "\t\tAnd there is no file at the url \"#{uri}\"" unless provided_files.include? uri + end + file.puts "\t\tWhen I carry out CSVW validation" + if entry["type"] == "csvt:WarningValidationTest" + file.puts "\t\tThen there should not be errors" + file.puts "\t\tAnd there should be warnings" + elsif entry["type"] == "csvt:NegativeValidationTest" + file.puts "\t\tThen there should be errors" + else + file.puts "\t\tThen there should not be errors" + file.puts "\t\tAnd there should not be warnings" + end + file.puts "\t" + end + end +end