smarter_csv 1.2.3 → 1.2.8

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c0efcd4dbad2546469ba99c1a133bc7548382e147fca66207d11065607fdb5ee
4
- data.tar.gz: 98024633925ed73251dd00606f23f73ca6cbda5517c24882b95935138ab4d7e3
3
+ metadata.gz: 90df8a442690ff9202ee2762a199e652ebca4dc6e5899d24ee0a72d192cf539f
4
+ data.tar.gz: 16d4826bc7840a112ef5d5ea3b7acf0997d5fbeb46f8f5289ffa31a7356aa71c
5
5
  SHA512:
6
- metadata.gz: ac64f3a688f9b5b4bce09e26d8ee140994bf585578ea6eed1d998cec434535f3afb4aa8c2ea222b873cb5ee113fba748412a96e1b3b23a8b5425d13aa7a6436c
7
- data.tar.gz: f8c3132f1f2cf60f8f67d2278d0b3660d7aab456581256e1c2508d1397c1cc31d455035c68656777c34e90ad6238c239699b1c59cdd918cdcd63c9f5a264aaba
6
+ metadata.gz: 85cf20915d26794ba37e508379bc8460d65f054771803779df3b67cd907a61da9ea195d8b51da5a9942bb7f3a5866325114a7a107cbbfcc269f47f6bf6dbfff5
7
+ data.tar.gz: e2508804722db4bd76e63a9e459b180fb75f7215e3e6d53970e5a83c120d0dab3cdd639c562abfe91d5b9458c3a990aa3959e85000491aef8529442ade5a3f90
data/.travis.yml CHANGED
@@ -6,10 +6,14 @@ before_install:
6
6
 
7
7
  matrix:
8
8
  include:
9
- - rvm: 2.2.8
10
- - rvm: 2.3.5
11
- - rvm: 2.4.2
12
- - rvm: jruby-9.1.13.0
9
+ - rvm: 2.2.10
10
+ - rvm: 2.3.8
11
+ - rvm: 2.4.6
12
+ - rvm: 2.5.7
13
+ - rvm: 2.6.3
14
+ - rvm: 2.7.2
15
+ - rvm: 3.0.0
16
+ - rvm: jruby-9.2.7.0
13
17
  env:
14
18
  - JRUBY_OPTS="--server -Xcompile.invokedynamic=false -J-XX:+TieredCompilation -J-XX:TieredStopAtLevel=1 -J-noverify -J-Xms512m -J-Xmx1024m"
15
19
  - rvm: ruby-head
@@ -17,3 +21,5 @@ matrix:
17
21
  branches:
18
22
  only:
19
23
  - master
24
+ - 1.2-stable
25
+ - 2.0-develop
data/Gemfile CHANGED
@@ -3,7 +3,6 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in smarter_csv.gemspec
4
4
  gemspec
5
5
 
6
-
7
6
  gem "rake", "< 11"
8
7
  gem 'pry'
9
8
 
data/README.md CHANGED
@@ -324,11 +324,24 @@ Planned in the next releases:
324
324
 
325
325
  ## Changes
326
326
 
327
+ #### 1.2.8 (2020-02-04)
328
+ * fix deprecation warnings on Ruby 2.7 (thank to Diego Salido)
329
+
330
+ #### 1.2.7 (2020-02-03)
331
+
332
+ #### 1.2.6 (2018-11-13)
333
+ * fixing error caused by calling f.close when we do not hand in a file
334
+
335
+ #### 1.2.5 (2018-09-16)
336
+ * fixing issue #136 with comments in CSV files
337
+ * fixing error class hierarchy
338
+
339
+ #### 1.2.4 (2018-08-06)
340
+ * using Rails blank? if it's available
341
+
327
342
  #### 1.2.3 (2018-01-27)
328
343
  * fixed regression / test
329
344
  * fuxed quote_char interpolation for headers, but not data (thanks to Colin Petruno)
330
-
331
- #### 1.2.1 (2018-01-25) ### YANKED!
332
345
  * bugfix (thanks to Joshua Smith for reporting)
333
346
 
334
347
  #### 1.2.0 (2018-01-20)
@@ -385,9 +398,6 @@ Planned in the next releases:
385
398
  #### 1.0.14 (2013-11-01)
386
399
  * added GPL-2 and MIT license to GEM spec file; if you need another license contact me
387
400
 
388
- #### 1.0.13 (2013-11-01) ### YANKED!
389
- * added GPL-2 license to GEM spec file; if you need another license contact me
390
-
391
401
  #### 1.0.12 (2013-10-15)
392
402
  * added RSpec tests
393
403
 
@@ -503,6 +513,7 @@ And a special thanks to those who contributed pull requests:
503
513
  * [Rohit Amarnath](https://github.com/ramarnat)
504
514
  * [Joshua Smith](https://github.com/enviable)
505
515
  * [Colin Petruno](https://github.com/colinpetruno)
516
+ * [Diego Salido](https://github.com/salidux)
506
517
 
507
518
 
508
519
  ## Contributing
@@ -1,16 +1,16 @@
1
1
  module SmarterCSV
2
-
3
- class HeaderSizeMismatch < Exception; end
4
- class IncorrectOption < Exception; end
5
- class DuplicateHeaders < Exception; end
6
- class MissingHeaders < Exception; end
2
+ class SmarterCSVException < StandardError; end
3
+ class HeaderSizeMismatch < SmarterCSVException; end
4
+ class IncorrectOption < SmarterCSVException; end
5
+ class DuplicateHeaders < SmarterCSVException; end
6
+ class MissingHeaders < SmarterCSVException; end
7
7
 
8
8
 
9
9
  def SmarterCSV.process(input, options={}, &block) # first parameter: filename or input object with readline method
10
10
  default_options = {:col_sep => ',' , :row_sep => $/ , :quote_char => '"', :force_simple_split => false , :verbose => false ,
11
11
  :remove_empty_values => true, :remove_zero_values => false , :remove_values_matching => nil , :remove_empty_hashes => true , :strip_whitespace => true,
12
12
  :convert_values_to_numeric => true, :strip_chars_from_headers => nil , :user_provided_headers => nil , :headers_in_file => true,
13
- :comment_regexp => /^#/, :chunk_size => nil , :key_mapping_hash => nil , :downcase_header => true, :strings_as_keys => false, :file_encoding => 'utf-8',
13
+ :comment_regexp => /\A#/, :chunk_size => nil , :key_mapping_hash => nil , :downcase_header => true, :strings_as_keys => false, :file_encoding => 'utf-8',
14
14
  :remove_unmapped_keys => false, :keep_original_headers => false, :value_converters => nil, :skip_lines => nil, :force_utf8 => false, :invalid_byte_sequence => '',
15
15
  :auto_row_sep_chars => 500, :required_headers => nil
16
16
  }
@@ -22,6 +22,7 @@ module SmarterCSV
22
22
  old_row_sep = $/
23
23
  file_line_count = 0
24
24
  csv_line_count = 0
25
+ has_rails = !! defined?(Rails)
25
26
  begin
26
27
  f = input.respond_to?(:readline) ? input : File.open(input, "r:#{options[:file_encoding]}")
27
28
 
@@ -52,7 +53,7 @@ module SmarterCSV
52
53
 
53
54
  if (header =~ %r{#{options[:quote_char]}}) and (! options[:force_simple_split])
54
55
  file_headerA = begin
55
- CSV.parse( header, csv_options ).flatten.collect!{|x| x.nil? ? '' : x} # to deal with nil values from CSV.parse
56
+ CSV.parse( header, **csv_options ).flatten.collect!{|x| x.nil? ? '' : x} # to deal with nil values from CSV.parse
56
57
  rescue CSV::MalformedCSVError => e
57
58
  raise $!, "#{$!} [SmarterCSV: csv line #{csv_line_count}]", $!.backtrace
58
59
  end
@@ -148,7 +149,7 @@ module SmarterCSV
148
149
 
149
150
  if (line =~ %r{#{options[:quote_char]}}) and (! options[:force_simple_split])
150
151
  dataA = begin
151
- CSV.parse( line, csv_options ).flatten.collect!{|x| x.nil? ? '' : x} # to deal with nil values from CSV.parse
152
+ CSV.parse( line, **csv_options ).flatten.collect!{|x| x.nil? ? '' : x} # to deal with nil values from CSV.parse
152
153
  rescue CSV::MalformedCSVError => e
153
154
  raise $!, "#{$!} [SmarterCSV: csv line #{csv_line_count}]", $!.backtrace
154
155
  end
@@ -167,7 +168,13 @@ module SmarterCSV
167
168
 
168
169
  # remove empty values using the same regexp as used by the rails blank? method
169
170
  # which caters for double \n and \r\n characters such as "1\r\n\r\n2" whereas the original check (v =~ /^\s*$/) does not
170
- hash.delete_if{|k,v| v.nil? || v !~ /[^[:space:]]/} if options[:remove_empty_values]
171
+ if options[:remove_empty_values]
172
+ if has_rails
173
+ hash.delete_if{|k,v| v.blank?}
174
+ else
175
+ hash.delete_if{|k,v| v.nil? || v !~ /[^[:space:]]/}
176
+ end
177
+ end
171
178
 
172
179
  hash.delete_if{|k,v| ! v.nil? && v =~ /^(\d+|\d+\.\d+)$/ && v.to_f == 0} if options[:remove_zero_values] # values are typically Strings!
173
180
  hash.delete_if{|k,v| v =~ options[:remove_values_matching]} if options[:remove_values_matching]
@@ -241,7 +248,7 @@ module SmarterCSV
241
248
  end
242
249
  ensure
243
250
  $/ = old_row_sep # make sure this stupid global variable is always reset to it's previous value after we're done!
244
- f.close
251
+ f.close if f.respond_to?(:close)
245
252
  end
246
253
  if block_given?
247
254
  return chunk_count # when we do processing through a block we only care how many chunks we processed
@@ -1,3 +1,3 @@
1
1
  module SmarterCSV
2
- VERSION = "1.2.3"
2
+ VERSION = "1.2.8"
3
3
  end
@@ -0,0 +1,11 @@
1
+ not a comment#First Name,Last Name,Dogs,Cats,Birds,Fish
2
+ # comment two
3
+ Dan,McAllister,2,0,,
4
+ Lucy#L,Laweless,,5,0,
5
+ # anothter comment
6
+ ,,,,,
7
+ Miles,O'Brian,0,0,0,21
8
+ Nancy,Homes,2,0,1,
9
+ Hernán,Curaçon,3,0,0,
10
+ #comment,comment,1,2,3,4
11
+ ,,,,,
@@ -0,0 +1,3 @@
1
+ h1,h2
2
+ a,"b
3
+ #c"
@@ -0,0 +1,8 @@
1
+ Compte;Date de comptabilisation;Date op�ration;Libell�;R�f�rence;Date valeur;Montant
2
+ 22215449203;02/06/2018;01/06/2018;ECHEANCE PRET DONT CAP 410,33 ASS. 8,00E INT. 21,87 COM. 0,00E;8711552;01/06/2018;-440,20;
3
+ 22215449203;04/06/2018;04/06/2018;EVI Gaultier Laperche remboursement compte courant;1038326;04/06/2018;-144,07;
4
+ 22215449203;04/06/2018;04/06/2018;EVI Guillemain Nicolas remboursement CC pret d'honneur;1038328;04/06/2018;-144,07;
5
+ 22215449203;01/06/2018;01/06/2018;310518 SC****5448 INTERMARCHE 95ERMONT;701JQ1K;01/06/2018;-16,00;
6
+ 22215449203;01/06/2018;01/06/2018;EVI Stripe Payments UK L STRIPE E7U0R1;706AO1Q;01/06/2018;45,89;
7
+ 22215449203;01/06/2018;01/06/2018;EVI Compte N26 Heroku;1100653;01/06/2018;-700,00;
8
+ 22215449203;31/05/2018;31/05/2018;EVI Stripe Payments UK L STRIPE L2J1N7;6YISBWF;31/05/2018;465,89;
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ fixture_path = 'spec/fixtures'
4
+
5
+ describe 'be_able_to' do
6
+ it 'ignore comments in CSV files' do
7
+ options = {}
8
+ data = SmarterCSV.process("#{fixture_path}/ignore_comments.csv", options)
9
+
10
+ data.size.should eq 5
11
+
12
+ # all the keys should be symbols
13
+ data.each{|item| item.keys.each{|x| x.is_a?(Symbol).should be_truthy}}
14
+ data.each do |h|
15
+ h.keys.each do |key|
16
+ [:"not_a_comment#first_name", :last_name, :dogs, :cats, :birds, :fish].should include( key )
17
+ end
18
+ end
19
+ end
20
+
21
+ it 'ignore comments in CSV files with CRLF' do
22
+ options = {row_sep: "\r\n"}
23
+ data = SmarterCSV.process("#{fixture_path}/ignore_comments2.csv", options)
24
+
25
+ # all the keys should be symbols
26
+ data.size.should eq 1
27
+ data.first[:h1].should eq 'a'
28
+ data.first[:h2].should eq "b\r\n#c"
29
+ end
30
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ fixture_path = 'spec/fixtures'
4
+
5
+ describe 'loading file with UTF-8 characters in the header' do
6
+
7
+ # file which caused issues because of UTF-8 characters in the header
8
+ it 'loads the file with force_utf8 flag set' do
9
+ options = {col_sep: ";", force_utf8: true}
10
+ data = SmarterCSV.process("#{fixture_path}/problematic.csv", options)
11
+
12
+ data.length.should eq 7
13
+ end
14
+
15
+ it 'loads the file with strings as keys' do
16
+ options = {
17
+ file_encoding: 'iso-8859-1:UTF-8', # important!
18
+ col_sep: ";", strings_as_keys: true,
19
+ }
20
+ data = SmarterCSV.process("#{fixture_path}/problematic.csv", options)
21
+
22
+ data.length.should eq 7
23
+ data.first.keys.sort.should eq [
24
+ "compte",
25
+ "date_de_comptabilisation",
26
+ "date_opération",
27
+ "date_valeur",
28
+ "libellé",
29
+ "montant",
30
+ "référence"
31
+ ]
32
+ end
33
+
34
+ end
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smarter_csv
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.3
4
+ version: 1.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - 'Tilo Sloboda
8
8
 
9
- '
10
- autorequire:
9
+ '
10
+ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2018-01-27 00:00:00.000000000 Z
13
+ date: 2021-02-04 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rspec
@@ -32,7 +32,7 @@ description: Ruby Gem for smarter importing of CSV Files as Array(s) of Hashes,
32
32
  email:
33
33
  - 'tilo.sloboda@gmail.com
34
34
 
35
- '
35
+ '
36
36
  executables: []
37
37
  extensions: []
38
38
  extra_rdoc_files: []
@@ -58,6 +58,8 @@ files:
58
58
  - spec/fixtures/chunk_cornercase.csv
59
59
  - spec/fixtures/duplicate_headers.csv
60
60
  - spec/fixtures/empty.csv
61
+ - spec/fixtures/ignore_comments.csv
62
+ - spec/fixtures/ignore_comments2.csv
61
63
  - spec/fixtures/line_endings_n.csv
62
64
  - spec/fixtures/line_endings_r.csv
63
65
  - spec/fixtures/line_endings_rn.csv
@@ -68,6 +70,7 @@ files:
68
70
  - spec/fixtures/no_header.csv
69
71
  - spec/fixtures/numeric.csv
70
72
  - spec/fixtures/pets.csv
73
+ - spec/fixtures/problematic.csv
71
74
  - spec/fixtures/quote_char.csv
72
75
  - spec/fixtures/quoted.csv
73
76
  - spec/fixtures/quoted2.csv
@@ -87,6 +90,7 @@ files:
87
90
  - spec/smarter_csv/convert_values_to_numeric_spec.rb
88
91
  - spec/smarter_csv/extenstions_spec.rb
89
92
  - spec/smarter_csv/header_transformation_spec.rb
93
+ - spec/smarter_csv/ignore_comments_spec.rb
90
94
  - spec/smarter_csv/invalid_headers_spec.rb
91
95
  - spec/smarter_csv/keep_headers_spec.rb
92
96
  - spec/smarter_csv/key_mapping_spec.rb
@@ -95,6 +99,7 @@ files:
95
99
  - spec/smarter_csv/malformed_spec.rb
96
100
  - spec/smarter_csv/no_header_spec.rb
97
101
  - spec/smarter_csv/not_downcase_header_spec.rb
102
+ - spec/smarter_csv/problematic.rb
98
103
  - spec/smarter_csv/quoted_spec.rb
99
104
  - spec/smarter_csv/remove_empty_values_spec.rb
100
105
  - spec/smarter_csv/remove_keys_from_hashes_spec.rb
@@ -115,7 +120,7 @@ licenses:
115
120
  - MIT
116
121
  - GPL-2
117
122
  metadata: {}
118
- post_install_message:
123
+ post_install_message:
119
124
  rdoc_options: []
120
125
  require_paths:
121
126
  - lib
@@ -131,9 +136,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
131
136
  version: '0'
132
137
  requirements:
133
138
  - csv
134
- rubyforge_project:
135
- rubygems_version: 2.7.4
136
- signing_key:
139
+ rubygems_version: 3.0.6
140
+ signing_key:
137
141
  specification_version: 4
138
142
  summary: Ruby Gem for smarter importing of CSV Files (and CSV-like files), with lots
139
143
  of optional features, e.g. chunked processing for huge CSV files
@@ -147,6 +151,8 @@ test_files:
147
151
  - spec/fixtures/chunk_cornercase.csv
148
152
  - spec/fixtures/duplicate_headers.csv
149
153
  - spec/fixtures/empty.csv
154
+ - spec/fixtures/ignore_comments.csv
155
+ - spec/fixtures/ignore_comments2.csv
150
156
  - spec/fixtures/line_endings_n.csv
151
157
  - spec/fixtures/line_endings_r.csv
152
158
  - spec/fixtures/line_endings_rn.csv
@@ -157,6 +163,7 @@ test_files:
157
163
  - spec/fixtures/no_header.csv
158
164
  - spec/fixtures/numeric.csv
159
165
  - spec/fixtures/pets.csv
166
+ - spec/fixtures/problematic.csv
160
167
  - spec/fixtures/quote_char.csv
161
168
  - spec/fixtures/quoted.csv
162
169
  - spec/fixtures/quoted2.csv
@@ -176,6 +183,7 @@ test_files:
176
183
  - spec/smarter_csv/convert_values_to_numeric_spec.rb
177
184
  - spec/smarter_csv/extenstions_spec.rb
178
185
  - spec/smarter_csv/header_transformation_spec.rb
186
+ - spec/smarter_csv/ignore_comments_spec.rb
179
187
  - spec/smarter_csv/invalid_headers_spec.rb
180
188
  - spec/smarter_csv/keep_headers_spec.rb
181
189
  - spec/smarter_csv/key_mapping_spec.rb
@@ -184,6 +192,7 @@ test_files:
184
192
  - spec/smarter_csv/malformed_spec.rb
185
193
  - spec/smarter_csv/no_header_spec.rb
186
194
  - spec/smarter_csv/not_downcase_header_spec.rb
195
+ - spec/smarter_csv/problematic.rb
187
196
  - spec/smarter_csv/quoted_spec.rb
188
197
  - spec/smarter_csv/remove_empty_values_spec.rb
189
198
  - spec/smarter_csv/remove_keys_from_hashes_spec.rb