beam 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/Gemfile.lock +1 -1
- data/README.md +29 -8
- data/beam.gemspec +1 -0
- data/lib/beam/upload.rb +27 -6
- data/lib/beam/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: acd3a8c0a75cf6f919a96814829bbe6d77c05898
|
4
|
+
data.tar.gz: e84bbadfac36ad545ac651725681851d05b15cf6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3644af866a139d8737ac62a83718768240061849c0ba38d3239aa721e46e4cb3ff3d024f41991950310b65ecacdca1d4a9892fe7f1ce109d035c3113eddf5178
|
7
|
+
data.tar.gz: 4afcf1ad50f32f32eb170f9d466cbb4e163c8a7f1a94a4b2e98d6a206dbf955281250be5b816ca01edf104345092328de3fefb26a7063f67a8014c7c3b439817
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,15 +1,32 @@
|
|
1
1
|
# Beam
|
2
2
|
|
3
|
-
A rubygem to simplifiy repetitive csv upload process for ActiveRecord models
|
3
|
+
A rubygem to simplifiy repetitive csv upload process for ActiveRecord models.
|
4
|
+
Supports bulk upload with [activerecord-import](http://rubygems.org/gems/activerecord-import)
|
4
5
|
|
5
6
|
## Usage
|
6
7
|
|
7
|
-
1. Add it
|
8
|
+
1. Add it the application's Gemfile:
|
9
|
+
```ruby
|
10
|
+
gem 'beam'
|
11
|
+
```
|
12
|
+
|
13
|
+
Add [activerecord-import gem](http://rubygems.org/gems/activerecord-import) to the application's Gemfile:
|
14
|
+
|
15
|
+
```ruby
|
16
|
+
gem 'activerecord-import', '0.4.1' # for rails-4.1 app
|
17
|
+
gem 'activerecord-import', '0.4.0' # for rails-4.0 app
|
18
|
+
gem 'activerecord-import', '0.3.1' # for rails-3.1+ app
|
19
|
+
```
|
8
20
|
|
21
|
+
2. Add it to the model you want to import csv file
|
22
|
+
|
23
|
+
```ruby
|
9
24
|
extend Beam::Upload
|
25
|
+
```
|
10
26
|
|
11
|
-
|
12
|
-
|
27
|
+
3. Upload zipped csv file, e.g. users.csv.zip
|
28
|
+
|
29
|
+
```ruby
|
13
30
|
Model.upload_file(file_name, file_path)
|
14
31
|
|
15
32
|
# where users.csv has headers and rows, e.g.:
|
@@ -18,13 +35,17 @@ A rubygem to simplifiy repetitive csv upload process for ActiveRecord models
|
|
18
35
|
# Test2,test2@test.com
|
19
36
|
# Test3,test3@test.com
|
20
37
|
# Test4,test4@test.com
|
38
|
+
```
|
21
39
|
|
22
|
-
|
23
|
-
|
24
|
-
|
40
|
+
4. Get the output as:
|
41
|
+
|
42
|
+
```ruby
|
43
|
+
# response hash, e.g.
|
25
44
|
{:errors=>1, :status=>200, :total_rows=>4, :error_rows=>[["Test1", nil, "is invalid"]]}
|
26
|
-
|
45
|
+
# error file, e.g.
|
27
46
|
for users.csv file, it creates errors_users.csv at the same path
|
47
|
+
# see records being saved in batch(by default) of 1_000 with activerecord-import gem
|
48
|
+
```
|
28
49
|
|
29
50
|
See beam/upload.rb for more details
|
30
51
|
|
data/beam.gemspec
CHANGED
data/lib/beam/upload.rb
CHANGED
@@ -6,13 +6,17 @@ module Beam
|
|
6
6
|
# file_path: path/to/zip-file, e.g. Rails.root/tmp
|
7
7
|
# error_file_needed:true if you need error file to be created, default is true
|
8
8
|
# callback_method: method which does the job to load records, default is parse method
|
9
|
-
|
9
|
+
# batch_process: defailt is true, set to false if you do not use activerecord-import
|
10
|
+
# for batch processing
|
11
|
+
def upload_file(file_name, file_path, error_file_needed=true, callback_method = "parse", batch_process=true)
|
10
12
|
status = {}
|
11
|
-
@file_name
|
12
|
-
@file_path
|
13
|
+
@file_name = file_name
|
14
|
+
@file_path = file_path
|
13
15
|
@error_file_needed = error_file_needed
|
14
16
|
@original_zip_file = "#{@file_path}/#{@file_name}"
|
15
17
|
@csv_file_name = @file_name.gsub(/\.zip/,'')
|
18
|
+
@batch_process = batch_process
|
19
|
+
@batch_size = 1_1000
|
16
20
|
|
17
21
|
begin
|
18
22
|
delete_csv_if_present
|
@@ -59,11 +63,12 @@ module Beam
|
|
59
63
|
end
|
60
64
|
|
61
65
|
# parses the csv file, creates record for the model and returns response hash,e.g.
|
62
|
-
# {:errors=>1, :status=>200, :total_rows=>4, :error_rows=>[["Test1", nil, "is invalid"]]}
|
66
|
+
# \{:errors=>1, :status=>200, :total_rows=>4, :error_rows=>[["Test1", nil, "is invalid"]]\}
|
63
67
|
# also, it creates error file to consume
|
64
68
|
def parse
|
65
69
|
response = { errors: 0, status: 200, total_rows: 0, error_rows: []}
|
66
70
|
index = 0
|
71
|
+
batch = []
|
67
72
|
|
68
73
|
begin
|
69
74
|
CSV.foreach("#{@file_path}/#{@csv_file_name}", :encoding => 'iso-8859-1:UTF-8', headers: true) do |row|
|
@@ -72,8 +77,10 @@ module Beam
|
|
72
77
|
response[:total_rows] += 1
|
73
78
|
begin
|
74
79
|
record, response[:errors], error_row = validate_record(response[:errors], row_hash, index)
|
75
|
-
if error_row
|
76
|
-
|
80
|
+
response[:error_rows] << error_row if error_row
|
81
|
+
|
82
|
+
if @batch_process
|
83
|
+
batch = add_to_batch(batch, record)
|
77
84
|
else
|
78
85
|
record.save!
|
79
86
|
end
|
@@ -82,6 +89,7 @@ module Beam
|
|
82
89
|
response[:error_rows] << log_and_return_error(row_hash, e, index)
|
83
90
|
end
|
84
91
|
end
|
92
|
+
import_from_batch(batch)
|
85
93
|
rescue Exception => e
|
86
94
|
response[:errors] = 1
|
87
95
|
log_and_return_error({}, e, '')
|
@@ -96,6 +104,19 @@ module Beam
|
|
96
104
|
response
|
97
105
|
end
|
98
106
|
|
107
|
+
def add_to_batch(batch, record)
|
108
|
+
batch << record if record
|
109
|
+
if batch.size >= @batch_size
|
110
|
+
import_from_batch(batch, true)
|
111
|
+
batch = []
|
112
|
+
end
|
113
|
+
batch
|
114
|
+
end
|
115
|
+
|
116
|
+
def import_from_batch(batch)
|
117
|
+
import(batch, :validate => false) if @batch_process
|
118
|
+
end
|
119
|
+
|
99
120
|
def log_and_return_validation_error(record, row_hash, index)
|
100
121
|
error_msg = record.errors.messages.values.join(', ')
|
101
122
|
Rails.logger.error("Error on #{index}: \n #{row_hash.values + [error_msg]}")
|
data/lib/beam/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: beam
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gourav Tiwari
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-12-
|
11
|
+
date: 2013-12-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|