csvlint 1.2.0 → 1.4.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.
- checksums.yaml +4 -4
- data/.github/workflows/push.yml +26 -5
- data/.gitignore +2 -0
- data/.ruby-version +1 -1
- data/.standard_todo.yml +4 -6
- data/Appraisals +22 -0
- data/README.md +1 -1
- data/csvlint.gemspec +3 -1
- data/features/support/load_tests.rb +4 -4
- data/gemfiles/activesupport_5.2.gemfile +7 -0
- data/gemfiles/activesupport_6.0.gemfile +7 -0
- data/gemfiles/activesupport_6.1.gemfile +7 -0
- data/gemfiles/activesupport_7.0.gemfile +7 -0
- data/gemfiles/activesupport_7.1.gemfile +7 -0
- data/lib/csvlint/cli.rb +2 -2
- data/lib/csvlint/csvw/column.rb +20 -20
- data/lib/csvlint/csvw/property_checker.rb +38 -38
- data/lib/csvlint/field.rb +1 -1
- data/lib/csvlint/validate.rb +5 -5
- data/lib/csvlint/version.rb +1 -1
- data/lib/csvlint.rb +1 -3
- metadata +38 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0d15e75580e44bba3f1f8965b348f0ccfe088c6fb60e881b9f997c99fc05a7cc
|
4
|
+
data.tar.gz: 0bdf3cbec5a855f68abec7c2dccaa4f90db70955459044f7cfc67cbec963f9b8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0c86225f94173f87c44bd337975b3716c9b1ec629aa6d784e4b309724655d2af5eaa118fda1d1f139f0d6a432cfeb1536e7076603a2a4b0e94fe18278d28dcb9
|
7
|
+
data.tar.gz: 4986940f1b2d928d85ae65b01a8c2c3eede4f352218a5ad18aa761a153fcd0a1530189e418a1e38aa4c0544c998f19944a8de290ef924d6f539d959fa2dcca8f
|
data/.github/workflows/push.yml
CHANGED
@@ -5,14 +5,34 @@ on:
|
|
5
5
|
pull_request:
|
6
6
|
branches: [ main ]
|
7
7
|
jobs:
|
8
|
-
|
8
|
+
appraisal:
|
9
|
+
name: Ruby ${{ matrix.ruby-version }} / Rails ${{ matrix.activesupport-version }}
|
9
10
|
runs-on: ubuntu-latest
|
10
11
|
strategy:
|
11
12
|
matrix:
|
12
|
-
ruby-version: ['2.5', '2.6', '2.7', '3.0', '3.1', '3.2']
|
13
|
+
ruby-version: ['2.5', '2.6', '2.7', '3.0', '3.1', '3.2', '3.3']
|
14
|
+
activesupport-version:
|
15
|
+
- activesupport_5.2
|
16
|
+
- activesupport_6.0
|
17
|
+
- activesupport_6.1
|
18
|
+
- activesupport_7.0
|
19
|
+
- activesupport_7.1
|
20
|
+
exclude:
|
21
|
+
- ruby-version: '2.5'
|
22
|
+
activesupport-version: activesupport_7.0
|
23
|
+
- ruby-version: '2.6'
|
24
|
+
activesupport-version: activesupport_7.0
|
25
|
+
- ruby-version: '2.5'
|
26
|
+
activesupport-version: activesupport_7.1
|
27
|
+
- ruby-version: '2.6'
|
28
|
+
activesupport-version: activesupport_7.1
|
13
29
|
fail-fast: false
|
30
|
+
|
31
|
+
env:
|
32
|
+
BUNDLE_GEMFILE: gemfiles/${{ matrix.activesupport-version }}.gemfile
|
33
|
+
|
14
34
|
steps:
|
15
|
-
- uses: actions/checkout@
|
35
|
+
- uses: actions/checkout@v4
|
16
36
|
- uses: ruby/setup-ruby@v1
|
17
37
|
with:
|
18
38
|
bundler-cache: true
|
@@ -21,14 +41,15 @@ jobs:
|
|
21
41
|
run: bundle install
|
22
42
|
- name: Run the tests
|
23
43
|
run: bundle exec rake
|
44
|
+
|
24
45
|
lint:
|
25
46
|
runs-on: ubuntu-latest
|
26
47
|
steps:
|
27
|
-
- uses: actions/checkout@
|
48
|
+
- uses: actions/checkout@v4
|
28
49
|
- uses: ruby/setup-ruby@v1
|
29
50
|
with:
|
30
51
|
bundler-cache: true
|
31
|
-
ruby-version: "3.
|
52
|
+
ruby-version: "3.3"
|
32
53
|
- name: Install dependencies
|
33
54
|
run: bundle install
|
34
55
|
- name: Run the tests
|
data/.gitignore
CHANGED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.
|
1
|
+
3.3.0
|
data/.standard_todo.yml
CHANGED
@@ -2,14 +2,8 @@
|
|
2
2
|
# Remove from this list as you refactor files.
|
3
3
|
---
|
4
4
|
ignore:
|
5
|
-
- features/step_definitions/validation_errors_steps.rb:
|
6
|
-
- Lint/Void
|
7
5
|
- features/support/load_tests.rb:
|
8
|
-
- Style/For
|
9
6
|
- Security/Open
|
10
|
-
- Lint/UselessAssignment
|
11
|
-
- lib/csvlint/cli.rb:
|
12
|
-
- Style/NonNilCheck
|
13
7
|
- lib/csvlint/csvw/column.rb:
|
14
8
|
- Style/TernaryParentheses
|
15
9
|
- lib/csvlint/csvw/date_format.rb:
|
@@ -41,3 +35,7 @@ ignore:
|
|
41
35
|
- Lint/NonLocalExitFromIterator
|
42
36
|
- spec/validator_spec.rb:
|
43
37
|
- Lint/UselessAssignment
|
38
|
+
- lib/csvlint/schema.rb:
|
39
|
+
- Lint/UselessRescue
|
40
|
+
- lib/csvlint/validate.rb:
|
41
|
+
- Lint/UselessRescue
|
data/Appraisals
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# After a new entry: `bundle exec appraisal install`
|
2
|
+
# Add an entry in `.github/workflows/push.yml`'s file
|
3
|
+
|
4
|
+
appraise "activesupport_5.2" do
|
5
|
+
gem "activesupport", "~> 5.2.0"
|
6
|
+
end
|
7
|
+
|
8
|
+
appraise "activesupport_6.0" do
|
9
|
+
gem "activesupport", "~> 6.0.0"
|
10
|
+
end
|
11
|
+
|
12
|
+
appraise "activesupport_6.1" do
|
13
|
+
gem "activesupport", "~> 6.1.0"
|
14
|
+
end
|
15
|
+
|
16
|
+
appraise "activesupport_7.0" do
|
17
|
+
gem "activesupport", "~> 7.0.0"
|
18
|
+
end
|
19
|
+
|
20
|
+
appraise "activesupport_7.1" do
|
21
|
+
gem "activesupport", "~> 7.1.0"
|
22
|
+
end
|
data/README.md
CHANGED
data/csvlint.gemspec
CHANGED
@@ -16,8 +16,9 @@ Gem::Specification.new do |spec|
|
|
16
16
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
17
|
spec.require_paths = ["lib"]
|
18
18
|
|
19
|
-
spec.required_ruby_version = [">= 2.5", "< 3.
|
19
|
+
spec.required_ruby_version = [">= 2.5", "< 3.4"]
|
20
20
|
|
21
|
+
spec.add_dependency "csv"
|
21
22
|
spec.add_dependency "rainbow"
|
22
23
|
spec.add_dependency "open_uri_redirections"
|
23
24
|
spec.add_dependency "activesupport"
|
@@ -47,4 +48,5 @@ Gem::Specification.new do |spec|
|
|
47
48
|
spec.add_development_dependency "rdf-turtle"
|
48
49
|
spec.add_development_dependency "henry"
|
49
50
|
spec.add_development_dependency "standardrb"
|
51
|
+
spec.add_development_dependency "appraisal"
|
50
52
|
end
|
@@ -16,7 +16,7 @@ def cache_file(filename)
|
|
16
16
|
unless File.exist?(file)
|
17
17
|
if filename.include? "/"
|
18
18
|
levels = filename.split("/")[0..-2]
|
19
|
-
|
19
|
+
(0..levels.length).each do |i|
|
20
20
|
dir = File.join(BASE_PATH, levels[0..i].join("/"))
|
21
21
|
Dir.mkdir(dir) unless Dir.exist?(dir)
|
22
22
|
end
|
@@ -26,7 +26,7 @@ def cache_file(filename)
|
|
26
26
|
f.puts URI.open(uri, "rb").read
|
27
27
|
end
|
28
28
|
end
|
29
|
-
|
29
|
+
uri
|
30
30
|
end
|
31
31
|
|
32
32
|
unless File.exist? SCRIPT_FILE_PATH
|
@@ -66,7 +66,7 @@ unless File.exist? VALIDATION_FEATURE_FILE_PATH
|
|
66
66
|
file.puts ""
|
67
67
|
|
68
68
|
manifest["entries"].each do |entry|
|
69
|
-
action_uri
|
69
|
+
action_uri = cache_file(entry["action"])
|
70
70
|
metadata = nil
|
71
71
|
provided_files = []
|
72
72
|
missing_files = []
|
@@ -98,7 +98,7 @@ unless File.exist? VALIDATION_FEATURE_FILE_PATH
|
|
98
98
|
missing_files << URI.join(action_uri, "csv-metadata.json").to_s
|
99
99
|
end
|
100
100
|
entry["implicit"]&.each do |implicit|
|
101
|
-
implicit_uri
|
101
|
+
implicit_uri = cache_file(implicit)
|
102
102
|
provided_files << implicit_uri.to_s
|
103
103
|
unless implicit_uri == metadata
|
104
104
|
file.puts "\t\tAnd I have a file called \"csvw/#{implicit}\" at the url \"#{implicit_uri}\""
|
data/lib/csvlint/cli.rb
CHANGED
@@ -105,7 +105,7 @@ module Csvlint
|
|
105
105
|
end
|
106
106
|
output_string = "#{index + 1}. "
|
107
107
|
if error.column && @schema && @schema.instance_of?(Csvlint::Schema)
|
108
|
-
|
108
|
+
unless @schema.fields[error.column - 1].nil?
|
109
109
|
output_string += "#{@schema.fields[error.column - 1].name}: "
|
110
110
|
end
|
111
111
|
end
|
@@ -176,7 +176,7 @@ module Csvlint
|
|
176
176
|
col: error.column
|
177
177
|
}
|
178
178
|
|
179
|
-
if error.column && @schema && @schema.instance_of?(Csvlint::Schema) &&
|
179
|
+
if error.column && @schema && @schema.instance_of?(Csvlint::Schema) && !@schema.fields[error.column - 1].nil?
|
180
180
|
field = @schema.fields[error.column - 1]
|
181
181
|
h[:header] = field.name
|
182
182
|
h[:constraints] = field.constraints.map { |k, v| [k.underscore, v] }.to_h
|
data/lib/csvlint/csvw/column.rb
CHANGED
@@ -126,14 +126,14 @@ module Csvlint
|
|
126
126
|
format = Csvlint::Csvw::DateFormat.new(nil, type) if format.nil?
|
127
127
|
v = format.parse(value)
|
128
128
|
return nil, warning if v.nil?
|
129
|
-
|
129
|
+
[v, nil]
|
130
130
|
}
|
131
131
|
end
|
132
132
|
|
133
133
|
def create_regexp_based_parser(regexp, warning)
|
134
134
|
lambda { |value, format|
|
135
135
|
return nil, warning unless value&.match?(regexp)
|
136
|
-
|
136
|
+
[value, nil]
|
137
137
|
}
|
138
138
|
end
|
139
139
|
|
@@ -256,14 +256,14 @@ module Csvlint
|
|
256
256
|
"http://www.w3.org/2001/XMLSchema#time" => NO_ADDITIONAL_VALIDATION
|
257
257
|
}
|
258
258
|
|
259
|
-
TRIM_VALUE = lambda { |value, format|
|
260
|
-
ALL_VALUES_VALID = lambda { |value, format|
|
259
|
+
TRIM_VALUE = lambda { |value, format| [value.strip, nil] }
|
260
|
+
ALL_VALUES_VALID = lambda { |value, format| [value, nil] }
|
261
261
|
|
262
262
|
NUMERIC_PARSER = lambda { |value, format, integer = false|
|
263
263
|
format = Csvlint::Csvw::NumberFormat.new(nil, nil, ".", integer) if format.nil?
|
264
264
|
v = format.parse(value)
|
265
265
|
return nil, :invalid_number if v.nil?
|
266
|
-
|
266
|
+
[v, nil]
|
267
267
|
}
|
268
268
|
|
269
269
|
DATATYPE_PARSER = {
|
@@ -281,7 +281,7 @@ module Csvlint
|
|
281
281
|
return true, nil if value == format[0]
|
282
282
|
return false, nil if value == format[1]
|
283
283
|
end
|
284
|
-
|
284
|
+
[value, :invalid_boolean]
|
285
285
|
},
|
286
286
|
"http://www.w3.org/2001/XMLSchema#date" =>
|
287
287
|
create_date_parser("http://www.w3.org/2001/XMLSchema#date", :invalid_date),
|
@@ -291,85 +291,85 @@ module Csvlint
|
|
291
291
|
create_date_parser("http://www.w3.org/2001/XMLSchema#dateTimeStamp", :invalid_date_time_stamp),
|
292
292
|
"http://www.w3.org/2001/XMLSchema#decimal" => lambda { |value, format|
|
293
293
|
return nil, :invalid_decimal if /(E|e|^(NaN|INF|-INF)$)/.match?(value)
|
294
|
-
|
294
|
+
NUMERIC_PARSER.call(value, format)
|
295
295
|
},
|
296
296
|
"http://www.w3.org/2001/XMLSchema#integer" => lambda { |value, format|
|
297
297
|
v, w = NUMERIC_PARSER.call(value, format, true)
|
298
298
|
return v, :invalid_integer unless w.nil?
|
299
299
|
return nil, :invalid_integer unless v.is_a? Integer
|
300
|
-
|
300
|
+
[v, w]
|
301
301
|
},
|
302
302
|
"http://www.w3.org/2001/XMLSchema#long" => lambda { |value, format|
|
303
303
|
v, w = DATATYPE_PARSER["http://www.w3.org/2001/XMLSchema#integer"].call(value, format)
|
304
304
|
return v, :invalid_long unless w.nil?
|
305
305
|
return nil, :invalid_long unless v <= 9223372036854775807 && v >= -9223372036854775808
|
306
|
-
|
306
|
+
[v, w]
|
307
307
|
},
|
308
308
|
"http://www.w3.org/2001/XMLSchema#int" => lambda { |value, format|
|
309
309
|
v, w = DATATYPE_PARSER["http://www.w3.org/2001/XMLSchema#integer"].call(value, format)
|
310
310
|
return v, :invalid_int unless w.nil?
|
311
311
|
return nil, :invalid_int unless v <= 2147483647 && v >= -2147483648
|
312
|
-
|
312
|
+
[v, w]
|
313
313
|
},
|
314
314
|
"http://www.w3.org/2001/XMLSchema#short" => lambda { |value, format|
|
315
315
|
v, w = DATATYPE_PARSER["http://www.w3.org/2001/XMLSchema#integer"].call(value, format)
|
316
316
|
return v, :invalid_short unless w.nil?
|
317
317
|
return nil, :invalid_short unless v <= 32767 && v >= -32768
|
318
|
-
|
318
|
+
[v, w]
|
319
319
|
},
|
320
320
|
"http://www.w3.org/2001/XMLSchema#byte" => lambda { |value, format|
|
321
321
|
v, w = DATATYPE_PARSER["http://www.w3.org/2001/XMLSchema#integer"].call(value, format)
|
322
322
|
return v, :invalid_byte unless w.nil?
|
323
323
|
return nil, :invalid_byte unless v <= 127 && v >= -128
|
324
|
-
|
324
|
+
[v, w]
|
325
325
|
},
|
326
326
|
"http://www.w3.org/2001/XMLSchema#nonNegativeInteger" => lambda { |value, format|
|
327
327
|
v, w = DATATYPE_PARSER["http://www.w3.org/2001/XMLSchema#integer"].call(value, format)
|
328
328
|
return v, :invalid_nonNegativeInteger unless w.nil?
|
329
329
|
return nil, :invalid_nonNegativeInteger unless v >= 0
|
330
|
-
|
330
|
+
[v, w]
|
331
331
|
},
|
332
332
|
"http://www.w3.org/2001/XMLSchema#positiveInteger" => lambda { |value, format|
|
333
333
|
v, w = DATATYPE_PARSER["http://www.w3.org/2001/XMLSchema#integer"].call(value, format)
|
334
334
|
return v, :invalid_positiveInteger unless w.nil?
|
335
335
|
return nil, :invalid_positiveInteger unless v > 0
|
336
|
-
|
336
|
+
[v, w]
|
337
337
|
},
|
338
338
|
"http://www.w3.org/2001/XMLSchema#unsignedLong" => lambda { |value, format|
|
339
339
|
v, w = DATATYPE_PARSER["http://www.w3.org/2001/XMLSchema#nonNegativeInteger"].call(value, format)
|
340
340
|
return v, :invalid_unsignedLong unless w.nil?
|
341
341
|
return nil, :invalid_unsignedLong unless v <= 18446744073709551615
|
342
|
-
|
342
|
+
[v, w]
|
343
343
|
},
|
344
344
|
"http://www.w3.org/2001/XMLSchema#unsignedInt" => lambda { |value, format|
|
345
345
|
v, w = DATATYPE_PARSER["http://www.w3.org/2001/XMLSchema#nonNegativeInteger"].call(value, format)
|
346
346
|
return v, :invalid_unsignedInt unless w.nil?
|
347
347
|
return nil, :invalid_unsignedInt unless v <= 4294967295
|
348
|
-
|
348
|
+
[v, w]
|
349
349
|
},
|
350
350
|
"http://www.w3.org/2001/XMLSchema#unsignedShort" => lambda { |value, format|
|
351
351
|
v, w = DATATYPE_PARSER["http://www.w3.org/2001/XMLSchema#nonNegativeInteger"].call(value, format)
|
352
352
|
return v, :invalid_unsignedShort unless w.nil?
|
353
353
|
return nil, :invalid_unsignedShort unless v <= 65535
|
354
|
-
|
354
|
+
[v, w]
|
355
355
|
},
|
356
356
|
"http://www.w3.org/2001/XMLSchema#unsignedByte" => lambda { |value, format|
|
357
357
|
v, w = DATATYPE_PARSER["http://www.w3.org/2001/XMLSchema#nonNegativeInteger"].call(value, format)
|
358
358
|
return v, :invalid_unsignedByte unless w.nil?
|
359
359
|
return nil, :invalid_unsignedByte unless v <= 255
|
360
|
-
|
360
|
+
[v, w]
|
361
361
|
},
|
362
362
|
"http://www.w3.org/2001/XMLSchema#nonPositiveInteger" => lambda { |value, format|
|
363
363
|
v, w = DATATYPE_PARSER["http://www.w3.org/2001/XMLSchema#integer"].call(value, format)
|
364
364
|
return v, :invalid_nonPositiveInteger unless w.nil?
|
365
365
|
return nil, :invalid_nonPositiveInteger unless v <= 0
|
366
|
-
|
366
|
+
[v, w]
|
367
367
|
},
|
368
368
|
"http://www.w3.org/2001/XMLSchema#negativeInteger" => lambda { |value, format|
|
369
369
|
v, w = DATATYPE_PARSER["http://www.w3.org/2001/XMLSchema#integer"].call(value, format)
|
370
370
|
return v, :invalid_negativeInteger unless w.nil?
|
371
371
|
return nil, :invalid_negativeInteger unless v < 0
|
372
|
-
|
372
|
+
[v, w]
|
373
373
|
},
|
374
374
|
"http://www.w3.org/2001/XMLSchema#double" => NUMERIC_PARSER,
|
375
375
|
# regular expressions here taken from XML Schema datatypes spec
|
@@ -60,7 +60,7 @@ module Csvlint
|
|
60
60
|
raise Csvlint::Csvw::MetadataError.new, "common property with @value has properties other than @language or @type" unless value.except("@type").except("@language").except("@value").empty?
|
61
61
|
when "@language"
|
62
62
|
raise Csvlint::Csvw::MetadataError.new, "common property with @language lacks a @value" unless value["@value"]
|
63
|
-
raise Csvlint::Csvw::MetadataError.new, "common property has invalid @language (#{v})"
|
63
|
+
raise Csvlint::Csvw::MetadataError.new, "common property has invalid @language (#{v})" if !((v.is_a? String) && (v =~ BCP47_LANGUAGE_REGEXP)) || !v.nil?
|
64
64
|
else
|
65
65
|
if p[0] == "@"
|
66
66
|
raise Csvlint::Csvw::MetadataError.new, "common property has property other than @id, @type, @value or @language beginning with @ (#{p})"
|
@@ -99,7 +99,7 @@ module Csvlint
|
|
99
99
|
v = format.parse(value[property])
|
100
100
|
if v.nil?
|
101
101
|
value.delete(property)
|
102
|
-
return [":invalid_#{property}"
|
102
|
+
return [:":invalid_#{property}"]
|
103
103
|
else
|
104
104
|
value[property] = v
|
105
105
|
return []
|
@@ -116,35 +116,35 @@ module Csvlint
|
|
116
116
|
def array_property(type)
|
117
117
|
lambda { |value, base_url, lang|
|
118
118
|
return value, nil, type if value.instance_of? Array
|
119
|
-
|
119
|
+
[false, :invalid_value, type]
|
120
120
|
}
|
121
121
|
end
|
122
122
|
|
123
123
|
def boolean_property(type)
|
124
124
|
lambda { |value, base_url, lang|
|
125
125
|
return value, nil, type if value == true || value == false
|
126
|
-
|
126
|
+
[false, :invalid_value, type]
|
127
127
|
}
|
128
128
|
end
|
129
129
|
|
130
130
|
def string_property(type)
|
131
131
|
lambda { |value, base_url, lang|
|
132
132
|
return value, nil, type if value.instance_of? String
|
133
|
-
|
133
|
+
["", :invalid_value, type]
|
134
134
|
}
|
135
135
|
end
|
136
136
|
|
137
137
|
def uri_template_property(type)
|
138
138
|
lambda { |value, base_url, lang|
|
139
139
|
return URITemplate.new(value), nil, type if value.instance_of? String
|
140
|
-
|
140
|
+
[URITemplate.new(""), :invalid_value, type]
|
141
141
|
}
|
142
142
|
end
|
143
143
|
|
144
144
|
def numeric_property(type)
|
145
145
|
lambda { |value, base_url, lang|
|
146
146
|
return value, nil, type if value.is_a?(Integer) && value >= 0
|
147
|
-
|
147
|
+
[nil, :invalid_value, type]
|
148
148
|
}
|
149
149
|
end
|
150
150
|
|
@@ -152,14 +152,14 @@ module Csvlint
|
|
152
152
|
lambda { |value, base_url, lang|
|
153
153
|
raise Csvlint::Csvw::MetadataError.new, "URL #{value} starts with _:" if /^_:/.match?(value.to_s)
|
154
154
|
return (base_url.nil? ? URI(value) : URI.join(base_url, value)), nil, type if value.instance_of? String
|
155
|
-
|
155
|
+
[base_url, :invalid_value, type]
|
156
156
|
}
|
157
157
|
end
|
158
158
|
|
159
159
|
def language_property(type)
|
160
160
|
lambda { |value, base_url, lang|
|
161
161
|
return value, nil, type if BCP47_REGEXP.match?(value)
|
162
|
-
|
162
|
+
[nil, :invalid_value, type]
|
163
163
|
}
|
164
164
|
end
|
165
165
|
|
@@ -167,7 +167,7 @@ module Csvlint
|
|
167
167
|
lambda { |value, base_url, lang|
|
168
168
|
warnings = []
|
169
169
|
if value.instance_of? String
|
170
|
-
|
170
|
+
[{lang => [value]}, nil, type]
|
171
171
|
elsif value.instance_of? Array
|
172
172
|
valid_titles = []
|
173
173
|
value.each do |title|
|
@@ -177,7 +177,7 @@ module Csvlint
|
|
177
177
|
warnings << :invalid_value
|
178
178
|
end
|
179
179
|
end
|
180
|
-
|
180
|
+
[{lang => valid_titles}, warnings, type]
|
181
181
|
elsif value.instance_of? Hash
|
182
182
|
value = value.clone
|
183
183
|
value.each do |l, v|
|
@@ -197,16 +197,16 @@ module Csvlint
|
|
197
197
|
end
|
198
198
|
end
|
199
199
|
warnings << :invalid_value if value.empty?
|
200
|
-
|
200
|
+
[value, warnings, type]
|
201
201
|
else
|
202
|
-
|
202
|
+
[{}, :invalid_value, type]
|
203
203
|
end
|
204
204
|
}
|
205
205
|
end
|
206
206
|
|
207
207
|
def column_reference_property(type)
|
208
208
|
lambda { |value, base_url, lang|
|
209
|
-
|
209
|
+
[Array(value), nil, type]
|
210
210
|
}
|
211
211
|
end
|
212
212
|
end
|
@@ -226,7 +226,7 @@ module Csvlint
|
|
226
226
|
values << v
|
227
227
|
warnings += w
|
228
228
|
end
|
229
|
-
|
229
|
+
[values, warnings, :common]
|
230
230
|
},
|
231
231
|
"suppressOutput" => boolean_property(:common),
|
232
232
|
"dialect" => lambda { |value, base_url, lang|
|
@@ -249,16 +249,16 @@ module Csvlint
|
|
249
249
|
end
|
250
250
|
end
|
251
251
|
end
|
252
|
-
|
252
|
+
[value, warnings, :common]
|
253
253
|
else
|
254
|
-
|
254
|
+
[{}, :invalid_value, :common]
|
255
255
|
end
|
256
256
|
},
|
257
257
|
# inherited properties
|
258
258
|
"null" => lambda { |value, base_url, lang|
|
259
259
|
case value
|
260
260
|
when String
|
261
|
-
|
261
|
+
[[value], nil, :inherited]
|
262
262
|
when Array
|
263
263
|
values = []
|
264
264
|
warnings = []
|
@@ -269,15 +269,15 @@ module Csvlint
|
|
269
269
|
warnings << :invalid_value
|
270
270
|
end
|
271
271
|
end
|
272
|
-
|
272
|
+
[values, warnings, :inherited]
|
273
273
|
else
|
274
|
-
|
274
|
+
[[""], :invalid_value, :inherited]
|
275
275
|
end
|
276
276
|
},
|
277
277
|
"default" => string_property(:inherited),
|
278
278
|
"separator" => lambda { |value, base_url, lang|
|
279
279
|
return value, nil, :inherited if value.instance_of?(String) || value.nil?
|
280
|
-
|
280
|
+
[nil, :invalid_value, :inherited]
|
281
281
|
},
|
282
282
|
"lang" => language_property(:inherited),
|
283
283
|
"datatype" => lambda { |value, base_url, lang|
|
@@ -387,7 +387,7 @@ module Csvlint
|
|
387
387
|
end
|
388
388
|
end
|
389
389
|
end
|
390
|
-
|
390
|
+
[value, warnings, :inherited]
|
391
391
|
},
|
392
392
|
"required" => boolean_property(:inherited),
|
393
393
|
"ordered" => boolean_property(:inherited),
|
@@ -397,14 +397,14 @@ module Csvlint
|
|
397
397
|
"textDirection" => lambda { |value, base_url, lang|
|
398
398
|
value = value.to_sym
|
399
399
|
return value, nil, :inherited if [:ltr, :rtl, :auto, :inherit].include? value
|
400
|
-
|
400
|
+
[:inherit, :invalid_value, :inherited]
|
401
401
|
},
|
402
402
|
# column level properties
|
403
403
|
"virtual" => boolean_property(:column),
|
404
404
|
"titles" => natural_language_property(:column),
|
405
405
|
"name" => lambda { |value, base_url, lang|
|
406
406
|
return value, nil, :column if value.instance_of?(String) && value =~ NAME_REGEXP
|
407
|
-
|
407
|
+
[nil, :invalid_value, :column]
|
408
408
|
},
|
409
409
|
# table level properties
|
410
410
|
"transformations" => lambda { |value, base_url, lang|
|
@@ -423,7 +423,7 @@ module Csvlint
|
|
423
423
|
elsif p == "titles"
|
424
424
|
else
|
425
425
|
v, warning, type = check_property(p, v, base_url, lang)
|
426
|
-
|
426
|
+
if type != :transformation && !(warning.nil? || warning.empty?)
|
427
427
|
value.delete(p)
|
428
428
|
warnings << :invalid_property unless type == :transformation
|
429
429
|
warnings += Array(warning)
|
@@ -438,12 +438,12 @@ module Csvlint
|
|
438
438
|
else
|
439
439
|
warnings << :invalid_value
|
440
440
|
end
|
441
|
-
|
441
|
+
[transformations, warnings, :table]
|
442
442
|
},
|
443
443
|
"tableDirection" => lambda { |value, base_url, lang|
|
444
444
|
value = value.to_sym
|
445
445
|
return value, nil, :table if [:ltr, :rtl, :auto].include? value
|
446
|
-
|
446
|
+
[:auto, :invalid_value, :table]
|
447
447
|
},
|
448
448
|
"tableSchema" => lambda { |value, base_url, lang|
|
449
449
|
schema_base_url = base_url
|
@@ -483,7 +483,7 @@ module Csvlint
|
|
483
483
|
end
|
484
484
|
end
|
485
485
|
end
|
486
|
-
|
486
|
+
[schema, warnings, :table]
|
487
487
|
},
|
488
488
|
"url" => link_property(:table),
|
489
489
|
# dialect properties
|
@@ -492,7 +492,7 @@ module Csvlint
|
|
492
492
|
"doubleQuote" => boolean_property(:dialect),
|
493
493
|
"encoding" => lambda { |value, base_url, lang|
|
494
494
|
return value, nil, :dialect if VALID_ENCODINGS.include? value
|
495
|
-
|
495
|
+
[nil, :invalid_value, :dialect]
|
496
496
|
},
|
497
497
|
"header" => boolean_property(:dialect),
|
498
498
|
"headerRowCount" => numeric_property(:dialect),
|
@@ -508,10 +508,10 @@ module Csvlint
|
|
508
508
|
value = :start if value == "start"
|
509
509
|
value = :end if value == "end"
|
510
510
|
return value, nil, :dialect if [:true, :false, :start, :end].include? value
|
511
|
-
|
511
|
+
[true, :invalid_value, :dialect]
|
512
512
|
},
|
513
513
|
# schema properties
|
514
|
-
"columns" => lambda { |value, base_url, lang|
|
514
|
+
"columns" => lambda { |value, base_url, lang| [value, nil, :schema] },
|
515
515
|
"primaryKey" => column_reference_property(:schema),
|
516
516
|
"foreignKeys" => lambda { |value, base_url, lang|
|
517
517
|
foreign_keys = []
|
@@ -540,13 +540,13 @@ module Csvlint
|
|
540
540
|
else
|
541
541
|
warnings << :invalid_value
|
542
542
|
end
|
543
|
-
|
543
|
+
[foreign_keys, warnings, :schema]
|
544
544
|
},
|
545
545
|
"rowTitles" => column_reference_property(:schema),
|
546
546
|
# transformation properties
|
547
|
-
"targetFormat" => lambda { |value, base_url, lang|
|
548
|
-
"scriptFormat" => lambda { |value, base_url, lang|
|
549
|
-
"source" => lambda { |value, base_url, lang|
|
547
|
+
"targetFormat" => lambda { |value, base_url, lang| [value, nil, :transformation] },
|
548
|
+
"scriptFormat" => lambda { |value, base_url, lang| [value, nil, :transformation] },
|
549
|
+
"source" => lambda { |value, base_url, lang| [value, nil, :transformation] },
|
550
550
|
# foreignKey properties
|
551
551
|
"columnReference" => column_reference_property(:foreign_key),
|
552
552
|
"reference" => lambda { |value, base_url, lang|
|
@@ -572,15 +572,15 @@ module Csvlint
|
|
572
572
|
raise Csvlint::Csvw::MetadataError.new("foreignKey.reference.columnReference"), "foreignKey reference columnReference is missing" unless value["columnReference"]
|
573
573
|
raise Csvlint::Csvw::MetadataError.new("foreignKey.reference"), "foreignKey reference does not have either resource or schemaReference" unless value["resource"] || value["schemaReference"]
|
574
574
|
raise Csvlint::Csvw::MetadataError.new("foreignKey.reference"), "foreignKey reference has both resource and schemaReference" if value["resource"] && value["schemaReference"]
|
575
|
-
|
575
|
+
[value, warnings, :foreign_key]
|
576
576
|
else
|
577
577
|
raise Csvlint::Csvw::MetadataError.new("foreignKey.reference"), "foreignKey reference is not an object"
|
578
578
|
end
|
579
579
|
},
|
580
580
|
# foreignKey reference properties
|
581
|
-
"resource" => lambda { |value, base_url, lang|
|
581
|
+
"resource" => lambda { |value, base_url, lang| [value, nil, :foreign_key_reference] },
|
582
582
|
"schemaReference" => lambda { |value, base_url, lang|
|
583
|
-
|
583
|
+
[URI.join(base_url, value).to_s, nil, :foreign_key_reference]
|
584
584
|
}
|
585
585
|
}
|
586
586
|
|
data/lib/csvlint/field.rb
CHANGED
@@ -16,7 +16,7 @@ module Csvlint
|
|
16
16
|
|
17
17
|
def validate_column(value, row = nil, column = nil, all_errors = [])
|
18
18
|
reset
|
19
|
-
unless all_errors.any? { |error| (
|
19
|
+
unless all_errors.any? { |error| (error.type == :invalid_regex) && (error.column == column) }
|
20
20
|
validate_regex(value, row, column, all_errors)
|
21
21
|
end
|
22
22
|
validate_length(value, row, column)
|
data/lib/csvlint/validate.rb
CHANGED
@@ -590,14 +590,14 @@ module Csvlint
|
|
590
590
|
numeric: /\A[-+]?\d*\.?\d+(?:[eE][-+]?\d+)?\z/,
|
591
591
|
uri: /\Ahttps?:/,
|
592
592
|
date_db: /\A\d{4,}-\d\d-\d\d\z/, # "12345-01-01"
|
593
|
-
date_long: /\A(?:#{Date::MONTHNAMES.join(
|
594
|
-
date_rfc822: /\A[ \d]\d (?:#{Date::ABBR_MONTHNAMES.join(
|
595
|
-
date_short: /\A[ \d]\d (?:#{Date::ABBR_MONTHNAMES.join(
|
593
|
+
date_long: /\A(?:#{Date::MONTHNAMES.join("|")}) [ \d]\d, \d{4,}\z/, # "January 1, 12345"
|
594
|
+
date_rfc822: /\A[ \d]\d (?:#{Date::ABBR_MONTHNAMES.join("|")}) \d{4,}\z/, # " 1 Jan 12345"
|
595
|
+
date_short: /\A[ \d]\d (?:#{Date::ABBR_MONTHNAMES.join("|")})\z/, # "1 Jan"
|
596
596
|
dateTime_db: /\A\d{4,}-\d\d-\d\d \d\d:\d\d:\d\d\z/, # "12345-01-01 00:00:00"
|
597
597
|
dateTime_hms: /\A\d\d:\d\d:\d\d\z/, # "00:00:00"
|
598
598
|
dateTime_iso8601: /\A\d{4,}-\d\d-\d\dT\d\d:\d\d:\d\dZ\z/, # "12345-01-01T00:00:00Z"
|
599
|
-
dateTime_long: /\A(?:#{Date::MONTHNAMES.join(
|
600
|
-
dateTime_short: /\A\d\d (?:#{Date::ABBR_MONTHNAMES.join(
|
599
|
+
dateTime_long: /\A(?:#{Date::MONTHNAMES.join("|")}) \d\d, \d{4,} \d\d:\d\d\z/, # "January 01, 12345 00:00"
|
600
|
+
dateTime_short: /\A\d\d (?:#{Date::ABBR_MONTHNAMES.join("|")}) \d\d:\d\d\z/, # "01 Jan 00:00"
|
601
601
|
dateTime_time: /\A\d\d:\d\d\z/ # "00:00"
|
602
602
|
}.freeze
|
603
603
|
|
data/lib/csvlint/version.rb
CHANGED
data/lib/csvlint.rb
CHANGED
@@ -4,9 +4,7 @@ require "open-uri"
|
|
4
4
|
require "tempfile"
|
5
5
|
require "typhoeus"
|
6
6
|
|
7
|
-
require "active_support
|
8
|
-
require "active_support/core_ext/time/conversions"
|
9
|
-
require "active_support/core_ext/object"
|
7
|
+
require "active_support"
|
10
8
|
require "open_uri_redirections"
|
11
9
|
require "uri_template"
|
12
10
|
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: csvlint
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- pezholio
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-04-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: csv
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: rainbow
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -402,6 +416,20 @@ dependencies:
|
|
402
416
|
- - ">="
|
403
417
|
- !ruby/object:Gem::Version
|
404
418
|
version: '0'
|
419
|
+
- !ruby/object:Gem::Dependency
|
420
|
+
name: appraisal
|
421
|
+
requirement: !ruby/object:Gem::Requirement
|
422
|
+
requirements:
|
423
|
+
- - ">="
|
424
|
+
- !ruby/object:Gem::Version
|
425
|
+
version: '0'
|
426
|
+
type: :development
|
427
|
+
prerelease: false
|
428
|
+
version_requirements: !ruby/object:Gem::Requirement
|
429
|
+
requirements:
|
430
|
+
- - ">="
|
431
|
+
- !ruby/object:Gem::Version
|
432
|
+
version: '0'
|
405
433
|
description: CSV Validator
|
406
434
|
email:
|
407
435
|
- pezholio@gmail.com
|
@@ -421,6 +449,7 @@ files:
|
|
421
449
|
- ".pre-commit-hooks.yaml"
|
422
450
|
- ".ruby-version"
|
423
451
|
- ".standard_todo.yml"
|
452
|
+
- Appraisals
|
424
453
|
- CHANGELOG.md
|
425
454
|
- CODE_OF_CONDUCT.md
|
426
455
|
- CONTRIBUTING.md
|
@@ -474,6 +503,11 @@ files:
|
|
474
503
|
- features/validation_errors.feature
|
475
504
|
- features/validation_info.feature
|
476
505
|
- features/validation_warnings.feature
|
506
|
+
- gemfiles/activesupport_5.2.gemfile
|
507
|
+
- gemfiles/activesupport_6.0.gemfile
|
508
|
+
- gemfiles/activesupport_6.1.gemfile
|
509
|
+
- gemfiles/activesupport_7.0.gemfile
|
510
|
+
- gemfiles/activesupport_7.1.gemfile
|
477
511
|
- lib/csvlint.rb
|
478
512
|
- lib/csvlint/cli.rb
|
479
513
|
- lib/csvlint/csvw/column.rb
|
@@ -513,14 +547,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
513
547
|
version: '2.5'
|
514
548
|
- - "<"
|
515
549
|
- !ruby/object:Gem::Version
|
516
|
-
version: '3.
|
550
|
+
version: '3.4'
|
517
551
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
518
552
|
requirements:
|
519
553
|
- - ">="
|
520
554
|
- !ruby/object:Gem::Version
|
521
555
|
version: '0'
|
522
556
|
requirements: []
|
523
|
-
rubygems_version: 3.
|
557
|
+
rubygems_version: 3.5.3
|
524
558
|
signing_key:
|
525
559
|
specification_version: 4
|
526
560
|
summary: CSV Validator
|