spreadsheet 0.6.9 → 0.7.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.
data/History.txt CHANGED
@@ -1,3 +1,13 @@
1
+ === 0.7.0 / 07.05.2012
2
+
3
+ * Author: Artem Ignatiev <zazubrik@gmail.com>
4
+ * use both ruby 1.8 and 1.9 compatible way of getting character code when hashing
5
+ * Fix syntax for ruby-1.9
6
+ * return gemspec so that bundler can find it
7
+ When bundler loads gemspec, it evaluates it, and if the return value is
8
+ not a gem specification built, refuses to load the gem.
9
+ * Testing worksheet protection
10
+
1
11
  === 0.6.9 / 28.04.2012
2
12
 
3
13
  * Yield is more simple here too.
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.9'
45
+ VERSION = '0.7.0'
46
46
 
47
47
  ##
48
48
  # Default client Encoding. Change this value if your application uses a
@@ -866,6 +866,8 @@ class Reader
866
866
  read_window2 worksheet, work, pos, len
867
867
  when :mergedcells # ○○ MERGEDCELLS ➜ 5.67
868
868
  read_merged_cells worksheet, work, pos, len
869
+ when :protect, :password
870
+ read_sheet_protection worksheet, op, work
869
871
  else
870
872
  if ROW_BLOCK_OPS.include?(op)
871
873
  set_missing_row_address worksheet, work, pos, len
@@ -1063,6 +1065,14 @@ class Reader
1063
1065
  fmt.pattern_bg_color = COLOR_CODES[xf_pattern & 0x3f80] || :pattern_bg
1064
1066
  @workbook.add_format fmt
1065
1067
  end
1068
+ def read_sheet_protection worksheet, op, data
1069
+ case op
1070
+ when :protect
1071
+ worksheet.protect! if data.unpack('v').first == 1
1072
+ when :password
1073
+ worksheet.password_hash = data.unpack('v').first
1074
+ end
1075
+ end
1066
1076
  def set_cell worksheet, row, column, xf, value=nil
1067
1077
  cells = @current_row_block[[worksheet, row]] ||= Row.new(nil, row)
1068
1078
  cells.formats[column] = @workbook.format(xf) unless xf == 0
@@ -471,6 +471,7 @@ and minimal code that generates this warning. Thanks!
471
471
  write_wsbool
472
472
  # ○ Page Settings Block ➜ 4.4
473
473
  # ○ Worksheet Protection Block ➜ 4.18
474
+ write_proctection
474
475
  # ○ DEFCOLWIDTH ➜ 5.32
475
476
  write_defcolwidth
476
477
  # ○○ COLINFO ➜ 5.18
@@ -856,6 +857,16 @@ and minimal code that generates this warning. Thanks!
856
857
  end
857
858
  end
858
859
 
860
+ def write_proctection
861
+ return unless @worksheet.protected?
862
+ # ○ PROTECT Worksheet contents: 1 = protected (➜ 5.82)
863
+ write_op opcode(:protect), [1].pack('v')
864
+ # ○ OBJECTPROTECT Embedded objects: 1 = protected (➜ 5.72)
865
+ # ○ SCENPROTECT Scenarios: 1 = protected (➜ 5.91)
866
+ # ○ PASSWORD Hash value of the password; 0 = no password (➜ 5.76)
867
+ write_op opcode(:password), [@worksheet.password_hash].pack('v')
868
+ end
869
+
859
870
  def write_wsbool
860
871
  bits = [
861
872
  # Bit Mask Contents
@@ -2,6 +2,7 @@ require 'date'
2
2
  require 'spreadsheet/column'
3
3
  require 'spreadsheet/encodings'
4
4
  require 'spreadsheet/row'
5
+ require 'spreadsheet/excel/password_hash'
5
6
 
6
7
  module Spreadsheet
7
8
  ##
@@ -26,7 +27,7 @@ module Spreadsheet
26
27
  class Worksheet
27
28
  include Spreadsheet::Encodings
28
29
  include Enumerable
29
- attr_accessor :name, :selected, :workbook
30
+ attr_accessor :name, :selected, :workbook, :password_hash
30
31
  attr_reader :rows, :columns, :merged_cells
31
32
  def initialize opts={}
32
33
  @default_format = nil
@@ -38,6 +39,8 @@ module Spreadsheet
38
39
  @columns = []
39
40
  @links = {}
40
41
  @merged_cells = []
42
+ @protected = false
43
+ @password_hash = 0
41
44
  end
42
45
  def active # :nodoc:
43
46
  warn "Worksheet#active is deprecated. Please use Worksheet#selected instead."
@@ -92,6 +95,23 @@ module Spreadsheet
92
95
  add_format format
93
96
  format
94
97
  end
98
+ ##
99
+ # Is the worksheet protected?
100
+ def protected?
101
+ @protected
102
+ end
103
+ ##
104
+ # Set worklist protection
105
+ def protect! password = ''
106
+ @protected = true
107
+ password = password.to_s
108
+ if password.size == 0
109
+ @password_hash = 0
110
+ else
111
+ @password_hash = Excel::Password.password_hash password
112
+ end
113
+ end
114
+
95
115
  ##
96
116
  # Dimensions:: [ first used row, first unused row,
97
117
  # first used column, first unused column ]
data/spreadsheet.gemspec CHANGED
@@ -3,7 +3,7 @@ require "rake"
3
3
 
4
4
  spec = Gem::Specification.new do |s|
5
5
  s.name = "spreadsheet"
6
- s.version = "0.6.7"
6
+ s.version = "0.7.0"
7
7
  s.summary = "The Spreadsheet Library is designed to read and write Spreadsheet Documents"
8
8
  s.description = "As of version 0.6.0, only Microsoft Excel compatible spreadsheets are supported"
9
9
  s.author = "Masaomi Hatakeyama, Zeno R.R. Davatz"
@@ -19,4 +19,6 @@ end
19
19
  if $0 == __FILE__
20
20
  Gem.manage_gems
21
21
  Gem::Builder.new(spec).build
22
+ else
23
+ spec
22
24
  end
data/test/integration.rb CHANGED
@@ -1310,6 +1310,32 @@ module Spreadsheet
1310
1310
  book.write StringIO.new("", "w+")
1311
1311
  end
1312
1312
  end
1313
+
1314
+ def test_read_protected_sheet
1315
+ path = File.join @data, "test_merged_and_protected.xls"
1316
+ book = Spreadsheet.open path
1317
+ sheet = book.worksheet(0)
1318
+ sheet.ensure_rows_read # FIXME HACK
1319
+ assert sheet.protected?, "Expected sheet to be protected"
1320
+ assert_equal Spreadsheet::Excel::Password.password_hash('testing'), sheet.password_hash
1321
+ end
1322
+
1323
+ def test_write_protected_sheet
1324
+ path = File.join @var, 'test_protected.xls'
1325
+ book = Spreadsheet::Workbook.new
1326
+ sheet = book.create_worksheet
1327
+ sheet.protect! 'secret'
1328
+ assert_nothing_raised do
1329
+ book.write path
1330
+ end
1331
+
1332
+ read_back = Spreadsheet.open path
1333
+ sheet = read_back.worksheet(0)
1334
+ sheet.ensure_rows_read # FIXME HACK
1335
+ assert sheet.protected?, "Expected sheet to be proteced"
1336
+ assert_equal Spreadsheet::Excel::Password.password_hash('secret'), sheet.password_hash
1337
+ end
1338
+
1313
1339
  =begin
1314
1340
  def test_read_baltic
1315
1341
  path = File.join @data, 'test_baltic.xls'
metadata CHANGED
@@ -1,86 +1,71 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: spreadsheet
3
- version: !ruby/object:Gem::Version
4
- hash: 21
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.7.0
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 6
9
- - 9
10
- version: 0.6.9
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Masaomi Hatakeyama, Zeno R.R. Davatz
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2012-04-28 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2012-05-07 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: ruby-ole
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &11528100 !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- hash: 15
29
- segments:
30
- - 1
31
- - 0
32
- version: "1.0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '1.0'
33
22
  type: :runtime
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: rdoc
37
23
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *11528100
25
+ - !ruby/object:Gem::Dependency
26
+ name: rdoc
27
+ requirement: &11525080 !ruby/object:Gem::Requirement
39
28
  none: false
40
- requirements:
29
+ requirements:
41
30
  - - ~>
42
- - !ruby/object:Gem::Version
43
- hash: 19
44
- segments:
45
- - 3
46
- - 10
47
- version: "3.10"
31
+ - !ruby/object:Gem::Version
32
+ version: '3.10'
48
33
  type: :development
49
- version_requirements: *id002
50
- - !ruby/object:Gem::Dependency
51
- name: hoe
52
34
  prerelease: false
53
- requirement: &id003 !ruby/object:Gem::Requirement
35
+ version_requirements: *11525080
36
+ - !ruby/object:Gem::Dependency
37
+ name: hoe
38
+ requirement: &11523960 !ruby/object:Gem::Requirement
54
39
  none: false
55
- requirements:
40
+ requirements:
56
41
  - - ~>
57
- - !ruby/object:Gem::Version
58
- hash: 25
59
- segments:
60
- - 2
61
- - 13
62
- version: "2.13"
42
+ - !ruby/object:Gem::Version
43
+ version: '2.13'
63
44
  type: :development
64
- version_requirements: *id003
65
- description: |-
66
- The Spreadsheet Library is designed to read and write Spreadsheet Documents.
45
+ prerelease: false
46
+ version_requirements: *11523960
47
+ description: ! 'The Spreadsheet Library is designed to read and write Spreadsheet
48
+ Documents.
49
+
67
50
  As of version 0.6.0, only Microsoft Excel compatible spreadsheets are
51
+
68
52
  supported. Spreadsheet is a combination/complete rewrite of the
53
+
69
54
  Spreadsheet::Excel Library by Daniel J. Berger and the ParseExcel Library by
70
- Hannes Wyss. Spreadsheet can read, write and modify Spreadsheet Documents.
71
- email:
55
+
56
+ Hannes Wyss. Spreadsheet can read, write and modify Spreadsheet Documents.'
57
+ email:
72
58
  - mhatakeyama@ywesee.com, zdavatz@ywesee.com
73
- executables:
59
+ executables:
74
60
  - xlsopcodes
75
61
  extensions: []
76
-
77
- extra_rdoc_files:
62
+ extra_rdoc_files:
78
63
  - GUIDE.txt
79
64
  - History.txt
80
65
  - LICENSE.txt
81
66
  - Manifest.txt
82
67
  - README.txt
83
- files:
68
+ files:
84
69
  - .gitignore
85
70
  - GUIDE.txt
86
71
  - History.txt
@@ -150,37 +135,28 @@ files:
150
135
  - .gemtest
151
136
  homepage: http://spreadsheet.rubyforge.org
152
137
  licenses: []
153
-
154
138
  post_install_message:
155
- rdoc_options:
139
+ rdoc_options:
156
140
  - --main
157
141
  - README.txt
158
- require_paths:
142
+ require_paths:
159
143
  - lib
160
- required_ruby_version: !ruby/object:Gem::Requirement
144
+ required_ruby_version: !ruby/object:Gem::Requirement
161
145
  none: false
162
- requirements:
163
- - - ">="
164
- - !ruby/object:Gem::Version
165
- hash: 3
166
- segments:
167
- - 0
168
- version: "0"
169
- required_rubygems_version: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ required_rubygems_version: !ruby/object:Gem::Requirement
170
151
  none: false
171
- requirements:
172
- - - ">="
173
- - !ruby/object:Gem::Version
174
- hash: 3
175
- segments:
176
- - 0
177
- version: "0"
152
+ requirements:
153
+ - - ! '>='
154
+ - !ruby/object:Gem::Version
155
+ version: '0'
178
156
  requirements: []
179
-
180
157
  rubyforge_project: spreadsheet
181
158
  rubygems_version: 1.8.15
182
159
  signing_key:
183
160
  specification_version: 3
184
161
  summary: The Spreadsheet Library is designed to read and write Spreadsheet Documents
185
162
  test_files: []
186
-