valigator-csv 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/valigator/csv/error.rb +77 -0
- data/lib/valigator/csv/validator.rb +5 -65
- data/lib/valigator/csv/version.rb +1 -1
- data/lib/valigator.rb +1 -0
- data/valigator-csv.gemspec +2 -4
- metadata +4 -19
- data/bin/console +0 -14
- data/bin/setup +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 325bd8b898cc324095f85b90956285b9fd49eb1c
|
4
|
+
data.tar.gz: dc833a514d767425f97077301ccb0addb3841335
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5f30e36ff1d0158203df6907dd192915dc07e65ec193a267ac17176727a8dca6d1aaa6b8e0b5cc52f2d99e32d892a3969c1798454297789b03f6f0f9970d9e25
|
7
|
+
data.tar.gz: 5ed312f29eba227c354f9bcd6e3897227330aca19f6fc4d3b9197f514143269aceaaa53dd0cef59fe9163a697dcc0babf3f0867335b54a0f19074d23bb2d2e37
|
@@ -0,0 +1,77 @@
|
|
1
|
+
module Valigator
|
2
|
+
module CSV
|
3
|
+
class Error
|
4
|
+
|
5
|
+
attr_reader :row, :type, :message
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
def initialize(error)
|
10
|
+
case error
|
11
|
+
when Hash
|
12
|
+
build_from_hash error
|
13
|
+
when StandardError
|
14
|
+
build_from_error error
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
def ==(other)
|
21
|
+
row == other.row && message == other.message && type == other.type
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def build_from_hash(error)
|
29
|
+
build error[:type], error[:message], error[:row]
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
def build_from_error(error)
|
35
|
+
build map_to_type(error.message), error.message, determine_row(error.message)
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
def determine_row(message)
|
41
|
+
matches = /line (?<lineno>\d+)/.match(message)
|
42
|
+
matches[:lineno].to_i if matches
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
def build(type, message, row)
|
48
|
+
@type = type
|
49
|
+
@row = row
|
50
|
+
@message = message
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
def map_to_type(message)
|
56
|
+
case message
|
57
|
+
when /Missing or stray quote/
|
58
|
+
'stray_quote'
|
59
|
+
when /Unquoted fields do not allow/
|
60
|
+
'line_breaks'
|
61
|
+
when /Illegal quoting/
|
62
|
+
'illegal_quoting'
|
63
|
+
when /Field size exceeded/
|
64
|
+
'field_size'
|
65
|
+
when /Unclosed quoted field/
|
66
|
+
'unclosed_quote'
|
67
|
+
when /invalid byte sequence/
|
68
|
+
'invalid_encoding'
|
69
|
+
else
|
70
|
+
raise ArgumentError, 'unknown type'
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -1,5 +1,4 @@
|
|
1
|
-
require '
|
2
|
-
require 'active_support/core_ext/string/filters'
|
1
|
+
require 'csv'
|
3
2
|
|
4
3
|
module Valigator
|
5
4
|
module CSV
|
@@ -10,74 +9,15 @@ module Valigator
|
|
10
9
|
|
11
10
|
def initialize(filename)
|
12
11
|
@filename = filename
|
13
|
-
end
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
def validate(options = {})
|
18
12
|
@errors = []
|
19
|
-
|
20
|
-
check_with_csvlint(options)
|
21
|
-
end
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
private
|
26
|
-
|
27
|
-
def check_with_csvlint(options = {})
|
28
|
-
File.open(filename, "r:#{options[:encoding] || 'UTF-8'}") do |file|
|
29
|
-
validator = ::Csvlint::Validator.new(file, build_dialect(options), build_schema(options))
|
30
|
-
|
31
|
-
validator.errors.each { |error| add_to_errors error }
|
32
|
-
validator.warnings.each { |warning| add_to_errors warning }
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
def build_dialect(options = {})
|
39
|
-
return {} unless options[:dialect]
|
40
|
-
|
41
|
-
stringify_keys options[:dialect]
|
42
13
|
end
|
43
14
|
|
44
15
|
|
45
16
|
|
46
|
-
def
|
47
|
-
|
48
|
-
|
49
|
-
::
|
50
|
-
end
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
def build_header_fields(options = {})
|
55
|
-
options[:headers].map do |header|
|
56
|
-
header_definition = stringify_keys(header)
|
57
|
-
|
58
|
-
::Csvlint::Field.new(header_definition["name"], header_definition["constraints"])
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
def stringify_keys(hash)
|
65
|
-
JSON.parse JSON.dump(hash)
|
66
|
-
end
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
def add_to_errors(original_error)
|
71
|
-
return if original_error.type == :encoding
|
72
|
-
|
73
|
-
error = {
|
74
|
-
row: original_error.row,
|
75
|
-
column: original_error.column,
|
76
|
-
type: original_error.type.to_s,
|
77
|
-
content: original_error.content.to_s.truncate(80)
|
78
|
-
}
|
79
|
-
|
80
|
-
@errors << error.reject { |_, v| v.blank? }
|
17
|
+
def validate(options = {})
|
18
|
+
::CSV.foreach(@filename, "r:#{options[:encoding] || 'UTF-8'}") { |_row| }
|
19
|
+
rescue ::CSV::MalformedCSVError, ArgumentError => error
|
20
|
+
@errors << CSV::Error.new(error)
|
81
21
|
end
|
82
22
|
|
83
23
|
end
|
data/lib/valigator.rb
CHANGED
data/valigator-csv.gemspec
CHANGED
@@ -13,13 +13,11 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.description = %q{Yet another CSV validator library. Just better.}
|
14
14
|
spec.homepage = 'https://github.com/emartech/valigator-csv'
|
15
15
|
|
16
|
-
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
17
|
-
spec.bindir = "
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|bin)/}) }
|
17
|
+
spec.bindir = "bin"
|
18
18
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_runtime_dependency "csvlint"
|
22
|
-
|
23
21
|
spec.add_development_dependency "bundler", "~> 1.10"
|
24
22
|
spec.add_development_dependency "rake", "~> 10.0"
|
25
23
|
spec.add_development_dependency "rspec"
|
metadata
CHANGED
@@ -1,30 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: valigator-csv
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Nagy
|
8
8
|
- Istvan Demeter
|
9
9
|
autorequire:
|
10
|
-
bindir:
|
10
|
+
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-12-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
-
- !ruby/object:Gem::Dependency
|
15
|
-
name: csvlint
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
requirements:
|
18
|
-
- - ">="
|
19
|
-
- !ruby/object:Gem::Version
|
20
|
-
version: '0'
|
21
|
-
type: :runtime
|
22
|
-
prerelease: false
|
23
|
-
version_requirements: !ruby/object:Gem::Requirement
|
24
|
-
requirements:
|
25
|
-
- - ">="
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
version: '0'
|
28
14
|
- !ruby/object:Gem::Dependency
|
29
15
|
name: bundler
|
30
16
|
requirement: !ruby/object:Gem::Requirement
|
@@ -82,10 +68,9 @@ files:
|
|
82
68
|
- Gemfile
|
83
69
|
- README.md
|
84
70
|
- Rakefile
|
85
|
-
- bin/console
|
86
|
-
- bin/setup
|
87
71
|
- lib/valigator.rb
|
88
72
|
- lib/valigator/csv.rb
|
73
|
+
- lib/valigator/csv/error.rb
|
89
74
|
- lib/valigator/csv/validator.rb
|
90
75
|
- lib/valigator/csv/version.rb
|
91
76
|
- valigator-csv.gemspec
|
data/bin/console
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require "bundler/setup"
|
4
|
-
require "valigator/csv"
|
5
|
-
|
6
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
-
# with your gem easier. You can also use a different console, if you like.
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
|
-
require "irb"
|
14
|
-
IRB.start
|