spreadsheet 0.7.1 → 0.7.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,8 @@
1
+ === 0.7.2 / 14.06.2012
2
+
3
+ * many changes by Mina Naguib <mina.git@naguib.ca>
4
+ * see git log for full details
5
+
1
6
  === 0.7.1 / 08.05.2012
2
7
 
3
8
  * Author: Artem Ignatiev <zazubrik@gmail.com>
@@ -42,7 +42,7 @@ module Spreadsheet
42
42
 
43
43
  ##
44
44
  # The version of Spreadsheet you are using.
45
- VERSION = '0.7.1'
45
+ VERSION = '0.7.2'
46
46
 
47
47
  ##
48
48
  # Default client Encoding. Change this value if your application uses a
@@ -30,7 +30,6 @@ class Format < DelegateClass Spreadsheet::Format
30
30
  color :diagonal_color, :border
31
31
  color :pattern_fg_color, :pattern_bg
32
32
  color :pattern_bg_color, :pattern_bg
33
- attr_accessor :xf_index
34
33
  attr_reader :format
35
34
  def initialize writer, workbook, format=workbook.default_format, opts={}
36
35
  @opts = { :type => :format }.merge opts
@@ -118,9 +118,11 @@ class Worksheet
118
118
  @io.size
119
119
  end
120
120
  def strings
121
- @worksheet.inject [] do |memo, row|
122
- strings = row.select do |cell| cell.is_a?(String) && !cell.empty? end
123
- memo.concat strings
121
+ @worksheet.inject(Hash.new(0)) do |memo, row|
122
+ row.each do |cell|
123
+ memo[cell] += 1 if (cell.is_a?(String) && !cell.empty?)
124
+ end
125
+ memo
124
126
  end
125
127
  end
126
128
  ##
@@ -64,26 +64,33 @@ class Workbook < Spreadsheet::Writer
64
64
  workbook.formats.each do |fmt|
65
65
  formats.push Format.new(self, workbook, fmt)
66
66
  end
67
+ @formats[workbook] = {
68
+ :writers => [],
69
+ :xf_indexes => {}
70
+ }
67
71
  formats.each_with_index do |fmt, idx|
68
- fmt.xf_index = idx
72
+ @formats[workbook][:writers] << fmt
73
+ @formats[workbook][:xf_indexes][fmt.format] ||= idx
69
74
  end
70
- @formats[workbook] = formats
71
75
  end
72
76
  def complete_sst_update? workbook
73
77
  stored = workbook.sst.collect do |entry| entry.content end
74
- current = worksheets(workbook).inject [] do |memo, worksheet|
75
- memo.concat worksheet.strings
78
+ num_total = 0
79
+ current = worksheets(workbook).inject(Hash.new(0)) do |memo, worksheet|
80
+ worksheet.strings.each do |k,v|
81
+ memo[k] += v
82
+ num_total += v
83
+ end
84
+ memo
76
85
  end
77
- total = current.size
78
- current.uniq!
79
86
  current.delete ''
80
- if (stored - current).empty? && !stored.empty?
87
+ if !stored.empty? && stored.all?{|x| current.include?(x) }
81
88
  ## if all previously stored strings are still needed, we don't have to
82
89
  # rewrite all cells because the sst-index of such string does not change.
83
- additions = current - stored
84
- [:partial_update, total, stored + additions]
90
+ additions = current.keys - stored
91
+ [:partial_update, num_total, stored + additions]
85
92
  else
86
- [:complete_update, total, current]
93
+ [:complete_update, num_total, current.keys]
87
94
  end
88
95
  end
89
96
  def font_index workbook, font_key
@@ -349,8 +356,8 @@ class Workbook < Spreadsheet::Writer
349
356
  end
350
357
  def write_fonts workbook, writer
351
358
  fonts = @fonts[workbook] = {}
352
- @formats[workbook].each do |format|
353
- if(font = format.font) && !fonts.include?(font.key)
359
+ @formats[workbook][:writers].map{|format| format.font }.compact.uniq.each do |font|
360
+ unless fonts.include?(font.key)
354
361
  fonts.store font.key, fonts.size
355
362
  write_font workbook, writer, font
356
363
  end
@@ -482,12 +489,15 @@ class Workbook < Spreadsheet::Writer
482
489
  # 0 4 Total number of strings in the workbook (see below)
483
490
  # 4 4 Number of following strings (nm)
484
491
  # 8 var. List of nm Unicode strings, 16-bit string length (➜ 3.4)
485
- strings = worksheets(workbook).inject [] do |memo, worksheet|
486
- memo.concat worksheet.strings
492
+ num_total = 0
493
+ strings = worksheets(workbook).inject(Hash.new(0)) do |memo, worksheet|
494
+ worksheet.strings.each do |k,v|
495
+ memo[k] += v
496
+ num_total += v
497
+ end
498
+ memo
487
499
  end
488
- total = strings.size
489
- strings.uniq!
490
- _write_sst workbook, writer, offset, total, strings
500
+ _write_sst workbook, writer, offset, num_total, strings.keys
491
501
  end
492
502
  def _write_sst workbook, writer, offset, total, strings
493
503
  sst = {}
@@ -635,17 +645,13 @@ class Workbook < Spreadsheet::Writer
635
645
  # the XF record with the fixed index 15 (0-based). By default, it uses the
636
646
  # worksheet/workbook default cell style, described by the very first XF
637
647
  # record (index 0).
638
- @formats[workbook].each do |fmt| fmt.write_xf writer end
648
+ @formats[workbook][:writers].each do |fmt| fmt.write_xf writer end
639
649
  end
640
650
  def sst_index worksheet, str
641
651
  @sst[worksheet][str]
642
652
  end
643
653
  def xf_index workbook, format
644
- if fmt = @formats[workbook].find do |fm| fm.format == format end
645
- fmt.xf_index
646
- else
647
- 0
648
- end
654
+ @formats[workbook][:xf_indexes][format] || 0
649
655
  end
650
656
  end
651
657
  end
@@ -118,9 +118,11 @@ class Worksheet
118
118
  @io.size
119
119
  end
120
120
  def strings
121
- @worksheet.inject [] do |memo, row|
122
- strings = row.select do |cell| cell.is_a?(String) && !cell.empty? end
123
- memo.concat strings
121
+ @worksheet.inject(Hash.new(0)) do |memo, row|
122
+ row.each do |cell|
123
+ memo[cell] += 1 if (cell.is_a?(String) && !cell.empty?)
124
+ end
125
+ memo
124
126
  end
125
127
  end
126
128
  ##
@@ -74,10 +74,18 @@ module Spreadsheet
74
74
  self.weight = bool ? :bold : nil
75
75
  end
76
76
  def key # :nodoc:
77
- key = @name.dup
77
+ fk = fast_key
78
+ return @key if @previous_fast_key == fk
79
+ @previous_fast_key = fk
80
+ @key = build_key
81
+ end
82
+ private
83
+ def build_key # :nodoc:
78
84
  underscore = client('_', 'UTF-8')
85
+ key = []
86
+ key << @name
79
87
  key << underscore << client(size.to_s, 'US-ASCII')
80
- key << client('_', 'UTF-8') << client(weight.to_s, 'US-ASCII')
88
+ key << underscore << client(weight.to_s, 'US-ASCII')
81
89
  key << client('_italic', 'UTF-8') if italic?
82
90
  key << client('_strikeout', 'UTF-8') if strikeout?
83
91
  key << client('_outline', 'UTF-8') if outline?
@@ -87,6 +95,10 @@ module Spreadsheet
87
95
  key << underscore << client(color.to_s, 'US-ASCII')
88
96
  key << underscore << client(family.to_s, 'US-ASCII')
89
97
  key << underscore << client(encoding.to_s, 'US-ASCII')
98
+ key.join("")
99
+ end
100
+ def fast_key
101
+ [@name, @size, @weight, @italic, @strikeout, @outline, @shadow, @escapement, @underline, @color, @family, @encoding]
90
102
  end
91
103
  end
92
104
  end
@@ -84,6 +84,12 @@ module Spreadsheet
84
84
  @diagonal_color = :builtin_black
85
85
  @pattern_fg_color = :border
86
86
  @pattern_bg_color = :pattern_bg
87
+ @regexes = {
88
+ :date => Regexp.new(client("[YMD]", 'UTF-8')),
89
+ :date_or_time => Regexp.new(client("[hmsYMD]", 'UTF-8')),
90
+ :datetime => Regexp.new(client("([YMD].*[HS])|([HS].*[YMD])", 'UTF-8')),
91
+ :time => Regexp.new(client("[hms]", 'UTF-8'))
92
+ }
87
93
  # Temp code to prevent merged formats in non-merged cells.
88
94
  @used_merge = 0
89
95
  opts.each do |key, val|
@@ -156,22 +162,22 @@ module Spreadsheet
156
162
  ##
157
163
  # Is the cell formatted as a Date?
158
164
  def date?
159
- !!Regexp.new(client("[YMD]", 'UTF-8')).match(@number_format.to_s)
165
+ !!@regexes[:date].match(@number_format.to_s)
160
166
  end
161
167
  ##
162
168
  # Is the cell formatted as a Date or Time?
163
169
  def date_or_time?
164
- !!Regexp.new(client("[hmsYMD]", 'UTF-8')).match(@number_format.to_s)
170
+ !!@regexes[:date_or_time].match(@number_format.to_s)
165
171
  end
166
172
  ##
167
173
  # Is the cell formatted as a DateTime?
168
174
  def datetime?
169
- !!Regexp.new(client("([YMD].*[HS])|([HS].*[YMD])", 'UTF-8')).match(@number_format.to_s)
175
+ !!@regexes[:datetime].match(@number_format.to_s)
170
176
  end
171
177
  ##
172
178
  # Is the cell formatted as a Time?
173
179
  def time?
174
- !!Regexp.new(client("[hms]", 'UTF-8')).match(@number_format.to_s)
180
+ !!@regexes[:time].match(@number_format.to_s)
175
181
  end
176
182
  end
177
183
  end
@@ -19,8 +19,9 @@ module Spreadsheet
19
19
  @io = io
20
20
  @fonts = []
21
21
  @formats = []
22
+ @formats_set = {}
22
23
  if @default_format = opts[:default_format]
23
- @formats.push @default_format
24
+ add_format @default_format
24
25
  end
25
26
  end
26
27
  ##
@@ -34,7 +35,10 @@ module Spreadsheet
34
35
  # Add a Format to the Workbook. If you use Row#set_format, you should not
35
36
  # need to use this Method.
36
37
  def add_format format
37
- @formats.push(format) if format && !@formats.include?(format)
38
+ if format && !@formats_set[format]
39
+ @formats_set[format] = true
40
+ @formats.push(format)
41
+ end
38
42
  format
39
43
  end
40
44
  ##
@@ -167,22 +167,30 @@ module Spreadsheet
167
167
  # - 'DD.MM.YYYY' for Date
168
168
  # - 'DD.MM.YYYY hh:mm:ss' for DateTime and Time
169
169
  def format_dates! format=nil
170
+ new_formats = {}
171
+ fmt_str_time = client('DD.MM.YYYY hh:mm:ss', 'UTF-8')
172
+ fmt_str_date = client('DD.MM.YYYY', 'UTF-8')
170
173
  each do |row|
171
174
  row.each_with_index do |value, idx|
172
175
  unless row.formats[idx] || row.format(idx).date_or_time?
173
176
  numfmt = case value
174
177
  when DateTime, Time
175
- format || client('DD.MM.YYYY hh:mm:ss', 'UTF-8')
178
+ format || fmt_str_time
176
179
  when Date
177
- format || client('DD.MM.YYYY', 'UTF-8')
180
+ format || fmt_str_date
178
181
  end
179
182
  case numfmt
180
183
  when Format
181
184
  row.set_format idx, numfmt
182
185
  when String
183
- fmt = row.format(idx).dup
184
- fmt.number_format = numfmt
185
- row.set_format idx, fmt
186
+ existing_format = row.format(idx)
187
+ new_formats[existing_format] ||= {}
188
+ new_format = new_formats[existing_format][numfmt]
189
+ if !new_format
190
+ new_format = new_formats[existing_format][numfmt] = existing_format.dup
191
+ new_format.number_format = numfmt
192
+ end
193
+ row.set_format idx, new_format
186
194
  end
187
195
  end
188
196
  end
@@ -10,12 +10,84 @@ module Spreadsheet
10
10
  module Excel
11
11
  module Writer
12
12
  class TestWorkbook < Test::Unit::TestCase
13
+ def setup
14
+ @book = Spreadsheet::Excel::Workbook.new
15
+ assert_instance_of Excel::Workbook, @book
16
+ assert_equal @book.worksheets.size, 0
17
+ @workbook_writer = Excel::Writer::Workbook.new @book
18
+ end
13
19
  def test_sanitize_worksheets
14
- book = Spreadsheet::Excel::Workbook.new
15
- assert_instance_of Excel::Workbook, book
16
- assert_equal book.worksheets.size, 0
17
- workbook_writer = Excel::Writer::Workbook.new book
18
- assert_nothing_raised { workbook_writer.sanitize_worksheets book.worksheets }
20
+ assert_nothing_raised { @workbook_writer.sanitize_worksheets @book.worksheets }
21
+ end
22
+ def test_collect_formats
23
+ assert_equal 17, @workbook_writer.collect_formats(@book).length # Expected for vanilla
24
+ sheet = @book.create_worksheet
25
+ rowi=-1
26
+
27
+ f1 = Spreadsheet::Format.new
28
+ sheet.row(rowi+=1).default_format = f1
29
+ assert_equal 18, @workbook_writer.collect_formats(@book).length
30
+
31
+ f2 = Spreadsheet::Format.new
32
+ sheet.row(rowi+=1).default_format = f2
33
+ assert_equal 19, @workbook_writer.collect_formats(@book).length
34
+
35
+ sheet.row(rowi+=1).default_format = f2
36
+ assert_equal 19, @workbook_writer.collect_formats(@book).length # Ignores duplicates
37
+ end
38
+ def test_xf_index
39
+ sheet = @book.create_worksheet
40
+ rowi=-1
41
+
42
+ f1 = Spreadsheet::Format.new
43
+ sheet.row(rowi+=1).default_format = f1
44
+ @workbook_writer.collect_formats(@book)
45
+ assert_equal 17, @workbook_writer.xf_index(@book, f1)
46
+
47
+ f2 = Spreadsheet::Format.new
48
+ sheet.row(rowi+=1).default_format = f2
49
+ @workbook_writer.collect_formats(@book)
50
+ assert_equal 18, @workbook_writer.xf_index(@book, f2)
51
+
52
+ end
53
+ def test_write_fonts
54
+ num_written = 0
55
+ sheet = @book.create_worksheet
56
+ rowi=-1
57
+ # Stub inner #write_font as a counter:
58
+ (class << @workbook_writer; self; end).send(:define_method, :write_font) do |*args|
59
+ num_written += 1
60
+ end
61
+ io = StringIO.new("")
62
+
63
+ num_written = 0
64
+ @workbook_writer.collect_formats(@book)
65
+ @workbook_writer.write_fonts(@book, io)
66
+ assert_equal 1, num_written # Default format's font
67
+
68
+ f1 = Spreadsheet::Format.new
69
+ sheet.row(rowi+=1).default_format = f1
70
+ num_written = 0
71
+ @workbook_writer.collect_formats(@book)
72
+ @workbook_writer.write_fonts(@book, io)
73
+ assert_equal 1, num_written # No new fonts
74
+
75
+ f2 = Spreadsheet::Format.new
76
+ f2.font = Spreadsheet::Font.new("Foo")
77
+ sheet.row(rowi+=1).default_format = f2
78
+ num_written = 0
79
+ @workbook_writer.collect_formats(@book)
80
+ @workbook_writer.write_fonts(@book, io)
81
+ assert_equal 2, num_written # 2 distinct fonts total
82
+
83
+ f3 = Spreadsheet::Format.new
84
+ f3.font = f2.font # Re-use previous font
85
+ sheet.row(rowi+=1).default_format = f3
86
+ num_written = 0
87
+ @workbook_writer.collect_formats(@book)
88
+ @workbook_writer.write_fonts(@book, io)
89
+ assert_equal 2, num_written # 2 distinct fonts total still
90
+
19
91
  end
20
92
  end
21
93
  end
@@ -49,6 +49,32 @@ module Spreadsheet
49
49
 
50
50
  assert_equal false, sheet.data.empty?
51
51
  end
52
+
53
+ def test_strings
54
+ book = Spreadsheet::Excel::Workbook.new
55
+ sheet = book.create_worksheet
56
+ writer = Worksheet.new book, sheet
57
+ rowi = -1
58
+
59
+ assert_equal(
60
+ {},
61
+ writer.strings
62
+ )
63
+
64
+ sheet.row(rowi+=1).concat(["Hello", "World"])
65
+ assert_equal(
66
+ {"Hello" => 1, "World" => 1},
67
+ writer.strings
68
+ )
69
+
70
+ sheet.row(rowi+=1).concat(["Goodbye", "Cruel", "World", 2012])
71
+ assert_equal(
72
+ {"Hello" => 1, "Goodbye" => 1, "Cruel" => 1, "World" => 2},
73
+ writer.strings
74
+ )
75
+
76
+ end
77
+
52
78
  end
53
79
  end
54
80
  end
@@ -106,33 +106,11 @@ module Spreadsheet
106
106
  assert_equal enc, book.encoding
107
107
  assert_equal 25, book.formats.size
108
108
  assert_equal 5, book.fonts.size
109
- str1 = book.shared_string 0
110
- other = @@iconv.iconv('Shared String')
111
- assert_equal @@iconv.iconv('Shared String'), str1
112
- str2 = book.shared_string 1
113
- assert_equal @@iconv.iconv('Another Shared String'), str2
114
- str3 = book.shared_string 2
115
- long = @@iconv.iconv('1234567890 ' * 1000)
116
- if str3 != long
117
- long.size.times do |idx|
118
- len = idx.next
119
- if str3[0,len] != long[0,len]
120
- assert_equal long[idx - 5, 10], str3[idx - 5, 10], "in position #{idx}"
121
- end
122
- end
123
- end
124
- assert_equal long, str3
125
- str4 = book.shared_string 3
126
- long = @@iconv.iconv('9876543210 ' * 1000)
127
- if str4 != long
128
- long.size.times do |idx|
129
- len = idx.next
130
- if str4[0,len] != long[0,len]
131
- assert_equal long[idx - 5, 10], str4[idx - 5, 10], "in position #{idx}"
132
- end
133
- end
134
- end
135
- assert_equal long, str4
109
+ str1 = @@iconv.iconv('Shared String')
110
+ str2 = @@iconv.iconv('Another Shared String')
111
+ str3 = @@iconv.iconv('1234567890 ' * 1000)
112
+ str4 = @@iconv.iconv('9876543210 ' * 1000)
113
+ assert_valid_sst(book, :contains => [str1, str2, str3, str4])
136
114
  sheet = book.worksheet 0
137
115
  assert_equal 11, sheet.row_count
138
116
  assert_equal 12, sheet.column_count
@@ -211,32 +189,11 @@ module Spreadsheet
211
189
  assert_equal enc, book.encoding
212
190
  assert_equal 25, book.formats.size
213
191
  assert_equal 5, book.fonts.size
214
- str1 = book.shared_string 0
215
- assert_equal 'Shared String', str1
216
- str2 = book.shared_string 1
217
- assert_equal 'Another Shared String', str2
218
- str3 = book.shared_string 2
219
- long = '1234567890 ' * 1000
220
- if str3 != long
221
- long.size.times do |idx|
222
- len = idx.next
223
- if str3[0,len] != long[0,len]
224
- assert_equal long[idx - 5, 10], str3[idx - 5, 10], "in position #{idx}"
225
- end
226
- end
227
- end
228
- assert_equal long, str3
229
- str4 = book.shared_string 3
230
- long = '9876543210 ' * 1000
231
- if str4 != long
232
- long.size.times do |idx|
233
- len = idx.next
234
- if str4[0,len] != long[0,len]
235
- assert_equal long[idx - 5, 10], str4[idx - 5, 10], "in position #{idx}"
236
- end
237
- end
238
- end
239
- assert_equal long, str4
192
+ str1 = 'Shared String'
193
+ str2 = 'Another Shared String'
194
+ str3 = '1234567890 ' * 1000
195
+ str4 = '9876543210 ' * 1000
196
+ assert_valid_sst(book, :contains => [str1, str2, str3, str4])
240
197
  sheet = book.worksheet 0
241
198
  assert_equal 11, sheet.row_count
242
199
  assert_equal 12, sheet.column_count
@@ -601,32 +558,12 @@ module Spreadsheet
601
558
  assert_equal 8, book.biff_version
602
559
  assert_equal 'Microsoft Excel 97/2000/XP', book.version_string
603
560
  path = File.join @var, 'test_change_cell.xls'
604
- str1 = book.shared_string 0
605
- assert_equal 'Shared String', str1
606
- str2 = book.shared_string 1
607
- assert_equal 'Another Shared String', str2
608
- str3 = book.shared_string 2
609
- long = '1234567890 ' * 1000
610
- if str3 != long
611
- long.size.times do |idx|
612
- len = idx.next
613
- if str3[0,len] != long[0,len]
614
- assert_equal long[idx - 5, 10], str3[idx - 5, 10], "in position #{idx}"
615
- end
616
- end
617
- end
618
- assert_equal long, str3
619
- str4 = book.shared_string 3
620
- long = '9876543210 ' * 1000
621
- if str4 != long
622
- long.size.times do |idx|
623
- len = idx.next
624
- if str4[0,len] != long[0,len]
625
- assert_equal long[idx - 5, 10], str4[idx - 5, 10], "in position #{idx}"
626
- end
627
- end
628
- end
629
- assert_equal long, str4
561
+ str1 = 'Shared String'
562
+ str2 = 'Another Shared String'
563
+ str3 = '1234567890 ' * 1000
564
+ str4 = '9876543210 ' * 1000
565
+ str5 = "Link-Text"
566
+ assert_valid_sst(book, :is => [str1, str2, str3, str4, str5])
630
567
  sheet = book.worksheet 0
631
568
  sheet[0,0] = 4
632
569
  row = sheet.row 1
@@ -704,44 +641,21 @@ module Spreadsheet
704
641
  assert_equal 8, book.biff_version
705
642
  assert_equal 'Microsoft Excel 97/2000/XP', book.version_string
706
643
  path = File.join @var, 'test_change_cell.xls'
707
- str1 = book.shared_string 0
708
- assert_equal 'Shared String', str1
709
- str2 = book.shared_string 1
710
- assert_equal 'Another Shared String', str2
711
- str3 = book.shared_string 2
712
- long = '1234567890 ' * 1000
713
- if str3 != long
714
- long.size.times do |idx|
715
- len = idx.next
716
- if str3[0,len] != long[0,len]
717
- assert_equal long[idx - 5, 10], str3[idx - 5, 10], "in position #{idx}"
718
- end
719
- end
720
- end
721
- assert_equal long, str3
722
- str4 = book.shared_string 3
723
- long = '9876543210 ' * 1000
724
- if str4 != long
725
- long.size.times do |idx|
726
- len = idx.next
727
- if str4[0,len] != long[0,len]
728
- assert_equal long[idx - 5, 10], str4[idx - 5, 10], "in position #{idx}"
729
- end
730
- end
731
- end
732
- assert_equal long, str4
644
+ str1 = 'Shared String'
645
+ str2 = 'Another Shared String'
646
+ str3 = '1234567890 ' * 1000
647
+ str4 = '9876543210 ' * 1000
648
+ str5 = 'Link-Text'
649
+ assert_valid_sst(book, :is => [str1, str2, str3, str4, str5])
733
650
  sheet = book.worksheet 0
734
651
  sheet[0,0] = 4
735
- str5 = 'A completely different String'
736
- sheet[0,1] = str5
652
+ str6 = 'A completely different String'
653
+ sheet[0,1] = str6
737
654
  row = sheet.row 1
738
655
  row[0] = 3
739
656
  book.write path
740
657
  assert_nothing_raised do book = Spreadsheet.open path end
741
- assert_equal str5, book.shared_string(0)
742
- assert_equal str2, book.shared_string(1)
743
- assert_equal str3, book.shared_string(2)
744
- assert_equal str4, book.shared_string(3)
658
+ assert_valid_sst(book, :is => [str2, str3, str4, str5, str6])
745
659
  sheet = book.worksheet 0
746
660
  assert_equal 11, sheet.row_count
747
661
  assert_equal 12, sheet.column_count
@@ -756,9 +670,9 @@ module Spreadsheet
756
670
  assert_equal 4, row[0]
757
671
  assert_equal 4, sheet[0,0]
758
672
  assert_equal 4, sheet.cell(0,0)
759
- assert_equal str5, row[1]
760
- assert_equal str5, sheet[0,1]
761
- assert_equal str5, sheet.cell(0,1)
673
+ assert_equal str6, row[1]
674
+ assert_equal str6, sheet[0,1]
675
+ assert_equal str6, sheet.cell(0,1)
762
676
  row = sheet.row 1
763
677
  assert_equal 3, row[0]
764
678
  assert_equal 3, sheet[1,0]
@@ -905,31 +819,7 @@ module Spreadsheet
905
819
  else
906
820
  assert_equal 'UTF-16LE', book.encoding
907
821
  end
908
- assert_equal str1, book.shared_string(0)
909
- assert_equal str2, book.shared_string(1)
910
- test = nil
911
- assert_nothing_raised "I've probably split a two-byte-character" do
912
- test = book.shared_string 2
913
- end
914
- if test != str3
915
- str3.size.times do |idx|
916
- len = idx.next
917
- if test[0,len] != str3[0,len]
918
- assert_equal str3[idx - 5, 10], test[idx - 5, 10], "in position #{idx}"
919
- end
920
- end
921
- end
922
- assert_equal str3, test
923
- test = book.shared_string 3
924
- if test != str4
925
- str4.size.times do |idx|
926
- len = idx.next
927
- if test[0,len] != str4[0,len]
928
- assert_equal str4[idx - 5, 10], test[idx - 5, 10], "in position #{idx}"
929
- end
930
- end
931
- end
932
- assert_equal str4, test
822
+ assert_valid_sst(book, :contains => [str1, str2, str3, str4])
933
823
  assert_equal 2, book.worksheets.size
934
824
  sheet = book.worksheets.first
935
825
  assert_instance_of Spreadsheet::Excel::Worksheet, sheet
@@ -1080,28 +970,7 @@ module Spreadsheet
1080
970
  else
1081
971
  assert_equal 'UTF-16LE', book.encoding
1082
972
  end
1083
- assert_equal str1, book.shared_string(0)
1084
- assert_equal str2, book.shared_string(1)
1085
- test = book.shared_string 2
1086
- if test != str3
1087
- str3.size.times do |idx|
1088
- len = idx.next
1089
- if test[0,len] != str3[0,len]
1090
- assert_equal str3[idx - 5, 10], test[idx - 5, 10], "in position #{idx}"
1091
- end
1092
- end
1093
- end
1094
- assert_equal str3, test
1095
- test = book.shared_string 3
1096
- if test != str4
1097
- str4.size.times do |idx|
1098
- len = idx.next
1099
- if test[0,len] != str4[0,len]
1100
- assert_equal str4[idx - 5, 10], test[idx - 5, 10], "in position #{idx}"
1101
- end
1102
- end
1103
- end
1104
- assert_equal str4, test
973
+ assert_valid_sst(book, :is => [str1, str2, str3, str4, "formatted when empty"])
1105
974
  assert_equal 2, book.worksheets.size
1106
975
  sheet = book.worksheets.first
1107
976
  assert_instance_of Spreadsheet::Excel::Worksheet, sheet
@@ -1364,5 +1233,35 @@ module Spreadsheet
1364
1233
  sheet[0,0] # trigger read_worksheet
1365
1234
  assert_equal [[2, 4, 1, 1], [3, 3, 2, 3]], sheet.merged_cells
1366
1235
  end
1236
+
1237
+ private
1238
+
1239
+ # Validates the workbook's SST
1240
+ # Valid options:
1241
+ # :is => [array]
1242
+ # :contains => [array]
1243
+ # :length => num
1244
+ def assert_valid_sst(workbook, opts = {})
1245
+ assert workbook.is_a?(Spreadsheet::Excel::Workbook)
1246
+ sst = workbook.sst
1247
+ assert sst.is_a?(Array)
1248
+ strings = sst.map do |entry|
1249
+ assert entry.is_a?(Spreadsheet::Excel::SstEntry)
1250
+ entry.content
1251
+ end
1252
+ sorted_strings = strings.sort
1253
+ # Make sure there are no duplicates, the whole point of the SST:
1254
+ assert_equal strings.uniq.sort, sorted_strings
1255
+ if opts[:is]
1256
+ assert_equal opts[:is].sort, sorted_strings
1257
+ end
1258
+ if opts[:contains]
1259
+ assert_equal [], opts[:contains] - sorted_strings
1260
+ end
1261
+ if opts[:length]
1262
+ assert_equal opts[:length], sorted_strings
1263
+ end
1264
+ end
1265
+
1367
1266
  end
1368
1267
  end
@@ -25,5 +25,20 @@ module Spreadsheet
25
25
  @book.add_worksheet @worksheet2
26
26
  assert_equal 2, @book.sheet_count
27
27
  end
28
+ def test_add_format
29
+
30
+ assert_equal 1, @book.formats.length # Received a default format
31
+
32
+ f1 = Format.new
33
+ @book.add_format f1
34
+ assert_equal 2, @book.formats.length
35
+
36
+ f2 = Format.new
37
+ @book.add_format f2
38
+ assert_equal 3, @book.formats.length
39
+
40
+ @book.add_format f2
41
+ assert_equal 3, @book.formats.length # Rejected duplicate insertion
42
+ end
28
43
  end
29
44
  end
@@ -76,5 +76,37 @@ module Spreadsheet
76
76
  assert_equal 30, @sheet.column(0).width
77
77
  assert_equal 20, @sheet.column(1).width
78
78
  end
79
+ def test_format_dates!
80
+ rowi = -1
81
+
82
+ @sheet.format_dates!
83
+ # No dates = no new formats
84
+ assert_equal 1, @book.formats.length # Default format
85
+
86
+ @sheet.row(rowi+=1).concat(["Hello", "World"])
87
+ @sheet.format_dates!
88
+ # No dates = no new formats
89
+ assert_equal 1, @book.formats.length
90
+
91
+ @sheet.row(rowi+=1).concat([Date.new(2010,1,1)])
92
+ @sheet.format_dates!
93
+ # 1 date = 1 new format
94
+ assert_equal 2, @book.formats.length
95
+
96
+ @sheet.row(rowi+=1).concat([Date.new(2011,1,1)])
97
+ @sheet.row(rowi+=1).concat([Date.new(2012,1,1)])
98
+ @sheet.row(rowi+=1).concat([Date.new(2013,1,1)])
99
+ @sheet.format_dates!
100
+ # 4 dates = only 1 new format across them:
101
+ assert_equal 3, @book.formats.length
102
+
103
+ @sheet.row(rowi+=1).concat([Date.new(2014,1,1)])
104
+ @sheet.row(rowi).default_format = Format.new
105
+ @sheet.row(rowi+=1).concat([Date.new(2015,1,1)])
106
+ @sheet.format_dates!
107
+ # 6 dates = 2 new formats across them:
108
+ assert_equal 6, @book.formats.length
109
+
110
+ end
79
111
  end
80
112
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spreadsheet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.7.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-05-08 00:00:00.000000000 Z
12
+ date: 2012-06-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ruby-ole
16
- requirement: &18163460 !ruby/object:Gem::Requirement
16
+ requirement: &8107060 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '1.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *18163460
24
+ version_requirements: *8107060
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rdoc
27
- requirement: &18162320 !ruby/object:Gem::Requirement
27
+ requirement: &8106340 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '3.10'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *18162320
35
+ version_requirements: *8106340
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: hoe
38
- requirement: &18161240 !ruby/object:Gem::Requirement
38
+ requirement: &8105620 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: '2.13'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *18161240
46
+ version_requirements: *8105620
47
47
  description: ! 'The Spreadsheet Library is designed to read and write Spreadsheet
48
48
  Documents.
49
49