wjordan213-csvlint 0.2.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitattributes +2 -0
  4. data/.gitignore +28 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +32 -0
  7. data/CHANGELOG.md +361 -0
  8. data/Gemfile +7 -0
  9. data/LICENSE.md +22 -0
  10. data/README.md +328 -0
  11. data/Rakefile +17 -0
  12. data/bin/create_schema +32 -0
  13. data/bin/csvlint +10 -0
  14. data/features/check_format.feature +46 -0
  15. data/features/cli.feature +210 -0
  16. data/features/csv_options.feature +35 -0
  17. data/features/csvupload.feature +145 -0
  18. data/features/csvw_schema_validation.feature +127 -0
  19. data/features/fixtures/cr-line-endings.csv +0 -0
  20. data/features/fixtures/crlf-line-endings.csv +0 -0
  21. data/features/fixtures/inconsistent-line-endings-unquoted.csv +0 -0
  22. data/features/fixtures/inconsistent-line-endings.csv +0 -0
  23. data/features/fixtures/invalid-byte-sequence.csv +0 -0
  24. data/features/fixtures/invalid_many_rows.csv +0 -0
  25. data/features/fixtures/lf-line-endings.csv +0 -0
  26. data/features/fixtures/spreadsheet.xls +0 -0
  27. data/features/fixtures/spreadsheet.xlsx +0 -0
  28. data/features/fixtures/title-row.csv +0 -0
  29. data/features/fixtures/valid.csv +0 -0
  30. data/features/fixtures/valid_many_rows.csv +0 -0
  31. data/features/fixtures/windows-line-endings.csv +0 -0
  32. data/features/information.feature +22 -0
  33. data/features/parse_csv.feature +90 -0
  34. data/features/schema_validation.feature +105 -0
  35. data/features/sources.feature +17 -0
  36. data/features/step_definitions/cli_steps.rb +11 -0
  37. data/features/step_definitions/csv_options_steps.rb +24 -0
  38. data/features/step_definitions/information_steps.rb +13 -0
  39. data/features/step_definitions/parse_csv_steps.rb +42 -0
  40. data/features/step_definitions/schema_validation_steps.rb +33 -0
  41. data/features/step_definitions/sources_steps.rb +7 -0
  42. data/features/step_definitions/validation_errors_steps.rb +90 -0
  43. data/features/step_definitions/validation_info_steps.rb +22 -0
  44. data/features/step_definitions/validation_warnings_steps.rb +60 -0
  45. data/features/support/aruba.rb +56 -0
  46. data/features/support/env.rb +26 -0
  47. data/features/support/load_tests.rb +114 -0
  48. data/features/support/webmock.rb +1 -0
  49. data/features/validation_errors.feature +147 -0
  50. data/features/validation_info.feature +16 -0
  51. data/features/validation_warnings.feature +86 -0
  52. data/lib/csvlint.rb +27 -0
  53. data/lib/csvlint/cli.rb +165 -0
  54. data/lib/csvlint/csvw/column.rb +359 -0
  55. data/lib/csvlint/csvw/date_format.rb +182 -0
  56. data/lib/csvlint/csvw/metadata_error.rb +13 -0
  57. data/lib/csvlint/csvw/number_format.rb +211 -0
  58. data/lib/csvlint/csvw/property_checker.rb +761 -0
  59. data/lib/csvlint/csvw/table.rb +204 -0
  60. data/lib/csvlint/csvw/table_group.rb +165 -0
  61. data/lib/csvlint/error_collector.rb +27 -0
  62. data/lib/csvlint/error_message.rb +15 -0
  63. data/lib/csvlint/field.rb +196 -0
  64. data/lib/csvlint/schema.rb +92 -0
  65. data/lib/csvlint/validate.rb +599 -0
  66. data/lib/csvlint/version.rb +3 -0
  67. data/spec/csvw/column_spec.rb +112 -0
  68. data/spec/csvw/date_format_spec.rb +49 -0
  69. data/spec/csvw/number_format_spec.rb +417 -0
  70. data/spec/csvw/table_group_spec.rb +143 -0
  71. data/spec/csvw/table_spec.rb +90 -0
  72. data/spec/field_spec.rb +252 -0
  73. data/spec/schema_spec.rb +211 -0
  74. data/spec/spec_helper.rb +17 -0
  75. data/spec/validator_spec.rb +619 -0
  76. data/wjordan213_csvlint.gemspec +46 -0
  77. metadata +490 -0
@@ -0,0 +1,210 @@
1
+ Feature: CSVlint CLI
2
+
3
+ Scenario: Valid CSV from url
4
+ Given I have a CSV with the following content:
5
+ """
6
+ "Foo","Bar","Baz"
7
+ "1","2","3"
8
+ "3","2","1"
9
+ """
10
+ And it is stored at the url "http://example.com/example1.csv"
11
+ When I run `csvlint http://example.com/example1.csv`
12
+ Then the output should contain "http://example.com/example1.csv is VALID"
13
+
14
+ Scenario: Valid CSV from file
15
+ When I run `csvlint ../../features/fixtures/valid.csv`
16
+ Then the output should contain "valid.csv is VALID"
17
+
18
+ # This is a hacky way of saying to run `cat features/fixtures/valid.csv | csvlint`
19
+ Scenario: Valid CSV from pipe
20
+ Given I have stubbed stdin to contain "features/fixtures/valid.csv"
21
+ When I run `csvlint`
22
+ Then the output should contain "CSV is VALID"
23
+
24
+ Scenario: URL that 404s
25
+ Given there is no file at the url "http://example.com/example1.csv"
26
+ And there is no file at the url "http://example.com/.well-known/csvm"
27
+ And there is no file at the url "http://example.com/example1.csv-metadata.json"
28
+ And there is no file at the url "http://example.com/csv-metadata.json"
29
+ When I run `csvlint http://example.com/example1.csv`
30
+ Then the output should contain "http://example.com/example1.csv is INVALID"
31
+ And the output should contain "not_found"
32
+
33
+ Scenario: File doesn't exist
34
+ When I run `csvlint ../../features/fixtures/non-existent-file.csv`
35
+ Then the output should contain "non-existent-file.csv not found"
36
+
37
+ Scenario: No file or URL specified
38
+ Given I have stubbed stdin to contain nothing
39
+ When I run `csvlint`
40
+ Then the output should contain "No CSV data to validate"
41
+
42
+ Scenario: No file or URL specified, but schema specified
43
+ Given I have stubbed stdin to contain nothing
44
+ And I have a schema with the following content:
45
+ """
46
+ {
47
+ "fields": [
48
+ { "name": "Name", "constraints": { "required": true } },
49
+ { "name": "Id", "constraints": { "required": true, "minLength": 1 } },
50
+ { "name": "Email", "constraints": { "required": true } }
51
+ ]
52
+ }
53
+ """
54
+ And the schema is stored at the url "http://example.com/schema.json"
55
+ When I run `csvlint --schema http://example.com/schema.json`
56
+ Then the output should contain "No CSV data to validate"
57
+
58
+ Scenario: Invalid CSV from url
59
+ Given I have a CSV with the following content:
60
+ """
61
+ "Foo", "Bar" , "Baz"
62
+ """
63
+ And it is stored at the url "http://example.com/example1.csv"
64
+ When I run `csvlint http://example.com/example1.csv`
65
+ Then the output should contain "http://example.com/example1.csv is INVALID"
66
+ And the output should contain "whitespace"
67
+
68
+ Scenario: Specify schema
69
+ Given I have a CSV with the following content:
70
+ """
71
+ "Bob","1234","bob@example.org"
72
+ "Alice","5","alice@example.com"
73
+ """
74
+ And it is stored at the url "http://example.com/example1.csv"
75
+ And I have a schema with the following content:
76
+ """
77
+ {
78
+ "fields": [
79
+ { "name": "Name", "constraints": { "required": true } },
80
+ { "name": "Id", "constraints": { "required": true, "minLength": 1 } },
81
+ { "name": "Email", "constraints": { "required": true } }
82
+ ]
83
+ }
84
+ """
85
+ And the schema is stored at the url "http://example.com/schema.json"
86
+ When I run `csvlint http://example.com/example1.csv --schema http://example.com/schema.json`
87
+ Then the output should contain "http://example.com/example1.csv is VALID"
88
+
89
+ Scenario: Schema errors
90
+ Given I have a CSV with the following content:
91
+ """
92
+ "Bob","1234","bob@example.org"
93
+ "Alice","5","alice@example.com"
94
+ """
95
+ And it is stored at the url "http://example.com/example1.csv"
96
+ And I have a schema with the following content:
97
+ """
98
+ {
99
+ "fields": [
100
+ { "name": "Name", "constraints": { "required": true } },
101
+ { "name": "Id", "constraints": { "required": true, "minLength": 3 } },
102
+ { "name": "Email", "constraints": { "required": true } }
103
+ ]
104
+ }
105
+ """
106
+ And the schema is stored at the url "http://example.com/schema.json"
107
+ When I run `csvlint http://example.com/example1.csv --schema http://example.com/schema.json`
108
+ Then the output should contain "http://example.com/example1.csv is INVALID"
109
+ And the output should contain "1. Id: min_length. Row: 2,2. 5"
110
+ And the output should contain "1. malformed_header. Row: 1. Bob,1234,bob@example.org"
111
+
112
+ Scenario: Invalid schema
113
+ Given I have a CSV with the following content:
114
+ """
115
+ "Bob","1234","bob@example.org"
116
+ "Alice","5","alice@example.com"
117
+ """
118
+ And it is stored at the url "http://example.com/example1.csv"
119
+ And I have a schema with the following content:
120
+ """
121
+ NO JSON HERE SON
122
+ """
123
+ And the schema is stored at the url "http://example.com/schema.json"
124
+ Then nothing should be outputted to STDERR
125
+ When I run `csvlint http://example.com/example1.csv --schema http://example.com/schema.json`
126
+ And the output should contain "invalid metadata: malformed JSON"
127
+
128
+ Scenario: Schema that 404s
129
+ Given I have a CSV with the following content:
130
+ """
131
+ "Bob","1234","bob@example.org"
132
+ "Alice","5","alice@example.com"
133
+ """
134
+ And it is stored at the url "http://example.com/example1.csv"
135
+ And there is no file at the url "http://example.com/schema404.json"
136
+ When I run `csvlint http://example.com/example1.csv --schema http://example.com/schema404.json`
137
+ Then the output should contain "http://example.com/schema404.json not found"
138
+
139
+ Scenario: Schema that doesn't exist
140
+ Given I have a CSV with the following content:
141
+ """
142
+ "Bob","1234","bob@example.org"
143
+ "Alice","5","alice@example.com"
144
+ """
145
+ And it is stored at the url "http://example.com/example1.csv"
146
+ When I run `csvlint http://example.com/example1.csv --schema /fake/file/path.json`
147
+ Then the output should contain "/fake/file/path.json not found"
148
+
149
+ Scenario: Valid CSVw schema
150
+ Given I have a CSV with the following content:
151
+ """
152
+ "Bob","1234","bob@example.org"
153
+ "Alice","5","alice@example.com"
154
+ """
155
+ And it is stored at the url "http://example.com/example1.csv"
156
+ And I have metadata with the following content:
157
+ """
158
+ {
159
+ "@context": "http://www.w3.org/ns/csvw",
160
+ "url": "http://example.com/example1.csv",
161
+ "dialect": { "header": false },
162
+ "tableSchema": {
163
+ "columns": [
164
+ { "name": "Name", "required": true },
165
+ { "name": "Id", "required": true, "datatype": { "base": "string", "minLength": 1 } },
166
+ { "name": "Email", "required": true }
167
+ ]
168
+ }
169
+ }
170
+ """
171
+ And the schema is stored at the url "http://example.com/schema.json"
172
+ When I run `csvlint http://example.com/example1.csv --schema http://example.com/schema.json`
173
+ Then the output should contain "http://example.com/example1.csv is VALID"
174
+
175
+ Scenario: CSVw schema with invalid CSV
176
+ Given I have a CSV with the following content:
177
+ """
178
+ "Bob","1234","bob@example.org"
179
+ "Alice","5","alice@example.com"
180
+ """
181
+ And it is stored at the url "http://example.com/example1.csv"
182
+ And I have metadata with the following content:
183
+ """
184
+ {
185
+ "@context": "http://www.w3.org/ns/csvw",
186
+ "url": "http://example.com/example1.csv",
187
+ "dialect": { "header": false },
188
+ "tableSchema": {
189
+ "columns": [
190
+ { "name": "Name", "required": true },
191
+ { "name": "Id", "required": true, "datatype": { "base": "string", "minLength": 3 } },
192
+ { "name": "Email", "required": true }
193
+ ]
194
+ }
195
+ }
196
+ """
197
+ And the schema is stored at the url "http://example.com/schema.json"
198
+ When I run `csvlint http://example.com/example1.csv --schema http://example.com/schema.json`
199
+ Then the output should contain "http://example.com/example1.csv is INVALID"
200
+ And the output should contain "1. min_length. Row: 2,2. 5"
201
+
202
+ Scenario: CSVw table Schema
203
+ Given I have stubbed stdin to contain nothing
204
+ And I have a metadata file called "csvw/countries.json"
205
+ And the metadata is stored at the url "http://w3c.github.io/csvw/tests/countries.json"
206
+ And I have a file called "csvw/countries.csv" at the url "http://w3c.github.io/csvw/tests/countries.csv"
207
+ And I have a file called "csvw/country_slice.csv" at the url "http://w3c.github.io/csvw/tests/country_slice.csv"
208
+ When I run `csvlint --schema http://w3c.github.io/csvw/tests/countries.json`
209
+ Then the output should contain "http://w3c.github.io/csvw/tests/countries.csv is VALID"
210
+ And the output should contain "http://w3c.github.io/csvw/tests/country_slice.csv is VALID"
@@ -0,0 +1,35 @@
1
+ Feature: CSV options
2
+
3
+ Scenario: Sucessfully parse a valid CSV
4
+ Given I have a CSV with the following content:
5
+ """
6
+ 'Foo';'Bar';'Baz'
7
+ '1';'2';'3'
8
+ '3';'2';'1'
9
+ """
10
+ And I set the delimiter to ";"
11
+ And I set quotechar to "'"
12
+ And it is stored at the url "http://example.com/example1.csv"
13
+ When I ask if the CSV is valid
14
+ Then I should get the value of true
15
+
16
+ Scenario: Warn if options seem to return invalid data
17
+ Given I have a CSV with the following content:
18
+ """
19
+ 'Foo';'Bar';'Baz'
20
+ '1';'2';'3'
21
+ '3';'2';'1'
22
+ """
23
+ And I set the delimiter to ","
24
+ And I set quotechar to """
25
+ And it is stored at the url "http://example.com/example1.csv"
26
+ And I ask if there are warnings
27
+ Then there should be 1 warnings
28
+ And that warning should have the type "check_options"
29
+
30
+ Scenario: Use esoteric line endings
31
+ Given I have a CSV file called "windows-line-endings.csv"
32
+ And it is stored at the url "http://example.com/example1.csv"
33
+ When I ask if the CSV is valid
34
+ Then I should get the value of true
35
+
@@ -0,0 +1,145 @@
1
+ Feature: Collect all the tests that should trigger dialect check related errors
2
+
3
+ Scenario: Title rows, I wish to trigger a :title_row type message
4
+ Given I have a CSV file called "title-row.csv"
5
+ And it is stored at the url "http://example.com/example1.csv"
6
+ And I ask if there are warnings
7
+ Then there should be 1 warnings
8
+ And that warning should have the type "title_row"
9
+
10
+ # :nonrfc_line_breaks
11
+
12
+ Scenario: LF line endings in file give an info message of type :nonrfc_line_breaks
13
+ Given I have a CSV file called "lf-line-endings.csv"
14
+ And it is stored at the url "http://example.com/example1.csv"
15
+ And I set header to "true"
16
+ And I ask if there are info messages
17
+ Then there should be 1 info message
18
+ And one of the messages should have the type "nonrfc_line_breaks"
19
+
20
+ Scenario: CRLF line endings in file produces no info messages of type :nonrfc_line_breaks
21
+ Given I have a CSV file called "crlf-line-endings.csv"
22
+ And it is stored at the url "http://example.com/example1.csv"
23
+ And I set header to "true"
24
+ And I ask if there are info messages
25
+ Then there should be 0 info messages
26
+
27
+ # :line_breaks
28
+
29
+ Scenario: Incorrect line endings specified in settings
30
+ Given I have a CSV file called "lf-line-endings.csv"
31
+ And I set the line endings to carriage return
32
+ And it is stored at the url "http://example.com/example1.csv"
33
+ And I ask if there are errors
34
+ Then there should be 1 error
35
+ And that error should have the type "line_breaks"
36
+
37
+ Scenario: inconsistent line endings in file cause an error
38
+ Given I have a CSV file called "inconsistent-line-endings.csv"
39
+ And it is stored at the url "http://example.com/example1.csv"
40
+ And I ask if there are errors
41
+ Then there should be 1 error
42
+ And that error should have the type "line_breaks"
43
+
44
+
45
+ Scenario: inconsistent line endings with unquoted fields in file cause an error
46
+ Given I have a CSV file called "inconsistent-line-endings-unquoted.csv"
47
+ And it is stored at the url "http://example.com/example1.csv"
48
+ And I ask if there are errors
49
+ Then there should be 1 error
50
+ And that error should have the type "line_breaks"
51
+
52
+ #:unclosed_quote
53
+
54
+ Scenario: CSV with incorrect quoting
55
+ Given I have a CSV with the following content:
56
+ """
57
+ "col1","col2","col3"
58
+ "Foo","Bar","Baz
59
+ """
60
+ And it is stored at the url "http://example.com/example1.csv"
61
+ When I ask if there are errors
62
+ Then there should be 1 error
63
+ And that error should have the type "unclosed_quote"
64
+ And that error should have the row "2"
65
+ And that error should have the content ""Foo","Bar","Baz"
66
+
67
+ # :invalid_encoding
68
+
69
+ Scenario: Report invalid Encoding
70
+ Given I have a CSV file called "invalid-byte-sequence.csv"
71
+ And I set an encoding header of "UTF-8"
72
+ And it is stored at the url "http://example.com/example1.csv"
73
+ When I ask if there are errors
74
+ Then there should be 1 error
75
+ And that error should have the type "invalid_encoding"
76
+
77
+ Scenario: Report invalid file
78
+ #should this throw an excel error?
79
+ Given I have a CSV file called "spreadsheet.xls"
80
+ And it is stored at the url "http://example.com/example1.csv"
81
+ When I ask if there are errors
82
+ Then there should be 1 error
83
+ And that error should have the type "invalid_encoding"
84
+
85
+ # :blank_rows
86
+
87
+ Scenario: Successfully report a CSV with blank rows
88
+ Given I have a CSV with the following content:
89
+ """
90
+ "col1","col2","col3"
91
+ "Foo","Bar","Baz"
92
+ "","",
93
+ "Baz","Bar","Foo"
94
+ """
95
+ And it is stored at the url "http://example.com/example1.csv"
96
+ When I ask if there are errors
97
+ Then there should be 1 error
98
+ And that error should have the type "blank_rows"
99
+ And that error should have the row "3"
100
+ And that error should have the content ""","","
101
+
102
+ Scenario: Successfully report a CSV with multiple trailing empty rows
103
+ Given I have a CSV with the following content:
104
+ """
105
+ "col1","col2","col3"
106
+ "Foo","Bar","Baz"
107
+ "Foo","Bar","Baz"
108
+
109
+
110
+ """
111
+ And it is stored at the url "http://example.com/example1.csv"
112
+ When I ask if there are errors
113
+ Then there should be 1 error
114
+ And that error should have the type "blank_rows"
115
+ And that error should have the row "4"
116
+
117
+ Scenario: Successfully report a CSV with an empty row
118
+ Given I have a CSV with the following content:
119
+ """
120
+ "col1","col2","col3"
121
+ "Foo","Bar","Baz"
122
+
123
+ "Foo","Bar","Baz"
124
+ """
125
+ And it is stored at the url "http://example.com/example1.csv"
126
+ When I ask if there are errors
127
+ Then there should be 1 error
128
+ And that error should have the type "blank_rows"
129
+ And that error should have the row "3"
130
+
131
+ #:check_options
132
+
133
+ Scenario: Warn if options seem to return invalid data
134
+ Given I have a CSV with the following content:
135
+ """
136
+ 'Foo';'Bar';'Baz'
137
+ '1';'2';'3'
138
+ '3';'2';'1'
139
+ """
140
+ And I set the delimiter to ","
141
+ And I set quotechar to """
142
+ And it is stored at the url "http://example.com/example1.csv"
143
+ And I ask if there are warnings
144
+ Then there should be 1 warnings
145
+ And that warning should have the type "check_options"
@@ -0,0 +1,127 @@
1
+ Feature: CSVW Schema Validation
2
+
3
+ Scenario: Valid CSV
4
+ Given I have a CSV with the following content:
5
+ """
6
+ "Bob","1234","bob@example.org"
7
+ "Alice","5","alice@example.com"
8
+ """
9
+ And it is stored at the url "http://example.com/example1.csv"
10
+ And I have metadata with the following content:
11
+ """
12
+ {
13
+ "@context": "http://www.w3.org/ns/csvw",
14
+ "url": "http://example.com/example1.csv",
15
+ "dialect": { "header": false },
16
+ "tableSchema": {
17
+ "columns": [
18
+ { "name": "Name", "required": true },
19
+ { "name": "Id", "required": true, "datatype": { "base": "string", "minLength": 1 } },
20
+ { "name": "Email", "required": true }
21
+ ]
22
+ }
23
+ }
24
+ """
25
+ When I ask if there are errors
26
+ Then there should be 0 error
27
+
28
+ Scenario: Schema invalid CSV
29
+ Given I have a CSV with the following content:
30
+ """
31
+ "Bob","1234","bob@example.org"
32
+ "Alice","5","alice@example.com"
33
+ """
34
+ And it is stored at the url "http://example.com/example1.csv"
35
+ And I have metadata with the following content:
36
+ """
37
+ {
38
+ "@context": "http://www.w3.org/ns/csvw",
39
+ "url": "http://example.com/example1.csv",
40
+ "dialect": { "header": false },
41
+ "tableSchema": {
42
+ "columns": [
43
+ { "name": "Name", "required": true },
44
+ { "name": "Id", "required": true, "datatype": { "base": "string", "minLength": 3 } },
45
+ { "name": "Email", "required": true }
46
+ ]
47
+ }
48
+ }
49
+ """
50
+ When I ask if there are errors
51
+ Then there should be 1 error
52
+
53
+ Scenario: CSV with incorrect header
54
+ Given I have a CSV with the following content:
55
+ """
56
+ "name","id","contact"
57
+ "Bob","1234","bob@example.org"
58
+ "Alice","5","alice@example.com"
59
+ """
60
+ And it is stored at the url "http://example.com/example1.csv"
61
+ And I have metadata with the following content:
62
+ """
63
+ {
64
+ "@context": "http://www.w3.org/ns/csvw",
65
+ "url": "http://example.com/example1.csv",
66
+ "tableSchema": {
67
+ "columns": [
68
+ { "titles": "name", "required": true },
69
+ { "titles": "id", "required": true, "datatype": { "base": "string", "minLength": 1 } },
70
+ { "titles": "email", "required": true }
71
+ ]
72
+ }
73
+ }
74
+ """
75
+ When I ask if there are errors
76
+ Then there should be 1 error
77
+
78
+ Scenario: Schema with valid regex
79
+ Given I have a CSV with the following content:
80
+ """
81
+ "firstname","id","email"
82
+ "Bob","1234","bob@example.org"
83
+ "Alice","5","alice@example.com"
84
+ """
85
+ And it is stored at the url "http://example.com/example1.csv"
86
+ And I have metadata with the following content:
87
+ """
88
+ {
89
+ "@context": "http://www.w3.org/ns/csvw",
90
+ "url": "http://example.com/example1.csv",
91
+ "tableSchema": {
92
+ "columns": [
93
+ { "titles": "firstname", "required": true, "datatype": { "base": "string", "format": "^[A-Za-z0-9_]*$" } },
94
+ { "titles": "id", "required": true, "datatype": { "base": "string", "minLength": 1 } },
95
+ { "titles": "email", "required": true }
96
+ ]
97
+ }
98
+ }
99
+ """
100
+ When I ask if there are warnings
101
+ Then there should be 0 warnings
102
+
103
+ Scenario: Schema with invalid regex
104
+ Given I have a CSV with the following content:
105
+ """
106
+ "firstname","id","email"
107
+ "Bob","1234","bob@example.org"
108
+ "Alice","5","alice@example.com"
109
+ """
110
+ And it is stored at the url "http://example.com/example1.csv"
111
+ And I have metadata with the following content:
112
+ """
113
+ {
114
+ "@context": "http://www.w3.org/ns/csvw",
115
+ "url": "http://example.com/example1.csv",
116
+ "tableSchema": {
117
+ "columns": [
118
+ { "titles": "firstname", "required": true, "datatype": { "base": "string", "format": "((" } },
119
+ { "titles": "id", "required": true, "datatype": { "base": "string", "minLength": 1 } },
120
+ { "titles": "email", "required": true }
121
+ ]
122
+ }
123
+ }
124
+ """
125
+ When I ask if there are warnings
126
+ Then there should be 1 warnings
127
+ And that warning should have the type "invalid_regex"