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.
@@ -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
@@ -6,4 +6,6 @@ Gemfile.lock
6
6
  pkg/*
7
7
  doc/*
8
8
  log/*
9
- *.rbc
9
+ *.rbc
10
+ .ruby-version
11
+ coverage
@@ -1,7 +1,10 @@
1
1
  rvm:
2
- - 1.8.7
3
2
  - 1.9.2
4
3
  - 1.9.3
5
- - ree
4
+ - 2.0.0
5
+ - 2.1.0
6
6
  - rbx
7
- - jruby
7
+ - jruby
8
+ notifications:
9
+ email:
10
+ - brad.spaulding@gmail.com
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
- [![Build Status](http://travis-ci.org/bspaulding/Sheets.png)](http://travis-ci.org/bspaulding/Sheets)
88
+ [![Build Status](https://travis-ci.org/bspaulding/Sheets.png?branch=master)](https://travis-ci.org/bspaulding/Sheets)
89
+
90
+ [![Code Climate](https://codeclimate.com/github/bspaulding/Sheets.png)](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
@@ -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'
@@ -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::Parsers.constants.collect {|constant_name| Sheets::Parsers.const_get(constant_name) }.map(&:formats).flatten.uniq
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/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::ZipFile.open( @file_path )
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/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
- # Create Matrices
9
- matrices = worksheets.collect do |worksheet|
10
- worksheet.css('sheetData>row').collect do |row|
11
- row.css('c').collect do |cell|
12
- cell_value = cell.css('v').text
13
-
14
- if cell.attribute('t')
15
- celltype = cell.attribute('t').value
16
- if celltype == 's'
17
- # Load Shared String Value
18
- cell_value = shared_strings[cell_value.to_i]
19
- elsif celltype == 'b'
20
- cell_value = (cell_value == "1") ? "TRUE" : "FALSE"
21
- end
22
- end
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
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
- matrices.first
32
+ cell_value
38
33
  end
39
34
 
40
- private
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::ZipFile.open( @file_path )
47
+ @zipfile ||= Zip::File.open( @file_path )
45
48
  end
46
49
 
47
50
  # returns a nokogiri document for the workbook
@@ -6,14 +6,14 @@ module Sheets
6
6
 
7
7
  module ClassMethods
8
8
  def renderable_formats
9
- Sheets::Renderers.constants.collect {|constant_name| Sheets::Renderers.const_get(constant_name) }.map(&:formats).flatten.uniq
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
@@ -1,3 +1,3 @@
1
1
  module Sheets
2
- VERSION = "1.1.1"
2
+ VERSION = "1.2.0"
3
3
  end
@@ -14,11 +14,12 @@ Gem::Specification.new do |s|
14
14
 
15
15
  s.rubyforge_project = "sheets"
16
16
 
17
- s.add_dependency('spreadsheet', '>= 0.6.5.2')
18
- s.add_dependency('rubyzip', '>= 0.9.4')
19
- s.add_dependency('nokogiri', '>= 1.4.3.1')
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', '0.9.2')
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")
@@ -1,10 +1,25 @@
1
1
  class TestNokogiriXlsxParser < Test::Unit::TestCase
2
- def setup
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
- @sheet = Sheets::Parsers::NokogiriXlsxParser.new(File.read(file_path), :xlsx, file_path)
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 test_does_not_raise_error_when_second_workbook_has_id_of_3
8
- assert_nothing_raised { @sheet.to_array }
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
@@ -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.1.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: 2012-10-03 00:00:00.000000000 Z
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.6.5.2
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.6.5.2
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: 0.9.4
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: 0.9.4
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.4.3.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.4.3.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: 0.9.2
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: 0.9.2
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: 1.8.24
148
+ rubygems_version: 2.2.0
150
149
  signing_key:
151
- specification_version: 3
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