sheets 1.1.1 → 1.2.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 +7 -0
- data/.gitignore +3 -1
- data/.travis.yml +6 -3
- data/README.md +7 -5
- data/Rakefile +3 -47
- data/lib/sheets.rb +7 -1
- data/lib/sheets/parseable.rb +3 -3
- data/lib/sheets/parsers/nokogiri_ods_parser.rb +3 -3
- data/lib/sheets/parsers/nokogiri_xlsx_parser.rb +34 -31
- data/lib/sheets/renderable.rb +4 -4
- data/lib/sheets/version.rb +1 -1
- data/sheets.gemspec +5 -4
- data/test/data/simple_with_booleans.xlsx +0 -0
- data/test/parsers/nokogiri_xlsx_parser_test.rb +19 -4
- data/test/test_helper.rb +4 -1
- metadata +41 -41
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ac9a23b6a8bbce5e11d002260b36023ea91edb3d
|
4
|
+
data.tar.gz: d8009b52e8584a447478cbce27967e8816dc119a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6cbe7db5c44a346c30e62d17d253f1e9e93437bb113faa6cd2b73ddd2f4a6c40235309646b11c7604416ed3e30a1206a1614a5073f9b0e6d88c2802cf3acf965
|
7
|
+
data.tar.gz: dd72683529416168abcf4938a6ff02bbbfa0e119ba10b570412dff0c5be40b4b8a102a88f4b0794b48adf540c52c68ac030bba813035c511ead8d0633f09b1b6
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -3,9 +3,9 @@ Sheets
|
|
3
3
|
|
4
4
|
Sheets is a Facade on top of many spreadsheet formats, presenting them as simple, unified, native ruby arrays. It is intended to allow applications to easily import data from a wide variety of spreadsheet formats.
|
5
5
|
|
6
|
-
With Sheets, all cell values are strings representing the final, evaluated value of the cell.
|
6
|
+
With Sheets, all cell values are strings representing the final, evaluated value of the cell.
|
7
7
|
|
8
|
-
This does mean that, in some cases, you will be casting data back into its native format.
|
8
|
+
This does mean that, in some cases, you will be casting data back into its native format.
|
9
9
|
|
10
10
|
However, this eliminates the need to deal with multiple spreadsheet formats and normalize data types in your application logic.
|
11
11
|
|
@@ -85,12 +85,14 @@ Test Suite Results
|
|
85
85
|
|
86
86
|
Sheets uses Travis-CI for Continuous Integration.
|
87
87
|
|
88
|
-
[](https://travis-ci.org/bspaulding/Sheets)
|
89
|
+
|
90
|
+
[](https://codeclimate.com/github/bspaulding/Sheets)
|
89
91
|
|
90
92
|
License
|
91
93
|
----------
|
92
94
|
|
93
|
-
Sheets is licensed under the [MIT License](http://www.opensource.org/licenses/mit-license.php).
|
95
|
+
Sheets is licensed under the [MIT License](http://www.opensource.org/licenses/mit-license.php).
|
94
96
|
|
95
97
|
Please note that Sheets is dependent upon the Spreadsheet gem, which is licensed under the [GPLv3](http://www.opensource.org/licenses/gpl-3.0.html).
|
96
98
|
|
@@ -101,4 +103,4 @@ Sheets takes advantage of the work done in these gems:
|
|
101
103
|
|
102
104
|
* [spreadsheet](http://rubygems.org/gems/spreadsheet)
|
103
105
|
* [rubyzip](http://rubygems.org/gems/rubyzip)
|
104
|
-
* [nokogiri](http://rubygems.org/gems/nokogiri)
|
106
|
+
* [nokogiri](http://rubygems.org/gems/nokogiri)
|
data/Rakefile
CHANGED
@@ -2,54 +2,10 @@
|
|
2
2
|
require 'bundler'
|
3
3
|
Bundler::GemHelper.install_tasks
|
4
4
|
|
5
|
-
testing_rubies = %w[1.8.7 1.9.2 ree ree-1.8.7-2010.01 jruby rbx]
|
6
|
-
|
7
5
|
task :default => :test
|
6
|
+
task :test do
|
7
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), 'test', 'test_helper.rb')
|
8
|
+
Dir[ File.join(File.expand_path(File.dirname(__FILE__)), 'test', '**', '*_test.rb') ].each {|file| require file }
|
8
9
|
|
9
|
-
namespace :test do
|
10
|
-
task :current do
|
11
|
-
require File.join(File.expand_path(File.dirname(__FILE__)), 'test', 'test_helper.rb')
|
12
|
-
Dir[ File.join(File.expand_path(File.dirname(__FILE__)), 'test', '**', '*_test.rb') ].each {|file| require file }
|
13
|
-
end
|
14
|
-
|
15
|
-
task :all do
|
16
|
-
File.delete('test/results.json') if File.exists?('test/results.json')
|
17
|
-
system "rvm --json #{testing_rubies.join(',')} rake test > test/results.json"
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
task :test => ['test:current']
|
22
|
-
|
23
|
-
namespace :install do
|
24
|
-
def ruby_installed?(ruby)
|
25
|
-
!%x[rvm use #{ruby}].include?('not installed')
|
26
|
-
end
|
27
|
-
|
28
|
-
task :rubies do
|
29
|
-
testing_rubies.each do |ruby|
|
30
|
-
puts ruby
|
31
|
-
puts "----------"
|
32
|
-
|
33
|
-
ruby_installed?(ruby) ? puts('- Installed.') : system("rvm install #{ruby}")
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
task :bundles => :rubies do
|
38
|
-
testing_rubies.each do |ruby|
|
39
|
-
puts ruby
|
40
|
-
puts "----------"
|
41
|
-
|
42
|
-
puts '- Installing bundler...'
|
43
|
-
system "rvm #{ruby} gem install --no-rdoc --no-ri bundler"
|
44
|
-
|
45
|
-
puts '- Installing bundle...'
|
46
|
-
system "rvm #{ruby} exec bundle install"
|
47
|
-
end
|
48
|
-
end
|
49
10
|
end
|
50
11
|
|
51
|
-
namespace :clean do
|
52
|
-
task :rbx do
|
53
|
-
Dir[ File.join(File.expand_path(File.dirname(__FILE__)), '**', '*.rbc') ].each {|file| File.delete(file) }
|
54
|
-
end
|
55
|
-
end
|
data/lib/sheets.rb
CHANGED
@@ -2,6 +2,12 @@ module Sheets
|
|
2
2
|
module Parsers; end
|
3
3
|
module Renderers; end
|
4
4
|
|
5
|
+
class Utilities
|
6
|
+
def self.subclasses_in(klass)
|
7
|
+
klass.constants.collect {|constant_name| klass.const_get(constant_name) }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
5
11
|
class UnsupportedSpreadsheetFormatError < StandardError; end
|
6
12
|
end
|
7
13
|
|
@@ -18,4 +24,4 @@ require File.join lib_path, 'sheets', 'renderers', 'base.rb'
|
|
18
24
|
Dir[ File.join lib_path, 'sheets', 'renderers', '*_renderer.rb' ].each {|file| require file }
|
19
25
|
|
20
26
|
# Load Sheets::Base
|
21
|
-
require File.join lib_path, 'sheets', 'base.rb'
|
27
|
+
require File.join lib_path, 'sheets', 'base.rb'
|
data/lib/sheets/parseable.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
module Sheets
|
2
2
|
module Parseable
|
3
3
|
include Enumerable
|
4
|
-
|
4
|
+
|
5
5
|
def self.included(base)
|
6
6
|
base.extend(ClassMethods)
|
7
7
|
end
|
8
8
|
|
9
9
|
module ClassMethods
|
10
10
|
def parseable_formats
|
11
|
-
Sheets::
|
11
|
+
Sheets::Utilities.subclasses_in(Sheets::Parsers).map(&:formats).flatten.uniq
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -36,4 +36,4 @@ module Sheets
|
|
36
36
|
@parser ||= parser_class.new(@data, @extension, @file_path) unless parser_class.nil?
|
37
37
|
end
|
38
38
|
end
|
39
|
-
end
|
39
|
+
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
require 'nokogiri'
|
2
|
-
require 'zip
|
2
|
+
require 'zip'
|
3
3
|
|
4
4
|
class Sheets::Parsers::NokogiriOdsParser < Sheets::Parsers::Base
|
5
5
|
parses :ods
|
6
6
|
|
7
7
|
def to_array
|
8
|
-
rows.collect do |row|
|
8
|
+
rows.collect do |row|
|
9
9
|
table_cells = []
|
10
10
|
row.xpath('table:table-cell').each do |cell|
|
11
11
|
repeat = cell.attributes["number-columns-repeated"].text.to_i if cell.attributes["number-columns-repeated"]
|
@@ -21,7 +21,7 @@ class Sheets::Parsers::NokogiriOdsParser < Sheets::Parsers::Base
|
|
21
21
|
|
22
22
|
# returns the zipfile object for the document
|
23
23
|
def zipfile
|
24
|
-
@zipfile ||= Zip::
|
24
|
+
@zipfile ||= Zip::File.open( @file_path )
|
25
25
|
end
|
26
26
|
|
27
27
|
def content_doc
|
@@ -1,47 +1,50 @@
|
|
1
1
|
require 'nokogiri'
|
2
|
-
require 'zip
|
2
|
+
require 'zip'
|
3
3
|
|
4
4
|
class Sheets::Parsers::NokogiriXlsxParser < Sheets::Parsers::Base
|
5
5
|
parses :xlsx
|
6
6
|
|
7
7
|
def to_array
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
cell_value
|
33
|
-
end
|
34
|
-
end
|
8
|
+
extract_worksheet(worksheets.first)
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def extract_worksheet(worksheet)
|
14
|
+
worksheet.css('sheetData>row').collect {|row| extract_row(row) }
|
15
|
+
end
|
16
|
+
|
17
|
+
def extract_row(row)
|
18
|
+
row.css('c').collect {|cell| value_for_cell(cell) }
|
19
|
+
end
|
20
|
+
|
21
|
+
def value_for_cell(cell)
|
22
|
+
cell_value = value_for_cell_type(cell.css('v').text, cell_type(cell))
|
23
|
+
|
24
|
+
if cell.attribute('s') && cell.attribute('s').value == "1"
|
25
|
+
cell_value = (base_date + cell_value.to_f).strftime('%Y-%m-%d') # Date conversion
|
26
|
+
end
|
27
|
+
|
28
|
+
if cell_value.match(/\A[0-9]+\.?[0-9]*\Z/)
|
29
|
+
cell_value = cell_value.to_f.to_s
|
35
30
|
end
|
36
31
|
|
37
|
-
|
32
|
+
cell_value
|
38
33
|
end
|
39
34
|
|
40
|
-
|
35
|
+
def cell_type(cell)
|
36
|
+
cell.attribute('t') ? cell.attribute('t').text : nil
|
37
|
+
end
|
38
|
+
|
39
|
+
def value_for_cell_type(cell_value, type)
|
40
|
+
{ 's' => shared_strings[cell_value.to_i],
|
41
|
+
'b' => ((cell_value == "1") ? "TRUE" : "FALSE")
|
42
|
+
}[type] || cell_value
|
43
|
+
end
|
41
44
|
|
42
45
|
# returns the zipfile object for the document
|
43
46
|
def zipfile
|
44
|
-
@zipfile ||= Zip::
|
47
|
+
@zipfile ||= Zip::File.open( @file_path )
|
45
48
|
end
|
46
49
|
|
47
50
|
# returns a nokogiri document for the workbook
|
data/lib/sheets/renderable.rb
CHANGED
@@ -6,14 +6,14 @@ module Sheets
|
|
6
6
|
|
7
7
|
module ClassMethods
|
8
8
|
def renderable_formats
|
9
|
-
Sheets::
|
9
|
+
Sheets::Utilities.subclasses_in(Sheets::Renderers).map(&:formats).flatten.uniq
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
13
|
def method_missing(method_name, *args, &block)
|
14
14
|
match = method_name.to_s.match(/\Ato_(.*)/i)
|
15
15
|
format = match[1] unless match.nil?
|
16
|
-
|
16
|
+
|
17
17
|
format.nil? || !self.class.renderable_formats.include?(format) ? super(method_name, args, block) : renderer(format).send(method_name)
|
18
18
|
end
|
19
19
|
|
@@ -26,11 +26,11 @@ module Sheets
|
|
26
26
|
|
27
27
|
classes.delete(nil)
|
28
28
|
|
29
|
-
classes.first
|
29
|
+
classes.first
|
30
30
|
end
|
31
31
|
|
32
32
|
def renderer(format = @extension)
|
33
33
|
renderer_class(format).new(to_array, format) unless renderer_class(format).nil?
|
34
34
|
end
|
35
35
|
end
|
36
|
-
end
|
36
|
+
end
|
data/lib/sheets/version.rb
CHANGED
data/sheets.gemspec
CHANGED
@@ -14,11 +14,12 @@ Gem::Specification.new do |s|
|
|
14
14
|
|
15
15
|
s.rubyforge_project = "sheets"
|
16
16
|
|
17
|
-
s.add_dependency('spreadsheet', '
|
18
|
-
s.add_dependency('rubyzip', '
|
19
|
-
s.add_dependency('nokogiri', '
|
17
|
+
s.add_dependency('spreadsheet', '~>0.9.7')
|
18
|
+
s.add_dependency('rubyzip', '~>1.1.0')
|
19
|
+
s.add_dependency('nokogiri', '~>1.6.1')
|
20
20
|
|
21
|
-
s.add_development_dependency('rake', '
|
21
|
+
s.add_development_dependency('rake', '~>10.1.1')
|
22
|
+
s.add_development_dependency('simplecov')
|
22
23
|
|
23
24
|
s.files = `git ls-files`.split("\n")
|
24
25
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
Binary file
|
@@ -1,10 +1,25 @@
|
|
1
1
|
class TestNokogiriXlsxParser < Test::Unit::TestCase
|
2
|
-
def
|
2
|
+
def test_does_not_raise_error_when_second_workbook_has_id_of_3
|
3
3
|
file_path = File.expand_path("../../data/reordered_workbooks.xlsx", __FILE__)
|
4
|
-
|
4
|
+
sheet = Sheets::Parsers::NokogiriXlsxParser.new(File.read(file_path), :xlsx, file_path)
|
5
|
+
assert_nothing_raised { sheet.to_array }
|
5
6
|
end
|
6
7
|
|
7
|
-
def
|
8
|
-
|
8
|
+
def test_boolean_cell_type
|
9
|
+
file_path = File.expand_path("../../data/simple_with_booleans.xlsx", __FILE__)
|
10
|
+
sheet = Sheets::Parsers::NokogiriXlsxParser.new(File.read(file_path), :xlsx, file_path)
|
11
|
+
assert_equal sheet.to_array, [
|
12
|
+
["Date", "Impressions", "Clicks", "Actions", "Boolean"],
|
13
|
+
["2011-01-01", "10.0", "10.0", "10.0", "TRUE"],
|
14
|
+
["2011-01-02", "10.0", "10.0", "10.0", "TRUE"],
|
15
|
+
["2011-01-03", "10.0", "10.0", "10.0", "FALSE"],
|
16
|
+
["2011-01-04", "10.0", "10.0", "10.0", "FALSE"],
|
17
|
+
["2011-01-05", "10.0", "10.0", "10.0", "TRUE"],
|
18
|
+
["2011-01-06", "10.0", "10.0", "10.0", "TRUE"],
|
19
|
+
["2011-01-07", "10.0", "10.0", "10.0", "FALSE"],
|
20
|
+
["2011-01-08", "10.0", "10.0", "10.0", "FALSE"],
|
21
|
+
["2011-01-09", "10.0", "10.0", "10.0", "TRUE"],
|
22
|
+
["2011-01-10", "10.0", "10.0", "10.0", "TRUE"]
|
23
|
+
]
|
9
24
|
end
|
10
25
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.start
|
3
|
+
|
1
4
|
require 'test/unit'
|
2
5
|
|
3
6
|
puts 'Loading Test Generators'
|
4
7
|
Dir[ File.join(File.expand_path(File.dirname(__FILE__)), 'generators', '*.rb') ].each {|file| puts "- #{file}"; require file }
|
5
8
|
|
6
|
-
require File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib', 'sheets.rb')
|
9
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib', 'sheets.rb')
|
metadata
CHANGED
@@ -1,80 +1,85 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sheets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.2.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Bradley J. Spaulding
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-02-13 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: spreadsheet
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - "~>"
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0.
|
19
|
+
version: 0.9.7
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - "~>"
|
28
25
|
- !ruby/object:Gem::Version
|
29
|
-
version: 0.
|
26
|
+
version: 0.9.7
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rubyzip
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - "~>"
|
36
32
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
33
|
+
version: 1.1.0
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - "~>"
|
44
39
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
40
|
+
version: 1.1.0
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: nokogiri
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - "~>"
|
52
46
|
- !ruby/object:Gem::Version
|
53
|
-
version: 1.
|
47
|
+
version: 1.6.1
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - "~>"
|
60
53
|
- !ruby/object:Gem::Version
|
61
|
-
version: 1.
|
54
|
+
version: 1.6.1
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: rake
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - "~>"
|
68
60
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
61
|
+
version: 10.1.1
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - "~>"
|
76
67
|
- !ruby/object:Gem::Version
|
77
|
-
version:
|
68
|
+
version: 10.1.1
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: simplecov
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
78
83
|
description: Work with spreadsheets easily in a native ruby format.
|
79
84
|
email:
|
80
85
|
- brad.spaulding@gmail.com
|
@@ -82,8 +87,8 @@ executables: []
|
|
82
87
|
extensions: []
|
83
88
|
extra_rdoc_files: []
|
84
89
|
files:
|
85
|
-
- .gitignore
|
86
|
-
- .travis.yml
|
90
|
+
- ".gitignore"
|
91
|
+
- ".travis.yml"
|
87
92
|
- Gemfile
|
88
93
|
- LICENSE.txt
|
89
94
|
- README.md
|
@@ -109,6 +114,7 @@ files:
|
|
109
114
|
- test/data/simple.ods
|
110
115
|
- test/data/simple.xls
|
111
116
|
- test/data/simple.xlsx
|
117
|
+
- test/data/simple_with_booleans.xlsx
|
112
118
|
- test/generators/test_classes.rb
|
113
119
|
- test/parseable_test.rb
|
114
120
|
- test/parsers/basic_parsers_test.rb
|
@@ -122,33 +128,26 @@ files:
|
|
122
128
|
- test/test_helper.rb
|
123
129
|
homepage: https://github.com/bspaulding/Sheets
|
124
130
|
licenses: []
|
131
|
+
metadata: {}
|
125
132
|
post_install_message:
|
126
133
|
rdoc_options: []
|
127
134
|
require_paths:
|
128
135
|
- lib
|
129
136
|
required_ruby_version: !ruby/object:Gem::Requirement
|
130
|
-
none: false
|
131
137
|
requirements:
|
132
|
-
- -
|
138
|
+
- - ">="
|
133
139
|
- !ruby/object:Gem::Version
|
134
140
|
version: '0'
|
135
|
-
segments:
|
136
|
-
- 0
|
137
|
-
hash: -333247326234641115
|
138
141
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
139
|
-
none: false
|
140
142
|
requirements:
|
141
|
-
- -
|
143
|
+
- - ">="
|
142
144
|
- !ruby/object:Gem::Version
|
143
145
|
version: '0'
|
144
|
-
segments:
|
145
|
-
- 0
|
146
|
-
hash: -333247326234641115
|
147
146
|
requirements: []
|
148
147
|
rubyforge_project: sheets
|
149
|
-
rubygems_version:
|
148
|
+
rubygems_version: 2.2.0
|
150
149
|
signing_key:
|
151
|
-
specification_version:
|
150
|
+
specification_version: 4
|
152
151
|
summary: Sheets provides a Facade for importing spreadsheets that gives the application
|
153
152
|
control. Any Spreadsheet can be represented as either (1) a two dimensional array,
|
154
153
|
or (2) an array of hashes. Sheets' goal is to convert any spreadsheet format to
|
@@ -161,6 +160,7 @@ test_files:
|
|
161
160
|
- test/data/simple.ods
|
162
161
|
- test/data/simple.xls
|
163
162
|
- test/data/simple.xlsx
|
163
|
+
- test/data/simple_with_booleans.xlsx
|
164
164
|
- test/generators/test_classes.rb
|
165
165
|
- test/parseable_test.rb
|
166
166
|
- test/parsers/basic_parsers_test.rb
|