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 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