beam 0.0.1 → 0.0.2
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 +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
|