From 93eb3ba5f7a85c066aff8a81bc12964e9ae323b9 Mon Sep 17 00:00:00 2001 From: Alexis Reigel <mail@koffeinfrei.org> Date: Fri, 1 Jun 2018 15:33:36 +0200 Subject: [PATCH] check columns (formerly `validate!`) on run don't execute anything from the constructor --- lib/excelsior/import.rb | 28 ++++++++++++++-------------- lib/excelsior/result.rb | 4 ++++ test/excelsior_test.rb | 2 +- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/lib/excelsior/import.rb b/lib/excelsior/import.rb index c00202a..cd81e3e 100644 --- a/lib/excelsior/import.rb +++ b/lib/excelsior/import.rb @@ -30,19 +30,15 @@ module Excelsior @rows = @sheet.rows @result = Result.new(@rows.length) - - validate! end def run(&block) - return unless valid? + check_columns! - if self.class.use_transaction - model_class.transaction do - insert_rows(&block) + return if result.failed? - raise ActiveRecord::Rollback if report.failed.positive? - end + if self.class.use_transaction + run_with_transaction(&block) else insert_rows(&block) end @@ -50,20 +46,24 @@ module Excelsior result end - def validate! + private + + def check_columns! fields.to_a.each do |f| errors[:missing_column] << { missing: f[:header] } unless @columns.include?(f[:header]) end end - def valid? - result.status != Result::Statuses::FAILED + def model_class + self.class.name.gsub('Import', '').constantize end - private + def run_with_transaction(&block) + model_class.transaction do + insert_rows(&block) - def model_class - self.class.name.gsub('Import', '').constantize + raise ActiveRecord::Rollback if report.failed.positive? + end end def add_model_errors(record, index) diff --git a/lib/excelsior/result.rb b/lib/excelsior/result.rb index 441d2eb..c0ff721 100644 --- a/lib/excelsior/result.rb +++ b/lib/excelsior/result.rb @@ -27,5 +27,9 @@ module Excelsior Statuses::PENDING end end + + def failed? + status == Result::Statuses::FAILED + end end end diff --git a/test/excelsior_test.rb b/test/excelsior_test.rb index 63bf210..c9e3d6f 100644 --- a/test/excelsior_test.rb +++ b/test/excelsior_test.rb @@ -167,7 +167,7 @@ describe Excelsior do describe '#errors' do it 'returns an error when a column is missing in the excel' do - import = UserImport.new('test/files/missing-column.xlsx') + import = UserImport.new('test/files/missing-column.xlsx').tap(&:run) assert import.errors[:missing_column].any? end -- GitLab