rails_spreadsheet_reader 0.0.1 → 0.1.0
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 +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
|