sheets 0.9.1 → 1.0.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.
@@ -1,4 +1,5 @@
1
1
  require 'roo'
2
+ require File.join( File.expand_path(File.dirname(__FILE__)), 'roo_patches.rb' )
2
3
 
3
4
  class Sheets::Parsers::RooParser < Sheets::Parsers::Base
4
5
  parses :xls, :xlsx, :ods
@@ -0,0 +1,5 @@
1
+ puts "Loading Roo Patches"
2
+ Dir[ File.join( File.expand_path(File.dirname(__FILE__)), 'roo_patches', '*.rb' ) ].each do |file|
3
+ puts "- #{File.basename(file)}"
4
+ require file
5
+ end
@@ -0,0 +1,116 @@
1
+ # RubyForge Patch: 28885 - Fixes to Honor XLSX Base Date Format
2
+ # NOTE: This fix is *highly* brittle. If roo updates, this may break roo.
3
+
4
+ class Excelx
5
+
6
+ def initialize(filename, packed=nil, file_warning = :error) #, create = false)
7
+ super()
8
+ @file_warning = file_warning
9
+ @tmpdir = "oo_"+$$.to_s
10
+ @tmpdir = File.join(ENV['ROO_TMP'], @tmpdir) if ENV['ROO_TMP']
11
+ unless File.exists?(@tmpdir)
12
+ FileUtils::mkdir(@tmpdir)
13
+ end
14
+ filename = open_from_uri(filename) if filename[0,7] == "http://"
15
+ filename = unzip(filename) if packed and packed == :zip
16
+ begin
17
+ file_type_check(filename,'.xlsx','an Excel-xlsx')
18
+ @cells_read = Hash.new
19
+ @filename = filename
20
+ unless File.file?(@filename)
21
+ raise IOError, "file #{@filename} does not exist"
22
+ end
23
+ @@nr += 1
24
+ @file_nr = @@nr
25
+ extract_content(@filename)
26
+ file = File.new(File.join(@tmpdir, @file_nr.to_s+"_roo_workbook.xml"))
27
+ # TODO: @workbook_doc = XML::Parser.io(file).parse
28
+ @workbook_doc = Nokogiri::XML(file)
29
+
30
+ # Set the base date, could be 1900 or 1904 depending on the system of origin.
31
+ date_base_element = @workbook_doc.search('workbookPr').attribute('date1904')
32
+ if date_base_element && date_base_element.value.to_i == 1
33
+ @base_date = Date.parse('1904-01-01')
34
+ else
35
+ @base_date = Date.parse('1900-01-01')
36
+ end
37
+ @base_datetime = DateTime.parse( @base_date.strftime("%Y-%m-%d") )
38
+
39
+ file.close
40
+ @shared_table = []
41
+ if File.exist?(File.join(@tmpdir, @file_nr.to_s+'_roo_sharedStrings.xml'))
42
+ file = File.new(File.join(@tmpdir, @file_nr.to_s+'_roo_sharedStrings.xml'))
43
+ #TODO: @sharedstring_doc = XML::Parser.io(file).parse
44
+ @sharedstring_doc = Nokogiri::XML(file)
45
+ file.close
46
+ read_shared_strings(@sharedstring_doc)
47
+ end
48
+ @styles_table = []
49
+ @style_definitions = Array.new # TODO: ??? { |h,k| h[k] = {} }
50
+ if File.exist?(File.join(@tmpdir, @file_nr.to_s+'_roo_styles.xml'))
51
+ file = File.new(File.join(@tmpdir, @file_nr.to_s+'_roo_styles.xml'))
52
+ #TODO: @styles_doc = XML::Parser.io(file).parse
53
+ @styles_doc = Nokogiri::XML(file)
54
+ file.close
55
+ read_styles(@styles_doc)
56
+ end
57
+ @sheet_doc = []
58
+ @sheet_files.each_with_index do |item, i|
59
+ file = File.new(item)
60
+ #TODO: @sheet_doc[i] = XML::Parser.io(file).parse
61
+ @sheet_doc[i] = Nokogiri::XML(file)
62
+ file.close
63
+ end
64
+ ensure
65
+ #if ENV["roo_local"] != "thomas-p"
66
+ FileUtils::rm_r(@tmpdir)
67
+ #end
68
+ end
69
+ @default_sheet = self.sheets.first
70
+ @cell = Hash.new
71
+ @cell_type = Hash.new
72
+ @formula = Hash.new
73
+ @first_row = Hash.new
74
+ @last_row = Hash.new
75
+ @first_column = Hash.new
76
+ @last_column = Hash.new
77
+ @header_line = 1
78
+ @excelx_type = Hash.new
79
+ @excelx_value = Hash.new
80
+ @s_attribute = Hash.new # TODO: ggf. wieder entfernen nur lokal benoetigt
81
+ end
82
+
83
+ def set_cell_values(sheet,x,y,i,v,vt,formula,tr,str_v,
84
+ excelx_type=nil,
85
+ excelx_value=nil,
86
+ s_attribute=nil)
87
+ key = [y,x+i]
88
+ @cell_type[sheet] = {} unless @cell_type[sheet]
89
+ @cell_type[sheet][key] = vt
90
+ @formula[sheet] = {} unless @formula[sheet]
91
+ @formula[sheet][key] = formula if formula
92
+ @cell[sheet] = {} unless @cell[sheet]
93
+ case @cell_type[sheet][key]
94
+ when :float
95
+ @cell[sheet][key] = v.to_f
96
+ when :string
97
+ @cell[sheet][key] = str_v
98
+ when :date
99
+ @cell[sheet][key] = (@base_date+v.to_i).strftime("%Y-%m-%d")
100
+ when :datetime
101
+ @cell[sheet][key] = (@base_datetime+v.to_f).strftime("%Y-%m-%d %H:%M:%S")
102
+ when :percentage
103
+ @cell[sheet][key] = v.to_f
104
+ when :time
105
+ @cell[sheet][key] = v.to_f*(24*60*60)
106
+ else
107
+ @cell[sheet][key] = v
108
+ end
109
+ @excelx_type[sheet] = {} unless @excelx_type[sheet]
110
+ @excelx_type[sheet][key] = excelx_type
111
+ @excelx_value[sheet] = {} unless @excelx_value[sheet]
112
+ @excelx_value[sheet][key] = excelx_value
113
+ @s_attribute[sheet] = {} unless @s_attribute[sheet]
114
+ @s_attribute[sheet][key] = s_attribute
115
+ end
116
+ end
@@ -0,0 +1,2 @@
1
+ # RubyForge Patch: 29045 - Fixes missing date format "January 10, 2011"
2
+ Excelx::FORMATS["mmm\\ d\\,\\ yyyy"] = :date
@@ -1,3 +1,3 @@
1
1
  module Sheets
2
- VERSION = "0.9.1"
2
+ VERSION = "1.0.0"
3
3
  end
data/sheets.gemspec CHANGED
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
15
15
  s.rubyforge_project = "sheets"
16
16
 
17
17
  s.add_dependency('spreadsheet', '>= 0.6.5.2')
18
- s.add_dependency('roo', '>= 1.9.3')
18
+ s.add_dependency('roo', '= 1.9.3')
19
19
  # These are the dependencies roo forgot:
20
20
  s.add_dependency('builder', '>= 3.0.0')
21
21
  s.add_dependency('rubyzip', '>= 0.9.4')
Binary file
@@ -0,0 +1,8 @@
1
+ class TestRooParser < Test::Unit::TestCase
2
+
3
+ def test_roo_date_format_issue
4
+ sheet = Sheets::Base.new( 'test/data/roo_issue_28885_test.xlsx' )
5
+
6
+ assert_equal "2011-01-10", sheet.to_array[1][0]
7
+ end
8
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sheets
3
3
  version: !ruby/object:Gem::Version
4
- hash: 57
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
- - 0
8
- - 9
9
7
  - 1
10
- version: 0.9.1
8
+ - 0
9
+ - 0
10
+ version: 1.0.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Bradley J. Spaulding
@@ -41,7 +41,7 @@ dependencies:
41
41
  requirement: &id002 !ruby/object:Gem::Requirement
42
42
  none: false
43
43
  requirements:
44
- - - ">="
44
+ - - "="
45
45
  - !ruby/object:Gem::Version
46
46
  hash: 53
47
47
  segments:
@@ -137,6 +137,9 @@ files:
137
137
  - lib/sheets/parsers/base.rb
138
138
  - lib/sheets/parsers/csv_parser.rb
139
139
  - lib/sheets/parsers/roo_parser.rb
140
+ - lib/sheets/parsers/roo_patches.rb
141
+ - lib/sheets/parsers/roo_patches/roo_patch_28885.rb
142
+ - lib/sheets/parsers/roo_patches/roo_patch_29045.rb
140
143
  - lib/sheets/renderable.rb
141
144
  - lib/sheets/renderers/base.rb
142
145
  - lib/sheets/renderers/csv_renderer.rb
@@ -144,6 +147,7 @@ files:
144
147
  - lib/sheets/version.rb
145
148
  - sheets.gemspec
146
149
  - test/base_test.rb
150
+ - test/data/roo_issue_28885_test.xlsx
147
151
  - test/data/simple.csv
148
152
  - test/data/simple.ods
149
153
  - test/data/simple.xls
@@ -152,6 +156,7 @@ files:
152
156
  - test/parseable_test.rb
153
157
  - test/parsers/basic_parsers_test.rb
154
158
  - test/parsers/csv_parser_test.rb
159
+ - test/parsers/roo_parser_test.rb
155
160
  - test/renderable_test.rb
156
161
  - test/renderers/basic_renderers_test.rb
157
162
  - test/renderers/csv_renderer_test.rb
@@ -193,6 +198,7 @@ specification_version: 3
193
198
  summary: Sheets provides a Facade for importing spreadsheets that gives the application control. Any Spreadsheet can be represented as either (1) a two dimensional array, or (2) an array of hashes. Sheets' goal is to convert any spreadsheet format to one of these native Ruby data structures.
194
199
  test_files:
195
200
  - test/base_test.rb
201
+ - test/data/roo_issue_28885_test.xlsx
196
202
  - test/data/simple.csv
197
203
  - test/data/simple.ods
198
204
  - test/data/simple.xls
@@ -201,6 +207,7 @@ test_files:
201
207
  - test/parseable_test.rb
202
208
  - test/parsers/basic_parsers_test.rb
203
209
  - test/parsers/csv_parser_test.rb
210
+ - test/parsers/roo_parser_test.rb
204
211
  - test/renderable_test.rb
205
212
  - test/renderers/basic_renderers_test.rb
206
213
  - test/renderers/csv_renderer_test.rb