smarter_csv 1.0.17 → 1.0.18

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7ac58be862e87f8334e8620b317e2d4cc534b881
4
+ data.tar.gz: 91d2b6f6d80b70cfd3878e2a82abf3cb5c7e66fb
5
+ SHA512:
6
+ metadata.gz: 90c70c2eee91b085414aefbd0c1a59268950a2ef3d0ba4a33ec74bc7795b0712ac98e6a9f61f211774dc5c467fb6dcf0ec84c972ba587491bb480dd31915d0d7
7
+ data.tar.gz: e2688ae5b2a0f3e36e07b0e8d90847541efadb9263ccdc215b470296a078618cfd93ccd342abbcf466648f5ee5423bae5bb9bbfa69baab0157d5a426eff853bd
@@ -5,25 +5,24 @@ rvm:
5
5
  - 1.9.2
6
6
  - 1.9.3
7
7
  - 2.0.0
8
- - jruby-18mode
9
- - jruby-19mode
8
+ - 2.1.3
9
+ - jruby
10
10
  - ruby-head
11
11
  - jruby-head
12
12
  - ree
13
- jdk:
14
- - oraclejdk7
15
- - openjdk7
13
+ - rbx
14
+ # jdk:
15
+ # - oraclejdk7
16
+ # - openjdk7
16
17
  env: JRUBY_OPTS="--server -Xcompile.invokedynamic=false -J-XX:+TieredCompilation -J-XX:TieredStopAtLevel=1 -J-noverify -J-Xms512m -J-Xmx1024m"
17
18
  matrix:
18
19
  allow_failures:
19
- - rbx-18mode
20
- - rbx-19mode
20
+ - rbx
21
21
  - rvm: jruby-head
22
22
  - rvm: ruby-head
23
23
  - rvm: ree
24
24
  - rvm: 1.8.7
25
25
  - rvm: jruby-18mode
26
- - rvm: rbx-18mode
27
26
  branches:
28
27
  only:
29
28
  - master
data/README.md CHANGED
@@ -165,6 +165,15 @@ The options and the block are optional.
165
165
  | :verbose | false | print out line number while processing (to track down problems in input files) |
166
166
 
167
167
 
168
+ #### NOTES about File Encodings:
169
+ * if you have a CSV file which contains unicode characters, you can process it as follows:
170
+
171
+
172
+ f = File.open(filename, "r:bom|utf-8");
173
+ data = SmarterCSV.process(f);
174
+ f.close
175
+
176
+
168
177
  #### NOTES about CSV Headers:
169
178
  * as this method parses CSV files, it is assumed that the first line of any file will contain a valid header
170
179
  * the first line with the CSV header may or may not be commented out according to the :comment_regexp
@@ -191,19 +200,6 @@ The options and the block are optional.
191
200
 
192
201
  #### Known Issues:
193
202
  * if you are using 1.8.7 versions of Ruby, JRuby, or Ruby Enterprise Edition, `smarter_csv` will have problems with double-quoted fields, because of a bug in an underlying library.
194
- * if your CSV data contains the :row_sep character, e.g. CR, smarter_csv will not be able to handle the data, but will report `CSV::MalformedCSVError: Unclosed quoted field`.
195
-
196
-
197
- Example of Invalid CSV:
198
-
199
- id,name,comment
200
- 1,James,a simple comment
201
- 2,Paul,"a comment which contains
202
- the :row_sep character CR"
203
- 3,Frank,"some other comment"
204
-
205
- The second row contains a comment with an embedded \n carriage return character.
206
- `smarter_csv` handles this special case as invalid CSV.
207
203
 
208
204
 
209
205
  ## See also:
@@ -229,6 +225,9 @@ Or install it yourself as:
229
225
 
230
226
  ## Changes
231
227
 
228
+ #### 1.0.18 (2014-10-27)
229
+ * added support for multi-line fields / csv fields containing CR (thanks to Chris Hilton) (issue #31)
230
+
232
231
  #### 1.0.17 (2014-01-13)
233
232
  * added option to set :row_sep to :auto , for automatic detection of the row-separator (issue #22)
234
233
 
@@ -327,6 +326,7 @@ Please [open an Issue on GitHub](https://github.com/tilo/smarter_csv/issues) if
327
326
  Many thanks to people who have filed issues and sent comments.
328
327
  And a special thanks to those who contributed pull requests:
329
328
 
329
+ * [Chris Hilton](https://github.com/chrismhilton)
330
330
  * [Sean Duckett](http://github.com/sduckett)
331
331
  * [Alex Ong](http://github.com/khaong)
332
332
  * [Martin Nilsson](http://github.com/MrTin)
@@ -21,7 +21,7 @@ module SmarterCSV
21
21
  f = input.respond_to?(:readline) ? input : File.open(input, "r:#{options[:file_encoding]}")
22
22
 
23
23
  if options[:row_sep] == :auto
24
- options[:row_sep] = SmarterCSV.guess_line_ending( f )
24
+ options[:row_sep] = SmarterCSV.guess_line_ending( f, options )
25
25
  f.rewind
26
26
  end
27
27
  $/ = options[:row_sep]
@@ -87,6 +87,15 @@ module SmarterCSV
87
87
  line_count += 1
88
88
  print "processing line %10d\r" % line_count if options[:verbose]
89
89
  next if line =~ options[:comment_regexp] # ignore all comment lines if there are any
90
+
91
+ # cater for the quoted csv data containing the row separator carriage return character
92
+ # in which case the row data will be split across multiple lines (see the sample content in spec/fixtures/carriage_returns_rn.csv)
93
+ # by detecting the existence of an uneven number of quote characters
94
+ while line.count(options[:quote_char])%2 == 1
95
+ print "line contains uneven number of quote chars so including content of next line" if options[:verbose]
96
+ line += f.readline
97
+ end
98
+
90
99
  line.chomp! # will use $/ which is set to options[:col_sep]
91
100
 
92
101
  if (line =~ %r{#{options[:quote_char]}}) and (! options[:force_simple_split])
@@ -104,7 +113,10 @@ module SmarterCSV
104
113
  eval('hash.delete(:"")')
105
114
  end
106
115
 
107
- hash.delete_if{|k,v| v.nil? || v =~ /^\s*$/} if options[:remove_empty_values]
116
+ # remove empty values using the same regexp as used by the rails blank? method
117
+ # which caters for double \n and \r\n characters such as "1\r\n\r\n2" whereas the original check (v =~ /^\s*$/) does not
118
+ hash.delete_if{|k,v| v.nil? || v !~ /[^[:space:]]/} if options[:remove_empty_values]
119
+
108
120
  hash.delete_if{|k,v| ! v.nil? && v =~ /^(\d+|\d+\.\d+)$/ && v.to_f == 0} if options[:remove_zero_values] # values are typically Strings!
109
121
  hash.delete_if{|k,v| v =~ options[:remove_values_matching]} if options[:remove_values_matching]
110
122
  if options[:convert_values_to_numeric]
@@ -192,12 +204,16 @@ module SmarterCSV
192
204
  end
193
205
 
194
206
  # limitation: this currently reads the whole file in before making a decision
195
- def self.guess_line_ending( filehandle )
207
+ def self.guess_line_ending( filehandle, options )
196
208
  counts = {"\n" => 0 , "\r" => 0, "\r\n" => 0}
209
+ quoted_char = false
197
210
 
211
+ # count how many of the pre-defined line-endings we find
212
+ # ignoring those contained within quote characters
198
213
  filehandle.each_char do |c|
199
- next if c !~ /\r|\n|\r\n/
200
- counts[c] += 1 # count how many of the pre-defined line-endings we find
214
+ quoted_char = !quoted_char if c == options[:quote_char]
215
+ next if quoted_char || c !~ /\r|\n|\r\n/
216
+ counts[c] += 1
201
217
  end
202
218
  # find the key/value pair with the largest counter:
203
219
  k,v = counts.max_by{|k,v| v}
@@ -1,3 +1,3 @@
1
1
  module SmarterCSV
2
- VERSION = "1.0.17"
2
+ VERSION = "1.0.18"
3
3
  end
@@ -0,0 +1,18 @@
1
+ Name,Street,City
2
+ Anfield,Anfield Road,Liverpool
3
+ "Highbury
4
+ Highbury House",75 Drayton Park,London
5
+ Old Trafford,"Sir Matt
6
+ Busby Way",Manchester
7
+ St. James' Park,,"Newcastle-upon-tyne
8
+ Tyne and Wear"
9
+ "White Hart Lane
10
+ (The Lane)","Bill Nicholson Way
11
+ 748 High Rd","Tottenham
12
+ London"
13
+ Stamford Bridge,"Fulham Road
14
+ London",
15
+ "Etihad Stadium
16
+ Rowsley St
17
+ Manchester",,
18
+ Goodison,Goodison Road,Liverpool
@@ -0,0 +1,3 @@
1
+ Band,Members,Albums
2
+ New Order,"Bernard Sumner
3
+ Led Zeppelin,"Jimmy Page
@@ -0,0 +1 @@
1
+ Name,Street,City
@@ -0,0 +1,18 @@
1
+ Name,Street,City
2
+ Anfield,Anfield Road,Liverpool
3
+ "Highbury
4
+ Highbury House",75 Drayton Park,London
5
+ Old Trafford,"Sir Matt
6
+ Busby Way",Manchester
7
+ St. James' Park,,"Newcastle-upon-tyne
8
+ Tyne and Wear"
9
+ "White Hart Lane
10
+ (The Lane)","Bill Nicholson Way
11
+ 748 High Rd","Tottenham
12
+ London"
13
+ Stamford Bridge,"Fulham Road
14
+ London",
15
+ "Etihad Stadium
16
+ Rowsley St
17
+ Manchester",,
18
+ Goodison,Goodison Road,Liverpool
@@ -0,0 +1,5 @@
1
+ not empty 1,not empty 2,not empty 3,empty 1,empty 2
2
+ 56
3
+
4
+ 666
5
+ ",?,"
@@ -0,0 +1,170 @@
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
@@ -16,7 +16,7 @@ describe 'numeric conversion of values' do
16
16
  end
17
17
 
18
18
  it 'can be prevented for all values' do
19
- options = { convert_values_to_numeric: false }
19
+ options = { :convert_values_to_numeric => false }
20
20
  data = SmarterCSV.process("#{fixture_path}/numeric.csv", options)
21
21
 
22
22
  data.each do |hash|
@@ -26,7 +26,7 @@ describe 'numeric conversion of values' do
26
26
  end
27
27
 
28
28
  it 'can be prevented for some keys' do
29
- options = { convert_values_to_numeric: { except: :reference }}
29
+ options = { :convert_values_to_numeric => { :except => :reference }}
30
30
  data = SmarterCSV.process("#{fixture_path}/numeric.csv", options)
31
31
 
32
32
  data.each do |hash|
@@ -36,7 +36,7 @@ describe 'numeric conversion of values' do
36
36
  end
37
37
 
38
38
  it 'can occur only for some keys' do
39
- options = { convert_values_to_numeric: { only: :wealth }}
39
+ options = { :convert_values_to_numeric => { :only => :wealth }}
40
40
  data = SmarterCSV.process("#{fixture_path}/numeric.csv", options)
41
41
 
42
42
  data.each do |hash|
@@ -0,0 +1,13 @@
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
metadata CHANGED
@@ -1,49 +1,44 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smarter_csv
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.17
5
- prerelease:
4
+ version: 1.0.18
6
5
  platform: ruby
7
6
  authors:
8
- - ! 'Tilo Sloboda
9
-
10
- '
7
+ - |
8
+ Tilo Sloboda
11
9
  autorequire:
12
10
  bindir: bin
13
11
  cert_chain: []
14
- date: 2014-01-13 00:00:00.000000000 Z
12
+ date: 2014-10-28 00:00:00.000000000 Z
15
13
  dependencies:
16
14
  - !ruby/object:Gem::Dependency
17
15
  name: rspec
18
16
  requirement: !ruby/object:Gem::Requirement
19
- none: false
20
17
  requirements:
21
- - - ! '>='
18
+ - - ">="
22
19
  - !ruby/object:Gem::Version
23
20
  version: '0'
24
21
  type: :development
25
22
  prerelease: false
26
23
  version_requirements: !ruby/object:Gem::Requirement
27
- none: false
28
24
  requirements:
29
- - - ! '>='
25
+ - - ">="
30
26
  - !ruby/object:Gem::Version
31
27
  version: '0'
32
28
  description: Ruby Gem for smarter importing of CSV Files as Array(s) of Hashes, with
33
29
  optional features for processing large files in parallel, embedded comments, unusual
34
30
  field- and record-separators, flexible mapping of CSV-headers to Hash-keys
35
31
  email:
36
- - ! 'tilo.sloboda@gmail.com
37
-
38
- '
32
+ - |
33
+ tilo.sloboda@gmail.com
39
34
  executables: []
40
35
  extensions: []
41
36
  extra_rdoc_files: []
42
37
  files:
43
- - .gitignore
44
- - .rspec
45
- - .rvmrc
46
- - .travis.yml
38
+ - ".gitignore"
39
+ - ".rspec"
40
+ - ".rvmrc"
41
+ - ".travis.yml"
47
42
  - Gemfile
48
43
  - README.md
49
44
  - Rakefile
@@ -54,7 +49,12 @@ files:
54
49
  - smarter_csv.gemspec
55
50
  - spec/fixtures/basic.csv
56
51
  - spec/fixtures/binary.csv
52
+ - spec/fixtures/carriage_returns_n.csv
53
+ - spec/fixtures/carriage_returns_quoted.csv
54
+ - spec/fixtures/carriage_returns_r.csv
55
+ - spec/fixtures/carriage_returns_rn.csv
57
56
  - spec/fixtures/chunk_cornercase.csv
57
+ - spec/fixtures/empty.csv
58
58
  - spec/fixtures/line_endings_n.csv
59
59
  - spec/fixtures/line_endings_r.csv
60
60
  - spec/fixtures/line_endings_rn.csv
@@ -66,6 +66,7 @@ files:
66
66
  - spec/fixtures/separator.csv
67
67
  - spec/smarter_csv/binary_file2_spec.rb
68
68
  - spec/smarter_csv/binary_file_spec.rb
69
+ - spec/smarter_csv/carriage_return_spec.rb
69
70
  - spec/smarter_csv/chunked_reading_spec.rb
70
71
  - spec/smarter_csv/column_separator_spec.rb
71
72
  - spec/smarter_csv/convert_values_to_numeric_spec.rb
@@ -75,6 +76,7 @@ files:
75
76
  - spec/smarter_csv/no_header_spec.rb
76
77
  - spec/smarter_csv/not_downcase_header_spec.rb
77
78
  - spec/smarter_csv/quoted_spec.rb
79
+ - spec/smarter_csv/remove_empty_values_spec.rb
78
80
  - spec/smarter_csv/remove_keys_from_hashes_spec.rb
79
81
  - spec/smarter_csv/remove_not_mapped_keys_spec.rb
80
82
  - spec/smarter_csv/remove_values_matching_spec.rb
@@ -88,34 +90,38 @@ homepage: https://github.com/tilo/smarter_csv
88
90
  licenses:
89
91
  - MIT
90
92
  - GPL-2
93
+ metadata: {}
91
94
  post_install_message:
92
95
  rdoc_options: []
93
96
  require_paths:
94
97
  - lib
95
98
  required_ruby_version: !ruby/object:Gem::Requirement
96
- none: false
97
99
  requirements:
98
- - - ! '>='
100
+ - - ">="
99
101
  - !ruby/object:Gem::Version
100
102
  version: '0'
101
103
  required_rubygems_version: !ruby/object:Gem::Requirement
102
- none: false
103
104
  requirements:
104
- - - ! '>='
105
+ - - ">="
105
106
  - !ruby/object:Gem::Version
106
107
  version: '0'
107
108
  requirements:
108
109
  - csv
109
110
  rubyforge_project:
110
- rubygems_version: 1.8.23
111
+ rubygems_version: 2.2.2
111
112
  signing_key:
112
- specification_version: 3
113
+ specification_version: 4
113
114
  summary: Ruby Gem for smarter importing of CSV Files (and CSV-like files), with lots
114
115
  of optional features, e.g. chunked processing for huge CSV files
115
116
  test_files:
116
117
  - spec/fixtures/basic.csv
117
118
  - spec/fixtures/binary.csv
119
+ - spec/fixtures/carriage_returns_n.csv
120
+ - spec/fixtures/carriage_returns_quoted.csv
121
+ - spec/fixtures/carriage_returns_r.csv
122
+ - spec/fixtures/carriage_returns_rn.csv
118
123
  - spec/fixtures/chunk_cornercase.csv
124
+ - spec/fixtures/empty.csv
119
125
  - spec/fixtures/line_endings_n.csv
120
126
  - spec/fixtures/line_endings_r.csv
121
127
  - spec/fixtures/line_endings_rn.csv
@@ -127,6 +133,7 @@ test_files:
127
133
  - spec/fixtures/separator.csv
128
134
  - spec/smarter_csv/binary_file2_spec.rb
129
135
  - spec/smarter_csv/binary_file_spec.rb
136
+ - spec/smarter_csv/carriage_return_spec.rb
130
137
  - spec/smarter_csv/chunked_reading_spec.rb
131
138
  - spec/smarter_csv/column_separator_spec.rb
132
139
  - spec/smarter_csv/convert_values_to_numeric_spec.rb
@@ -136,6 +143,7 @@ test_files:
136
143
  - spec/smarter_csv/no_header_spec.rb
137
144
  - spec/smarter_csv/not_downcase_header_spec.rb
138
145
  - spec/smarter_csv/quoted_spec.rb
146
+ - spec/smarter_csv/remove_empty_values_spec.rb
139
147
  - spec/smarter_csv/remove_keys_from_hashes_spec.rb
140
148
  - spec/smarter_csv/remove_not_mapped_keys_spec.rb
141
149
  - spec/smarter_csv/remove_values_matching_spec.rb