smarter_csv 1.1.5 → 1.12.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +5 -5
  2. data/.rspec +1 -2
  3. data/.rubocop.yml +154 -0
  4. data/CHANGELOG.md +364 -0
  5. data/CONTRIBUTORS.md +56 -0
  6. data/Gemfile +7 -2
  7. data/LICENSE.txt +21 -0
  8. data/README.md +44 -441
  9. data/Rakefile +39 -19
  10. data/TO_DO_v2.md +14 -0
  11. data/docs/_introduction.md +56 -0
  12. data/docs/basic_api.md +157 -0
  13. data/docs/batch_processing.md +68 -0
  14. data/docs/data_transformations.md +50 -0
  15. data/docs/examples.md +75 -0
  16. data/docs/header_transformations.md +113 -0
  17. data/docs/header_validations.md +36 -0
  18. data/docs/options.md +98 -0
  19. data/docs/row_col_sep.md +104 -0
  20. data/docs/value_converters.md +68 -0
  21. data/ext/smarter_csv/extconf.rb +14 -0
  22. data/ext/smarter_csv/smarter_csv.c +97 -0
  23. data/lib/smarter_csv/auto_detection.rb +78 -0
  24. data/lib/smarter_csv/errors.rb +16 -0
  25. data/lib/smarter_csv/file_io.rb +50 -0
  26. data/lib/smarter_csv/hash_transformations.rb +91 -0
  27. data/lib/smarter_csv/header_transformations.rb +63 -0
  28. data/lib/smarter_csv/header_validations.rb +34 -0
  29. data/lib/smarter_csv/headers.rb +68 -0
  30. data/lib/smarter_csv/options.rb +95 -0
  31. data/lib/smarter_csv/parser.rb +90 -0
  32. data/lib/smarter_csv/reader.rb +243 -0
  33. data/lib/smarter_csv/version.rb +3 -1
  34. data/lib/smarter_csv/writer.rb +116 -0
  35. data/lib/smarter_csv.rb +91 -3
  36. data/smarter_csv.gemspec +43 -20
  37. metadata +122 -137
  38. data/.gitignore +0 -8
  39. data/.travis.yml +0 -19
  40. data/lib/extensions/hash.rb +0 -7
  41. data/lib/smarter_csv/smarter_csv.rb +0 -281
  42. data/spec/fixtures/basic.csv +0 -8
  43. data/spec/fixtures/binary.csv +0 -1
  44. data/spec/fixtures/carriage_returns_n.csv +0 -18
  45. data/spec/fixtures/carriage_returns_quoted.csv +0 -3
  46. data/spec/fixtures/carriage_returns_r.csv +0 -1
  47. data/spec/fixtures/carriage_returns_rn.csv +0 -18
  48. data/spec/fixtures/chunk_cornercase.csv +0 -10
  49. data/spec/fixtures/empty.csv +0 -5
  50. data/spec/fixtures/line_endings_n.csv +0 -4
  51. data/spec/fixtures/line_endings_r.csv +0 -1
  52. data/spec/fixtures/line_endings_rn.csv +0 -4
  53. data/spec/fixtures/lots_of_columns.csv +0 -2
  54. data/spec/fixtures/malformed.csv +0 -3
  55. data/spec/fixtures/malformed_header.csv +0 -3
  56. data/spec/fixtures/money.csv +0 -3
  57. data/spec/fixtures/no_header.csv +0 -7
  58. data/spec/fixtures/numeric.csv +0 -5
  59. data/spec/fixtures/pets.csv +0 -5
  60. data/spec/fixtures/quoted.csv +0 -5
  61. data/spec/fixtures/separator.csv +0 -4
  62. data/spec/fixtures/skip_lines.csv +0 -8
  63. data/spec/fixtures/valid_unicode.csv +0 -5
  64. data/spec/fixtures/with_dashes.csv +0 -8
  65. data/spec/fixtures/with_dates.csv +0 -4
  66. data/spec/smarter_csv/binary_file2_spec.rb +0 -24
  67. data/spec/smarter_csv/binary_file_spec.rb +0 -22
  68. data/spec/smarter_csv/carriage_return_spec.rb +0 -170
  69. data/spec/smarter_csv/chunked_reading_spec.rb +0 -14
  70. data/spec/smarter_csv/close_file_spec.rb +0 -15
  71. data/spec/smarter_csv/column_separator_spec.rb +0 -11
  72. data/spec/smarter_csv/convert_values_to_numeric_spec.rb +0 -48
  73. data/spec/smarter_csv/extenstions_spec.rb +0 -17
  74. data/spec/smarter_csv/header_transformation_spec.rb +0 -21
  75. data/spec/smarter_csv/keep_headers_spec.rb +0 -24
  76. data/spec/smarter_csv/key_mapping_spec.rb +0 -25
  77. data/spec/smarter_csv/line_ending_spec.rb +0 -43
  78. data/spec/smarter_csv/load_basic_spec.rb +0 -20
  79. data/spec/smarter_csv/malformed_spec.rb +0 -21
  80. data/spec/smarter_csv/no_header_spec.rb +0 -24
  81. data/spec/smarter_csv/not_downcase_header_spec.rb +0 -24
  82. data/spec/smarter_csv/quoted_spec.rb +0 -23
  83. data/spec/smarter_csv/remove_empty_values_spec.rb +0 -13
  84. data/spec/smarter_csv/remove_keys_from_hashes_spec.rb +0 -25
  85. data/spec/smarter_csv/remove_not_mapped_keys_spec.rb +0 -35
  86. data/spec/smarter_csv/remove_values_matching_spec.rb +0 -26
  87. data/spec/smarter_csv/remove_zero_values_spec.rb +0 -25
  88. data/spec/smarter_csv/skip_lines_spec.rb +0 -29
  89. data/spec/smarter_csv/strings_as_keys_spec.rb +0 -24
  90. data/spec/smarter_csv/strip_chars_from_headers_spec.rb +0 -24
  91. data/spec/smarter_csv/valid_unicode_spec.rb +0 -94
  92. data/spec/smarter_csv/value_converters_spec.rb +0 -52
  93. data/spec/spec/spec_helper.rb +0 -17
  94. data/spec/spec.opts +0 -2
  95. data/spec/spec_helper.rb +0 -21
@@ -1,170 +0,0 @@
1
- require 'spec_helper'
2
-
3
- fixture_path = 'spec/fixtures'
4
-
5
- describe 'process files with line endings explicitly pre-specified' do
6
-
7
- it 'should process a file with \n for line endings and within data fields' do
8
- sep = "\n"
9
- options = {:row_sep => sep}
10
- data = SmarterCSV.process("#{fixture_path}/carriage_returns_n.csv", {:row_sep => sep})
11
- data.flatten.size.should == 8
12
- data[0][:name].should == "Anfield"
13
- data[0][:street].should == "Anfield Road"
14
- data[0][:city].should == "Liverpool"
15
- data[1][:name].should == ["Highbury", "Highbury House"].join(sep)
16
- data[2][:street].should == ["Sir Matt ", "Busby Way"].join(sep)
17
- data[3][:city].should == ["Newcastle-upon-tyne ", "Tyne and Wear"].join(sep)
18
- data[4][:name].should == ["White Hart Lane", "(The Lane)"].join(sep)
19
- data[4][:street].should == ["Bill Nicholson Way ", "748 High Rd"].join(sep)
20
- data[4][:city].should == ["Tottenham", "London"].join(sep)
21
- data[5][:name].should == "Stamford Bridge"
22
- data[5][:street].should == ["Fulham Road", "London"].join(sep)
23
- data[5][:city].should be_nil
24
- data[6][:name].should == ["Etihad Stadium", "Rowsley St", "Manchester"].join(sep)
25
- data[7][:name].should == "Goodison"
26
- data[7][:street].should == "Goodison Road"
27
- data[7][:city].should == "Liverpool"
28
- end
29
-
30
- it 'should process a file with \r for line endings and within data fields' do
31
- sep = "\r"
32
- data = SmarterCSV.process("#{fixture_path}/carriage_returns_r.csv", {:row_sep => sep})
33
- data.flatten.size.should == 8
34
- data[0][:name].should == "Anfield"
35
- data[0][:street].should == "Anfield Road"
36
- data[0][:city].should == "Liverpool"
37
- data[1][:name].should == ["Highbury", "Highbury House"].join(sep)
38
- data[2][:street].should == ["Sir Matt ", "Busby Way"].join(sep)
39
- data[3][:city].should == ["Newcastle-upon-tyne ", "Tyne and Wear"].join(sep)
40
- data[4][:name].should == ["White Hart Lane", "(The Lane)"].join(sep)
41
- data[4][:street].should == ["Bill Nicholson Way ", "748 High Rd"].join(sep)
42
- data[4][:city].should == ["Tottenham", "London"].join(sep)
43
- data[5][:name].should == "Stamford Bridge"
44
- data[5][:street].should == ["Fulham Road", "London"].join(sep)
45
- data[5][:city].should be_nil
46
- data[6][:name].should == ["Etihad Stadium", "Rowsley St", "Manchester"].join(sep)
47
- data[7][:name].should == "Goodison"
48
- data[7][:street].should == "Goodison Road"
49
- data[7][:city].should == "Liverpool"
50
- end
51
-
52
- it 'should process a file with \r\n for line endings and within data fields' do
53
- sep = "\r\n"
54
- data = SmarterCSV.process("#{fixture_path}/carriage_returns_rn.csv", {:row_sep => sep})
55
- data.flatten.size.should == 8
56
- data[0][:name].should == "Anfield"
57
- data[0][:street].should == "Anfield Road"
58
- data[0][:city].should == "Liverpool"
59
- data[1][:name].should == ["Highbury", "Highbury House"].join(sep)
60
- data[2][:street].should == ["Sir Matt ", "Busby Way"].join(sep)
61
- data[3][:city].should == ["Newcastle-upon-tyne ", "Tyne and Wear"].join(sep)
62
- data[4][:name].should == ["White Hart Lane", "(The Lane)"].join(sep)
63
- data[4][:street].should == ["Bill Nicholson Way ", "748 High Rd"].join(sep)
64
- data[4][:city].should == ["Tottenham", "London"].join(sep)
65
- data[5][:name].should == "Stamford Bridge"
66
- data[5][:street].should == ["Fulham Road", "London"].join(sep)
67
- data[5][:city].should be_nil
68
- data[6][:name].should == ["Etihad Stadium", "Rowsley St", "Manchester"].join(sep)
69
- data[7][:name].should == "Goodison"
70
- data[7][:street].should == "Goodison Road"
71
- data[7][:city].should == "Liverpool"
72
- end
73
-
74
- it 'should process a file with more quoted text carriage return characters (\r) than line ending characters (\n)' do
75
- row_sep = "\n"
76
- text_sep = "\r"
77
- data = SmarterCSV.process("#{fixture_path}/carriage_returns_quoted.csv", {:row_sep => row_sep})
78
- data.flatten.size.should == 2
79
- data[0][:band].should == "New Order"
80
- data[0][:members].should == ["Bernard Sumner", "Peter Hook", "Stephen Morris", "Gillian Gilbert"].join(text_sep)
81
- data[0][:albums].should == ["Movement", "Power, Corruption and Lies", "Low-Life", "Brotherhood", "Substance"].join(text_sep)
82
- data[1][:band].should == "Led Zeppelin"
83
- data[1][:members].should == ["Jimmy Page", "Robert Plant", "John Bonham", "John Paul Jones"].join(text_sep)
84
- data[1][:albums].should == ["Led Zeppelin", "Led Zeppelin II", "Led Zeppelin III", "Led Zeppelin IV"].join(text_sep)
85
- end
86
-
87
- end
88
-
89
- describe 'process files with line endings in automatic mode' do
90
-
91
- it 'should process a file with \n for line endings and within data fields' do
92
- sep = "\n"
93
- data = SmarterCSV.process("#{fixture_path}/carriage_returns_n.csv", {:row_sep => :auto})
94
- data.flatten.size.should == 8
95
- data[0][:name].should == "Anfield"
96
- data[0][:street].should == "Anfield Road"
97
- data[0][:city].should == "Liverpool"
98
- data[1][:name].should == ["Highbury", "Highbury House"].join(sep)
99
- data[2][:street].should == ["Sir Matt ", "Busby Way"].join(sep)
100
- data[3][:city].should == ["Newcastle-upon-tyne ", "Tyne and Wear"].join(sep)
101
- data[4][:name].should == ["White Hart Lane", "(The Lane)"].join(sep)
102
- data[4][:street].should == ["Bill Nicholson Way ", "748 High Rd"].join(sep)
103
- data[4][:city].should == ["Tottenham", "London"].join(sep)
104
- data[5][:name].should == "Stamford Bridge"
105
- data[5][:street].should == ["Fulham Road", "London"].join(sep)
106
- data[5][:city].should be_nil
107
- data[6][:name].should == ["Etihad Stadium", "Rowsley St", "Manchester"].join(sep)
108
- data[7][:name].should == "Goodison"
109
- data[7][:street].should == "Goodison Road"
110
- data[7][:city].should == "Liverpool"
111
- end
112
-
113
- it 'should process a file with \r for line endings and within data fields' do
114
- sep = "\r"
115
- data = SmarterCSV.process("#{fixture_path}/carriage_returns_r.csv", {:row_sep => :auto})
116
- data.flatten.size.should == 8
117
- data[0][:name].should == "Anfield"
118
- data[0][:street].should == "Anfield Road"
119
- data[0][:city].should == "Liverpool"
120
- data[1][:name].should == ["Highbury", "Highbury House"].join(sep)
121
- data[2][:street].should == ["Sir Matt ", "Busby Way"].join(sep)
122
- data[3][:city].should == ["Newcastle-upon-tyne ", "Tyne and Wear"].join(sep)
123
- data[4][:name].should == ["White Hart Lane", "(The Lane)"].join(sep)
124
- data[4][:street].should == ["Bill Nicholson Way ", "748 High Rd"].join(sep)
125
- data[4][:city].should == ["Tottenham", "London"].join(sep)
126
- data[5][:name].should == "Stamford Bridge"
127
- data[5][:street].should == ["Fulham Road", "London"].join(sep)
128
- data[5][:city].should be_nil
129
- data[6][:name].should == ["Etihad Stadium", "Rowsley St", "Manchester"].join(sep)
130
- data[7][:name].should == "Goodison"
131
- data[7][:street].should == "Goodison Road"
132
- data[7][:city].should == "Liverpool"
133
- end
134
-
135
- it 'should process a file with \r\n for line endings and within data fields' do
136
- sep = "\r\n"
137
- data = SmarterCSV.process("#{fixture_path}/carriage_returns_rn.csv", {:row_sep => :auto})
138
- data.flatten.size.should == 8
139
- data[0][:name].should == "Anfield"
140
- data[0][:street].should == "Anfield Road"
141
- data[0][:city].should == "Liverpool"
142
- data[1][:name].should == ["Highbury", "Highbury House"].join(sep)
143
- data[2][:street].should == ["Sir Matt ", "Busby Way"].join(sep)
144
- data[3][:city].should == ["Newcastle-upon-tyne ", "Tyne and Wear"].join(sep)
145
- data[4][:name].should == ["White Hart Lane", "(The Lane)"].join(sep)
146
- data[4][:street].should == ["Bill Nicholson Way ", "748 High Rd"].join(sep)
147
- data[4][:city].should == ["Tottenham", "London"].join(sep)
148
- data[5][:name].should == "Stamford Bridge"
149
- data[5][:street].should == ["Fulham Road", "London"].join(sep)
150
- data[5][:city].should be_nil
151
- data[6][:name].should == ["Etihad Stadium", "Rowsley St", "Manchester"].join(sep)
152
- data[7][:name].should == "Goodison"
153
- data[7][:street].should == "Goodison Road"
154
- data[7][:city].should == "Liverpool"
155
- end
156
-
157
- it 'should process a file with more quoted text carriage return characters (\r) than line ending characters (\n)' do
158
- row_sep = "\n"
159
- text_sep = "\r"
160
- data = SmarterCSV.process("#{fixture_path}/carriage_returns_quoted.csv", {:row_sep => :auto})
161
- data.flatten.size.should == 2
162
- data[0][:band].should == "New Order"
163
- data[0][:members].should == ["Bernard Sumner", "Peter Hook", "Stephen Morris", "Gillian Gilbert"].join(text_sep)
164
- data[0][:albums].should == ["Movement", "Power, Corruption and Lies", "Low-Life", "Brotherhood", "Substance"].join(text_sep)
165
- data[1][:band].should == "Led Zeppelin"
166
- data[1][:members].should == ["Jimmy Page", "Robert Plant", "John Bonham", "John Paul Jones"].join(text_sep)
167
- data[1][:albums].should == ["Led Zeppelin", "Led Zeppelin II", "Led Zeppelin III", "Led Zeppelin IV"].join(text_sep)
168
- end
169
-
170
- end
@@ -1,14 +0,0 @@
1
- require 'spec_helper'
2
-
3
- fixture_path = 'spec/fixtures'
4
-
5
- describe 'be_able_to' do
6
- it 'loads_chunk_cornercase_csv_files' do
7
- (0..5).each do |chunk_size| # test for all chunk-sizes
8
- options = {:chunk_size => chunk_size, :remove_empty_hashes => true}
9
- data = SmarterCSV.process("#{fixture_path}/chunk_cornercase.csv", options)
10
- data.flatten.size.should == 5 # end-result must always be 5 rows
11
- end
12
- end
13
-
14
- end
@@ -1,15 +0,0 @@
1
- require 'spec_helper'
2
-
3
- fixture_path = 'spec/fixtures'
4
-
5
- describe 'be_able_to' do
6
- it 'close file after using it' do
7
- options = {:col_sep => "\cA", :row_sep => "\cB", :comment_regexp => /^#/, :strings_as_keys => true}
8
-
9
- file = File.new("#{fixture_path}/binary.csv")
10
-
11
- SmarterCSV.process(file, options)
12
-
13
- file.closed?.should == true
14
- end
15
- end
@@ -1,11 +0,0 @@
1
- require 'spec_helper'
2
-
3
- fixture_path = 'spec/fixtures'
4
-
5
- describe 'be_able_to' do
6
- it 'loads_file_with_different_column_separator' do
7
- options = {:col_sep => ';'}
8
- data = SmarterCSV.process("#{fixture_path}/separator.csv", options)
9
- data.flatten.size.should == 3
10
- end
11
- end
@@ -1,48 +0,0 @@
1
- require 'spec_helper'
2
-
3
- fixture_path = 'spec/fixtures'
4
-
5
- describe 'numeric conversion of values' do
6
- it 'occurs by default' do
7
- options = {}
8
- data = SmarterCSV.process("#{fixture_path}/numeric.csv", options)
9
- data.size.should == 3
10
-
11
- # all the keys should be symbols
12
- data.each do |hash|
13
- hash[:wealth].should be_a_kind_of(Numeric) unless hash[:wealth].nil?
14
- hash[:reference].should be_a_kind_of(Numeric) unless hash[:reference].nil?
15
- end
16
- end
17
-
18
- it 'can be prevented for all values' do
19
- options = { :convert_values_to_numeric => false }
20
- data = SmarterCSV.process("#{fixture_path}/numeric.csv", options)
21
-
22
- data.each do |hash|
23
- hash[:wealth].should be_a_kind_of(String) unless hash[:wealth].nil?
24
- hash[:reference].should be_a_kind_of(String) unless hash[:reference].nil?
25
- end
26
- end
27
-
28
- it 'can be prevented for some keys' do
29
- options = { :convert_values_to_numeric => { :except => :reference }}
30
- data = SmarterCSV.process("#{fixture_path}/numeric.csv", options)
31
-
32
- data.each do |hash|
33
- hash[:wealth].should be_a_kind_of(Numeric) unless hash[:wealth].nil?
34
- hash[:reference].should be_a_kind_of(String) unless hash[:reference].nil?
35
- end
36
- end
37
-
38
- it 'can occur only for some keys' do
39
- options = { :convert_values_to_numeric => { :only => :wealth }}
40
- data = SmarterCSV.process("#{fixture_path}/numeric.csv", options)
41
-
42
- data.each do |hash|
43
- hash[:wealth].should be_a_kind_of(Numeric) unless hash[:wealth].nil?
44
- hash[:reference].should be_a_kind_of(String) unless hash[:reference].nil?
45
- end
46
- end
47
- end
48
-
@@ -1,17 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "Hash.zip" do
4
- it "constructs a new Hash from two Arrays" do
5
- Hash.zip(["a", "b"], [1, 2]).should == { "a" => 1, "b" => 2 }
6
- end
7
-
8
- it "constructs an empty Hash if given no keys" do
9
- Hash.zip([], []).should == {}
10
- Hash.zip([], [1]).should == {}
11
- end
12
-
13
- it "uses nil values if there are more keys than values" do
14
- Hash.zip(["a"], []).should == { "a" => nil }
15
- Hash.zip(["a", "b"], [1]).should == { "a" => 1, "b" => nil }
16
- end
17
- end
@@ -1,21 +0,0 @@
1
- require 'spec_helper'
2
-
3
- fixture_path = 'spec/fixtures'
4
-
5
- describe 'be_able_to' do
6
- it 'loads_file_with_dashes_in_header_fields as strings' do
7
- options = {:strings_as_keys => true}
8
- data = SmarterCSV.process("#{fixture_path}/with_dashes.csv", options)
9
- data.flatten.size.should == 5
10
- data[0]['first_name'].should eq 'Dan'
11
- data[0]['last_name'].should eq 'McAllister'
12
- end
13
-
14
- it 'loads_file_with_dashes_in_header_fields as symbols' do
15
- options = {:strings_as_keys => false}
16
- data = SmarterCSV.process("#{fixture_path}/with_dashes.csv", options)
17
- data.flatten.size.should == 5
18
- data[0][:first_name].should eq 'Dan'
19
- data[0][:last_name].should eq 'McAllister'
20
- end
21
- end
@@ -1,24 +0,0 @@
1
- require 'spec_helper'
2
-
3
- fixture_path = 'spec/fixtures'
4
-
5
- describe 'be_able_to' do
6
- it 'not_downcase_headers' do
7
- options = {:keep_original_headers => true}
8
- data = SmarterCSV.process("#{fixture_path}/basic.csv", options)
9
- data.size.should == 5
10
- # all the keys should be string
11
- data.each{|item| item.keys.each{|x| x.class.should be == String}}
12
-
13
- data.each do |item|
14
- item.keys.each do |key|
15
- ['First Name','Last Name','Dogs','Cats','Birds','Fish'].should include( key )
16
- end
17
- end
18
-
19
- data.each do |h|
20
- h.size.should <= 6
21
- end
22
- end
23
-
24
- end
@@ -1,25 +0,0 @@
1
- require 'spec_helper'
2
-
3
- fixture_path = 'spec/fixtures'
4
-
5
- describe 'be_able_to' do
6
- it 'remove_values_matching' do
7
- options = {:remove_zero_values => true, :key_mapping => {:first_name => :vorname, :last_name => :nachname} }
8
- data = SmarterCSV.process("#{fixture_path}/basic.csv", options)
9
- data.size.should == 5
10
- # all the keys should be symbols
11
- data.each{|item| item.keys.each{|x| x.class.should be == Symbol}}
12
-
13
- data.each do |hash|
14
- hash.keys.each do |key|
15
- [:vorname, :nachname, :dogs, :cats, :birds, :fish].should include( key )
16
- end
17
- hash.values.should_not include( 0 )
18
- end
19
-
20
- data.each do |h|
21
- h.size.should <= 6
22
- end
23
- end
24
-
25
- end
@@ -1,43 +0,0 @@
1
- require 'spec_helper'
2
-
3
- fixture_path = 'spec/fixtures'
4
-
5
- describe 'process files with line endings explicitly pre-specified' do
6
- it 'reads file with \n line endings' do
7
- options = {:row_sep => "\n"}
8
- data = SmarterCSV.process("#{fixture_path}/line_endings_n.csv", options)
9
- data.size.should == 3
10
- end
11
-
12
- it 'reads file with \r line endings' do
13
- options = {:row_sep => "\r"}
14
- data = SmarterCSV.process("#{fixture_path}/line_endings_r.csv", options)
15
- data.size.should == 3
16
- end
17
-
18
- it 'reads file with \r\n line endings' do
19
- options = {:row_sep => "\r\n"}
20
- data = SmarterCSV.process("#{fixture_path}/line_endings_rn.csv", options)
21
- data.size.should == 3
22
- end
23
- end
24
-
25
- describe 'process files with line endings in automatic mode' do
26
- it 'reads file with \n line endings' do
27
- options = {:row_sep => :auto}
28
- data = SmarterCSV.process("#{fixture_path}/line_endings_n.csv", options)
29
- data.size.should == 3
30
- end
31
-
32
- it 'reads file with \r line endings' do
33
- options = {:row_sep => :auto}
34
- data = SmarterCSV.process("#{fixture_path}/line_endings_r.csv", options)
35
- data.size.should == 3
36
- end
37
-
38
- it 'reads file with \r\n line endings' do
39
- options = {:row_sep => :auto}
40
- data = SmarterCSV.process("#{fixture_path}/line_endings_rn.csv", options)
41
- data.size.should == 3
42
- end
43
- end
@@ -1,20 +0,0 @@
1
- require 'spec_helper'
2
-
3
- fixture_path = 'spec/fixtures'
4
-
5
- describe 'be_able_to' do
6
- it 'loads_basic_csv_file' do
7
- data = SmarterCSV.process("#{fixture_path}/basic.csv")
8
- data.size.should == 5
9
-
10
- # all the keys should be symbols
11
- data.each{|item| item.keys.each{|x| x.class.should be == Symbol}}
12
- data.each do |h|
13
- h.keys.each do |key|
14
- [:first_name, :last_name, :dogs, :cats, :birds, :fish].should include( key )
15
- end
16
- h.size.should <= 6
17
- end
18
- end
19
-
20
- end
@@ -1,21 +0,0 @@
1
- require 'spec_helper'
2
-
3
- fixture_path = 'spec/fixtures'
4
-
5
- describe 'malformed_csv' do
6
- subject { lambda { SmarterCSV.process(csv_path) } }
7
-
8
- context "malformed header" do
9
- let(:csv_path) { "#{fixture_path}/malformed_header.csv" }
10
- it { should raise_error(CSV::MalformedCSVError) }
11
- it { should raise_error(/(Missing or stray quote in line 1|CSV::MalformedCSVError)/) }
12
- it { should raise_error(CSV::MalformedCSVError) }
13
- end
14
-
15
- context "malformed content" do
16
- let(:csv_path) { "#{fixture_path}/malformed.csv" }
17
- it { should raise_error(CSV::MalformedCSVError) }
18
- it { should raise_error(/(Missing or stray quote in line 1|CSV::MalformedCSVError)/) }
19
- it { should raise_error(CSV::MalformedCSVError) }
20
- end
21
- end
@@ -1,24 +0,0 @@
1
- require 'spec_helper'
2
-
3
- fixture_path = 'spec/fixtures'
4
-
5
- describe 'be_able_to' do
6
- it 'loads_csv_file_without_header' do
7
- options = {:headers_in_file => false, :user_provided_headers => [:a,:b,:c,:d,:e,:f]}
8
- data = SmarterCSV.process("#{fixture_path}/no_header.csv", options)
9
- data.size.should == 5
10
- # all the keys should be symbols
11
- data.each{|item| item.keys.each{|x| x.class.should be == Symbol}}
12
-
13
- data.each do |item|
14
- item.keys.each do |key|
15
- [:a,:b,:c,:d,:e,:f].should include( key )
16
- end
17
- end
18
-
19
- data.each do |h|
20
- h.size.should <= 6
21
- end
22
- end
23
-
24
- end
@@ -1,24 +0,0 @@
1
- require 'spec_helper'
2
-
3
- fixture_path = 'spec/fixtures'
4
-
5
- describe 'be_able_to' do
6
- it 'not_downcase_headers' do
7
- options = {:downcase_header => false}
8
- data = SmarterCSV.process("#{fixture_path}/basic.csv", options)
9
- data.size.should == 5
10
- # all the keys should be symbols
11
- data.each{|item| item.keys.each{|x| x.class.should be == Symbol}}
12
-
13
- data.each do |item|
14
- item.keys.each do |key|
15
- [:First_Name, :Last_Name, :Dogs, :Cats, :Birds, :Fish].should include( key )
16
- end
17
- end
18
-
19
- data.each do |h|
20
- h.size.should <= 6
21
- end
22
- end
23
-
24
- end
@@ -1,23 +0,0 @@
1
- require 'spec_helper'
2
-
3
- fixture_path = 'spec/fixtures'
4
-
5
- describe 'be_able_to' do
6
-
7
- it 'loads_file_with_quoted_fields' do
8
- options = {}
9
- data = SmarterCSV.process("#{fixture_path}/quoted.csv", options)
10
- data.flatten.size.should == 4
11
- data[1][:model].should eq 'Venture "Extended Edition"'
12
- data[1][:description].should be_nil
13
- data[2][:model].should eq 'Venture "Extended Edition, Very Large"'
14
- data[2][:description].should be_nil
15
- data.each do |h|
16
- h[:year].class.should eq Fixnum
17
- h[:make].should_not be_nil
18
- h[:model].should_not be_nil
19
- h[:price].class.should eq Float
20
- end
21
- end
22
-
23
- end
@@ -1,13 +0,0 @@
1
- require 'spec_helper'
2
-
3
- fixture_path = 'spec/fixtures'
4
-
5
- describe 'be_able_to' do
6
- it 'remove_empty_values' do
7
- options = {:row_sep => :auto, :remove_empty_values => true}
8
- data = SmarterCSV.process("#{fixture_path}/empty.csv", options)
9
- data.size.should == 1
10
- data[0].keys.should == [:not_empty_1, :not_empty_2, :not_empty_3]
11
- end
12
-
13
- end
@@ -1,25 +0,0 @@
1
- require 'spec_helper'
2
-
3
- fixture_path = 'spec/fixtures'
4
-
5
- describe 'be_able_to' do
6
- it 'remove_values_matching' do
7
- options = {:remove_zero_values => true, :key_mapping => {:first_name => :vorname, :last_name => :nachname, :fish => nil} }
8
- data = SmarterCSV.process("#{fixture_path}/basic.csv", options)
9
- data.size.should == 5
10
- # all the keys should be symbols
11
- data.each{|item| item.keys.each{|x| x.class.should be == Symbol}}
12
-
13
- data.each do |hash|
14
- hash.keys.each do |key|
15
- [:vorname, :nachname, :dogs, :cats, :birds].should include( key )
16
- end
17
- hash.values.should_not include( 0 )
18
- end
19
-
20
- data.each do |h|
21
- h.size.should <= 6
22
- end
23
- end
24
-
25
- end
@@ -1,35 +0,0 @@
1
- require 'spec_helper'
2
-
3
- fixture_path = 'spec/fixtures'
4
-
5
- describe ':remove_unmapped_keys option' do
6
-
7
- it 'it has no effect on loading a file without options' do
8
- options = {}
9
- data = SmarterCSV.process("#{fixture_path}/lots_of_columns.csv", options)
10
- data.size.should eq 1
11
- data.first.size.should eq 474 # there are some empty rows in the fixture
12
- end
13
-
14
- it 'it has no effect if provided without :key_mapping' do
15
- options = {:remove_unmapped_keys => true}
16
- data = SmarterCSV.process("#{fixture_path}/lots_of_columns.csv", options)
17
- data.size.should eq 1
18
- data.first.size.should eq 474 # there are some empty rows in the fixture
19
- end
20
-
21
- it 'it defaults to false and has no effect if :key_mapping is provided without :remove_unmapped_keys' do
22
- options = {:key_mapping => {:column_0 => :one, :column_15 => :two, :column_42 => :three}}
23
- data = SmarterCSV.process("#{fixture_path}/lots_of_columns.csv", options)
24
- data.size.should eq 1
25
- data.first.size.should eq 474 # there are some empty rows in the fixture
26
- end
27
-
28
- it 'it removes non-mapped keys/columns when set to true and :key_mapping is provided' do
29
- options = {:remove_unmapped_keys => true, :key_mapping => {:column_0 => :one, :column_15 => :two, :column_42 => :three}}
30
- data = SmarterCSV.process("#{fixture_path}/lots_of_columns.csv", options)
31
- data.size.should eq 1
32
- data.first.size.should eq 2 # column_15 is empty
33
- end
34
- end
35
-
@@ -1,26 +0,0 @@
1
- require 'spec_helper'
2
-
3
- fixture_path = 'spec/fixtures'
4
-
5
- describe 'be_able_to' do
6
- it 'remove_values_matching' do
7
- options = {:remove_zero_values => true, :remove_empty_values => true, :remove_values_matching => /^\d+$/}
8
- data = SmarterCSV.process("#{fixture_path}/basic.csv", options)
9
- data.size.should == 5
10
- # all the keys should be symbols
11
- data.each{|item| item.keys.each{|x| x.class.should be == Symbol}}
12
-
13
- data.each do |hash|
14
- hash.keys.each do |key|
15
- [:first_name, :last_name].should include( key )
16
- end
17
- hash.values.each{|x| x.class.should be == String}
18
- hash.values.should_not include( 0 )
19
- end
20
-
21
- data.each do |h|
22
- h.size.should <= 6
23
- end
24
- end
25
-
26
- end
@@ -1,25 +0,0 @@
1
- require 'spec_helper'
2
-
3
- fixture_path = 'spec/fixtures'
4
-
5
- describe 'be_able_to' do
6
- it 'remove_zero_values' do
7
- options = {:remove_zero_values => true, :remove_empty_values => true}
8
- data = SmarterCSV.process("#{fixture_path}/basic.csv", options)
9
- data.size.should == 5
10
- # all the keys should be symbols
11
- data.each{|item| item.keys.each{|x| x.class.should be == Symbol}}
12
-
13
- data.each do |hash|
14
- hash.keys.each do |key|
15
- [:first_name, :last_name, :dogs, :cats, :birds, :fish].should include( key )
16
- end
17
- hash.values.should_not include( 0 )
18
- end
19
-
20
- data.each do |h|
21
- h.size.should <= 6
22
- end
23
- end
24
-
25
- end