From 25773a8ee557e6b90f76de9edbfaff039bef5f24 Mon Sep 17 00:00:00 2001 From: Andy Meneely Date: Mon, 27 Apr 2015 08:48:12 -0400 Subject: [PATCH] Better regression tests for roo --- CHANGELOG.md | 2 +- lib/squib/api/data.rb | 6 +++--- spec/api/api_data_spec.rb | 19 +++++++++++++++++++ spec/data/xlsx/basic.xlsx | Bin 0 -> 9823 bytes spec/data/xlsx/formulas.xlsx | Bin 0 -> 8592 bytes spec/spec_helper.rb | 4 ++++ squib.sublime-project | 5 +++++ 7 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 spec/data/xlsx/basic.xlsx create mode 100644 spec/data/xlsx/formulas.xlsx diff --git a/CHANGELOG.md b/CHANGELOG.md index a267798..481a0eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ Squib follows [semantic versioning](http://semver.org). ## v0.6.0 / Unreleased Features: -* Upgraded roo (Excel parsing) to 2.0.0. Nothing major for Squib users, just keeping up with the times. +* Upgraded roo (Excel parsing) to 2.0.0. Nothing major for Squib users, just keeping up with the times. () Bugs: * Fixed global text hinting (#63) diff --git a/lib/squib/api/data.rb b/lib/squib/api/data.rb index e0f1e5c..2ef0abd 100644 --- a/lib/squib/api/data.rb +++ b/lib/squib/api/data.rb @@ -24,15 +24,15 @@ module Squib def xlsx(opts = {}) opts = Squib::SYSTEM_DEFAULTS.merge(opts) opts = Squib::InputHelpers.fileify(opts) - s = Roo::Excelx.new(opts[:file]) + s = Roo::Excelx.new(opts[:file]) s.default_sheet = s.sheets[opts[:sheet]] data = {} s.first_column.upto(s.last_column) do |col| header = s.cell(s.first_row,col).to_s data[header] = [] - (s.first_row+1).upto(s.last_row) do |row| + (s.first_row + 1).upto(s.last_row) do |row| cell = s.cell(row,col) - # Roo hack for avoiding unnecessary .0's on whole integers + # Roo hack for avoiding unnecessary .0's on whole integers (https://github.com/roo-rb/roo/issues/139) cell = s.excelx_value(row,col) if s.excelx_type(row,col) == [:numeric_or_formula, 'General'] data[header] << cell end#row diff --git a/spec/api/api_data_spec.rb b/spec/api/api_data_spec.rb index b90bd44..2519956 100644 --- a/spec/api/api_data_spec.rb +++ b/spec/api/api_data_spec.rb @@ -28,4 +28,23 @@ describe Squib::Deck do }) end end + + context '#xlsx' do + it 'loads basic xlsx data' do + expect(Squib.xlsx(file: xlsx_file('basic.xlsx'))).to eq({ + 'Name' => %w(Larry Curly Mo), + 'General Number' => %w(1 2 3), #general types always get loaded as strings with no conversion + 'Actual Number' => [4.0, 5.0, 6.0], #numbers get auto-converted to integers + }) + end + + it 'loads xlsx with formulas' do + expect(Squib.xlsx(file: xlsx_file('formulas.xlsx'))).to eq({ + 'A' => %w(1, 2), + 'B' => %w(3, 4), + 'Sum' => %w(4, 6), + }) + end + + end end \ No newline at end of file diff --git a/spec/data/xlsx/basic.xlsx b/spec/data/xlsx/basic.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d37739f7bdf5fd22a3b27dd18f9594cdc87832b8 GIT binary patch literal 9823 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 ju<=*%8S=k~{~1J-*&;00937%+$)M literal 0 HcmV?d00001 diff --git a/spec/data/xlsx/formulas.xlsx b/spec/data/xlsx/formulas.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..fadc137c4ed209db2b89eefb190f460f8f1ba2d1 GIT binary patch literal 8592 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