sheets 1.1.1 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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