csv_schema 0.0.2 → 0.0.3
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.
- 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
|