rails_spreadsheet_reader 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +13 -5
- data/README.md +3 -2
- data/lib/rails_spreadsheet_reader/base.rb +12 -19
- data/lib/rails_spreadsheet_reader/row_collection.rb +17 -2
- data/lib/rails_spreadsheet_reader/version.rb +1 -1
- data/spec/base_spec.rb +14 -20
- data/spec/models/empty_column_spreadsheet.rb +7 -0
- data/spec/models/invalid_column_spreadsheet.rb +7 -0
- data/spec/models/user_invalid_spreadsheet.rb +1 -1
- metadata +11 -7
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
YTMwNzIzNDhlOTA5ZDU4NzYxNzQ4OWY3ODhiNWZlZjhhZmI0NDg3ZA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NTZjOGQwNDdjZDVkYzIyNzkyNGZjM2Y0YTc2Zjg3ZGI4YWI1NzRmNw==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
NGNkMjk0NDM5YThjMzE3NWNhMTE1MTIyZjhiOTQ0NTMwZjUwZjM1MmQxZDIw
|
10
|
+
ZGZiNTA3ZGYxMDU5YjFlNTAwMTg2NTcwYTkxNTliN2FkZWM2ODk1YzgzNzM1
|
11
|
+
YTg5Y2M0YzU4MWQxMGY0MWI3ZTRjZmZmNzVkZDEwYzBlMmMyMzA=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MmUzMDAzZTJkZDQ5OWNmNDZmMGIxNDYyYzI1MzUxYWMwYjdkNjExYTBkMTQz
|
14
|
+
ZDRiZTI2YTI5MDI2NjM3YWZhYTk3ZmMwNmNhZDNlZTIzNTFhMTdkNWQzYzVk
|
15
|
+
Y2Q0MWVlNGNkNDcxMzI5NjRlMGJkNWQ3NWQxNTZkODE2ZDQ5YzA=
|
data/README.md
CHANGED
@@ -19,15 +19,16 @@ Or install it yourself as:
|
|
19
19
|
## Usage
|
20
20
|
|
21
21
|
Run
|
22
|
+
|
22
23
|
$ rails g spreadsheet name
|
23
24
|
|
24
25
|
to create a spreadsheet reader into app/spreadsheet_reader directory.
|
25
26
|
|
26
|
-
Edit the columns
|
27
|
+
Edit the **self.columns**, **self.validate_multiple_rows** and **self.persist** methods depending on your use-case.
|
27
28
|
|
28
29
|
## Example
|
29
30
|
|
30
|
-
|
31
|
+
Example rails app: https://github.com/muZk/spreadsheet_reader_example
|
31
32
|
|
32
33
|
## Contributing
|
33
34
|
|
@@ -106,18 +106,16 @@ module RailsSpreadsheetReader
|
|
106
106
|
# This method is called when all rows of row_collection are valid. The main
|
107
107
|
# idea of this method is to run validations that have to do with
|
108
108
|
# the set of rows of the excel. For example, you can check here if a
|
109
|
-
# excel column is unique
|
110
|
-
# an error with a certain row.
|
109
|
+
# excel column is unique:
|
111
110
|
#
|
112
111
|
# Example:
|
113
112
|
#
|
114
113
|
# def self.validate_multiple_rows(row_collection)
|
115
114
|
# username_list = []
|
116
|
-
# row_collection.
|
115
|
+
# row_collection.each do |row|
|
117
116
|
# if username_list.include?(row.username)
|
118
117
|
# row_collection.invalid_row = row
|
119
118
|
# row.errors[:username] = 'is unique'
|
120
|
-
# raise 'Validation Error'
|
121
119
|
# else
|
122
120
|
# username_list << row.username
|
123
121
|
# end
|
@@ -141,7 +139,7 @@ module RailsSpreadsheetReader
|
|
141
139
|
# Example:
|
142
140
|
# def self.persist(row_collection)
|
143
141
|
# User.transaction do
|
144
|
-
# row_collection.
|
142
|
+
# row_collection.each do |row|
|
145
143
|
# user = User.new(attr1: row.attr1, attr2: row.attr2, ...)
|
146
144
|
# unless user.save
|
147
145
|
# row_collection.set_invalid_row(row, user) # pass the model with errors as second parameter
|
@@ -175,20 +173,16 @@ module RailsSpreadsheetReader
|
|
175
173
|
def self.read_spreadsheet(spreadsheet_file)
|
176
174
|
|
177
175
|
if columns.empty?
|
178
|
-
raise
|
176
|
+
raise MethodNotImplementedError
|
179
177
|
end
|
180
178
|
|
181
179
|
spreadsheet = open_spreadsheet(spreadsheet_file)
|
182
180
|
row_collection = RailsSpreadsheetReader::RowCollection.new
|
183
181
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
row_collection
|
189
|
-
rescue
|
190
|
-
row_collection
|
191
|
-
end
|
182
|
+
validate_rows(spreadsheet, row_collection)
|
183
|
+
validate_multiple_rows(row_collection) if row_collection.valid?
|
184
|
+
persist(row_collection) if row_collection.valid?
|
185
|
+
row_collection
|
192
186
|
|
193
187
|
end
|
194
188
|
|
@@ -200,15 +194,14 @@ module RailsSpreadsheetReader
|
|
200
194
|
|
201
195
|
private
|
202
196
|
|
203
|
-
# Calls row.valid? on every row of the spreadsheet.
|
204
|
-
# when
|
205
|
-
# the current row is an invalid ActiveModel::Model.
|
197
|
+
# Calls row.valid? on every row of the spreadsheet.
|
198
|
+
# Stops when a row is an invalid ActiveModel::Model.
|
206
199
|
def self.validate_rows(spreadsheet, row_collection)
|
207
200
|
(starting_row..spreadsheet.last_row).each do |number|
|
208
201
|
hash = formatted_hash(spreadsheet.row(number))
|
209
202
|
hash[:row_number] = number
|
210
203
|
row_collection.push self.new(hash)
|
211
|
-
|
204
|
+
break if row_collection.invalid?
|
212
205
|
end
|
213
206
|
end
|
214
207
|
|
@@ -233,4 +226,4 @@ module RailsSpreadsheetReader
|
|
233
226
|
|
234
227
|
end
|
235
228
|
|
236
|
-
end
|
229
|
+
end
|
@@ -9,16 +9,27 @@ module RailsSpreadsheetReader
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def push(row)
|
12
|
-
self.invalid_row = row
|
12
|
+
self.invalid_row = row if row.invalid?
|
13
13
|
self.rows << row
|
14
14
|
end
|
15
15
|
|
16
|
+
def invalid_row=(row)
|
17
|
+
if row.invalid?
|
18
|
+
@invalid_row = row
|
19
|
+
end
|
20
|
+
# TODO: Throw exception maybe?
|
21
|
+
end
|
22
|
+
|
16
23
|
def valid?
|
17
24
|
self.invalid_row.nil?
|
18
25
|
end
|
19
26
|
|
27
|
+
def invalid?
|
28
|
+
!valid?
|
29
|
+
end
|
30
|
+
|
20
31
|
def errors
|
21
|
-
self.invalid_row.errors
|
32
|
+
self.invalid_row.errors if invalid?
|
22
33
|
end
|
23
34
|
|
24
35
|
def set_invalid_row(row, model_with_errors)
|
@@ -26,6 +37,10 @@ module RailsSpreadsheetReader
|
|
26
37
|
self.invalid_row = row
|
27
38
|
end
|
28
39
|
|
40
|
+
def each(&block)
|
41
|
+
self.rows.each(&block)
|
42
|
+
end
|
43
|
+
|
29
44
|
end
|
30
45
|
|
31
46
|
end
|
data/spec/base_spec.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require_relative 'models/invalid_column_spreadsheet'
|
2
3
|
require_relative 'models/user_spreadsheet'
|
3
4
|
require_relative 'models/user_invalid_spreadsheet'
|
5
|
+
require_relative 'models/empty_column_spreadsheet.rb'
|
4
6
|
|
5
7
|
def test_file(filename, ext)
|
6
8
|
File.open(File.join TEST_DIR, "#{filename}.#{ext}")
|
@@ -8,31 +10,31 @@ end
|
|
8
10
|
|
9
11
|
describe RailsSpreadsheetReader::Base do
|
10
12
|
|
11
|
-
it '
|
12
|
-
expect { RailsSpreadsheetReader::Base.columns }.to raise_error
|
13
|
+
it 'not implementing columns method should raise an error' do
|
14
|
+
expect { RailsSpreadsheetReader::Base.columns }.to raise_error(RailsSpreadsheetReader::Base::MethodNotImplementedError)
|
13
15
|
end
|
14
16
|
|
15
|
-
it '
|
16
|
-
expect {
|
17
|
+
it 'format method should raise an error if columns method is not valid' do
|
18
|
+
expect { InvalidColumnSpreadsheet.format }.to raise_error(RailsSpreadsheetReader::Base::InvalidTypeError)
|
17
19
|
end
|
18
20
|
|
19
|
-
it '
|
20
|
-
expect {
|
21
|
+
it 'formatted_hash should raise an error if columns method is not valid' do
|
22
|
+
expect { InvalidColumnSpreadsheet.formatted_hash(%w(username email@test.com male)) }.to raise_error(RailsSpreadsheetReader::Base::InvalidTypeError)
|
21
23
|
end
|
22
24
|
|
23
|
-
it 'Base
|
25
|
+
it 'Base.valid? should be true by default' do
|
24
26
|
expect(RailsSpreadsheetReader::Base.new.valid?).to eq(true)
|
25
27
|
end
|
26
28
|
|
27
|
-
it 'Base
|
29
|
+
it 'Base.open_spreadsheet should return a Roo::Base instance' do
|
28
30
|
file = test_file 'users', :csv
|
29
|
-
|
30
|
-
expect(
|
31
|
+
roo_row = RailsSpreadsheetReader::Base.open_spreadsheet file
|
32
|
+
expect(roo_row.is_a?(Roo::Base)).not_to eq(false)
|
31
33
|
end
|
32
34
|
|
33
|
-
it '
|
35
|
+
it 'empty columns should raise an error' do
|
34
36
|
file = test_file 'users', :csv
|
35
|
-
expect {
|
37
|
+
expect { EmptyColumnSpreadsheet.read_spreadsheet(file) }.to raise_error(RailsSpreadsheetReader::Base::MethodNotImplementedError)
|
36
38
|
end
|
37
39
|
|
38
40
|
it '#formatted_hash should work in a derived class which overrides "columns" method' do
|
@@ -71,12 +73,4 @@ describe RailsSpreadsheetReader::Base do
|
|
71
73
|
expect(row_collection.errors.full_messages).to eq(["Email can't be blank"])
|
72
74
|
end
|
73
75
|
|
74
|
-
it '#read_spreadsheet should be invalid because #validate_multiple_rows raises an exception' do
|
75
|
-
file = test_file 'users_invalid', :csv
|
76
|
-
row_collection = UserInvalidSpreadsheet.read_spreadsheet(file)
|
77
|
-
expect(row_collection.valid?).to eq(false)
|
78
|
-
expect(row_collection.invalid_row.row_number).to eq(5)
|
79
|
-
expect(row_collection.errors.full_messages).to eq(['Username is unique'])
|
80
|
-
end
|
81
|
-
|
82
76
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_spreadsheet_reader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- muzk
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-09-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -28,14 +28,14 @@ dependencies:
|
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - '>='
|
31
|
+
- - ! '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - '>='
|
38
|
+
- - ! '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
@@ -116,6 +116,8 @@ files:
|
|
116
116
|
- spec/base_spec.rb
|
117
117
|
- spec/files/users.csv
|
118
118
|
- spec/files/users_invalid.csv
|
119
|
+
- spec/models/empty_column_spreadsheet.rb
|
120
|
+
- spec/models/invalid_column_spreadsheet.rb
|
119
121
|
- spec/models/user_invalid_spreadsheet.rb
|
120
122
|
- spec/models/user_spreadsheet.rb
|
121
123
|
- spec/spec_helper.rb
|
@@ -129,17 +131,17 @@ require_paths:
|
|
129
131
|
- lib
|
130
132
|
required_ruby_version: !ruby/object:Gem::Requirement
|
131
133
|
requirements:
|
132
|
-
- - '>='
|
134
|
+
- - ! '>='
|
133
135
|
- !ruby/object:Gem::Version
|
134
136
|
version: '0'
|
135
137
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
136
138
|
requirements:
|
137
|
-
- - '>='
|
139
|
+
- - ! '>='
|
138
140
|
- !ruby/object:Gem::Version
|
139
141
|
version: '0'
|
140
142
|
requirements: []
|
141
143
|
rubyforge_project:
|
142
|
-
rubygems_version: 2.4.
|
144
|
+
rubygems_version: 2.4.3
|
143
145
|
signing_key:
|
144
146
|
specification_version: 4
|
145
147
|
summary: Provides an easy way to add model-based validations to excel files.
|
@@ -147,6 +149,8 @@ test_files:
|
|
147
149
|
- spec/base_spec.rb
|
148
150
|
- spec/files/users.csv
|
149
151
|
- spec/files/users_invalid.csv
|
152
|
+
- spec/models/empty_column_spreadsheet.rb
|
153
|
+
- spec/models/invalid_column_spreadsheet.rb
|
150
154
|
- spec/models/user_invalid_spreadsheet.rb
|
151
155
|
- spec/models/user_spreadsheet.rb
|
152
156
|
- spec/spec_helper.rb
|