wjordan213-csvlint 0.2.8

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 (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"