roo-xls 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1123a00b02f4882fe61348d8ce2e4d291ee69e18
4
- data.tar.gz: 08219e99656723cb9d1d0c22439285985eb98cb5
3
+ metadata.gz: 72a5eeec41696350e22d685b1337489727f9211c
4
+ data.tar.gz: d149d0621aec472b1b64ef3b817ef167d7cfd785
5
5
  SHA512:
6
- metadata.gz: 36d6728ac2bc30d611630220a91e16ae9dd7a37138cf10c60fec43794881a196218a7a9b8bcf69e08867e5ad54defed15f5514d72941f00b038a543d8bfb23b7
7
- data.tar.gz: 0f3d5a35a4c83e19c964375cd0c1dc458bdad69b88d495b07b23595e2f0da506f4eebbc06c9222af37c3c009436543fd34d682cdafec4ba1f908f68cb4b4bbe2
6
+ metadata.gz: b4c1534cb3cbe004cc8bfe510c88f9565adbf4e9e607c42961a49827dbc579ce06b630716eb9804d04076afb0ee79b5269a02b333eb0a096a97b4bbbfa417e4d
7
+ data.tar.gz: faf978fc060d3bf38ff0011bc8ff239ffa9067835ad2cee1fa9f7c09aeb64a181136c7365e70ddb7c5015e9ac24e076cd7473414e6d8fcec60feb5cb12dd1458
@@ -1,11 +1,15 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.0.0
3
+ - 2.0
4
4
  - 2.1
5
+ - 2.2
6
+ - 2.3
7
+ - 2.4.0
5
8
  - ruby-head
6
9
  - jruby-19mode # JRuby in 1.9 mode
7
10
  - rbx-2
8
11
  matrix:
9
12
  allow_failures:
10
13
  - rvm: ruby-head
14
+ - rvm: rbx-2
11
15
  bundler_args: --without local_development
data/Gemfile CHANGED
@@ -4,11 +4,13 @@ source 'https://rubygems.org'
4
4
  gemspec
5
5
 
6
6
  if ENV['TRAVIS']
7
- gem 'roo', '>= 2.0.0beta1', github: 'roo-rb/roo'
7
+ gem 'roo', '>= 2.0.0beta1', git: 'https://github.com/roo-rb/roo.git'
8
8
  else
9
9
  gem 'roo', '>= 2.0.0beta1', path: ::File.expand_path('../../roo', __FILE__)
10
10
  end
11
11
 
12
+ gem 'activesupport', '~> 4.2.0' if RUBY_VERSION < '2.2'
13
+
12
14
  group :test do
13
15
  # additional testing libs
14
16
  gem 'webmock'
data/README.md CHANGED
@@ -1,4 +1,6 @@
1
- # Roo::Xls [![BuildStatus](https://travis-ci.org/roo-rb/roo-xls.svg)](https://travis-ci.org/roo-rb/roo-xls)[![Code Climate](https://codeclimate.com/github/roo-rb/roo-xls/badges/gpa.svg)](https://codeclimate.com/github/roo-rb/roo-xls)[![Coverage Status](https://coveralls.io/repos/roo-rb/roo-xls/badge.svg?branch=master)](https://coveralls.io/r/roo-rb/roo-xls?branch=master)
1
+ # Roo::Xls
2
+
3
+ [![Build Status](https://img.shields.io/travis/roo-rb/roo-xls.svg?style=flat-square)](https://travis-ci.org/roo-rb/roo-xls) [![Code Climate](https://img.shields.io/codeclimate/github/roo-rb/roo-xls.svg?style=flat-square)](https://codeclimate.com/github/roo-rb/roo-xls) [![Coverage Status](https://img.shields.io/coveralls/roo-rb/roo-xls.svg?style=flat-square)](https://coveralls.io/r/roo-rb/roo-xls) [![Gem Version](https://img.shields.io/gem/v/roo-xls.svg?style=flat-square)](https://rubygems.org/gems/roo-xls)
2
4
 
3
5
  This library extends Roo to add support for handling class Excel files, including:
4
6
 
@@ -10,7 +12,7 @@ of a formula but not the formula itself.
10
12
 
11
13
  ## License
12
14
 
13
- While Roo and Roo::Xls are licensed under the MIT / Expat license, please note that the 'spreadsheet' gem [is released under](https://github.com/zdavatz/spreadsheet/blob/master/LICENSE.txt) the GPLv3 license.
15
+ While Roo and Roo::Xls are licensed under the MIT / Expat license, please note that the `spreadsheet` gem [is released under](https://github.com/zdavatz/spreadsheet/blob/master/LICENSE.txt) the GPLv3 license. Please be aware that the author of the `spreadsheet` gem [claims you need a commercial license](http://spreadsheet.ch/2014/10/24/using-ruby-spreadsheet-on-heroku-with-dynos/) to use it as part of a public-facing, closed-source service, an interpretation [at odds with the FSF's intent and interpretation of the license](http://www.gnu.org/licenses/gpl-faq.html#UnreleasedMods).
14
16
 
15
17
  ## Installation
16
18
 
@@ -34,7 +36,7 @@ TODO: Write usage instructions here
34
36
 
35
37
  ## Contributing
36
38
 
37
- 1. Fork it ( https://github.com/[my-github-username]/roo-xls/fork )
39
+ 1. Fork it ( https://github.com/roo-rb/roo-xls/fork )
38
40
  2. Create your feature branch (`git checkout -b my-new-feature`)
39
41
  3. Commit your changes (`git commit -am 'Add some feature'`)
40
42
  4. Push to the branch (`git push origin my-new-feature`)
@@ -1,11 +1,12 @@
1
1
  require 'roo/xls/version'
2
2
  require 'roo/base'
3
3
  require 'spreadsheet'
4
+ require 'tmpdir'
4
5
 
5
6
  module Roo
6
7
  # Class for handling Excel-Spreadsheets
7
8
  class Excel < Roo::Base
8
- FORMULAS_MESSAGE = 'the spreadsheet gem does not support forumulas, so roo can not.'
9
+ FORMULAS_MESSAGE = 'the spreadsheet gem does not support formulas, so roo can not.'
9
10
  CHARGUESS =
10
11
  begin
11
12
  require 'charguess'
@@ -23,18 +24,25 @@ module Roo
23
24
  file_warning = options[:file_warning] || :error
24
25
  mode = options[:mode] || 'rb+'
25
26
 
26
- file_type_check(filename, '.xls', 'an Excel', file_warning, packed)
27
- make_tmpdir do |tmpdir|
28
- filename = download_uri(filename, tmpdir) if uri?(filename)
29
- filename = open_from_stream(filename[7..-1], tmpdir) if filename.is_a?(::String) && filename[0, 7] == 'stream:'
30
- filename = unzip(filename, tmpdir) if packed == :zip
27
+ if is_stream?(filename)
28
+ @workbook = ::Spreadsheet.open(filename, mode)
29
+ else
30
+ file_type_check(filename, '.xls', 'an Excel', file_warning, packed)
31
+ Dir.mktmpdir do |tmpdir|
32
+ filename = download_uri(filename, tmpdir) if uri?(filename)
33
+ if filename.is_a?(::String) && filename[0, 7] == 'stream:'
34
+ filename = open_from_stream(filename[7..-1], tmpdir)
35
+ end
36
+ filename = unzip(filename, tmpdir) if packed == :zip
31
37
 
32
- @filename = filename
33
- unless File.file?(@filename)
34
- fail IOError, "file #{@filename} does not exist"
38
+ @filename = filename
39
+ unless File.file?(@filename)
40
+ raise IOError, "file #{@filename} does not exist"
41
+ end
42
+ @workbook = ::Spreadsheet.open(filename, mode)
35
43
  end
36
- @workbook = ::Spreadsheet.open(filename, mode)
37
44
  end
45
+
38
46
  super(filename, options)
39
47
  @formula = {}
40
48
  @fonts = {}
@@ -57,7 +65,7 @@ module Roo
57
65
 
58
66
  # this method lets you find the worksheet with the most data
59
67
  def longest_sheet
60
- sheet(worksheets.inject do|m, o|
68
+ sheet(worksheets.inject do |m, o|
61
69
  o.row_count > m.row_count ? o : m
62
70
  end.name)
63
71
  end
@@ -67,20 +75,16 @@ module Roo
67
75
  validate_sheet!(sheet)
68
76
 
69
77
  read_cells(sheet)
70
- fail 'should be read' unless @cells_read[sheet]
78
+ raise 'should be read' unless @cells_read[sheet]
71
79
  row, col = normalize(row, col)
72
80
  if celltype(row, col, sheet) == :date
73
81
  yyyy, mm, dd = @cell[sheet][[row, col]].split('-')
74
82
  return Date.new(yyyy.to_i, mm.to_i, dd.to_i)
75
83
  end
76
84
  if celltype(row, col, sheet) == :string
77
- return platform_specific_encoding(@cell[sheet][[row, col]])
85
+ platform_specific_encoding(@cell[sheet][[row, col]])
78
86
  else
79
- if @cell[sheet] && @cell[sheet][[row, col]]
80
- return @cell[sheet][[row, col]]
81
- else
82
- return nil
83
- end
87
+ @cell[sheet] && @cell[sheet][[row, col]]
84
88
  end
85
89
  end
86
90
 
@@ -109,13 +113,13 @@ module Roo
109
113
 
110
114
  # returns NO formula in excel spreadsheets
111
115
  def formula(_row, _col, _sheet = nil)
112
- fail NotImplementedError, FORMULAS_MESSAGE
116
+ raise NotImplementedError, FORMULAS_MESSAGE
113
117
  end
114
118
  alias_method :formula?, :formula
115
119
 
116
120
  # returns NO formulas in excel spreadsheets
117
121
  def formulas(_sheet = nil)
118
- fail NotImplementedError, FORMULAS_MESSAGE
122
+ raise NotImplementedError, FORMULAS_MESSAGE
119
123
  end
120
124
 
121
125
  # Given a cell, return the cell's font
@@ -136,18 +140,18 @@ module Roo
136
140
 
137
141
  # converts name of a sheet to index (0,1,2,..)
138
142
  def sheet_no(name)
139
- return name - 1 if name.is_a?(Fixnum)
143
+ return name - 1 if name.is_a?(Integer)
140
144
  i = 0
141
145
  worksheets.each do |worksheet|
142
146
  return i if name == normalize_string(worksheet.name)
143
147
  i += 1
144
148
  end
145
- fail StandardError, "sheet '#{name}' not found"
149
+ raise StandardError, "sheet '#{name}' not found"
146
150
  end
147
151
 
148
152
  def normalize_string(value)
149
153
  value = every_second_null?(value) ? remove_every_second_null(value) : value
150
- if CHARGUESS && encoding = CharGuess.guess(value)
154
+ if CHARGUESS && (encoding = CharGuess.guess(value))
151
155
  encoding.encode Encoding::UTF_8
152
156
  else
153
157
  platform_specific_encoding(value)
@@ -164,9 +168,7 @@ module Roo
164
168
  else
165
169
  value
166
170
  end
167
- if every_second_null?(result)
168
- result = remove_every_second_null(result)
169
- end
171
+ result = remove_every_second_null(result) if every_second_null?(result)
170
172
  result
171
173
  end
172
174
 
@@ -198,8 +200,8 @@ module Roo
198
200
  @cell_type[sheet] = {} unless @cell_type[sheet]
199
201
  @cell_type[sheet][key] = value_type
200
202
  @formula[sheet] = {} unless @formula[sheet]
201
- @formula[sheet][key] = formula if formula
202
- @cell[sheet] = {} unless @cell[sheet]
203
+ @formula[sheet][key] = formula if formula
204
+ @cell[sheet] = {} unless @cell[sheet]
203
205
  @fonts[sheet] = {} unless @fonts[sheet]
204
206
  @fonts[sheet][key] = font
205
207
 
@@ -250,7 +252,7 @@ module Roo
250
252
  worksheet.each(0) do |row|
251
253
  (0..row.size).each do |cell_index|
252
254
  cell = row.at(cell_index)
253
- next if cell.nil? # skip empty cells
255
+ next if cell.nil? # skip empty cells
254
256
  next if cell.class == ::Spreadsheet::Formula && cell.value.nil? # skip empty formula cells
255
257
  value_type, v =
256
258
  if date_or_time?(row, cell_index)
@@ -299,17 +301,18 @@ module Roo
299
301
  f = cell * 24.0 * 60.0 * 60.0
300
302
  secs = f.round
301
303
  h = (secs / 3600.0).floor
302
- secs = secs - 3600 * h
304
+ secs -= 3600 * h
303
305
  m = (secs / 60.0).floor
304
- secs = secs - 60 * m
306
+ secs -= 60 * m
305
307
  s = secs
306
308
  value = h * 3600 + m * 60 + s
307
309
  else
308
- if row.at(idx).class == ::Spreadsheet::Formula
309
- datetime = row.send(:_datetime, cell)
310
- else
311
- datetime = row.datetime(idx)
312
- end
310
+ datetime =
311
+ if row.at(idx).class == ::Spreadsheet::Formula
312
+ row.send(:_datetime, cell)
313
+ else
314
+ row.datetime(idx)
315
+ end
313
316
  if datetime.hour != 0 ||
314
317
  datetime.min != 0 ||
315
318
  datetime.sec != 0
@@ -317,11 +320,12 @@ module Roo
317
320
  value = datetime
318
321
  else
319
322
  value_type = :date
320
- if row.at(idx).class == ::Spreadsheet::Formula
321
- value = row.send(:_date, cell)
322
- else
323
- value = row.date(idx)
324
- end
323
+ value =
324
+ if row.at(idx).class == ::Spreadsheet::Formula
325
+ row.send(:_date, cell)
326
+ else
327
+ row.date(idx)
328
+ end
325
329
  value = sprintf('%04d-%02d-%02d', value.year, value.month, value.day)
326
330
  end
327
331
  end
@@ -333,7 +337,7 @@ module Roo
333
337
  def read_cell(row, idx)
334
338
  cell = read_cell_content(row, idx)
335
339
  case cell
336
- when Float, Integer, Fixnum, Bignum
340
+ when Float, Integer
337
341
  value_type = :float
338
342
  value = cell.to_f
339
343
  when ::Spreadsheet::Link
@@ -1,6 +1,7 @@
1
1
  require 'date'
2
2
  require 'base64'
3
3
  require 'nokogiri'
4
+ require 'tmpdir'
4
5
 
5
6
  class Roo::Excel2003XML < Roo::Base
6
7
  # initialization and opening of a spreadsheet file
@@ -9,14 +10,14 @@ class Roo::Excel2003XML < Roo::Base
9
10
  packed = options[:packed]
10
11
  file_warning = options[:file_warning] || :error
11
12
 
12
- make_tmpdir do |tmpdir|
13
+ Dir.mktmpdir do |tmpdir|
13
14
  filename = download_uri(filename, tmpdir) if uri?(filename)
14
15
  filename = unzip(filename, tmpdir) if packed == :zip
15
16
 
16
17
  file_type_check(filename, '.xml', 'an Excel 2003 XML', file_warning)
17
18
  @filename = filename
18
19
  unless File.file?(@filename)
19
- fail IOError, "file #{@filename} does not exist"
20
+ raise IOError, "file #{@filename} does not exist"
20
21
  end
21
22
  @doc = ::Roo::Utils.load_xml(@filename)
22
23
  end
@@ -240,7 +241,7 @@ class Roo::Excel2003XML < Roo::Base
240
241
  end
241
242
  end
242
243
  unless sheet_found
243
- fail RangeError, "Unable to find sheet #{sheet} for reading"
244
+ raise RangeError, "Unable to find sheet #{sheet} for reading"
244
245
  end
245
246
  @cells_read[sheet] = true
246
247
  end
@@ -1,5 +1,5 @@
1
1
  module Roo
2
2
  module Xls
3
- VERSION = '1.0.0'
3
+ VERSION = '1.1.0'
4
4
  end
5
5
  end
@@ -19,9 +19,14 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency "roo", ">= 2.0.0beta1", "< 3"
22
- spec.add_dependency "nokogiri"
23
22
  spec.add_dependency "spreadsheet", "> 0.9.0"
24
23
 
24
+ if RUBY_VERSION >= '2.1'
25
+ spec.add_dependency "nokogiri"
26
+ else
27
+ spec.add_dependency "nokogiri", "~> 1.6.0"
28
+ end
29
+
25
30
  spec.add_development_dependency "bundler", ">= 1.7"
26
31
  spec.add_development_dependency "rake", ">= 10.0"
27
32
  end
@@ -1,5 +1,6 @@
1
1
  # -- encoding : utf-8 --
2
2
  require 'test_helper'
3
+ require 'stringio'
3
4
 
4
5
  class TestRooExcel < MiniTest::Test
5
6
  def with_spreadsheet(name)
@@ -1034,7 +1035,7 @@ Sheet 3:
1034
1035
  i += 1
1035
1036
  end
1036
1037
  if letter == '' || number == 0
1037
- fail ArgumentError
1038
+ raise ArgumentError
1038
1039
  end
1039
1040
  [letter, number]
1040
1041
  end
@@ -1090,4 +1091,12 @@ Sheet 3:
1090
1091
  # assert_equal 'ist "e" im Nenner von H(s)', excel.cell('b', 5)
1091
1092
  # end
1092
1093
  # end
1094
+
1095
+ def test_excel_via_stringio
1096
+ io = StringIO.new(
1097
+ File.read(File.join(TESTDIR, 'simple_spreadsheet.xls')))
1098
+ spreadsheet = ::Roo::Spreadsheet.open(io, extension: '.xls')
1099
+ spreadsheet.default_sheet = spreadsheet.sheets.first
1100
+ assert_equal 'Task 1', spreadsheet.cell('f', 4)
1101
+ end
1093
1102
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roo-xls
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Preymesser
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-04-09 00:00:00.000000000 Z
13
+ date: 2017-05-27 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: roo
@@ -33,33 +33,33 @@ dependencies:
33
33
  - !ruby/object:Gem::Version
34
34
  version: '3'
35
35
  - !ruby/object:Gem::Dependency
36
- name: nokogiri
36
+ name: spreadsheet
37
37
  requirement: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - ">="
39
+ - - ">"
40
40
  - !ruby/object:Gem::Version
41
- version: '0'
41
+ version: 0.9.0
42
42
  type: :runtime
43
43
  prerelease: false
44
44
  version_requirements: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - ">="
46
+ - - ">"
47
47
  - !ruby/object:Gem::Version
48
- version: '0'
48
+ version: 0.9.0
49
49
  - !ruby/object:Gem::Dependency
50
- name: spreadsheet
50
+ name: nokogiri
51
51
  requirement: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - ">"
53
+ - - ">="
54
54
  - !ruby/object:Gem::Version
55
- version: 0.9.0
55
+ version: '0'
56
56
  type: :runtime
57
57
  prerelease: false
58
58
  version_requirements: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - ">"
60
+ - - ">="
61
61
  - !ruby/object:Gem::Version
62
- version: 0.9.0
62
+ version: '0'
63
63
  - !ruby/object:Gem::Dependency
64
64
  name: bundler
65
65
  requirement: !ruby/object:Gem::Requirement
@@ -204,7 +204,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
204
204
  version: '0'
205
205
  requirements: []
206
206
  rubyforge_project:
207
- rubygems_version: 2.4.6
207
+ rubygems_version: 2.5.1
208
208
  signing_key:
209
209
  specification_version: 4
210
210
  summary: Roo::Excel can access the contents of classic xls files.