roo 1.12.2 → 1.13.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: c041c89a52bab18a4a8c0f3ca606323c2a74dcf4
4
+ data.tar.gz: 73837bdf2ff5a36f18f70c0353f2535ca128c511
5
+ SHA512:
6
+ metadata.gz: 802f2af75523ef329aeaeca290702eba0d0a87f866e07db3ad75efcf1191f252e9f1a9856eb5580d93446e64b95f05143132fbace981e4b2e522af96df916547
7
+ data.tar.gz: 9d28e8f7980756a1a9f8f9f7a5c3c47af33aaf53f3bf0fda6ebacf951d19cccb0e79467619f458436b0e1d322b04ec93138d0eddceace90987c344a67a49dc52
data/CHANGELOG CHANGED
@@ -1,7 +1,21 @@
1
+ == 1.13.0 2013-12-05
2
+
3
+ * enhancements
4
+ * Support extracting link data from Excel and Excelx spreadsheets,
5
+ via Excel#read_cell(_content) and Excelx#hyperlink(?). #47
6
+ * Support setting the Excel Spreadsheet mode via the :mode option. #88
7
+ * Support Spreadsheet.open with a declared :extension that includes a leading '.'. #73
8
+ * Enable file type detection for URI's with parameters / anchors. #51
9
+
10
+ * bugfixes
11
+ * Fix that CSV#each_row could overwrite the filename when run against a uri. #77
12
+ * Fix that #to_matrix wasn't respecting the sheet argument. #87
13
+
1
14
  == 1.12.2 2013-09-11
2
15
 
3
16
  * 1 enhancement
4
17
  * Support rubyzip >= 1.0.0. #65
18
+ * Fix typo in deprecation notices. #63
5
19
 
6
20
  == 1.12.1 2013-08-18
7
21
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.12.2
1
+ 1.13.0
@@ -208,7 +208,7 @@ class Roo::Base
208
208
 
209
209
  Matrix.rows((from_row||first_row(sheet)).upto(to_row||last_row(sheet)).map do |row|
210
210
  (from_column||first_column(sheet)).upto(to_column||last_column(sheet)).map do |col|
211
- cell(row,col)
211
+ cell(row,col,sheet)
212
212
  end
213
213
  end)
214
214
  end
@@ -60,8 +60,8 @@ class Roo::CSV < Roo::Base
60
60
  def each_row(options, &block)
61
61
  if uri?(filename)
62
62
  make_tmpdir do |tmpdir|
63
- filename = download_uri(filename, tmpdir)
64
- CSV.foreach(filename, options, &block)
63
+ tmp_filename = download_uri(filename, tmpdir)
64
+ CSV.foreach(tmp_filename, options, &block)
65
65
  end
66
66
  else
67
67
  CSV.foreach(filename, options, &block)
@@ -19,9 +19,11 @@ class Roo::Excel < Roo::Base
19
19
  if Hash === options
20
20
  packed = options[:packed]
21
21
  file_warning = options[:file_warning] || :error
22
+ mode = options[:mode] || "rb+"
22
23
  else
23
- warn 'Supplying `packed` or `file_warning` as separate arguments to `Roo::Excel.new` is deprected. Use an options hash instead.'
24
+ warn 'Supplying `packed` or `file_warning` as separate arguments to `Roo::Excel.new` is deprecated. Use an options hash instead.'
24
25
  packed = options
26
+ mode = "rb+"
25
27
  file_warning = deprecated_file_warning
26
28
  end
27
29
 
@@ -35,7 +37,7 @@ class Roo::Excel < Roo::Base
35
37
  unless File.file?(@filename)
36
38
  raise IOError, "file #{@filename} does not exist"
37
39
  end
38
- @workbook = Spreadsheet.open(filename)
40
+ @workbook = Spreadsheet.open(filename, mode)
39
41
  end
40
42
  super(filename, options)
41
43
  @formula = Hash.new
@@ -274,6 +276,7 @@ class Roo::Excel < Roo::Base
274
276
  # way formula stores the value
275
277
  def read_cell_content(row, idx)
276
278
  cell = row.at(idx)
279
+ cell = row[idx] if row[idx].class == Spreadsheet::Link
277
280
  cell = cell.value if cell.class == Spreadsheet::Formula
278
281
  cell
279
282
  end
@@ -336,6 +339,9 @@ class Roo::Excel < Roo::Base
336
339
  when Float, Integer, Fixnum, Bignum
337
340
  value_type = :float
338
341
  value = cell.to_f
342
+ when Spreadsheet::Link
343
+ value_type = :link
344
+ value = cell
339
345
  when String, TrueClass, FalseClass
340
346
  value_type = :string
341
347
  value = cell.to_s
@@ -11,7 +11,7 @@ class Roo::Excel2003XML < Roo::Base
11
11
  packed = options[:packed]
12
12
  file_warning = options[:file_warning] || :error
13
13
  else
14
- warn 'Supplying `packed` or `file_warning` as separate arguments to `Roo::Excel2003XML.new` is deprected. Use an options hash instead.'
14
+ warn 'Supplying `packed` or `file_warning` as separate arguments to `Roo::Excel2003XML.new` is deprecated. Use an options hash instead.'
15
15
  packed = options
16
16
  file_warning = deprecated_file_warning
17
17
  end
@@ -1,5 +1,6 @@
1
1
  require 'date'
2
2
  require 'nokogiri'
3
+ require 'spreadsheet'
3
4
 
4
5
  class Roo::Excelx < Roo::Base
5
6
  module Format
@@ -70,7 +71,7 @@ class Roo::Excelx < Roo::Base
70
71
  packed = options[:packed]
71
72
  file_warning = options[:file_warning] || :error
72
73
  else
73
- warn 'Supplying `packed` or `file_warning` as separate arguments to `Roo::Excelx.new` is deprected. Use an options hash instead.'
74
+ warn 'Supplying `packed` or `file_warning` as separate arguments to `Roo::Excelx.new` is deprecated. Use an options hash instead.'
74
75
  packed = options
75
76
  file_warning = deprecated_file_warning
76
77
  end
@@ -84,6 +85,7 @@ class Roo::Excelx < Roo::Base
84
85
  raise IOError, "file #{@filename} does not exist"
85
86
  end
86
87
  @comments_files = Array.new
88
+ @rels_files = Array.new
87
89
  extract_content(tmpdir, @filename)
88
90
  @workbook_doc = load_xml(File.join(tmpdir, "roo_workbook.xml"))
89
91
  @shared_table = []
@@ -103,6 +105,9 @@ class Roo::Excelx < Roo::Base
103
105
  @comments_doc = @comments_files.compact.map do |item|
104
106
  load_xml(item)
105
107
  end
108
+ @rels_doc = @rels_files.map do |item|
109
+ load_xml(item)
110
+ end
106
111
  end
107
112
  super(filename, options)
108
113
  @formula = Hash.new
@@ -111,6 +116,8 @@ class Roo::Excelx < Roo::Base
111
116
  @s_attribute = Hash.new # TODO: ggf. wieder entfernen nur lokal benoetigt
112
117
  @comment = Hash.new
113
118
  @comments_read = Hash.new
119
+ @hyperlink = Hash.new
120
+ @hyperlinks_read = Hash.new
114
121
  end
115
122
 
116
123
  def method_missing(m,*args)
@@ -290,6 +297,20 @@ class Roo::Excelx < Roo::Base
290
297
  end
291
298
  end
292
299
 
300
+ def hyperlink?(row,col,sheet=nil)
301
+ hyperlink(row, col, sheet) != nil
302
+ end
303
+
304
+ # returns the hyperlink at (row/col)
305
+ # nil if there is no hyperlink
306
+ def hyperlink(row,col,sheet=nil)
307
+ sheet ||= @default_sheet
308
+ read_hyperlinks(sheet) unless @hyperlinks_read[sheet]
309
+ row,col = normalize(row,col)
310
+ return nil unless @hyperlink[sheet]
311
+ @hyperlink[sheet][[row,col]]
312
+ end
313
+
293
314
  # returns the comment at (row/col)
294
315
  # nil if there is no comment
295
316
  def comment(row,col,sheet=nil)
@@ -354,6 +375,8 @@ class Roo::Excelx < Roo::Base
354
375
  else
355
376
  v
356
377
  end
378
+
379
+ @cell[sheet][key] = Spreadsheet::Link.new(@hyperlink[sheet][key], @cell[sheet][key]) if hyperlink?(y,x+i)
357
380
  @excelx_type[sheet] ||= {}
358
381
  @excelx_type[sheet][key] = excelx_type
359
382
  @excelx_value[sheet] ||= {}
@@ -509,6 +532,26 @@ Datei xl/comments1.xml
509
532
  @comments_read[sheet] = true
510
533
  end
511
534
 
535
+ # Reads all hyperlinks from a sheet
536
+ def read_hyperlinks(sheet=nil)
537
+ sheet ||= @default_sheet
538
+ validate_sheet!(sheet)
539
+ n = self.sheets.index(sheet)
540
+ if rels_doc = @rels_doc[n]
541
+ rels = Hash[rels_doc.xpath("/xmlns:Relationships/xmlns:Relationship").map do |r|
542
+ [r.attribute('Id').text, r]
543
+ end]
544
+ @sheet_doc[n].xpath("/xmlns:worksheet/xmlns:hyperlinks/xmlns:hyperlink").each do |h|
545
+ if rel_element = rels[h.attribute('id').text]
546
+ row,col = Roo::Base.split_coordinate(h.attributes['ref'].to_s)
547
+ @hyperlink[sheet] ||= {}
548
+ @hyperlink[sheet][[row,col]] = rel_element.attribute('Target').text
549
+ end
550
+ end
551
+ end
552
+ @hyperlinks_read[sheet] = true
553
+ end
554
+
512
555
  def read_labels
513
556
  @label ||= Hash[@workbook_doc.xpath("//xmlns:definedName").map do |defined_name|
514
557
  # "Sheet1!$C$5"
@@ -523,43 +566,36 @@ Datei xl/comments1.xml
523
566
  @sheet_files = []
524
567
  Roo::ZipFile.open(zipfilename) {|zf|
525
568
  zf.entries.each {|entry|
526
- if entry.to_s.end_with?('workbook.xml')
527
- open(tmpdir+'/'+'roo_workbook.xml','wb') {|f|
528
- f << zip.read(entry)
529
- }
530
- end
531
- # if entry.to_s.end_with?('sharedStrings.xml')
532
- # at least one application creates this file with another (incorrect?)
533
- # casing. It doesn't hurt, if we ignore here the correct casing - there
534
- # won't be both names in the archive.
535
- # Changed the casing of all the following filenames.
536
- if entry.to_s.downcase.end_with?('sharedstrings.xml')
537
- open(tmpdir+'/'+'roo_sharedStrings.xml','wb') {|f|
538
- f << zip.read(entry)
539
- }
540
- end
541
- if entry.to_s.downcase.end_with?('styles.xml')
542
- open(tmpdir+'/'+'roo_styles.xml','wb') {|f|
543
- f << zip.read(entry)
544
- }
545
- end
546
- if entry.to_s.downcase =~ /sheet([0-9]+).xml$/
547
- nr = $1
548
- open(tmpdir+'/'+"roo_sheet#{nr}",'wb') {|f|
549
- f << zip.read(entry)
550
- }
551
- @sheet_files[nr.to_i-1] = tmpdir+'/'+"roo_sheet#{nr}"
552
- end
553
- if entry.to_s.downcase =~ /comments([0-9]+).xml$/
554
- nr = $1
555
- open(tmpdir+'/'+"roo_comments#{nr}",'wb') {|f|
556
- f << zip.read(entry)
557
- }
558
- @comments_files[nr.to_i-1] = tmpdir+'/'+"roo_comments#{nr}"
569
+ entry_name = entry.to_s.downcase
570
+
571
+ path =
572
+ if entry_name.end_with?('workbook.xml')
573
+ "#{tmpdir}/roo_workbook.xml"
574
+ elsif entry_name.end_with?('sharedstrings.xml')
575
+ "#{tmpdir}/roo_sharedStrings.xml"
576
+ elsif entry_name.end_with?('styles.xml')
577
+ "#{tmpdir}/roo_styles.xml"
578
+ elsif entry_name =~ /sheet([0-9]+).xml$/
579
+ nr = $1
580
+ @sheet_files[nr.to_i-1] = "#{tmpdir}/roo_sheet#{nr}"
581
+ elsif entry_name =~ /comments([0-9]+).xml$/
582
+ nr = $1
583
+ @comments_files[nr.to_i-1] = "#{tmpdir}/roo_comments#{nr}"
584
+ elsif entry_name =~ /sheet([0-9]+).xml.rels$/
585
+ nr = $1
586
+ @rels_files[nr.to_i-1] = "#{tmpdir}/roo_rels#{nr}"
587
+ end
588
+ if path
589
+ extract_file(zip, entry, path)
559
590
  end
560
591
  }
561
592
  }
562
- # return
593
+ end
594
+
595
+ def extract_file(source_zip, entry, destination_path)
596
+ open(destination_path,'wb') {|f|
597
+ f << source_zip.read(entry)
598
+ }
563
599
  end
564
600
 
565
601
  # extract files from the zip file
@@ -36,7 +36,7 @@ class Roo::OpenOffice < Roo::Base
36
36
  file_warning = options[:file_warning] || :error
37
37
  tmpdir_root = options[:tmpdir_root]
38
38
  else
39
- warn 'Supplying `packed`, `file_warning`, or `tmpdir_root` as separate arguments to `Roo::OpenOffice.new` is deprected. Use an options hash instead.'
39
+ warn 'Supplying `packed`, `file_warning`, or `tmpdir_root` as separate arguments to `Roo::OpenOffice.new` is deprecated. Use an options hash instead.'
40
40
  packed = options
41
41
  file_warning = deprecated_file_warning
42
42
  tmpdir_root = deprecated_tmpdir_root
@@ -7,9 +7,9 @@ module Roo
7
7
  extension =
8
8
  if options[:extension]
9
9
  options[:file_warning] = :ignore
10
- ".#{options[:extension]}"
10
+ ".#{options[:extension]}".gsub(/[.]+/, ".")
11
11
  else
12
- File.extname(file)
12
+ File.extname(URI.parse(file).path)
13
13
  end
14
14
 
15
15
  case extension.downcase
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "roo"
8
- s.version = "1.12.1"
8
+ s.version = "1.13.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Thomas Preymesser", "Hugh McGowan", "Ben Woosley"]
12
- s.date = "2013-09-11"
12
+ s.date = "2013-12-05"
13
13
  s.description = "Roo can access the contents of various spreadsheet files. It can handle\n* OpenOffice\n* Excel\n* Google spreadsheets\n* Excelx\n* LibreOffice\n* CSV"
14
14
  s.email = "ruby.ruby.ruby.roo@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -110,6 +110,8 @@ Gem::Specification.new do |s|
110
110
  "test/files/formula_parse_error.xml",
111
111
  "test/files/formula_string_error.xlsx",
112
112
  "test/files/html-escape.ods",
113
+ "test/files/link.xls",
114
+ "test/files/link.xlsx",
113
115
  "test/files/matrix.ods",
114
116
  "test/files/matrix.xls",
115
117
  "test/files/named_cells.ods",
@@ -173,12 +175,12 @@ Gem::Specification.new do |s|
173
175
  s.licenses = ["MIT"]
174
176
  s.require_paths = ["lib"]
175
177
  s.required_ruby_version = Gem::Requirement.new(">= 1.9.0")
176
- s.rubygems_version = "1.8.24"
178
+ s.rubygems_version = "2.0.14"
177
179
  s.summary = "Roo can access the contents of various spreadsheet files."
178
- s.test_files = ["spec/fixtures/vcr_cassettes/google_drive.yml", "spec/fixtures/vcr_cassettes/google_drive_access_token.yml", "spec/lib/roo/base_spec.rb", "spec/lib/roo/csv_spec.rb", "spec/lib/roo/excel2003xml_spec.rb", "spec/lib/roo/excel_spec.rb", "spec/lib/roo/excelx/format_spec.rb", "spec/lib/roo/excelx_spec.rb", "spec/lib/roo/google_spec.rb", "spec/lib/roo/libreoffice_spec.rb", "spec/lib/roo/openoffice_spec.rb", "spec/lib/roo/spreadsheet_spec.rb", "spec/spec_helper.rb", "test/all_ss.rb", "test/files/1900_base.xls", "test/files/1900_base.xlsx", "test/files/1904_base.xls", "test/files/1904_base.xlsx", "test/files/Bibelbund.csv", "test/files/Bibelbund.ods", "test/files/Bibelbund.xls", "test/files/Bibelbund.xlsx", "test/files/Bibelbund.xml", "test/files/Bibelbund1.ods", "test/files/Pfand_from_windows_phone.xlsx", "test/files/bad_excel_date.xls", "test/files/bbu.ods", "test/files/bbu.xls", "test/files/bbu.xlsx", "test/files/bbu.xml", "test/files/bode-v1.ods.zip", "test/files/bode-v1.xls.zip", "test/files/boolean.csv", "test/files/boolean.ods", "test/files/boolean.xls", "test/files/boolean.xlsx", "test/files/boolean.xml", "test/files/borders.ods", "test/files/borders.xls", "test/files/borders.xlsx", "test/files/borders.xml", "test/files/bug-numbered-sheet-names.xlsx", "test/files/bug-row-column-fixnum-float.xls", "test/files/bug-row-column-fixnum-float.xml", "test/files/comments.ods", "test/files/comments.xls", "test/files/comments.xlsx", "test/files/csvtypes.csv", "test/files/datetime.ods", "test/files/datetime.xls", "test/files/datetime.xlsx", "test/files/datetime.xml", "test/files/datetime_floatconv.xls", "test/files/datetime_floatconv.xml", "test/files/dreimalvier.ods", "test/files/emptysheets.ods", "test/files/emptysheets.xls", "test/files/emptysheets.xlsx", "test/files/emptysheets.xml", "test/files/excel2003.xml", "test/files/false_encoding.xls", "test/files/false_encoding.xml", "test/files/formula.ods", "test/files/formula.xls", "test/files/formula.xlsx", "test/files/formula.xml", "test/files/formula_parse_error.xls", "test/files/formula_parse_error.xml", "test/files/formula_string_error.xlsx", "test/files/html-escape.ods", "test/files/matrix.ods", "test/files/matrix.xls", "test/files/named_cells.ods", "test/files/named_cells.xls", "test/files/named_cells.xlsx", "test/files/no_spreadsheet_file.txt", "test/files/numbers1.csv", "test/files/numbers1.ods", "test/files/numbers1.xls", "test/files/numbers1.xlsx", "test/files/numbers1.xml", "test/files/only_one_sheet.ods", "test/files/only_one_sheet.xls", "test/files/only_one_sheet.xlsx", "test/files/only_one_sheet.xml", "test/files/paragraph.ods", "test/files/paragraph.xls", "test/files/paragraph.xlsx", "test/files/paragraph.xml", "test/files/prova.xls", "test/files/ric.ods", "test/files/simple_spreadsheet.ods", "test/files/simple_spreadsheet.xls", "test/files/simple_spreadsheet.xlsx", "test/files/simple_spreadsheet.xml", "test/files/simple_spreadsheet_from_italo.ods", "test/files/simple_spreadsheet_from_italo.xls", "test/files/simple_spreadsheet_from_italo.xml", "test/files/so_datetime.csv", "test/files/style.ods", "test/files/style.xls", "test/files/style.xlsx", "test/files/style.xml", "test/files/time-test.csv", "test/files/time-test.ods", "test/files/time-test.xls", "test/files/time-test.xlsx", "test/files/time-test.xml", "test/files/type_excel.ods", "test/files/type_excel.xlsx", "test/files/type_excelx.ods", "test/files/type_excelx.xls", "test/files/type_openoffice.xls", "test/files/type_openoffice.xlsx", "test/files/whitespace.ods", "test/files/whitespace.xls", "test/files/whitespace.xlsx", "test/files/whitespace.xml", "test/rm_sub_test.rb", "test/rm_test.rb", "test/test_generic_spreadsheet.rb", "test/test_helper.rb", "test/test_roo.rb"]
180
+ s.test_files = ["spec/fixtures/vcr_cassettes/google_drive.yml", "spec/fixtures/vcr_cassettes/google_drive_access_token.yml", "spec/lib/roo/base_spec.rb", "spec/lib/roo/csv_spec.rb", "spec/lib/roo/excel2003xml_spec.rb", "spec/lib/roo/excel_spec.rb", "spec/lib/roo/excelx/format_spec.rb", "spec/lib/roo/excelx_spec.rb", "spec/lib/roo/google_spec.rb", "spec/lib/roo/libreoffice_spec.rb", "spec/lib/roo/openoffice_spec.rb", "spec/lib/roo/spreadsheet_spec.rb", "spec/spec_helper.rb", "test/all_ss.rb", "test/files/1900_base.xls", "test/files/1900_base.xlsx", "test/files/1904_base.xls", "test/files/1904_base.xlsx", "test/files/Bibelbund.csv", "test/files/Bibelbund.ods", "test/files/Bibelbund.xls", "test/files/Bibelbund.xlsx", "test/files/Bibelbund.xml", "test/files/Bibelbund1.ods", "test/files/Pfand_from_windows_phone.xlsx", "test/files/bad_excel_date.xls", "test/files/bbu.ods", "test/files/bbu.xls", "test/files/bbu.xlsx", "test/files/bbu.xml", "test/files/bode-v1.ods.zip", "test/files/bode-v1.xls.zip", "test/files/boolean.csv", "test/files/boolean.ods", "test/files/boolean.xls", "test/files/boolean.xlsx", "test/files/boolean.xml", "test/files/borders.ods", "test/files/borders.xls", "test/files/borders.xlsx", "test/files/borders.xml", "test/files/bug-numbered-sheet-names.xlsx", "test/files/bug-row-column-fixnum-float.xls", "test/files/bug-row-column-fixnum-float.xml", "test/files/comments.ods", "test/files/comments.xls", "test/files/comments.xlsx", "test/files/csvtypes.csv", "test/files/datetime.ods", "test/files/datetime.xls", "test/files/datetime.xlsx", "test/files/datetime.xml", "test/files/datetime_floatconv.xls", "test/files/datetime_floatconv.xml", "test/files/dreimalvier.ods", "test/files/emptysheets.ods", "test/files/emptysheets.xls", "test/files/emptysheets.xlsx", "test/files/emptysheets.xml", "test/files/excel2003.xml", "test/files/false_encoding.xls", "test/files/false_encoding.xml", "test/files/formula.ods", "test/files/formula.xls", "test/files/formula.xlsx", "test/files/formula.xml", "test/files/formula_parse_error.xls", "test/files/formula_parse_error.xml", "test/files/formula_string_error.xlsx", "test/files/html-escape.ods", "test/files/link.xls", "test/files/link.xlsx", "test/files/matrix.ods", "test/files/matrix.xls", "test/files/named_cells.ods", "test/files/named_cells.xls", "test/files/named_cells.xlsx", "test/files/no_spreadsheet_file.txt", "test/files/numbers1.csv", "test/files/numbers1.ods", "test/files/numbers1.xls", "test/files/numbers1.xlsx", "test/files/numbers1.xml", "test/files/only_one_sheet.ods", "test/files/only_one_sheet.xls", "test/files/only_one_sheet.xlsx", "test/files/only_one_sheet.xml", "test/files/paragraph.ods", "test/files/paragraph.xls", "test/files/paragraph.xlsx", "test/files/paragraph.xml", "test/files/prova.xls", "test/files/ric.ods", "test/files/simple_spreadsheet.ods", "test/files/simple_spreadsheet.xls", "test/files/simple_spreadsheet.xlsx", "test/files/simple_spreadsheet.xml", "test/files/simple_spreadsheet_from_italo.ods", "test/files/simple_spreadsheet_from_italo.xls", "test/files/simple_spreadsheet_from_italo.xml", "test/files/so_datetime.csv", "test/files/style.ods", "test/files/style.xls", "test/files/style.xlsx", "test/files/style.xml", "test/files/time-test.csv", "test/files/time-test.ods", "test/files/time-test.xls", "test/files/time-test.xlsx", "test/files/time-test.xml", "test/files/type_excel.ods", "test/files/type_excel.xlsx", "test/files/type_excelx.ods", "test/files/type_excelx.xls", "test/files/type_openoffice.xls", "test/files/type_openoffice.xlsx", "test/files/whitespace.ods", "test/files/whitespace.xls", "test/files/whitespace.xlsx", "test/files/whitespace.xml", "test/rm_sub_test.rb", "test/rm_test.rb", "test/test_generic_spreadsheet.rb", "test/test_helper.rb", "test/test_roo.rb"]
179
181
 
180
182
  if s.respond_to? :specification_version then
181
- s.specification_version = 3
183
+ s.specification_version = 4
182
184
 
183
185
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
184
186
  s.add_runtime_dependency(%q<spreadsheet>, ["> 0.6.4"])
@@ -6,21 +6,55 @@ describe Roo::Spreadsheet do
6
6
  let(:filename) { 'file.XLS' }
7
7
 
8
8
  it 'loads the proper type' do
9
- Roo::Excel.should_receive(:new).with(filename, {})
9
+ expect(Roo::Excel).to receive(:new).with(filename, {})
10
10
  Roo::Spreadsheet.open(filename)
11
11
  end
12
12
  end
13
13
 
14
+ context 'for a url' do
15
+ context 'that is csv' do
16
+ let(:filename) { 'http://example.com/file.csv?with=params#and=anchor' }
17
+
18
+ it 'treats the url as CSV' do
19
+ expect(Roo::CSV).to receive(:new).with(filename, {})
20
+ Roo::Spreadsheet.open(filename)
21
+ end
22
+ end
23
+ end
24
+
14
25
  context 'for a csv file' do
15
26
  let(:filename) { 'file.csv' }
16
27
  let(:options) { {csv_options: {col_sep: '"'}} }
17
28
 
18
29
  context 'with options' do
19
30
  it 'passes the options through' do
20
- Roo::CSV.should_receive(:new).with(filename, options)
31
+ expect(Roo::CSV).to receive(:new).with(filename, options)
32
+ Roo::Spreadsheet.open(filename, options)
33
+ end
34
+ end
35
+ end
36
+
37
+ context 'when the file extension' do
38
+ let(:filename) { 'file.xls' }
39
+
40
+ context "is xls" do
41
+ let(:options) { { extension: "xls" } }
42
+
43
+ it 'loads with xls extension options' do
44
+ expect(Roo::Excel).to receive(:new).with(filename, options)
21
45
  Roo::Spreadsheet.open(filename, options)
22
46
  end
23
47
  end
48
+
49
+ context "is .xls" do
50
+ let(:options) { { extension: ".xls" } }
51
+
52
+ it 'loads with .xls extension options' do
53
+ expect(Roo::Excel).to receive(:new).with(filename, options)
54
+ Roo::Spreadsheet.open(filename, options)
55
+ end
56
+ end
57
+
24
58
  end
25
59
  end
26
60
  end
Binary file
Binary file
@@ -1542,6 +1542,21 @@ Sheet 3:
1542
1542
  end
1543
1543
  end
1544
1544
 
1545
+
1546
+ def test_excel_links
1547
+ with_each_spreadsheet(:name=>'link', :format=>:excel) do |oo|
1548
+ assert_equal 'Google', oo.cell(1,1)
1549
+ assert_equal 'http://www.google.com', oo.cell(1,1).url
1550
+ end
1551
+ end
1552
+
1553
+ def test_excelx_links
1554
+ with_each_spreadsheet(:name=>'link', :format=>:excelx) do |oo|
1555
+ assert_equal 'Google', oo.cell(1,1)
1556
+ assert_equal 'http://www.google.com', oo.cell(1,1).url
1557
+ end
1558
+ end
1559
+
1545
1560
  # Excel has two base date formats one from 1900 and the other from 1904.
1546
1561
  # There's a MS bug that 1900 base dates include an extra day due to erroneously
1547
1562
  # including 1900 as a leap yar.
@@ -1771,6 +1786,16 @@ Sheet 3:
1771
1786
  end
1772
1787
  end
1773
1788
 
1789
+ def test_matrix_specifying_sheet
1790
+ with_each_spreadsheet(:name => 'matrix', :format => [:openoffice, :excel, :google]) do |oo|
1791
+ oo.default_sheet = oo.sheets.first
1792
+ assert_equal Matrix[
1793
+ [1.0, nil, 3.0],
1794
+ [4.0, 5.0, 6.0],
1795
+ [7.0, 8.0, nil] ], oo.to_matrix(nil, nil, nil, nil, 'Sheet3')
1796
+ end
1797
+ end
1798
+
1774
1799
  # unter Windows soll es laut Bug-Reports nicht moeglich sein, eine Excel-Datei, die
1775
1800
  # mit Excel.new geoeffnet wurde nach dem Processing anschliessend zu loeschen.
1776
1801
  # Anmerkung: Das Spreadsheet-Gem erlaubt kein explizites Close von Spreadsheet-Dateien,
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.12.2
5
- prerelease:
4
+ version: 1.13.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Thomas Preymesser
@@ -11,101 +10,86 @@ authors:
11
10
  autorequire:
12
11
  bindir: bin
13
12
  cert_chain: []
14
- date: 2013-09-11 00:00:00.000000000 Z
13
+ date: 2013-12-05 00:00:00.000000000 Z
15
14
  dependencies:
16
15
  - !ruby/object:Gem::Dependency
17
16
  name: spreadsheet
18
17
  requirement: !ruby/object:Gem::Requirement
19
- none: false
20
18
  requirements:
21
- - - ! '>'
19
+ - - '>'
22
20
  - !ruby/object:Gem::Version
23
21
  version: 0.6.4
24
22
  type: :runtime
25
23
  prerelease: false
26
24
  version_requirements: !ruby/object:Gem::Requirement
27
- none: false
28
25
  requirements:
29
- - - ! '>'
26
+ - - '>'
30
27
  - !ruby/object:Gem::Version
31
28
  version: 0.6.4
32
29
  - !ruby/object:Gem::Dependency
33
30
  name: nokogiri
34
31
  requirement: !ruby/object:Gem::Requirement
35
- none: false
36
32
  requirements:
37
- - - ! '>='
33
+ - - '>='
38
34
  - !ruby/object:Gem::Version
39
35
  version: '0'
40
36
  type: :runtime
41
37
  prerelease: false
42
38
  version_requirements: !ruby/object:Gem::Requirement
43
- none: false
44
39
  requirements:
45
- - - ! '>='
40
+ - - '>='
46
41
  - !ruby/object:Gem::Version
47
42
  version: '0'
48
43
  - !ruby/object:Gem::Dependency
49
44
  name: rubyzip
50
45
  requirement: !ruby/object:Gem::Requirement
51
- none: false
52
46
  requirements:
53
- - - ! '>='
47
+ - - '>='
54
48
  - !ruby/object:Gem::Version
55
49
  version: '0'
56
50
  type: :runtime
57
51
  prerelease: false
58
52
  version_requirements: !ruby/object:Gem::Requirement
59
- none: false
60
53
  requirements:
61
- - - ! '>='
54
+ - - '>='
62
55
  - !ruby/object:Gem::Version
63
56
  version: '0'
64
57
  - !ruby/object:Gem::Dependency
65
58
  name: google_drive
66
59
  requirement: !ruby/object:Gem::Requirement
67
- none: false
68
60
  requirements:
69
- - - ! '>='
61
+ - - '>='
70
62
  - !ruby/object:Gem::Version
71
63
  version: '0'
72
64
  type: :development
73
65
  prerelease: false
74
66
  version_requirements: !ruby/object:Gem::Requirement
75
- none: false
76
67
  requirements:
77
- - - ! '>='
68
+ - - '>='
78
69
  - !ruby/object:Gem::Version
79
70
  version: '0'
80
71
  - !ruby/object:Gem::Dependency
81
72
  name: jeweler
82
73
  requirement: !ruby/object:Gem::Requirement
83
- none: false
84
74
  requirements:
85
- - - ! '>='
75
+ - - '>='
86
76
  - !ruby/object:Gem::Version
87
77
  version: '0'
88
78
  type: :development
89
79
  prerelease: false
90
80
  version_requirements: !ruby/object:Gem::Requirement
91
- none: false
92
81
  requirements:
93
- - - ! '>='
82
+ - - '>='
94
83
  - !ruby/object:Gem::Version
95
84
  version: '0'
96
- description: ! 'Roo can access the contents of various spreadsheet files. It can handle
97
-
85
+ description: |-
86
+ Roo can access the contents of various spreadsheet files. It can handle
98
87
  * OpenOffice
99
-
100
88
  * Excel
101
-
102
89
  * Google spreadsheets
103
-
104
90
  * Excelx
105
-
106
91
  * LibreOffice
107
-
108
- * CSV'
92
+ * CSV
109
93
  email: ruby.ruby.ruby.roo@gmail.com
110
94
  executables: []
111
95
  extensions: []
@@ -206,6 +190,8 @@ files:
206
190
  - test/files/formula_parse_error.xml
207
191
  - test/files/formula_string_error.xlsx
208
192
  - test/files/html-escape.ods
193
+ - test/files/link.xls
194
+ - test/files/link.xlsx
209
195
  - test/files/matrix.ods
210
196
  - test/files/matrix.xls
211
197
  - test/files/named_cells.ods
@@ -267,27 +253,26 @@ files:
267
253
  homepage: http://github.com/Empact/roo
268
254
  licenses:
269
255
  - MIT
256
+ metadata: {}
270
257
  post_install_message:
271
258
  rdoc_options: []
272
259
  require_paths:
273
260
  - lib
274
261
  required_ruby_version: !ruby/object:Gem::Requirement
275
- none: false
276
262
  requirements:
277
- - - ! '>='
263
+ - - '>='
278
264
  - !ruby/object:Gem::Version
279
265
  version: 1.9.0
280
266
  required_rubygems_version: !ruby/object:Gem::Requirement
281
- none: false
282
267
  requirements:
283
- - - ! '>='
268
+ - - '>='
284
269
  - !ruby/object:Gem::Version
285
270
  version: '0'
286
271
  requirements: []
287
272
  rubyforge_project:
288
- rubygems_version: 1.8.24
273
+ rubygems_version: 2.0.14
289
274
  signing_key:
290
- specification_version: 3
275
+ specification_version: 4
291
276
  summary: Roo can access the contents of various spreadsheet files.
292
277
  test_files:
293
278
  - spec/fixtures/vcr_cassettes/google_drive.yml
@@ -360,6 +345,8 @@ test_files:
360
345
  - test/files/formula_parse_error.xml
361
346
  - test/files/formula_string_error.xlsx
362
347
  - test/files/html-escape.ods
348
+ - test/files/link.xls
349
+ - test/files/link.xlsx
363
350
  - test/files/matrix.ods
364
351
  - test/files/matrix.xls
365
352
  - test/files/named_cells.ods