csvlint 0.4.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. checksums.yaml +5 -5
  2. data/.github/dependabot.yml +11 -0
  3. data/.github/workflows/push.yml +35 -0
  4. data/.gitignore +1 -0
  5. data/.ruby-version +1 -1
  6. data/.standard_todo.yml +43 -0
  7. data/CHANGELOG.md +38 -0
  8. data/Dockerfile +16 -0
  9. data/Gemfile +2 -2
  10. data/README.md +13 -10
  11. data/Rakefile +7 -7
  12. data/bin/create_schema +2 -2
  13. data/csvlint.gemspec +19 -22
  14. data/docker_notes_for_windows.txt +20 -0
  15. data/features/step_definitions/cli_steps.rb +11 -11
  16. data/features/step_definitions/information_steps.rb +4 -4
  17. data/features/step_definitions/parse_csv_steps.rb +11 -11
  18. data/features/step_definitions/schema_validation_steps.rb +10 -10
  19. data/features/step_definitions/sources_steps.rb +1 -1
  20. data/features/step_definitions/validation_errors_steps.rb +19 -19
  21. data/features/step_definitions/validation_info_steps.rb +9 -9
  22. data/features/step_definitions/validation_warnings_steps.rb +11 -11
  23. data/features/support/aruba.rb +10 -9
  24. data/features/support/earl_formatter.rb +39 -39
  25. data/features/support/env.rb +10 -11
  26. data/features/support/load_tests.rb +109 -105
  27. data/features/support/webmock.rb +3 -1
  28. data/lib/csvlint/cli.rb +136 -142
  29. data/lib/csvlint/csvw/column.rb +279 -280
  30. data/lib/csvlint/csvw/date_format.rb +90 -92
  31. data/lib/csvlint/csvw/metadata_error.rb +1 -3
  32. data/lib/csvlint/csvw/number_format.rb +40 -32
  33. data/lib/csvlint/csvw/property_checker.rb +714 -717
  34. data/lib/csvlint/csvw/table.rb +49 -52
  35. data/lib/csvlint/csvw/table_group.rb +24 -23
  36. data/lib/csvlint/error_collector.rb +2 -0
  37. data/lib/csvlint/error_message.rb +0 -1
  38. data/lib/csvlint/field.rb +153 -141
  39. data/lib/csvlint/schema.rb +35 -43
  40. data/lib/csvlint/validate.rb +173 -151
  41. data/lib/csvlint/version.rb +1 -1
  42. data/lib/csvlint.rb +22 -23
  43. data/spec/csvw/column_spec.rb +15 -16
  44. data/spec/csvw/date_format_spec.rb +5 -7
  45. data/spec/csvw/number_format_spec.rb +2 -4
  46. data/spec/csvw/table_group_spec.rb +103 -105
  47. data/spec/csvw/table_spec.rb +71 -73
  48. data/spec/field_spec.rb +116 -121
  49. data/spec/schema_spec.rb +131 -141
  50. data/spec/spec_helper.rb +6 -6
  51. data/spec/validator_spec.rb +167 -203
  52. metadata +41 -85
  53. data/.travis.yml +0 -37
@@ -1,22 +1,22 @@
1
1
  Given(/^I ask if there are info messages$/) do
2
2
  @csv_options ||= default_csv_options
3
-
3
+
4
4
  if @schema_json
5
- if @schema_type == :json_table
6
- @schema = Csvlint::Schema.from_json_table( @schema_url || "http://example.org ", JSON.parse(@schema_json) )
5
+ @schema = if @schema_type == :json_table
6
+ Csvlint::Schema.from_json_table(@schema_url || "http://example.org ", JSON.parse(@schema_json))
7
7
  else
8
- @schema = Csvlint::Schema.from_csvw_metadata( @schema_url || "http://example.org ", JSON.parse(@schema_json) )
8
+ Csvlint::Schema.from_csvw_metadata(@schema_url || "http://example.org ", JSON.parse(@schema_json))
9
9
  end
10
10
  end
11
-
12
- @validator = Csvlint::Validator.new( @url, @csv_options, @schema )
11
+
12
+ @validator = Csvlint::Validator.new(@url, @csv_options, @schema)
13
13
  @info_messages = @validator.info_messages
14
14
  end
15
15
 
16
16
  Then(/^there should be (\d+) info messages?$/) do |num|
17
- expect( @info_messages.count ).to eq( num.to_i )
17
+ expect(@info_messages.count).to eq(num.to_i)
18
18
  end
19
19
 
20
20
  Then(/^one of the messages should have the type "(.*?)"$/) do |msg_type|
21
- expect( @info_messages.find{|x| x.type == msg_type.to_sym} ).to be_present
22
- end
21
+ expect(@info_messages.find { |x| x.type == msg_type.to_sym }).to be_present
22
+ end
@@ -12,35 +12,35 @@ Given(/^I do not set an encoding header$/) do
12
12
  end
13
13
 
14
14
  Given(/^I have a CSV file called "(.*?)"$/) do |filename|
15
- @csv = File.read( File.join( File.dirname(__FILE__), "..", "fixtures", filename ) )
15
+ @csv = File.read(File.join(File.dirname(__FILE__), "..", "fixtures", filename))
16
16
  end
17
17
 
18
18
  When(/^I ask if there are warnings$/) do
19
19
  @csv_options ||= default_csv_options
20
20
  if @schema_json
21
- if @schema_type == :json_table
22
- @schema = Csvlint::Schema.from_json_table( @schema_url || "http://example.org ", JSON.parse(@schema_json) )
21
+ @schema = if @schema_type == :json_table
22
+ Csvlint::Schema.from_json_table(@schema_url || "http://example.org ", JSON.parse(@schema_json))
23
23
  else
24
- @schema = Csvlint::Schema.from_csvw_metadata( @schema_url || "http://example.org ", JSON.parse(@schema_json) )
24
+ Csvlint::Schema.from_csvw_metadata(@schema_url || "http://example.org ", JSON.parse(@schema_json))
25
25
  end
26
26
  end
27
27
 
28
- @validator = Csvlint::Validator.new( @url, @csv_options, @schema )
28
+ @validator = Csvlint::Validator.new(@url, @csv_options, @schema)
29
29
  @warnings = @validator.warnings
30
30
  end
31
31
 
32
32
  Then(/^there should be warnings$/) do
33
- expect( @warnings.count ).to be > 0
33
+ expect(@warnings.count).to be > 0
34
34
  end
35
35
 
36
36
  Then(/^there should not be warnings$/) do
37
37
  # this test is only used for CSVW testing, and :inconsistent_values warnings don't count in CSVW
38
38
  @warnings.delete_if { |w| [:inconsistent_values, :check_options].include?(w.type) }
39
- expect( @warnings.count ).to eq(0)
39
+ expect(@warnings.count).to eq(0)
40
40
  end
41
41
 
42
42
  Then(/^there should be (\d+) warnings$/) do |count|
43
- expect( @warnings.count ).to eq( count.to_i )
43
+ expect(@warnings.count).to eq(count.to_i)
44
44
  end
45
45
 
46
46
  Given(/^the content type is set to "(.*?)"$/) do |type|
@@ -48,13 +48,13 @@ Given(/^the content type is set to "(.*?)"$/) do |type|
48
48
  end
49
49
 
50
50
  Then(/^that warning should have the row "(.*?)"$/) do |row|
51
- expect( @warnings.first.row ).to eq( row.to_i )
51
+ expect(@warnings.first.row).to eq(row.to_i)
52
52
  end
53
53
 
54
54
  Then(/^that warning should have the column "(.*?)"$/) do |column|
55
- expect( @warnings.first.column ).to eq( column.to_i )
55
+ expect(@warnings.first.column).to eq(column.to_i)
56
56
  end
57
57
 
58
58
  Then(/^that warning should have the type "(.*?)"$/) do |type|
59
- expect( @warnings.first.type ).to eq( type.to_sym )
59
+ expect(@warnings.first.type).to eq(type.to_sym)
60
60
  end
@@ -1,13 +1,12 @@
1
- require 'aruba'
2
- require 'aruba/in_process'
3
- require 'aruba/cucumber'
1
+ require "aruba"
2
+ require "aruba/cucumber"
4
3
 
5
- require 'csvlint/cli'
4
+ require "csvlint/cli"
6
5
 
7
6
  module Csvlint
8
7
  class CliRunner
9
8
  # Allow everything fun to be injected from the outside while defaulting to normal implementations.
10
- def initialize(argv, stdin = STDIN, stdout = STDOUT, stderr = STDERR, kernel = Kernel)
9
+ def initialize(argv, stdin = $stdin, stdout = $stdout, stderr = $stderr, kernel = Kernel)
11
10
  @argv, @stdin, @stdout, @stderr, @kernel = argv, stdin, stdout, stderr, kernel
12
11
  end
13
12
 
@@ -23,11 +22,11 @@ module Csvlint
23
22
 
24
23
  # Thor::Base#start does not have a return value, assume success if no exception is raised.
25
24
  0
26
- rescue StandardError => e
25
+ rescue => e
27
26
  # The ruby interpreter would pipe this to STDERR and exit 1 in the case of an unhandled exception
28
27
  b = e.backtrace
29
28
  @stderr.puts("#{b.shift}: #{e.message} (#{e.class})")
30
- @stderr.puts(b.map{|s| "\tfrom #{s}"}.join("\n"))
29
+ @stderr.puts(b.map { |s| "\tfrom #{s}" }.join("\n"))
31
30
  1
32
31
  rescue SystemExit => e
33
32
  e.status
@@ -52,5 +51,7 @@ module Csvlint
52
51
  end
53
52
  end
54
53
 
55
- Aruba.process = Aruba::Processes::InProcess
56
- Aruba.process.main_class = Csvlint::CliRunner
54
+ Aruba.configure do |config|
55
+ config.command_launcher = :in_process
56
+ config.main_class = Csvlint::CliRunner
57
+ end
@@ -1,33 +1,33 @@
1
- require 'rdf'
2
- require 'rdf/turtle'
1
+ require "rdf"
2
+ require "rdf/turtle"
3
3
 
4
4
  class EarlFormatter
5
5
  def initialize(step_mother, io, options)
6
6
  output = RDF::Resource.new("")
7
7
  @graph = RDF::Graph.new
8
- @graph << [ CSVLINT, RDF.type, RDF::DOAP.Project ]
9
- @graph << [ CSVLINT, RDF.type, EARL.TestSubject ]
10
- @graph << [ CSVLINT, RDF.type, EARL.Software ]
11
- @graph << [ CSVLINT, RDF::DOAP.name, "csvlint" ]
12
- @graph << [ CSVLINT, RDF::DC.title, "csvlint" ]
13
- @graph << [ CSVLINT, RDF::DOAP.description, "CSV validator" ]
14
- @graph << [ CSVLINT, RDF::DOAP.homepage, RDF::Resource.new("https://github.com/theodi/csvlint.rb") ]
15
- @graph << [ CSVLINT, RDF::DOAP.license, RDF::Resource.new("https://raw.githubusercontent.com/theodi/csvlint.rb/master/LICENSE.md") ]
16
- @graph << [ CSVLINT, RDF::DOAP["programming-language"], "Ruby" ]
17
- @graph << [ CSVLINT, RDF::DOAP.implements, RDF::Resource.new("http://www.w3.org/TR/tabular-data-model/") ]
18
- @graph << [ CSVLINT, RDF::DOAP.implements, RDF::Resource.new("http://www.w3.org/TR/tabular-metadata/") ]
19
- @graph << [ CSVLINT, RDF::DOAP.developer, ODI ]
20
- @graph << [ CSVLINT, RDF::DOAP.maintainer, ODI ]
21
- @graph << [ CSVLINT, RDF::DOAP.documenter, ODI ]
22
- @graph << [ CSVLINT, RDF::FOAF.maker, ODI ]
23
- @graph << [ CSVLINT, RDF::DC.creator, ODI ]
24
- @graph << [ output, RDF::FOAF["primaryTopic"], CSVLINT ]
25
- @graph << [ output, RDF::DC.issued, DateTime.now ]
26
- @graph << [ output, RDF::FOAF.maker, ODI ]
27
- @graph << [ ODI, RDF.type, RDF::FOAF.Organization ]
28
- @graph << [ ODI, RDF.type, EARL.Assertor ]
29
- @graph << [ ODI, RDF::FOAF.name, "Open Data Institute" ]
30
- @graph << [ ODI, RDF::FOAF.homepage, "https://theodi.org/" ]
8
+ @graph << [CSVLINT, RDF.type, RDF::DOAP.Project]
9
+ @graph << [CSVLINT, RDF.type, EARL.TestSubject]
10
+ @graph << [CSVLINT, RDF.type, EARL.Software]
11
+ @graph << [CSVLINT, RDF::DOAP.name, "csvlint"]
12
+ @graph << [CSVLINT, RDF::DC.title, "csvlint"]
13
+ @graph << [CSVLINT, RDF::DOAP.description, "CSV validator"]
14
+ @graph << [CSVLINT, RDF::DOAP.homepage, RDF::Resource.new("https://github.com/theodi/csvlint.rb")]
15
+ @graph << [CSVLINT, RDF::DOAP.license, RDF::Resource.new("https://raw.githubusercontent.com/theodi/csvlint.rb/master/LICENSE.md")]
16
+ @graph << [CSVLINT, RDF::DOAP["programming-language"], "Ruby"]
17
+ @graph << [CSVLINT, RDF::DOAP.implements, RDF::Resource.new("http://www.w3.org/TR/tabular-data-model/")]
18
+ @graph << [CSVLINT, RDF::DOAP.implements, RDF::Resource.new("http://www.w3.org/TR/tabular-metadata/")]
19
+ @graph << [CSVLINT, RDF::DOAP.developer, ODI]
20
+ @graph << [CSVLINT, RDF::DOAP.maintainer, ODI]
21
+ @graph << [CSVLINT, RDF::DOAP.documenter, ODI]
22
+ @graph << [CSVLINT, RDF::FOAF.maker, ODI]
23
+ @graph << [CSVLINT, RDF::DC.creator, ODI]
24
+ @graph << [output, RDF::FOAF["primaryTopic"], CSVLINT]
25
+ @graph << [output, RDF::DC.issued, DateTime.now]
26
+ @graph << [output, RDF::FOAF.maker, ODI]
27
+ @graph << [ODI, RDF.type, RDF::FOAF.Organization]
28
+ @graph << [ODI, RDF.type, EARL.Assertor]
29
+ @graph << [ODI, RDF::FOAF.name, "Open Data Institute"]
30
+ @graph << [ODI, RDF::FOAF.homepage, "https://theodi.org/"]
31
31
  end
32
32
 
33
33
  def scenario_name(keyword, name, file_colon_line, source_indent)
@@ -40,27 +40,27 @@ class EarlFormatter
40
40
  passed = false unless s.status == :passed
41
41
  end
42
42
  a = RDF::Node.new
43
- @graph << [ a, RDF.type, EARL.Assertion ]
44
- @graph << [ a, EARL.assertedBy, ODI ]
45
- @graph << [ a, EARL.subject, CSVLINT ]
46
- @graph << [ a, EARL.test, @test ]
47
- @graph << [ a, EARL.mode, EARL.automatic ]
43
+ @graph << [a, RDF.type, EARL.Assertion]
44
+ @graph << [a, EARL.assertedBy, ODI]
45
+ @graph << [a, EARL.subject, CSVLINT]
46
+ @graph << [a, EARL.test, @test]
47
+ @graph << [a, EARL.mode, EARL.automatic]
48
48
  r = RDF::Node.new
49
- @graph << [ a, EARL.result, r ]
50
- @graph << [ r, RDF.type, EARL.TestResult ]
51
- @graph << [ r, EARL.outcome, passed ? EARL.passed : EARL.failed ]
52
- @graph << [ r, RDF::DC.date, DateTime.now ]
49
+ @graph << [a, EARL.result, r]
50
+ @graph << [r, RDF.type, EARL.TestResult]
51
+ @graph << [r, EARL.outcome, passed ? EARL.passed : EARL.failed]
52
+ @graph << [r, RDF::DC.date, DateTime.now]
53
53
  end
54
54
 
55
55
  def after_features(features)
56
- RDF::Writer.for(:ttl).open("csvlint-earl.ttl", { :prefixes => { "earl" => EARL }, :standard_prefixes => true, :canonicalize => true, :literal_shorthand => true }) do |writer|
56
+ RDF::Writer.for(:ttl).open("csvlint-earl.ttl", {prefixes: {"earl" => EARL}, standard_prefixes: true, canonicalize: true, literal_shorthand: true}) do |writer|
57
57
  writer << @graph
58
- end
58
+ end
59
59
  end
60
60
 
61
61
  private
62
- EARL = RDF::Vocabulary.new("http://www.w3.org/ns/earl#")
63
- ODI = RDF::Resource.new("https://theodi.org/")
64
- CSVLINT = RDF::Resource.new("https://github.com/theodi/csvlint.rb")
65
62
 
63
+ EARL = RDF::Vocabulary.new("http://www.w3.org/ns/earl#")
64
+ ODI = RDF::Resource.new("https://theodi.org/")
65
+ CSVLINT = RDF::Resource.new("https://github.com/theodi/csvlint.rb")
66
66
  end
@@ -1,23 +1,22 @@
1
- require 'coveralls'
2
- Coveralls.wear_merged!('test_frameworks')
1
+ require "coveralls"
2
+ Coveralls.wear_merged!("test_frameworks")
3
3
 
4
- $:.unshift File.join( File.dirname(__FILE__), "..", "..", "lib")
4
+ $:.unshift File.join(File.dirname(__FILE__), "..", "..", "lib")
5
5
 
6
- require 'rspec/expectations'
7
- require 'cucumber/rspec/doubles'
8
- require 'csvlint'
9
- require 'pry'
6
+ require "rspec/expectations"
7
+ require "cucumber/rspec/doubles"
8
+ require "csvlint"
9
+ require "byebug"
10
10
 
11
- require 'spork'
11
+ require "spork"
12
12
 
13
13
  Spork.each_run do
14
- require 'csvlint'
14
+ require "csvlint"
15
15
  end
16
16
 
17
17
  class CustomWorld
18
18
  def default_csv_options
19
- return {
20
- }
19
+ {}
21
20
  end
22
21
  end
23
22
 
@@ -1,8 +1,8 @@
1
- require 'json'
2
- require 'open-uri'
3
- require 'uri'
1
+ require "json"
2
+ require "open-uri"
3
+ require "uri"
4
4
 
5
- BASE_URI = "http://www.w3.org/2013/csvw/tests/"
5
+ BASE_URI = "https://w3c.github.io/csvw/tests/"
6
6
  BASE_PATH = File.join(File.dirname(__FILE__), "..", "fixtures", "csvw")
7
7
  FEATURE_BASE_PATH = File.join(File.dirname(__FILE__), "..")
8
8
  VALIDATION_FEATURE_FILE_PATH = File.join(FEATURE_BASE_PATH, "csvw_validation_tests.feature")
@@ -11,109 +11,113 @@ SCRIPT_FILE_PATH = File.join(File.dirname(__FILE__), "..", "..", "bin", "run-csv
11
11
  Dir.mkdir(BASE_PATH) unless Dir.exist?(BASE_PATH)
12
12
 
13
13
  def cache_file(filename)
14
- file = File.join(BASE_PATH, filename)
15
- uri = URI.join(BASE_URI, filename)
16
- unless File.exist?(file)
17
- if filename.include? "/"
18
- levels = filename.split("/")[0..-2]
19
- for i in 0..levels.length
20
- dir = File.join(BASE_PATH, levels[0..i].join("/"))
21
- Dir.mkdir(dir) unless Dir.exist?(dir)
22
- end
23
- end
24
- STDERR.puts("storing #{file} locally")
25
- File.open(file, 'wb') do |f|
26
- f.puts open(uri, 'rb').read
27
- end
28
- end
29
- return uri, file
14
+ file = File.join(BASE_PATH, filename)
15
+ uri = URI.join(BASE_URI, filename)
16
+ unless File.exist?(file)
17
+ if filename.include? "/"
18
+ levels = filename.split("/")[0..-2]
19
+ for i in 0..levels.length
20
+ dir = File.join(BASE_PATH, levels[0..i].join("/"))
21
+ Dir.mkdir(dir) unless Dir.exist?(dir)
22
+ end
23
+ end
24
+ warn("storing #{file} locally")
25
+ File.open(file, "wb") do |f|
26
+ f.puts URI.open(uri, "rb").read
27
+ end
28
+ end
29
+ [uri, file]
30
30
  end
31
31
 
32
- File.open(SCRIPT_FILE_PATH, 'w') do |file|
33
- File.chmod(0755, SCRIPT_FILE_PATH)
34
- manifest = JSON.parse( open("http://www.w3.org/2013/csvw/tests/manifest-validation.jsonld").read )
35
- manifest["entries"].each do |entry|
36
- type = "valid"
37
- case entry["type"]
38
- when "csvt:WarningValidationTest"
39
- type = "warnings"
40
- when "csvt:NegativeValidationTest"
41
- type = "errors"
42
- end
43
- file.puts "echo \"#{entry["id"].split("#")[-1]}: #{entry["name"].gsub("`", "'")}\""
44
- file.puts "echo \"#{type}: #{entry["comment"].gsub("\"", "\\\"").gsub("`", "'")}\""
45
- if entry["action"].end_with?(".json")
46
- file.puts "csvlint --schema=features/fixtures/csvw/#{entry["action"]}"
47
- elsif entry["option"] && entry["option"]["metadata"]
48
- file.puts "csvlint features/fixtures/csvw/#{entry["action"]} --schema=features/fixtures/csvw/#{entry["option"]["metadata"]}"
49
- else
50
- file.puts "csvlint features/fixtures/csvw/#{entry["action"]}"
51
- end
52
- file.puts "echo"
53
- end
54
- end unless File.exist? SCRIPT_FILE_PATH
32
+ unless File.exist? SCRIPT_FILE_PATH
33
+ File.open(SCRIPT_FILE_PATH, "w") do |file|
34
+ File.chmod(0o755, SCRIPT_FILE_PATH)
35
+ manifest = JSON.parse(URI.open("#{BASE_URI}manifest-validation.jsonld").read)
36
+ manifest["entries"].each do |entry|
37
+ type = "valid"
38
+ case entry["type"]
39
+ when "csvt:WarningValidationTest"
40
+ type = "warnings"
41
+ when "csvt:NegativeValidationTest"
42
+ type = "errors"
43
+ end
44
+ file.puts "echo \"#{entry["id"].split("#")[-1]}: #{entry["name"].tr("`", "'")}\""
45
+ file.puts "echo \"#{type}: #{entry["comment"].gsub("\"", "\\\"").tr("`", "'")}\""
46
+ if entry["action"].end_with?(".json")
47
+ file.puts "csvlint --schema=features/fixtures/csvw/#{entry["action"]}"
48
+ elsif entry["option"] && entry["option"]["metadata"]
49
+ file.puts "csvlint features/fixtures/csvw/#{entry["action"]} --schema=features/fixtures/csvw/#{entry["option"]["metadata"]}"
50
+ else
51
+ file.puts "csvlint features/fixtures/csvw/#{entry["action"]}"
52
+ end
53
+ file.puts "echo"
54
+ end
55
+ end
56
+ end
57
+
58
+ unless File.exist? VALIDATION_FEATURE_FILE_PATH
59
+ File.open(VALIDATION_FEATURE_FILE_PATH, "w") do |file|
60
+ file.puts "# Auto-generated file based on standard validation CSVW tests from #{BASE_URI}manifest-validation.jsonld"
61
+ file.puts ""
55
62
 
56
- File.open(VALIDATION_FEATURE_FILE_PATH, 'w') do |file|
57
- file.puts "# Auto-generated file based on standard validation CSVW tests from http://www.w3.org/2013/csvw/tests/manifest-validation.jsonld"
58
- file.puts ""
63
+ manifest = JSON.parse(URI.open("#{BASE_URI}manifest-validation.jsonld").read)
59
64
 
60
- manifest = JSON.parse( open("http://www.w3.org/2013/csvw/tests/manifest-validation.jsonld").read )
65
+ file.puts "Feature: #{manifest["label"]}"
66
+ file.puts ""
61
67
 
62
- file.puts "Feature: #{manifest["label"]}"
63
- file.puts ""
64
-
65
- manifest["entries"].each do |entry|
66
- action_uri, action_file = cache_file(entry["action"])
67
- metadata = nil
68
- provided_files = []
69
- missing_files = []
70
- file.puts "\t# #{entry["id"]}"
71
- file.puts "\t# #{entry["comment"]}"
72
- file.puts "\tScenario: #{entry["id"]} #{entry["name"].gsub("<", "less than")}"
73
- if entry["action"].end_with?(".json")
74
- file.puts "\t\tGiven I have a metadata file called \"csvw/#{entry["action"]}\""
75
- file.puts "\t\tAnd the metadata is stored at the url \"#{action_uri}\""
76
- else
77
- file.puts "\t\tGiven I have a CSV file called \"csvw/#{entry["action"]}\""
78
- file.puts "\t\tAnd it has a Link header holding \"#{entry["httpLink"]}\"" if entry["httpLink"]
79
- file.puts "\t\tAnd it is stored at the url \"#{action_uri}\""
80
- if entry["option"] && entry["option"]["metadata"]
81
- # no need to store the file here, as it will be listed in the 'implicit' list, which all get stored
82
- metadata = URI.join(BASE_URI, entry["option"]["metadata"])
83
- file.puts "\t\tAnd I have a metadata file called \"csvw/#{entry["option"]["metadata"]}\""
84
- file.puts "\t\tAnd the metadata is stored at the url \"#{metadata}\""
85
- end
86
- provided_files << action_uri.to_s
87
- if entry["name"].include?("/.well-known/csvm")
88
- file.puts "\t\tAnd I have a file called \"w3.org/.well-known/csvm\" at the url \"http://www.w3.org/.well-known/csvm\""
89
- missing_files << "#{action_uri}.json"
90
- missing_files << URI.join(action_uri, 'csvm.json').to_s
91
- else
92
- missing_files << URI.join(action_uri, '/.well-known/csvm').to_s
93
- end
94
- missing_files << "#{action_uri}-metadata.json"
95
- missing_files << URI.join(action_uri, 'csv-metadata.json').to_s
96
- end
97
- entry["implicit"].each do |implicit|
98
- implicit_uri, implicit_file = cache_file(implicit)
99
- provided_files << implicit_uri.to_s
100
- unless implicit_uri == metadata
101
- file.puts "\t\tAnd I have a file called \"csvw/#{implicit}\" at the url \"#{implicit_uri}\""
102
- end
103
- end if entry["implicit"]
104
- missing_files.each do |uri|
105
- file.puts "\t\tAnd there is no file at the url \"#{uri}\"" unless provided_files.include? uri
106
- end
107
- file.puts "\t\tWhen I carry out CSVW validation"
108
- if entry["type"] == "csvt:WarningValidationTest"
109
- file.puts "\t\tThen there should not be errors"
110
- file.puts "\t\tAnd there should be warnings"
111
- elsif entry["type"] == "csvt:NegativeValidationTest"
112
- file.puts "\t\tThen there should be errors"
113
- else
114
- file.puts "\t\tThen there should not be errors"
115
- file.puts "\t\tAnd there should not be warnings"
116
- end
117
- file.puts "\t"
118
- end
119
- end unless File.exist? VALIDATION_FEATURE_FILE_PATH
68
+ manifest["entries"].each do |entry|
69
+ action_uri, action_file = cache_file(entry["action"])
70
+ metadata = nil
71
+ provided_files = []
72
+ missing_files = []
73
+ file.puts "\t# #{entry["id"]}"
74
+ file.puts "\t# #{entry["comment"]}"
75
+ file.puts "\tScenario: #{entry["id"]} #{entry["name"].gsub("<", "less than")}"
76
+ if entry["action"].end_with?(".json")
77
+ file.puts "\t\tGiven I have a metadata file called \"csvw/#{entry["action"]}\""
78
+ file.puts "\t\tAnd the metadata is stored at the url \"#{action_uri}\""
79
+ else
80
+ file.puts "\t\tGiven I have a CSV file called \"csvw/#{entry["action"]}\""
81
+ file.puts "\t\tAnd it has a Link header holding \"#{entry["httpLink"]}\"" if entry["httpLink"]
82
+ file.puts "\t\tAnd it is stored at the url \"#{action_uri}\""
83
+ if entry["option"] && entry["option"]["metadata"]
84
+ # no need to store the file here, as it will be listed in the 'implicit' list, which all get stored
85
+ metadata = URI.join(BASE_URI, entry["option"]["metadata"])
86
+ file.puts "\t\tAnd I have a metadata file called \"csvw/#{entry["option"]["metadata"]}\""
87
+ file.puts "\t\tAnd the metadata is stored at the url \"#{metadata}\""
88
+ end
89
+ provided_files << action_uri.to_s
90
+ if entry["name"].include?("/.well-known/csvm")
91
+ file.puts "\t\tAnd I have a file called \"w3.org/.well-known/csvm\" at the url \"https://www.w3.org/.well-known/csvm\""
92
+ missing_files << "#{action_uri}.json"
93
+ missing_files << URI.join(action_uri, "csvm.json").to_s
94
+ else
95
+ missing_files << URI.join(action_uri, "/.well-known/csvm").to_s
96
+ end
97
+ missing_files << "#{action_uri}-metadata.json"
98
+ missing_files << URI.join(action_uri, "csv-metadata.json").to_s
99
+ end
100
+ entry["implicit"]&.each do |implicit|
101
+ implicit_uri, implicit_file = cache_file(implicit)
102
+ provided_files << implicit_uri.to_s
103
+ unless implicit_uri == metadata
104
+ file.puts "\t\tAnd I have a file called \"csvw/#{implicit}\" at the url \"#{implicit_uri}\""
105
+ end
106
+ end
107
+ missing_files.each do |uri|
108
+ file.puts "\t\tAnd there is no file at the url \"#{uri}\"" unless provided_files.include? uri
109
+ end
110
+ file.puts "\t\tWhen I carry out CSVW validation"
111
+ if entry["type"] == "csvt:WarningValidationTest"
112
+ file.puts "\t\tThen there should not be errors"
113
+ file.puts "\t\tAnd there should be warnings"
114
+ elsif entry["type"] == "csvt:NegativeValidationTest"
115
+ file.puts "\t\tThen there should be errors"
116
+ else
117
+ file.puts "\t\tThen there should not be errors"
118
+ file.puts "\t\tAnd there should not be warnings"
119
+ end
120
+ file.puts "\t"
121
+ end
122
+ end
123
+ end
@@ -1 +1,3 @@
1
- require 'webmock/cucumber'
1
+ require "webmock/cucumber"
2
+
3
+ WebMock.disable_net_connect!(allow: %r{csvw/tests})