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 CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 8cb068a98505cc537d62613ee7c32c50035f15c4
4
- data.tar.gz: a716652b67871f0e27523ee725dbbfdccb50b288
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YTMwNzIzNDhlOTA5ZDU4NzYxNzQ4OWY3ODhiNWZlZjhhZmI0NDg3ZA==
5
+ data.tar.gz: !binary |-
6
+ NTZjOGQwNDdjZDVkYzIyNzkyNGZjM2Y0YTc2Zjg3ZGI4YWI1NzRmNw==
5
7
  SHA512:
6
- metadata.gz: 6586a01666ce199b41deee31f7c3b98f6beea0f95547b5b512f9263c654086ebb1d02ac4489e8bab343b4f5f221189d7123852a4a136df277e6c68d3a31f575d
7
- data.tar.gz: e08e369c5df81a842857f704938cdd7a4ad42a8e86bfc0bd5b37df253ba1bf866b6fbb508bdecebf2d27bb60e0da5a76c77297eba558011a34aef47377d820ae
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, validate_multiple_rows and persist methods depending on your use-case.
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
- TODO: Add example app link
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. It have to raise an exception if there was
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.rows.each do |row|
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.rows.each do |row|
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 NotImplementedError
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
- begin
185
- validate_rows(spreadsheet, row_collection)
186
- validate_multiple_rows(row_collection)
187
- persist(row_collection)
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. Raises an exception
204
- # when row_collection.valid? returns false. It happens 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
- raise 'Invalid Row in Excel' unless row_collection.valid?
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 unless row.valid?
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
@@ -1,3 +1,3 @@
1
1
  module RailsSpreadsheetReader
2
- VERSION = "0.0.1"
2
+ VERSION = '0.1.0'
3
3
  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 'Base#columns' do
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 'Base#format' do
16
- expect { RailsSpreadsheetReader::Base.format }.to raise_error
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 'Base#formatted_hash' do
20
- expect { RailsSpreadsheetReader::Base.formatted_hash(%w(username email@test.com male)) }.to raise_error
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#valid? should work as desired' do
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#open_spreadsheet' do
29
+ it 'Base.open_spreadsheet should return a Roo::Base instance' do
28
30
  file = test_file 'users', :csv
29
- row = RailsSpreadsheetReader::Base.open_spreadsheet file
30
- expect(row).not_to eq(false)
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 'Base#read_spreadsheet' do
35
+ it 'empty columns should raise an error' do
34
36
  file = test_file 'users', :csv
35
- expect { RailsSpreadsheetReader::Base.read_spreadsheet(file) }.to raise_error
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
@@ -0,0 +1,7 @@
1
+ class EmptyColumnSpreadsheet < RailsSpreadsheetReader::Base
2
+
3
+ def self.columns
4
+ []
5
+ end
6
+
7
+ end
@@ -0,0 +1,7 @@
1
+ class InvalidColumnSpreadsheet < RailsSpreadsheetReader::Base
2
+
3
+ def self.columns
4
+ 10
5
+ end
6
+
7
+ end
@@ -14,7 +14,7 @@ class UserInvalidSpreadsheet < RailsSpreadsheetReader::Base
14
14
  if usernames.has_key?(row.username)
15
15
  row_collection.invalid_row = row
16
16
  row.errors[:username] = 'is unique'
17
- raise 'Validation Error'
17
+ break
18
18
  else
19
19
  usernames[row.username] = true
20
20
  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.1
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-01-29 00:00:00.000000000 Z
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.5
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