diff --git a/lib/roo/base.rb b/lib/roo/base.rb index b92549b..f29717d 100644 --- a/lib/roo/base.rb +++ b/lib/roo/base.rb @@ -32,6 +32,9 @@ def initialize(filename, options = {}, _file_warning = :error, _tmpdir = nil) @last_column = {} @header_line = 1 + rescue => e # clean up any temp files, but only if an error was raised + close + raise e end def close diff --git a/lib/roo/excelx.rb b/lib/roo/excelx.rb index 45ac6e2..31f8348 100644 --- a/lib/roo/excelx.rb +++ b/lib/roo/excelx.rb @@ -288,6 +288,9 @@ def initialize(filename_or_stream, options = {}) end super + rescue => e # clean up any temp files, but only if an error was raised + close + raise e end def method_missing(method,*args) diff --git a/lib/roo/open_office.rb b/lib/roo/open_office.rb index 187cf4e..183b03a 100644 --- a/lib/roo/open_office.rb +++ b/lib/roo/open_office.rb @@ -38,6 +38,9 @@ def initialize(filename, options={}) @font_style_definitions = Hash.new @comment = Hash.new @comments_read = Hash.new + rescue => e # clean up any temp files, but only if an error was raised + close + raise e end def method_missing(m,*args) diff --git a/test/test_roo.rb b/test/test_roo.rb index d1bce50..66a0651 100644 --- a/test/test_roo.rb +++ b/test/test_roo.rb @@ -64,7 +64,7 @@ def with_each_spreadsheet(options) yield Roo::Spreadsheet.open(File.join(TESTDIR, fixture_filename(options[:name], format))) rescue => e - raise e, "#{e.message} for #{format}", e.backtrace + raise e, "#{e.message} for #{format}", e.backtrace unless options[:ignore_errors] end end end @@ -2079,4 +2079,10 @@ def test_close assert !File.exists?(tempdir), "Expected #{tempdir} to be cleaned up, but it still exists" end end + + def test_cleanup_on_error + old_temp_files = Dir.open(Dir.tmpdir).to_a + with_each_spreadsheet(:name=>'non_existent_file', :ignore_errors=>true) do |oo|; end + assert_equal Dir.open(Dir.tmpdir).to_a, old_temp_files + end end # class