csv_schema 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/csv_schema.gemspec +1 -1
- data/lib/csv_schema.rb +16 -13
- data/spec/csv_schema_spec.rb +12 -0
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.3
|
data/csv_schema.gemspec
CHANGED
data/lib/csv_schema.rb
CHANGED
@@ -27,11 +27,11 @@ class CSVSchema
|
|
27
27
|
@current_row = 1
|
28
28
|
FasterCSV.foreach(@file) do |row|
|
29
29
|
if @current_row == 1
|
30
|
-
|
31
|
-
index_field_requirements_by_column_number
|
32
|
-
validate_duplicate_headers(
|
33
|
-
validate_blank_headers(
|
34
|
-
validate_required_headers(
|
30
|
+
headers = transform(row)
|
31
|
+
index_field_requirements_by_column_number(headers)
|
32
|
+
validate_duplicate_headers(headers) unless @allow_duplicate_headers
|
33
|
+
validate_blank_headers(headers) unless @allow_blank_headers
|
34
|
+
validate_required_headers(headers) if @required_headers
|
35
35
|
else
|
36
36
|
validate_blank_rows(row) unless @allow_blank_rows
|
37
37
|
validate_restrict_value_fields(row) if !@restrict_value_fields.empty?
|
@@ -45,9 +45,9 @@ class CSVSchema
|
|
45
45
|
end
|
46
46
|
|
47
47
|
private
|
48
|
-
def index_field_requirements_by_column_number
|
48
|
+
def index_field_requirements_by_column_number(headers)
|
49
49
|
headers_to_column_number = Hash.new { |hash, key| raise "The specified column '#{key}' does not exist" }
|
50
|
-
|
50
|
+
headers.each_with_index do |header, column_number|
|
51
51
|
headers_to_column_number[header] = column_number
|
52
52
|
end
|
53
53
|
@indexed_headers = headers_to_column_number.invert
|
@@ -71,20 +71,19 @@ private
|
|
71
71
|
@unique_fields = u
|
72
72
|
end
|
73
73
|
|
74
|
-
def validate_duplicate_headers(
|
75
|
-
headers = transform ? row.map{ |header| transform.call(header)} : row
|
74
|
+
def validate_duplicate_headers(headers)
|
76
75
|
dups = headers.inject(Hash.new(0)) { |h, v| h[v] += 1; h }.reject { |k, v| v==1 }.keys #http://snippets.dzone.com/posts/show/3838
|
77
76
|
if dups.length > 0
|
78
77
|
raise "Duplicate headers exist: #{dups.inspect}"
|
79
78
|
end
|
80
79
|
end
|
81
80
|
|
82
|
-
def validate_blank_headers(
|
83
|
-
raise "There are illegal blank headers. If this is allowed, set :allow_blank_headers => true" if
|
81
|
+
def validate_blank_headers(headers)
|
82
|
+
raise "There are illegal blank headers. If this is allowed, set :allow_blank_headers => true" if headers.any?{|h| (h == '') || (h == nil)}
|
84
83
|
end
|
85
84
|
|
86
|
-
def validate_required_headers(
|
87
|
-
missing = @required_headers -
|
85
|
+
def validate_required_headers(headers)
|
86
|
+
missing = @required_headers - headers
|
88
87
|
raise "#{File.basename(@file)} is missing headers: #{missing.inspect}" unless missing.empty?
|
89
88
|
end
|
90
89
|
|
@@ -130,4 +129,8 @@ private
|
|
130
129
|
def header_name(col_num)
|
131
130
|
@indexed_headers[col_num]
|
132
131
|
end
|
132
|
+
|
133
|
+
def transform(header_row)
|
134
|
+
@headers_transform ? header_row.map { |header| @headers_transform.call(header) } : header_row
|
135
|
+
end
|
133
136
|
end
|
data/spec/csv_schema_spec.rb
CHANGED
@@ -96,6 +96,18 @@ describe CSVSchema do
|
|
96
96
|
lambda { CSVSchema.new(@lenient_options.merge(:file => generate_csv_file.path, :required_headers => ['header_1'])).validate }.should_not raise_error
|
97
97
|
end
|
98
98
|
|
99
|
+
it "should NOT raise when the transformed headers do exist" do
|
100
|
+
@headers = ['HEADER 1']
|
101
|
+
transform = FasterCSV::HeaderConverters[:symbol]
|
102
|
+
lambda { CSVSchema.new(@lenient_options.merge(:file => generate_csv_file.path, :required_headers => [:header_1], :headers_transform => transform)).validate }.should_not raise_error()
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should raise when the transformed headers do NOT exist" do
|
106
|
+
@headers = ['HEADER 1']
|
107
|
+
transform = FasterCSV::HeaderConverters[:symbol]
|
108
|
+
lambda { CSVSchema.new(@lenient_options.merge(:file => generate_csv_file.path, :required_headers => @headers, :headers_transform => transform)).validate }.should raise_error(StandardError, /#{@headers.first}/)
|
109
|
+
end
|
110
|
+
|
99
111
|
it "should raise when any REQUIRED HEADERS do NOT exist" do
|
100
112
|
missing_header = 'doesnt_exist'
|
101
113
|
lambda { CSVSchema.new(@lenient_options.merge(:file => generate_csv_file.path, :required_headers => [missing_header])).validate }.should raise_error(StandardError, /#{missing_header}/)
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: csv_schema
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- jconley
|