spreadsheet 0.6.1.5 → 0.6.1.6

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,4 +1,19 @@
1
- === 0.6.1.4 / 2008-10-24
1
+ === 0.6.1.6 / 2008-10-28
2
+
3
+ * 2 Bugfixes
4
+
5
+ * Fixed encoding and decoding of BigNums, negative and other large Numbers
6
+ http://rubyforge.org/tracker/index.php?func=detail&aid=22581&group_id=678&atid=2677
7
+ * Fix a bug where modifications to default columns weren't stored
8
+ http://rubyforge.org/forum/message.php?msg_id=61567
9
+
10
+ * 1 minor enhancement
11
+
12
+ * Row#enriched_data won't return a Bogus-Date if the data isn't a Numeric
13
+ value
14
+ (Thanks to Bjørn Hjelle for the report)
15
+
16
+ === 0.6.1.5 / 2008-10-24
2
17
 
3
18
  * 2 Bugfixes
4
19
 
data/lib/spreadsheet.rb CHANGED
@@ -42,7 +42,7 @@ module Spreadsheet
42
42
 
43
43
  ##
44
44
  # The version of Spreadsheet you are using.
45
- VERSION = '0.6.1.5'
45
+ VERSION = '0.6.1.6'
46
46
 
47
47
  ##
48
48
  # Default client Encoding. Change this value if your application uses a
@@ -17,12 +17,27 @@ module Spreadsheet
17
17
  # #collapsed:: The Column is collapsed.
18
18
  # #outline_level:: Outline level of the column.
19
19
  class Column
20
+ class << self
21
+ def updater *keys
22
+ keys.each do |key|
23
+ unless instance_methods.include? "unupdated_#{key}="
24
+ alias_method :"unupdated_#{key}=", :"#{key}="
25
+ define_method "#{key}=" do |value|
26
+ send "unupdated_#{key}=", value
27
+ @worksheet.column_updated @idx, self if @worksheet
28
+ value
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
20
34
  include Datatypes
21
35
  include Enumerable
22
36
  attr_accessor :width, :worksheet
23
37
  attr_reader :default_format, :idx
24
38
  boolean :hidden, :collapsed
25
39
  enum :outline_level, 0, Integer
40
+ updater :width, :hidden, :outline_level
26
41
  def initialize idx, format, opts={}
27
42
  @idx = idx
28
43
  opts[:width] ||= 10
@@ -36,6 +51,8 @@ module Spreadsheet
36
51
  def default_format= format
37
52
  @worksheet.add_format format if @worksheet
38
53
  @default_format = format
54
+ @worksheet.column_updated @idx, self if @worksheet
55
+ format
39
56
  end
40
57
  ##
41
58
  # Iterate over all cells in this column.
@@ -54,13 +54,12 @@ class Reader
54
54
  integer &= 0xfffffffc
55
55
  value, = ("\0\0\0\0" << [integer].pack('V')).unpack EIGHT_BYTE_DOUBLE
56
56
  else
57
+ ## I can't find a format for unpacking a little endian signed integer.
58
+ # 'V' works for packing, but not for unpacking. But the following works
59
+ # fine afaics:
60
+ unsigned, = (@bigendian ? work.reverse : work).unpack 'l'
57
61
  ## remove two bits
58
- unsigned, = work.unpack 'V'
59
- unsigned = unsigned >> 2
60
- shifted = [unsigned].pack 'V'
61
- ## I can't find a format for unpacking a little endian signed integer
62
- shifted.reverse! if @bigendian
63
- value, = shifted.unpack 'l'
62
+ value = unsigned >> 2
64
63
  end
65
64
  if cent == 1
66
65
  value /= 100.0
@@ -621,11 +620,7 @@ class Reader
621
620
  # 2 2 Index to column
622
621
  # 4 2 Index to XF record (➜ 6.115)
623
622
  # 6 8 IEEE 754 floating-point value (64-bit double precision)
624
- row, column, xf, value = work.unpack 'v3E'
625
- unless value
626
- # on architectures where sizeof(double) > 8
627
- value, = work.unpack 'x6e'
628
- end
623
+ row, column, xf, value = work.unpack binfmt(:number)
629
624
  set_cell worksheet, row, column, xf, value
630
625
  end
631
626
  def read_rk worksheet, addr, work
@@ -55,7 +55,7 @@ class Row < Spreadsheet::Row
55
55
  res = nil
56
56
  if link = @worksheet.links[[@idx, idx]]
57
57
  res = link
58
- elsif fmt = format(idx)
58
+ elsif data.is_a?(Numeric) && fmt = format(idx)
59
59
  res = if fmt.datetime? || fmt.time?
60
60
  _datetime data
61
61
  elsif fmt.date?
@@ -66,10 +66,8 @@ class Worksheet
66
66
  cent = 1
67
67
  end
68
68
  if value.is_a?(Integer)
69
- shifted = [value].pack 'l'
70
- ## I can't find a format for packing a little endian signed integer
71
- shifted.reverse! if @bigendian
72
- value, = shifted.unpack 'V'
69
+ ## although not documented as signed, 'V' appears to correctly pack
70
+ # negative numbers.
73
71
  value <<= 2
74
72
  else
75
73
  # FIXME: precision of small numbers
@@ -172,8 +170,13 @@ class Worksheet
172
170
  multiples, first_idx = nil
173
171
  row.each_with_index do |cell, idx|
174
172
  cell = nil if cell == ''
175
- number = cell.is_a?(Float) && cell.to_s.length > 5
176
- if multiples && (!multiples.last.is_a?(cell.class) || number)
173
+ ## it appears that there are limitations to RK precision, both for
174
+ # Integers and Floats, that lie well below 2^30 significant bits, or
175
+ # Ruby's Bignum threshold. In that case we'll just write a Number
176
+ # record
177
+ need_number = (cell.is_a?(Float) && cell.to_s.length > 5) \
178
+ || (cell.is_a?(Numeric) && cell.abs > 0x500000)
179
+ if multiples && (!multiples.last.is_a?(cell.class) || need_number)
177
180
  write_multiples row, first_idx, multiples
178
181
  multiples, first_idx = nil
179
182
  end
@@ -197,7 +200,7 @@ class Worksheet
197
200
  # 10^9. Not sure what is a good rule of thumb here, but it seems that
198
201
  # Decimal Numbers with more than 4 significant digits are not represented
199
202
  # with sufficient precision by RK
200
- if number
203
+ if need_number
201
204
  write_number row, idx
202
205
  elsif multiples
203
206
  multiples.push cell
@@ -54,6 +54,9 @@ module Spreadsheet
54
54
  def column_count
55
55
  dimensions[3] - dimensions[2]
56
56
  end
57
+ def column_updated idx, column
58
+ @columns[idx] = column
59
+ end
57
60
  ##
58
61
  # Delete the Row at _idx_ (0-based) from this Worksheet.
59
62
  def delete_row idx
data/test/integration.rb CHANGED
@@ -1062,5 +1062,24 @@ module Spreadsheet
1062
1062
  sheet.name
1063
1063
  assert_not_nil sheet.offset
1064
1064
  end
1065
+ def test_bignum
1066
+ smallnum = 0x500000
1067
+ bignum = smallnum + 1
1068
+ book = Spreadsheet::Workbook.new
1069
+ sheet = book.create_worksheet
1070
+ sheet[0,0] = bignum
1071
+ sheet[1,0] = -bignum
1072
+ sheet[0,1] = smallnum
1073
+ sheet[1,1] = -smallnum
1074
+ path = File.join @var, 'test_big-number.xls'
1075
+ book.write path
1076
+ assert_nothing_raised do
1077
+ book = Spreadsheet.open path
1078
+ end
1079
+ assert_equal bignum, book.worksheet(0)[0,0]
1080
+ assert_equal -bignum, book.worksheet(0)[1,0]
1081
+ assert_equal smallnum, book.worksheet(0)[0,1]
1082
+ assert_equal -smallnum, book.worksheet(0)[1,1]
1083
+ end
1065
1084
  end
1066
1085
  end
data/test/worksheet.rb CHANGED
@@ -4,12 +4,13 @@
4
4
  $: << File.expand_path('../lib', File.dirname(__FILE__))
5
5
 
6
6
  require 'test/unit'
7
- require 'spreadsheet/worksheet'
7
+ require 'spreadsheet'
8
8
 
9
9
  module Spreadsheet
10
10
  class TestWorksheet < Test::Unit::TestCase
11
11
  def setup
12
- @sheet = Worksheet.new
12
+ @book = Workbook.new
13
+ @sheet = @book.create_worksheet
13
14
  end
14
15
  def test_cell_writer
15
16
  assert_nil @sheet[0,0]
@@ -58,5 +59,14 @@ module Spreadsheet
58
59
  @sheet.replace_row 3
59
60
  assert_equal 4, @sheet.row_count
60
61
  end
62
+ def test_modify_column
63
+ assert_equal 10, @sheet.column(0).width
64
+ @sheet.column(1).width = 20
65
+ assert_equal 10, @sheet.column(0).width
66
+ assert_equal 20, @sheet.column(1).width
67
+ @sheet.column(0).width = 30
68
+ assert_equal 30, @sheet.column(0).width
69
+ assert_equal 20, @sheet.column(1).width
70
+ end
61
71
  end
62
72
  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.6.1.5
4
+ version: 0.6.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hannes Wyss
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-10-24 00:00:00 +02:00
12
+ date: 2008-10-28 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency