parceira 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,23 @@
1
+ .DS_Store
2
+ .*.swp
3
+ *.orig
4
+ *.cp
5
+ *~
6
+ *.gem
7
+ *.rbc
8
+ .bundle
9
+ .config
10
+ .yardoc
11
+ .rvmrc
12
+ Gemfile.lock
13
+ InstalledFiles
14
+ _yardoc
15
+ coverage
16
+ doc/
17
+ lib/bundler/man
18
+ pkg
19
+ rdoc
20
+ spec/reports
21
+ test/tmp
22
+ test/version_tmp
23
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in parceira.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,9 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'rspec', :cli => '--color' do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/parceira/(.+)\.rb$}) { |m| "spec/parceira/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+ end
9
+
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Marcos G. Zimmermann
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,70 @@
1
+ parceira
2
+ ========
3
+
4
+ Importing of CSV Files as Array(s) of Hashes with featured to process large csv files and better support for file encoding.
5
+
6
+ ## Installation
7
+
8
+ Add this line to your application's Gemfile:
9
+
10
+ gem 'parceira'
11
+
12
+ And then execute:
13
+
14
+ $ bundle
15
+
16
+ Or install it yourself as:
17
+
18
+ $ gem install parceira
19
+
20
+ ## Usage
21
+
22
+ ```bash
23
+ $ cat example/products.csv
24
+ Product ID,Name,Price
25
+ 1,Macbook Air,999
26
+ 2,Ipad mini,329.99
27
+ 3,Iphone 5,199.00
28
+ 4,MacBook Pro,
29
+ ```
30
+
31
+ ```ruby
32
+ > require 'parceira'
33
+ > filename = File.expand_path('./../example/products.csv', __FILE__)
34
+ > Parceira.process(filename)
35
+ => [{:product_id=>1, :name=>"Macbook Air", :price=>999}, {:product_id=>2, :name=>"Ipad mini", :price=>329.99}, {:product_id=>3, :name=>"Iphone 5", :price=>199.0}, {:product_id=>4, :name=>"MacBook Pro", :price=>nil}]
36
+
37
+ > Parceira.process(filename, key_mapping: {name: :description})
38
+ => [{:product_id=>1, :description=>"Macbook Air", :price=>999}, {:product_id=>2, :description=>"Ipad mini", :price=>329.99}, {:product_id=>3, :description=>"Iphone 5", :price=>199.0}, {:product_id=>4, :description=>"MacBook Pro", :price=>nil}]
39
+
40
+ > Parceira.process(filename, reject_nil: true)
41
+ => [{:product_id=>1, :name=>"Macbook Air", :price=>999}, {:product_id=>2, :name=>"Ipad mini", :price=>329.99}, {:product_id=>3, :name=>"Iphone 5", :price=>199.0}, {:product_id=>4, :name=>"MacBook Pro"}]
42
+
43
+ > Parceira.process(filename, reject_matching: /^Macbook/i)
44
+ => [{:product_id=>1, :name=>nil, :price=>999}, {:product_id=>2, :name=>"Ipad mini", :price=>329.99}, {:product_id=>3, :name=>"Iphone 5", :price=>199.0}, {:product_id=>4, :name=>nil, :price=>nil}]
45
+
46
+ > Parceira.process(filename, file_encoding: 'utf-8')
47
+ => [{:product_id=>1, :name=>"Macbook Air", :price=>999}, {:product_id=>2, :name=>"Ipad mini", :price=>329.99}, {:product_id=>3, :name=>"Iphone 5", :price=>199.0}, {:product_id=>4, :name=>"MacBook Pro", :price=>nil}]
48
+
49
+ > Parceira.process(filename, headers: false)
50
+ => [[1, "Macbook Air", 999], [2, "Ipad mini", 329.99], [3, "Iphone 5", 199.0], [4, "MacBook Pro", nil]]
51
+
52
+ > Parceira.process(filename, headers: false, headers_included: false)
53
+ => [["Product ID", "Name", "Price"], [1, "Macbook Air", 999], [2, "Ipad mini", 329.99], [3, "Iphone 5", 199.0], [4, "MacBook Pro", nil]]
54
+
55
+ > Parceira.process(filename, headers: %w(ID Name Value))
56
+ => [{"ID"=>1, "Name"=>"Macbook Air", "Value"=>999}, {"ID"=>2, "Name"=>"Ipad mini", "Value"=>329.99}, {"ID"=>3, "Name"=>"Iphone 5", "Value"=>199.0}, {"ID"=>4, "Name"=>"MacBook Pro", "Value"=>nil}]
57
+ ```
58
+
59
+
60
+ ## Reporting Bugs / Feature Requests
61
+ Please [open an Issue on GitHub](https://github.com/marcosgz/parceira/issues) if you have feedback, new feature requests, or want to report a bug. Thank you!
62
+
63
+
64
+ ## Contributing
65
+
66
+ 1. Fork it
67
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
68
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
69
+ 4. Push to the branch (`git push origin my-new-feature`)
70
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+ require "rspec/core/rake_task"
4
+
5
+ RSpec::Core::RakeTask.new do |t|
6
+ t.pattern = "spec/parceira/**/*_spec.rb"
7
+ end
8
+
9
+
10
+ task :default => :spec
11
+ task :test => :spec
@@ -0,0 +1,4 @@
1
+ First Name,Last Name
2
+ Marcos,Zimmermann
3
+ Paul,Molive
4
+ Maya,Didas
@@ -0,0 +1,5 @@
1
+ Product ID,Name,Price
2
+ 1,Macbook Air,999
3
+ 2,Ipad mini,329.99
4
+ 3,Iphone 5,199.00
5
+ 4,MacBook Pro,
@@ -0,0 +1,179 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module Parceira
3
+ class Reader
4
+ DEFAULT_OPTIONS = {
5
+ # CSV options
6
+ col_sep: ',',
7
+ row_sep: $/,
8
+ quote_char: '"',
9
+ # Header
10
+ headers: true,
11
+ headers_included: true,
12
+ key_mapping: nil,
13
+ file_encoding: nil,
14
+ # Values
15
+ reject_blank: true,
16
+ reject_nil: false,
17
+ reject_zero: false,
18
+ reject_matching: nil,
19
+ convert_to_numeric: true,
20
+ }
21
+ attr_reader :options
22
+
23
+
24
+ def initialize(input, options, &block)
25
+ @input = input
26
+ @options = DEFAULT_OPTIONS.merge(options)
27
+ end
28
+
29
+
30
+ def process!
31
+ if input_file.nil? && @input.is_a?(String)
32
+ data = CSV.parse(@input, csv_options) # content is already in memory. Process with CSV
33
+ header_data = data.shift if options[:headers_included] # Remove header row
34
+ header_keys = \
35
+ if options[:headers] == true
36
+ self.parse_header( header_data )
37
+ elsif options[:headers].is_a?(Array)
38
+ options[:headers]
39
+ end
40
+ data.map do |arr|
41
+ values = parse_values(arr)
42
+ if header_keys
43
+ convert_to_hash(header_keys, values)
44
+ else
45
+ values
46
+ end
47
+ end
48
+ elsif input_file.is_a?(File)
49
+ output = []
50
+ begin
51
+ $/ = options[:row_sep]
52
+ # Build header
53
+ header_data = input_file.readline.to_s.chomp(options[:row_sep]) if options[:headers_included] # Remove header row
54
+ header_keys = \
55
+ if options[:headers] == true
56
+ data = CSV.parse(header_data, self.csv_options)
57
+ self.parse_header( data )
58
+ elsif options[:headers].is_a?(Array)
59
+ options[:headers]
60
+ end
61
+
62
+ # now on to processing all the rest of the lines in the CSV file:
63
+ while !input_file.eof? # we can't use f.readlines() here, because this would read the whole file into memory at once, and eof => true
64
+ values = parse_values( CSV.parse(input_file.readline.chomp, csv_options) )
65
+ if header_keys
66
+ output << convert_to_hash(header_keys, values)
67
+ else
68
+ output << values
69
+ end
70
+ end
71
+ ensure
72
+ $/ = $/
73
+ end
74
+ output
75
+ end
76
+ end
77
+
78
+ protected
79
+ def convert_to_hash(header, values)
80
+ header.each_with_index.inject({}) do |r, (key, index)|
81
+ value = values[index]
82
+ if options[:reject_nil] && value.nil?
83
+ else
84
+ r[key] = value
85
+ end
86
+ r
87
+ end
88
+ end
89
+
90
+ def parse_values(arr)
91
+ arr.flatten.map do |v|
92
+ value = \
93
+ if options[:convert_to_numeric]
94
+ case v
95
+ when /^[+-]?\d+\.\d+$/
96
+ v.to_f
97
+ when /^[+-]?\d+$/
98
+ v.to_i
99
+ else
100
+ v.to_s.strip
101
+ end
102
+ else
103
+ v.to_s.strip
104
+ end
105
+ value = nil if options[:reject_blank] && value.blank?
106
+ value = nil if options[:reject_zero] && value.respond_to?(:zero?) && value.zero?
107
+ value = nil if options[:reject_matching] && value =~ options[:reject_matching]
108
+ value
109
+ end
110
+ end
111
+
112
+ def parse_header(arr)
113
+ arr.flatten.each_with_index.inject([]) do |arr, (value, index)|
114
+ v = \
115
+ if (str=value.to_s.parameterize('_')).present?
116
+ str.to_sym
117
+ else
118
+ "field_#{index.next}".to_sym
119
+ end
120
+ v = options[:key_mapping][v] if options[:key_mapping].is_a?(Hash) && options[:key_mapping].has_key?(v)
121
+ arr.push(v)
122
+ end
123
+ end
124
+
125
+ def input_file
126
+ @input_file ||= \
127
+ case @input
128
+ when File
129
+ @input
130
+ when String
131
+ if File.exists?(@input)
132
+ File.open(@input, "r:#{self.charset}")
133
+ end
134
+ end
135
+ end
136
+
137
+
138
+ def charset
139
+ options[:file_encoding] || begin
140
+ filename = \
141
+ case @input
142
+ when String
143
+ @input if File.exists?(@input)
144
+ when File
145
+ @input.path
146
+ end
147
+ if filename
148
+ IO.popen(['file', '--brief', '--mime', filename]).read.chomp.match(/charset=([^\s]+)/) { $1 }
149
+ else
150
+ default_charset
151
+ end
152
+ rescue
153
+ default_charset
154
+ end
155
+ end
156
+
157
+
158
+ def csv_options
159
+ options.select do |k,v|
160
+ [
161
+ :col_sep,
162
+ :row_sep,
163
+ :quote_char,
164
+ :field_size_limit,
165
+ :converters,
166
+ :unconverted_fields,
167
+ :skip_blanks,
168
+ :force_quotes
169
+ ].include?(k)
170
+ end
171
+ end
172
+
173
+
174
+ def default_charset
175
+ 'utf-8'
176
+ end
177
+
178
+ end
179
+ end
@@ -0,0 +1,4 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module Parceira
3
+ VERSION = "0.0.1"
4
+ end
data/lib/parceira.rb ADDED
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'rubygems'
4
+ require 'csv'
5
+ require 'i18n'
6
+ require 'active_support/lazy_load_hooks'
7
+ require 'active_support/i18n'
8
+ require 'active_support/inflector'
9
+ require 'active_support/core_ext/string'
10
+
11
+ require "parceira/version"
12
+ require "parceira/reader"
13
+
14
+ include ActiveSupport::Inflector
15
+
16
+ module Parceira
17
+ def self.process(input, options={}, &block)
18
+ Parceira::Reader.new(input, options.symbolize_keys, &block).process!
19
+ end
20
+ end
data/parceira.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/parceira/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Marcos G. Zimmermann"]
6
+ gem.email = ["mgzmaster@gmail.com"]
7
+ gem.description = %q{Importing of CSV Files as Array(s) of Hashes with featured to process large csv files and better support for file encoding.}
8
+ gem.summary = %q{Importing of CSV Files as Array(s) of Hashes}
9
+ gem.homepage = "http://github.com/marcosgz/parceira"
10
+
11
+ gem.add_development_dependency "rspec"
12
+ gem.add_development_dependency "guard-rspec"
13
+
14
+ gem.add_dependency "i18n"
15
+ gem.add_dependency "active_support"
16
+
17
+ gem.files = `git ls-files`.split($\)
18
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
19
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
20
+ gem.name = "parceira"
21
+ gem.require_paths = ["lib"]
22
+ gem.version = Parceira::VERSION
23
+ end
@@ -0,0 +1,291 @@
1
+ require "spec_helper"
2
+
3
+ describe Parceira::Reader do
4
+
5
+ describe :process! do
6
+ describe "using default headers" do
7
+ let(:path) { File.expand_path('./../../../example/contacts-us-ascii.csv', __FILE__) }
8
+ let(:expected) {
9
+ [
10
+ {:first_name=>"Marcos", :last_name=>"Zimmermann"},
11
+ {:first_name=>"Paul", :last_name=>"Molive"},
12
+ {:first_name=>"Maya", :last_name=>"Didas"}
13
+ ]
14
+ }
15
+
16
+ context "from string" do
17
+ subject { Parceira::Reader.new(File.read(path), {}).process! }
18
+ it { should eq(expected)}
19
+ end
20
+
21
+ context "from file" do
22
+ subject { Parceira::Reader.new(path, {}).process! }
23
+ it { should eq(expected)}
24
+ end
25
+ end
26
+
27
+ describe "disable headers" do
28
+ let(:path) { File.expand_path('./../../../example/contacts-us-ascii.csv', __FILE__) }
29
+ let(:options) { {headers: false} }
30
+ let(:expected) {
31
+ [
32
+ ["Marcos", "Zimmermann"],
33
+ ["Paul", "Molive"],
34
+ ["Maya", "Didas"]
35
+ ]
36
+ }
37
+
38
+ context "from string" do
39
+ subject { Parceira::Reader.new(File.read(path), options).process! }
40
+ it { should eq(expected)}
41
+ end
42
+
43
+ context "from file" do
44
+ subject { Parceira::Reader.new(path, options).process! }
45
+ it { should eq(expected)}
46
+ end
47
+ end
48
+
49
+ describe "overwriting headers" do
50
+ let(:path) { File.expand_path('./../../../example/contacts-us-ascii.csv', __FILE__) }
51
+ let(:options) { {headers: ['First Name', 'Middle Name']} }
52
+ let(:expected) {
53
+ [
54
+ {'First Name'=>"Marcos", 'Middle Name'=>"Zimmermann"},
55
+ {'First Name'=>"Paul", 'Middle Name'=>"Molive"},
56
+ {'First Name'=>"Maya", 'Middle Name'=>"Didas"}
57
+ ]
58
+ }
59
+
60
+ context "from string" do
61
+ subject { Parceira::Reader.new(File.read(path), options).process! }
62
+ it { should eq(expected)}
63
+ end
64
+
65
+ context "from file" do
66
+ subject { Parceira::Reader.new(path, options).process! }
67
+ it { should eq(expected)}
68
+ end
69
+ end
70
+
71
+ describe "include first row(Header)" do
72
+ let(:path) { File.expand_path('./../../../example/contacts-us-ascii.csv', __FILE__) }
73
+ let(:options) { {headers_included: false, headers: false} }
74
+ let(:expected) {
75
+ [
76
+ ["First Name", "Last Name"],
77
+ ["Marcos", "Zimmermann"],
78
+ ["Paul", "Molive"],
79
+ ["Maya", "Didas"]
80
+ ]
81
+ }
82
+
83
+ context "from string" do
84
+ subject { Parceira::Reader.new(File.read(path), options).process! }
85
+ it { should eq(expected)}
86
+ end
87
+
88
+ context "from file" do
89
+ subject { Parceira::Reader.new(path, options).process! }
90
+ it { should eq(expected)}
91
+ end
92
+ end
93
+ end
94
+
95
+
96
+ describe :convert_to_hash do
97
+ let(:header) { [:foo, :bar] }
98
+ context "reject nil values" do
99
+ let(:values) { ["Foo", nil] }
100
+ subject { Parceira::Reader.new('', {reject_nil: true}).send(:convert_to_hash, header, values) }
101
+ it { should eq({foo:"Foo"})}
102
+ end
103
+
104
+ context "allow nil values" do
105
+ let(:values) { ["Foo", nil] }
106
+ subject { Parceira::Reader.new('', {reject_nil: false}).send(:convert_to_hash, header, values) }
107
+ it { should eq({foo:"Foo",bar:nil})}
108
+ end
109
+ end
110
+
111
+
112
+ describe :parse_values do
113
+ it "should strip values" do
114
+ expect(Parceira::Reader.new('', {reject_blank: false}).send(:parse_values, ['Foo ', nil, ' Bar', ' ', 'Age'])).to eq(["Foo", "", "Bar", "", "Age"])
115
+ end
116
+
117
+ describe "convert_to_numeric true" do
118
+ subject { Parceira::Reader.new('', {convert_to_numeric: true}).send(:parse_values, values) }
119
+ context "Fixnum" do
120
+ let(:values) { ['Foo', '1', 'Bar'] }
121
+ it { should eq(["Foo", 1, "Bar"])}
122
+ end
123
+
124
+ context "Negative Fixnum" do
125
+ let(:values) { ['Foo', '-1', 'Bar'] }
126
+ it { should eq(["Foo", -1, "Bar"])}
127
+ end
128
+
129
+ context "Positive Fixnum" do
130
+ let(:values) { ['Foo', '+1', 'Bar'] }
131
+ it { should eq(["Foo", 1, "Bar"])}
132
+ end
133
+
134
+ context "Float" do
135
+ let(:values) { ['Foo', '1.23', 'Bar'] }
136
+ it { should eq(["Foo", 1.23, "Bar"])}
137
+ end
138
+
139
+ context "Negative Float" do
140
+ let(:values) { ['Foo', '-1.23', 'Bar'] }
141
+ it { should eq(["Foo", -1.23, "Bar"])}
142
+ end
143
+
144
+ context "Positive Float" do
145
+ let(:values) { ['Foo', '+1.23', 'Bar'] }
146
+ it { should eq(["Foo", 1.23, "Bar"])}
147
+ end
148
+ end
149
+
150
+ describe "reject_blank" do
151
+ context "true" do
152
+ subject { Parceira::Reader.new('', {reject_blank: true}).send(:parse_values, ['Foo', '', 'Bar']) }
153
+ it { should eq(["Foo", nil, "Bar"])}
154
+ end
155
+
156
+ context "false" do
157
+ subject { Parceira::Reader.new('', {reject_blank: false}).send(:parse_values, ['Foo', '', 'Bar']) }
158
+ it { should eq(["Foo", '', "Bar"])}
159
+ end
160
+ end
161
+
162
+ describe "reject_zero" do
163
+ context "true" do
164
+ subject { Parceira::Reader.new('', {reject_zero: true}).send(:parse_values, ['Foo', '0', 'Bar', '0.0']) }
165
+ it { should eq(["Foo", nil, "Bar", nil])}
166
+ end
167
+ context "false" do
168
+ subject { Parceira::Reader.new('', {reject_zero: false}).send(:parse_values, ['Foo', '0', 'Bar', '0.0']) }
169
+ it { should eq(["Foo", 0, "Bar", 0.0])}
170
+ end
171
+ end
172
+
173
+ describe "reject_matching" do
174
+ context "match with /^B/" do
175
+ subject { Parceira::Reader.new('', {reject_matching: /^B/}).send(:parse_values, ['Foo', 'Bar']) }
176
+ it { should eq(["Foo", nil])}
177
+ end
178
+ context "nil" do
179
+ subject { Parceira::Reader.new('', {reject_matching: nil}).send(:parse_values, ['Foo', 'Bar']) }
180
+ it { should eq(["Foo", "Bar"])}
181
+ end
182
+ end
183
+ end
184
+
185
+ describe :parse_header do
186
+ subject { Parceira::Reader.new('', {}).send(:parse_header, values) }
187
+ context "with whitespace character" do
188
+ let(:values) { ['First Name', 'Last Name', 'Age']}
189
+ it { should eq([:first_name, :last_name, :age])}
190
+ end
191
+
192
+ context "one missing key" do
193
+ let(:values) { ['First Name', nil, 'Age']}
194
+ it { should eq([:first_name, :field_2, :age])}
195
+ end
196
+
197
+ context "missing values" do
198
+ let(:values) { ['', nil, '']}
199
+ it { should eq([:field_1, :field_2, :field_3])}
200
+ end
201
+
202
+ context "key_mapping" do
203
+ let(:values) { ['First Name', 'Last Name']}
204
+ it "overwrite header attributes" do
205
+ Parceira::Reader.new('', {key_mapping:{first_name: :first}}).send(:parse_header, values).should eq([:first, :last_name])
206
+ Parceira::Reader.new('', {key_mapping:{last_name: :last}}).send(:parse_header, values).should eq([:first_name, :last])
207
+ end
208
+ end
209
+ end
210
+
211
+ describe :process! do
212
+
213
+ end
214
+
215
+ describe :input_file do
216
+ let(:path) { File.expand_path('./../../../example/contacts-us-ascii.csv', __FILE__) }
217
+ it { expect(File.exists?(path)).to be_true }
218
+
219
+ context "intance of File" do
220
+ let(:file) { File.open(path) }
221
+ subject { Parceira::Reader.new(file, {}).send(:input_file) }
222
+ it { should eq(file)}
223
+ end
224
+
225
+ context "filename" do
226
+ let(:file) { double('File') }
227
+ before(:each) do
228
+ File.should_receive(:open).with(path, 'r:us-ascii').and_return(file)
229
+ end
230
+ subject { Parceira::Reader.new(path, {}).send(:input_file) }
231
+ it { should eq(file)}
232
+ end
233
+
234
+ context "csv string" do
235
+ subject { Parceira::Reader.new('foo,bar', {}).send(:input_file) }
236
+ it { should be_nil}
237
+ end
238
+ end
239
+
240
+
241
+ describe :charset do
242
+ let(:path) { File.expand_path('./../../../example/contacts-us-ascii.csv', __FILE__) }
243
+ it { expect(File.exists?(path)).to be_true }
244
+
245
+ context ":file_encoding config" do
246
+ subject { Parceira::Reader.new(path, {file_encoding: 'iso-8859-1'}).send(:charset) }
247
+ it { should eq('iso-8859-1')}
248
+ end
249
+
250
+ context "instance of File" do
251
+ subject { Parceira::Reader.new(File.open(path), {}).send(:charset) }
252
+ it { should eq('us-ascii')}
253
+ end
254
+
255
+ context "filename" do
256
+ subject { Parceira::Reader.new(path, {}).send(:charset) }
257
+ it { should eq('us-ascii')}
258
+ end
259
+
260
+ context "csv string" do
261
+ subject { Parceira::Reader.new("name,age\nFoo Bar,25", {}).send(:charset) }
262
+ it "returns default_charset value" do
263
+ should eq('utf-8')
264
+ end
265
+ end
266
+ end
267
+
268
+
269
+ describe :csv_options do
270
+ subject { Parceira::Reader.new('', {}).send(:csv_options) }
271
+ it "includes only options allowed on CSV.parse method" do
272
+ should have_key(:col_sep)
273
+ should have_key(:row_sep)
274
+ should have_key(:quote_char)
275
+ should_not have_key(:headers)
276
+ should_not have_key(:reject_blank)
277
+ should_not have_key(:reject_nil)
278
+ should_not have_key(:reject_matching)
279
+ should_not have_key(:convert_to_numeric)
280
+ end
281
+ end
282
+
283
+
284
+ describe :default_charset do
285
+ subject { Parceira::Reader.new('/tmp/path', {}).send(:default_charset) }
286
+ it { should eq('utf-8')}
287
+ end
288
+
289
+
290
+ it { expect(Parceira::Reader).to be_const_defined('DEFAULT_OPTIONS') }
291
+ end
@@ -0,0 +1,5 @@
1
+ require "spec_helper"
2
+
3
+ describe Parceira do
4
+ it { expect(Parceira).to be_const_defined('VERSION') }
5
+ end
@@ -0,0 +1,6 @@
1
+ require "bundler"
2
+ Bundler.require :default, :development
3
+
4
+ RSpec.configure do |config|
5
+ # Configs
6
+ end
metadata ADDED
@@ -0,0 +1,128 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: parceira
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Marcos G. Zimmermann
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-07-11 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: guard-rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: i18n
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: active_support
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ description: Importing of CSV Files as Array(s) of Hashes with featured to process
79
+ large csv files and better support for file encoding.
80
+ email:
81
+ - mgzmaster@gmail.com
82
+ executables: []
83
+ extensions: []
84
+ extra_rdoc_files: []
85
+ files:
86
+ - .gitignore
87
+ - Gemfile
88
+ - Guardfile
89
+ - LICENSE
90
+ - README.md
91
+ - Rakefile
92
+ - example/contacts-us-ascii.csv
93
+ - example/products.csv
94
+ - lib/parceira.rb
95
+ - lib/parceira/reader.rb
96
+ - lib/parceira/version.rb
97
+ - parceira.gemspec
98
+ - spec/parceira/reader_spec.rb
99
+ - spec/parceira/version_spec.rb
100
+ - spec/spec_helper.rb
101
+ homepage: http://github.com/marcosgz/parceira
102
+ licenses: []
103
+ post_install_message:
104
+ rdoc_options: []
105
+ require_paths:
106
+ - lib
107
+ required_ruby_version: !ruby/object:Gem::Requirement
108
+ none: false
109
+ requirements:
110
+ - - ! '>='
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ required_rubygems_version: !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ! '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ requirements: []
120
+ rubyforge_project:
121
+ rubygems_version: 1.8.23
122
+ signing_key:
123
+ specification_version: 3
124
+ summary: Importing of CSV Files as Array(s) of Hashes
125
+ test_files:
126
+ - spec/parceira/reader_spec.rb
127
+ - spec/parceira/version_spec.rb
128
+ - spec/spec_helper.rb