sheets 0.9.1 → 1.0.0

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