diff --git a/lib/excelsior/import.rb b/lib/excelsior/import.rb index c859ce8280bc6d88c7c0775acfec32a742eb593a..98087a5035e516db140e221a7d772d4296186af6 100644 --- a/lib/excelsior/import.rb +++ b/lib/excelsior/import.rb @@ -33,7 +33,13 @@ module Excelsior @rows.map.with_index do |row, i| attributes = map_row_values(row, @columns) if block_given? - yield attributes + begin + result = yield attributes + report_insert + result + rescue + report_failure + end else record = model_class.create(attributes) add_model_errors(record, i) @@ -60,15 +66,23 @@ module Excelsior def add_model_errors(record, index) if record.errors.empty? - @report.inserted += 1 + report_insert return end - @report.failed += 1 + report_failure @errors[:model] ||= [] @errors[:model] << Error.new(index + 1, record.errors.full_messages) end + + def report_insert + @report.inserted += 1 + end + + def report_failure + @report.failed += 1 + end end end diff --git a/test/excelsior_test.rb b/test/excelsior_test.rb index 0fd4a657842279520a364d0cdb539bbdff9dd582..60f8efb0395eb3114f6218724789eddb3ee2d3a0 100644 --- a/test/excelsior_test.rb +++ b/test/excelsior_test.rb @@ -88,4 +88,15 @@ class ExcelsiorTest < Minitest::Test assert_equal 1, import.report.failed assert_equal 3, import.report.total end + + def test_report_with_block + import = UserImport.new("test/files/missing-first-name.xlsx") + import.run do |v| + raise "failure!" if v[:first_name].nil? + v + end + assert_equal 2, import.report.inserted + assert_equal 1, import.report.failed + assert_equal 3, import.report.total + end end