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 CHANGED
@@ -1 +1 @@
1
- 0.0.2
1
+ 0.0.3
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{csv_schema}
8
- s.version = "0.0.2"
8
+ s.version = "0.0.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["jconley"]
@@ -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
- @headers = row
31
- index_field_requirements_by_column_number
32
- validate_duplicate_headers(row, @headers_transform) unless @allow_duplicate_headers
33
- validate_blank_headers(row) unless @allow_blank_headers
34
- validate_required_headers(row) if @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
- @headers.each_with_index do |header, column_number|
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(row, transform = nil)
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(row)
83
- raise "There are illegal blank headers. If this is allowed, set :allow_blank_headers => true" if row.any?{|h| (h == '') || (h == nil)}
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(row)
87
- missing = @required_headers - row
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
@@ -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: 27
4
+ hash: 25
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - jconley