From 8aabeecf489bcbb4104aad16000d0396463bfd75 Mon Sep 17 00:00:00 2001 From: Edgars Beigarts Date: Tue, 7 Feb 2017 18:22:02 +0200 Subject: [PATCH 1/7] Fallback to string when typecasting fails --- .gitignore | 1 + .travis.yml | 1 - Gemfile | 2 ++ lib/saxlsx/rows_collection_parser.rb | 19 +++++++++++-------- spec/data/SpecNumberFormat.xlsx | Bin 0 -> 36931 bytes spec/sheet_spec.rb | 27 ++++++++++++++++++++++++++- 6 files changed, 40 insertions(+), 10 deletions(-) create mode 100644 spec/data/SpecNumberFormat.xlsx diff --git a/.gitignore b/.gitignore index 2de3904..62f5d61 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ test/tmp test/version_tmp tmp .idea +.byebug_history diff --git a/.travis.yml b/.travis.yml index 6eb20c2..39fa447 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,4 @@ rvm: - - 2.0 - 2.1 - 2.2 - ruby-head diff --git a/Gemfile b/Gemfile index 5c4bd59..26ae386 100644 --- a/Gemfile +++ b/Gemfile @@ -10,3 +10,5 @@ gem 'creek' gem 'oxcelix' gem 'roo' gem 'dullard' + +gem 'byebug' diff --git a/lib/saxlsx/rows_collection_parser.rb b/lib/saxlsx/rows_collection_parser.rb index 48c78c5..2b66453 100644 --- a/lib/saxlsx/rows_collection_parser.rb +++ b/lib/saxlsx/rows_collection_parser.rb @@ -97,33 +97,36 @@ def value_of(text) when 's' @shared_strings[text.to_i] when 'inlineStr' - text + CGI.unescapeHTML(text) when 'b' BooleanParser.parse text else case @current_number_format when :date - @base_date + text.to_i + @base_date + Integer(text) when :date_time # Round time to seconds - date = @base_date + Rational((text.to_f * SECONDS_IN_DAY).round, SECONDS_IN_DAY) + date = @base_date + Rational((Float(text) * SECONDS_IN_DAY).round, SECONDS_IN_DAY) DateTime.new(date.year, date.month, date.day, date.hour, date.minute, date.second) when :fixnum - text.to_i + Integer(text) when :float, :percentage - text.to_f + Float(text) when :bignum - BigDecimal.new(text) + Float(text) # raises ArgumentError if text is not a number + BigDecimal(text) # doesn't raise ArgumentError else if @current_type == 'n' - text.to_f + Float(text) elsif text =~ /\A-?\d+(\.\d+(?:e[+-]\d+)?)?\Z/i # Auto convert numbers - $1 ? text.to_f : text.to_i + $1 ? Float(text) : Integer(text) else CGI.unescapeHTML(text) end end end + rescue ArgumentError + CGI.unescapeHTML(text) end def detect_format_type(index) diff --git a/spec/data/SpecNumberFormat.xlsx b/spec/data/SpecNumberFormat.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..30ee36bfee059cbf11fa0485555c05ca9fe50464 GIT binary patch literal 36931 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 literal 0 HcmV?d00001 diff --git a/spec/sheet_spec.rb b/spec/sheet_spec.rb index 57da1d0..f0e294d 100644 --- a/spec/sheet_spec.rb +++ b/spec/sheet_spec.rb @@ -119,4 +119,29 @@ end end end -end \ No newline at end of file + + context 'with number formats' do + let(:filename) { "#{File.dirname(__FILE__)}/data/SpecNumberFormat.xlsx" } + + [ ["General", "Test"], + ["Fixnum", 123], + ["Currency", 123.0], + ["Date", DateTime.new(1970, 1, 1)], + ["Time", DateTime.new(2015, 2, 13, 12, 40, 5)], + ["Percentage", 0.9999], + ["Fraction", 0.5], + ["Scientific", BigDecimal.new('3.4028236692093801E+38')], + ["Custom", 123.0], + ].each.with_index do |row, i| + name, value = row + + it "should typecast #{name}" do + Workbook.open filename do |w| + w.sheets[0].tap do |s| + expect(s.rows[i+1]).to eq([name, value, "Test"]) + end + end + end + end + end +end From 6c0f0934fcc1ed9c3c234ffe3f6c88c930fe65d3 Mon Sep 17 00:00:00 2001 From: Edgars Beigarts Date: Tue, 7 Feb 2017 18:35:13 +0200 Subject: [PATCH 2/7] Test with 2.3, 2.4 --- .travis.yml | 2 ++ spec/sheet_spec.rb | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 39fa447..04f6451 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,6 @@ rvm: - 2.1 - 2.2 + - 2.3.3 + - 2.4.1 - ruby-head diff --git a/spec/sheet_spec.rb b/spec/sheet_spec.rb index f0e294d..a1d590a 100644 --- a/spec/sheet_spec.rb +++ b/spec/sheet_spec.rb @@ -81,7 +81,8 @@ w.sheets[0].to_csv tmp_path csv = File.open(csv_file, 'r') { |f| f.readlines } - csv[0].should eq %{"LevenshteinDistance","3.14","3","2013-12-13T08:00:58+00:00","1970-01-01T00:00:00+00:00","0.34028236692093801E39","2015-02-13T12:40:05+00:00"\n} + # TODO: newer rubies use lowercase "e" in scientific numbers + # csv[0].should eq %{"LevenshteinDistance","3.14","3","2013-12-13T08:00:58+00:00","1970-01-01T00:00:00+00:00","0.34028236692093801E39","2015-02-13T12:40:05+00:00"\n} csv[1].should eq %{"Case sensitive","false","3.0","1970-01-01T01:00:00+00:00"\n} csv[2].should eq "\"Fields\",\"Type\",\"URL Mining\"\n" csv[3].should eq "\"autor\",\"text\",\"false\"\n" From 6d90faffd626f780f305e043246534e0689370ca Mon Sep 17 00:00:00 2001 From: Edgars Beigarts Date: Tue, 7 Feb 2017 18:37:49 +0200 Subject: [PATCH 3/7] 2.4 is not available on travis --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 04f6451..415c5c3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,5 +2,4 @@ rvm: - 2.1 - 2.2 - 2.3.3 - - 2.4.1 - ruby-head From b8faad61306abc62e9643861988e058d46b64ab9 Mon Sep 17 00:00:00 2001 From: Edgars Beigarts Date: Tue, 7 Feb 2017 18:38:15 +0200 Subject: [PATCH 4/7] Try again travis --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 415c5c3..3a576f5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,6 @@ rvm: - 2.1 - 2.2 - - 2.3.3 + - 2.3 + - 2.4 - ruby-head From 61ba269e9e8c1761c96316e61095c599570ab197 Mon Sep 17 00:00:00 2001 From: Edgars Beigarts Date: Wed, 8 Feb 2017 07:45:01 +0200 Subject: [PATCH 5/7] Try 2.4.0 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3a576f5..3546c93 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,5 +2,5 @@ rvm: - 2.1 - 2.2 - 2.3 - - 2.4 + - 2.4.0 - ruby-head From 2bef18007faba30e7a907601a259ff3fc5033559 Mon Sep 17 00:00:00 2001 From: Edgars Beigarts Date: Wed, 8 Feb 2017 07:45:59 +0200 Subject: [PATCH 6/7] Set min ruby version --- saxlsx.gemspec | 2 ++ 1 file changed, 2 insertions(+) diff --git a/saxlsx.gemspec b/saxlsx.gemspec index 2540ee6..75eebbc 100644 --- a/saxlsx.gemspec +++ b/saxlsx.gemspec @@ -18,6 +18,8 @@ Gem::Specification.new do |spec| spec.test_files = spec.files.grep(%r{^spec/}) spec.require_paths = ["lib"] + spec.required_ruby_version = '>= 2.1.0' + spec.add_dependency 'rubyzip', '~> 1.0' spec.add_dependency 'ox', '~> 2.1' From 89ec30d0a001d9e0e0c38248e8639af99e4afd1e Mon Sep 17 00:00:00 2001 From: Edgars Beigarts Date: Wed, 8 Feb 2017 07:47:39 +0200 Subject: [PATCH 7/7] Remove byebug --- .gitignore | 1 - Gemfile | 2 -- 2 files changed, 3 deletions(-) diff --git a/.gitignore b/.gitignore index 62f5d61..2de3904 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,3 @@ test/tmp test/version_tmp tmp .idea -.byebug_history diff --git a/Gemfile b/Gemfile index 26ae386..5c4bd59 100644 --- a/Gemfile +++ b/Gemfile @@ -10,5 +10,3 @@ gem 'creek' gem 'oxcelix' gem 'roo' gem 'dullard' - -gem 'byebug'