Skip to content

Commit

Permalink
Merge 8b33cac into 143fffa
Browse files Browse the repository at this point in the history
  • Loading branch information
stevendaniels committed Dec 30, 2016
2 parents 143fffa + 8b33cac commit 60edc96
Show file tree
Hide file tree
Showing 16 changed files with 444 additions and 643 deletions.
6 changes: 2 additions & 4 deletions Gemfile
Expand Up @@ -4,22 +4,20 @@ gemspec

group :test do
# additional testing libs
gem 'webmock'
gem 'shoulda'
gem 'activesupport', '< 5.1'
gem 'rspec', '>= 3.0.0'
gem 'vcr'
gem 'simplecov', '>= 0.9.0', require: false
gem 'coveralls', require: false
gem "minitest-reporters"
end

group :local_development do
gem 'terminal-notifier-guard', require: false if RUBY_PLATFORM.downcase.include?('darwin')
gem 'guard-rspec', '>= 4.3.1', require: false
gem 'guard-minitest', require: false
gem 'guard-bundler', require: false
gem 'guard-preek', require: false
gem 'guard-rubocop', require: false
gem 'guard-reek', github: 'pericles/guard-reek', require: false
gem "rb-readline"
gem 'pry'
end
6 changes: 3 additions & 3 deletions Gemfile_ruby2
Expand Up @@ -6,14 +6,13 @@ gem 'nokogiri', "< 1.7.0"

group :test do
# additional testing libs
gem 'webmock'
gem 'shoulda'
gem 'rspec', '>= 3.0.0'
gem 'vcr'
gem 'simplecov', '>= 0.9.0', require: false
gem 'coveralls', require: false
# gem "pry"
gem "activesupport", "~> 4.2.0"
gem "tins", '~> 1.6.0'
gem "term-ansicolor", "~> 1.3.2"
end

group :local_development do
Expand All @@ -25,5 +24,6 @@ group :local_development do
gem 'guard-preek', require: false
gem 'guard-rubocop', require: false
gem 'guard-reek', github: 'pericles/guard-reek', require: false
gem 'rb-readline'
gem 'pry'
end
4 changes: 4 additions & 0 deletions lib/roo/base.rb
Expand Up @@ -22,6 +22,10 @@ def self.TEMP_PREFIX
Roo::TEMP_PREFIX
end

def self.finalize(object_id)
proc { finalize_tempdirs(object_id) }
end

def initialize(filename, options = {}, _file_warning = :error, _tmpdir = nil)
@filename = filename
@options = options
Expand Down
9 changes: 7 additions & 2 deletions lib/roo/excelx.rb
Expand Up @@ -4,12 +4,11 @@
require 'roo/tempdir'
require 'roo/utils'
require 'forwardable'
require 'set'

module Roo
class Excelx < Roo::Base
extend Roo::Tempdir

require 'set'
extend Forwardable

ERROR_VALUES = %w(#N/A #REF! #NAME? #DIV/0! #NULL! #VALUE! #NUM!).to_set
Expand Down Expand Up @@ -46,7 +45,13 @@ def initialize(filename_or_stream, options = {})
basename = find_basename(filename_or_stream)
end

# NOTE: Create temp directory and allow Ruby to cleanup the temp directory
# when the object is garbage collected. Initially, the finalizer was
# created in the Roo::Tempdir module, but that led to a segfault
# when testing in Ruby 2.4.0.
@tmpdir = self.class.make_tempdir(self, basename, options[:tmpdir_root])
ObjectSpace.define_finalizer(self, self.class.finalize(object_id))

@shared = Shared.new(@tmpdir)
@filename = local_filename(filename_or_stream, @tmpdir, packed)
process_zipfile(@filename || filename_or_stream)
Expand Down
7 changes: 6 additions & 1 deletion lib/roo/open_office.rb
Expand Up @@ -22,7 +22,12 @@ def initialize(filename, options = {})

@only_visible_sheets = options[:only_visible_sheets]
file_type_check(filename, '.ods', 'an Roo::OpenOffice', file_warning, packed)
@tmpdir = self.class.make_tempdir(self, find_basename(filename), options[:tmpdir_root])
# NOTE: Create temp directory and allow Ruby to cleanup the temp directory
# when the object is garbage collected. Initially, the finalizer was
# created in the Roo::Tempdir module, but that led to a segfault
# when testing in Ruby 2.4.0.
@tmpdir = self.class.make_tempdir(self, find_basename(filename), options[:tmpdir_root])
ObjectSpace.define_finalizer(self, self.class.finalize(object_id))
@filename = local_filename(filename, @tmpdir, packed)
# TODO: @cells_read[:default] = false
open_oo_file(options)
Expand Down
15 changes: 5 additions & 10 deletions lib/roo/tempdir.rb
Expand Up @@ -2,24 +2,19 @@ module Roo
module Tempdir
def finalize_tempdirs(object_id)
if @tempdirs && (dirs_to_remove = @tempdirs[object_id])
@tempdirs[object_id] = nil
@tempdirs.delete(object_id)
dirs_to_remove.each do |dir|
::FileUtils.remove_entry(dir)
end
end
end

def make_tempdir(object, prefix, root)
root ||= ENV['ROO_TMP']
# folder is cleaned up in .finalize_tempdirs
root ||= ENV["ROO_TMP"]
# NOTE: This folder is cleaned up by finalize_tempdirs.
::Dir.mktmpdir("#{Roo::TEMP_PREFIX}#{prefix}", root).tap do |tmpdir|
@tempdirs ||= {}
if @tempdirs[object.object_id]
@tempdirs[object.object_id] << tmpdir
else
@tempdirs[object.object_id] = [tmpdir]
ObjectSpace.define_finalizer(object, method(:finalize_tempdirs))
end
@tempdirs ||= Hash.new { |h, k| h[k] = [] }
@tempdirs[object.object_id] << tmpdir
end
end
end
Expand Down
1 change: 1 addition & 0 deletions roo.gemspec
Expand Up @@ -22,4 +22,5 @@ Gem::Specification.new do |spec|

spec.add_development_dependency 'rake', '~> 10.1'
spec.add_development_dependency 'minitest', '~> 5.4', '>= 5.4.3'
spec.add_development_dependency 'rack', '~> 1.6', '< 2.0.0'
end
8 changes: 2 additions & 6 deletions spec/spec_helper.rb
@@ -1,13 +1,9 @@
require 'simplecov'
require 'roo'
require 'vcr'
require 'helpers'

RSpec.configure do |c|
c.include Helpers
end

VCR.configure do |c|
c.cassette_library_dir = 'spec/fixtures/vcr_cassettes'
c.hook_into :webmock # or :fakeweb
c.color = true
c.formatter = :documentation
end
6 changes: 3 additions & 3 deletions test/excelx/cell/test_time.rb
@@ -1,7 +1,7 @@
require 'test_helper'

class TestRooExcelxCellTime < Minitest::Test
def time
def roo_time
Roo::Excelx::Cell::Time
end

Expand All @@ -18,13 +18,13 @@ def test_formatted_value
['[h]:mm:ss', '[1]:48:09'],
['mmss.0', '4809.0'] # Cell::Time always get rounded to the nearest second.
].each do |style_format, result|
cell = time.new(value, nil, [:numeric_or_formula, style_format], 6, nil, base_date, nil)
cell = roo_time.new(value, nil, [:numeric_or_formula, style_format], 6, nil, base_date, nil)
assert_equal result, cell.formatted_value, "Style=#{style_format} is not properly formatted"
end
end

def test_value
cell = time.new('0.0751', nil, [:numeric_or_formula, 'h:mm'], 6, nil, base_date, nil)
cell = roo_time.new('0.0751', nil, [:numeric_or_formula, 'h:mm'], 6, nil, base_date, nil)
assert_kind_of Integer, cell.value
end
end
Binary file added test/files/rata.ods.zip
Binary file not shown.
39 changes: 39 additions & 0 deletions test/roo/test_csv.rb
@@ -0,0 +1,39 @@
require 'test_helper'

class TestRooCSV < Minitest::Test
def test_sheets
file = filename("numbers1")
workbook = roo_class.new(File.join(TESTDIR, file))
assert_equal ["default"], workbook.sheets
assert_raises(RangeError) { workbook.default_sheet = "no_sheet" }
assert_raises(TypeError) { workbook.default_sheet = [1, 2, 3] }
workbook.sheets.each do |sh|
workbook.default_sheet = sh
assert_equal sh, workbook.default_sheet
end
end

def test_nil_rows_and_lines_csv
# x_123
oo = Roo::CSV.new(File.join(TESTDIR,'Bibelbund.csv'))
oo.default_sheet = oo.sheets.first
assert_equal 1, oo.first_row
end

def test_csv_parsing_with_headers
return unless CSV
headers = ["TITEL", "VERFASSER", "OBJEKT", "NUMMER", "SEITE", "INTERNET", "PC", "KENNUNG"]

oo = Roo::Spreadsheet.open(File.join(TESTDIR, "Bibelbund.csv"))
parsed = oo.parse(headers: true)
assert_equal headers, parsed[1].keys
end

def roo_class
Roo::CSV
end

def filename(name)
"#{name}.csv"
end
end

0 comments on commit 60edc96

Please sign in to comment.