robust_excel_ole 1.0.2 → 1.0.3
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/Changelog +2 -0
- data/README.rdoc +1 -0
- data/README_detail.rdoc +1 -0
- data/lib/robust_excel_ole/book.rb +8 -19
- data/lib/robust_excel_ole/bookstore.rb +3 -1
- data/lib/robust_excel_ole/excel.rb +5 -16
- data/lib/robust_excel_ole/reo_common.rb +0 -8
- data/lib/robust_excel_ole/sheet.rb +1 -9
- data/lib/robust_excel_ole/version.rb +1 -1
- data/spec/book_specs/book_misc_spec.rb +31 -0
- data/spec/book_specs/book_open_spec.rb +12 -0
- data/spec/bookstore_spec.rb +79 -36
- data/spec/data/workbook.xls +0 -0
- data/spec/excel_spec.rb +127 -0
- data/spec/general_spec.rb +35 -1
- data/spec/reo_common_spec.rb +22 -0
- metadata +4 -4
data/Changelog
CHANGED
data/README.rdoc
CHANGED
data/README_detail.rdoc
CHANGED
@@ -126,8 +126,9 @@ module RobustExcelOle
|
|
126
126
|
return book
|
127
127
|
end
|
128
128
|
end
|
129
|
+
else
|
130
|
+
super
|
129
131
|
end
|
130
|
-
super
|
131
132
|
end
|
132
133
|
|
133
134
|
# creates a new Book object, if a file name is given
|
@@ -343,7 +344,7 @@ module RobustExcelOle
|
|
343
344
|
# for Excel2007: for option :if_unsaved => :alert and user cancels: this error appears?
|
344
345
|
# if yes: distinguish these events
|
345
346
|
#raise
|
346
|
-
trace "WIN32OLERuntimeError: #{msg.message}"
|
347
|
+
# trace "WIN32OLERuntimeError: #{msg.message}"
|
347
348
|
end
|
348
349
|
begin
|
349
350
|
# workaround for bug in Excel 2010: workbook.Open does not always return the workbook when given file name
|
@@ -437,8 +438,8 @@ module RobustExcelOle
|
|
437
438
|
else
|
438
439
|
close_workbook
|
439
440
|
end
|
440
|
-
trace "close: canceled by user" if alive? &&
|
441
|
-
|
441
|
+
#trace "close: canceled by user" if alive? &&
|
442
|
+
# (opts[:if_unsaved] == :alert || opts[:if_unsaved] == :excel) && (not @ole_workbook.Saved)
|
442
443
|
end
|
443
444
|
|
444
445
|
private
|
@@ -645,7 +646,7 @@ module RobustExcelOle
|
|
645
646
|
bookstore.store(self)
|
646
647
|
rescue WIN32OLERuntimeError => msg
|
647
648
|
if msg.message =~ /SaveAs/ and msg.message =~ /Workbook/ then
|
648
|
-
trace "save: canceled by user" if options[:if_exists] == :alert || options[:if_exists] == :excel
|
649
|
+
# trace "save: canceled by user" if options[:if_exists] == :alert || options[:if_exists] == :excel
|
649
650
|
# another possible semantics. raise WorkbookError, "could not save Workbook"
|
650
651
|
else
|
651
652
|
raise UnexpectedError, "unknown WIN32OELERuntimeError:\n#{msg.message}"
|
@@ -686,11 +687,7 @@ module RobustExcelOle
|
|
686
687
|
after_or_before, base_sheet = opts.to_a.first || [:after, last_sheet]
|
687
688
|
sheet.Copy({ after_or_before.to_s => base_sheet.worksheet })
|
688
689
|
new_sheet = sheet_class.new(@excel.Activesheet)
|
689
|
-
|
690
|
-
new_sheet.name = new_sheet_name if new_sheet_name
|
691
|
-
rescue WIN32OLERuntimeError => msg
|
692
|
-
msg.message =~ /800A03EC/ ? raise(NameAlreadyExists, "sheet name already exists") : raise(UnexpectedError)
|
693
|
-
end
|
690
|
+
new_sheet.name = new_sheet_name if new_sheet_name
|
694
691
|
new_sheet
|
695
692
|
end
|
696
693
|
|
@@ -707,11 +704,7 @@ module RobustExcelOle
|
|
707
704
|
after_or_before, base_sheet = opts.to_a.first || [:after, last_sheet]
|
708
705
|
@ole_workbook.Worksheets.Add({ after_or_before.to_s => base_sheet.worksheet })
|
709
706
|
new_sheet = sheet_class.new(@excel.Activesheet)
|
710
|
-
|
711
|
-
new_sheet.name = new_sheet_name if new_sheet_name
|
712
|
-
rescue WIN32OLERuntimeError => msg
|
713
|
-
msg.message =~ /800A03EC/ ? raise(NameAlreadyExists, "sheet name already exists") : raise(UnexpectedError)
|
714
|
-
end
|
707
|
+
new_sheet.name = new_sheet_name if new_sheet_name
|
715
708
|
new_sheet
|
716
709
|
end
|
717
710
|
|
@@ -909,10 +902,6 @@ module RobustExcelOle
|
|
909
902
|
self.class.bookstore
|
910
903
|
end
|
911
904
|
|
912
|
-
def self.all_books # :nodoc: #
|
913
|
-
bookstore.books
|
914
|
-
end
|
915
|
-
|
916
905
|
def to_s # :nodoc: #
|
917
906
|
"#{self.filename}"
|
918
907
|
end
|
@@ -100,6 +100,8 @@ module RobustExcelOle
|
|
100
100
|
@hidden_excel_instance.__getobj__ if (@hidden_excel_instance && @hidden_excel_instance.weakref_alive? && @hidden_excel_instance.__getobj__.alive?)
|
101
101
|
end
|
102
102
|
|
103
|
+
public
|
104
|
+
|
103
105
|
# prints the book store
|
104
106
|
def print # :nodoc: #
|
105
107
|
trace "@filename2books:"
|
@@ -113,7 +115,7 @@ module RobustExcelOle
|
|
113
115
|
books.each do |book|
|
114
116
|
if book.weakref_alive?
|
115
117
|
trace "#{book}"
|
116
|
-
else
|
118
|
+
else # this should never happen
|
117
119
|
trace "weakref not alive"
|
118
120
|
end
|
119
121
|
end
|
@@ -94,8 +94,6 @@ module RobustExcelOle
|
|
94
94
|
result.calculation = options[:calculation] unless options[:calculation].nil?
|
95
95
|
result.screenupdating = options[:screenupdating] unless options[:screenupdating].nil?
|
96
96
|
result.created = !reused
|
97
|
-
rescue WIN32OLERuntimeError
|
98
|
-
raise ExcelError, "cannot access Excel"
|
99
97
|
end
|
100
98
|
end
|
101
99
|
result
|
@@ -104,10 +102,6 @@ module RobustExcelOle
|
|
104
102
|
def initialize(options= {}) # :nodoc: #
|
105
103
|
end
|
106
104
|
|
107
|
-
def excel
|
108
|
-
self
|
109
|
-
end
|
110
|
-
|
111
105
|
# reopens a closed Excel instance
|
112
106
|
# @param [Hash] opts the options
|
113
107
|
# @option opts [Boolean] :reopen_workbooks
|
@@ -177,15 +171,10 @@ module RobustExcelOle
|
|
177
171
|
end
|
178
172
|
|
179
173
|
def self.contains_unsaved_workbooks?
|
180
|
-
|
181
|
-
Excel.current
|
182
|
-
rescue
|
183
|
-
return false
|
184
|
-
end
|
185
|
-
not excel.unsaved_workbooks.empty?
|
174
|
+
not Excel.current.unsaved_workbooks.empty?
|
186
175
|
end
|
187
176
|
|
188
|
-
# returns unsaved workbooks
|
177
|
+
# returns unsaved workbooks (win32ole objects)
|
189
178
|
def unsaved_workbooks
|
190
179
|
unsaved_workbooks = []
|
191
180
|
begin
|
@@ -470,7 +459,7 @@ module RobustExcelOle
|
|
470
459
|
|
471
460
|
|
472
461
|
# returns unsaved workbooks in known (not opened by user) Excel instances
|
473
|
-
def self.unsaved_known_workbooks
|
462
|
+
def self.unsaved_known_workbooks # :nodoc: #
|
474
463
|
result = []
|
475
464
|
@@hwnd2excel.each do |hwnd,wr_excel|
|
476
465
|
excel = wr_excel.__getobj__ if wr_excel.weakref_alive?
|
@@ -479,12 +468,12 @@ module RobustExcelOle
|
|
479
468
|
result
|
480
469
|
end
|
481
470
|
|
482
|
-
def print_workbooks
|
471
|
+
def print_workbooks # :nodoc: #
|
483
472
|
self.Workbooks.each {|w| trace "#{w.Name} #{w}"}
|
484
473
|
end
|
485
474
|
|
486
475
|
# generates, saves, and closes empty workbook
|
487
|
-
def generate_workbook file_name
|
476
|
+
def generate_workbook file_name # :nodoc: #
|
488
477
|
raise FileNameNotGiven, "filename is nil" if file_name.nil?
|
489
478
|
self.Workbooks.Add
|
490
479
|
empty_workbook = self.Workbooks.Item(self.Workbooks.Count)
|
@@ -14,10 +14,6 @@ class REOCommon
|
|
14
14
|
(self.methods - Object.methods).sort
|
15
15
|
end
|
16
16
|
|
17
|
-
def trace(text)
|
18
|
-
self.class.trace(text)
|
19
|
-
end
|
20
|
-
|
21
17
|
def self.tr1(text)
|
22
18
|
puts :text
|
23
19
|
end
|
@@ -39,10 +35,6 @@ class REOCommon
|
|
39
35
|
end
|
40
36
|
end
|
41
37
|
|
42
|
-
def puts_hash(hash)
|
43
|
-
self.class.puts_hash(hash)
|
44
|
-
end
|
45
|
-
|
46
38
|
def self.puts_hash(hash)
|
47
39
|
hash.each do |e|
|
48
40
|
if e[1].is_a?(Hash)
|
@@ -230,19 +230,11 @@ module RobustExcelOle
|
|
230
230
|
self.Names.Add("Name" => name, "RefersToR1C1" => "=" + address)
|
231
231
|
end
|
232
232
|
rescue WIN32OLERuntimeError => msg
|
233
|
-
trace "WIN32OLERuntimeError: #{msg.message}"
|
233
|
+
#trace "WIN32OLERuntimeError: #{msg.message}"
|
234
234
|
raise RangeNotEvaluatable, "cannot add name #{name.inspect} to cell with row #{row.inspect} and column #{column.inspect}"
|
235
235
|
end
|
236
236
|
end
|
237
237
|
|
238
|
-
def respond_to?(name, include_private = false) # :nodoc: #
|
239
|
-
super
|
240
|
-
end
|
241
|
-
|
242
|
-
def methods # :nodoc: #
|
243
|
-
super
|
244
|
-
end
|
245
|
-
|
246
238
|
def self.book_class # :nodoc: #
|
247
239
|
@book_class ||= begin
|
248
240
|
module_name = self.parent_name
|
@@ -47,6 +47,37 @@ describe Book do
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
+
describe "excel_of" do
|
51
|
+
|
52
|
+
before do
|
53
|
+
@book = Book.open(@simple_file)
|
54
|
+
end
|
55
|
+
|
56
|
+
after do
|
57
|
+
@book.close
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should access the excel" do
|
61
|
+
workbook = @book.ole_workbook
|
62
|
+
excel = Book.excel_of(workbook)
|
63
|
+
excel.should be_a Excel
|
64
|
+
excel.should == @book.excel
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should access the Excel of the ole_excel" do
|
68
|
+
excel = Book.excel_of(@book.excel.ole_excel)
|
69
|
+
excel.should be_a Excel
|
70
|
+
excel.should == @book.excel
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should access the Excel of a Book" do
|
74
|
+
excel = Book.excel_of(@book)
|
75
|
+
excel.should be_a Excel
|
76
|
+
excel.should == @book.excel
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
50
81
|
describe "with retain_saved" do
|
51
82
|
|
52
83
|
before do
|
@@ -1364,6 +1364,12 @@ describe Book do
|
|
1364
1364
|
old_book.close
|
1365
1365
|
end
|
1366
1366
|
|
1367
|
+
it "should close the old book and open the new book, if :if_obstructed is :close_if_saved" do
|
1368
|
+
@book.close(:if_unsaved => :forget)
|
1369
|
+
book = Book.open(@simple_file_other_path)
|
1370
|
+
Book.open(@simple_file1, :if_obstructed => :close_if_saved)
|
1371
|
+
end
|
1372
|
+
|
1367
1373
|
it "should open the book in a new excel instance, if :if_obstructed is :new_excel" do
|
1368
1374
|
@new_book = Book.open(@simple_file1, :if_obstructed => :new_excel)
|
1369
1375
|
@book.should be_alive
|
@@ -1630,6 +1636,12 @@ describe Book do
|
|
1630
1636
|
book.should be_a Book
|
1631
1637
|
end
|
1632
1638
|
end
|
1639
|
+
it 'block parameter should be instance of Book for new' do
|
1640
|
+
Book.new(@simple_file) do |book|
|
1641
|
+
book.should be_a Book
|
1642
|
+
end
|
1643
|
+
end
|
1644
|
+
|
1633
1645
|
end
|
1634
1646
|
|
1635
1647
|
context "with WIN32OLE#GetAbsolutePathName" do
|
data/spec/bookstore_spec.rb
CHANGED
@@ -51,6 +51,8 @@ describe Bookstore do
|
|
51
51
|
@simple_save_file = @dir + '/workbook_save.xls'
|
52
52
|
@different_file = @dir + '/different_workbook.xls'
|
53
53
|
@simple_file_other_path = @dir + '/more_data/workbook.xls'
|
54
|
+
@simple_file1 = @simple_file
|
55
|
+
@different_file1 = @different_file
|
54
56
|
end
|
55
57
|
|
56
58
|
after do
|
@@ -78,8 +80,8 @@ describe Bookstore do
|
|
78
80
|
|
79
81
|
describe "Mock-Test" do
|
80
82
|
it "should never store any book" do
|
81
|
-
b1 = Book.open(@
|
82
|
-
b2 = Book.open(@
|
83
|
+
b1 = Book.open(@simple_file1)
|
84
|
+
b2 = Book.open(@simple_file1)
|
83
85
|
b2.object_id.should_not == b1.object_id
|
84
86
|
end
|
85
87
|
end
|
@@ -108,8 +110,8 @@ describe Bookstore do
|
|
108
110
|
|
109
111
|
it "should fetch one book several times" do
|
110
112
|
@bookstore.store(@book)
|
111
|
-
book1 = @bookstore.fetch(@
|
112
|
-
book2 = @bookstore.fetch(@
|
113
|
+
book1 = @bookstore.fetch(@simple_file1)
|
114
|
+
book2 = @bookstore.fetch(@simple_file1)
|
113
115
|
expect(book1).to be_a Book
|
114
116
|
book1.should be_alive
|
115
117
|
book1.should == @book
|
@@ -161,10 +163,10 @@ describe Bookstore do
|
|
161
163
|
end
|
162
164
|
|
163
165
|
it "should store and open two different books" do
|
164
|
-
@book2 = Book.open(@
|
166
|
+
@book2 = Book.open(@different_file1)
|
165
167
|
@bookstore.store(@book2)
|
166
168
|
new_book = @bookstore.fetch(@simple_file)
|
167
|
-
new_book2 = @bookstore.fetch(@
|
169
|
+
new_book2 = @bookstore.fetch(@different_file1)
|
168
170
|
new_book.should be_a Book
|
169
171
|
new_book.should be_alive
|
170
172
|
new_book.should == @book
|
@@ -177,35 +179,35 @@ describe Bookstore do
|
|
177
179
|
end
|
178
180
|
|
179
181
|
it "should fetch the first, writable book" do
|
180
|
-
@book2 = Book.open(@
|
182
|
+
@book2 = Book.open(@simple_file1, :force_excel => :new)
|
181
183
|
@bookstore.store(@book2)
|
182
184
|
@book.ReadOnly.should be_false
|
183
185
|
@book2.ReadOnly.should be_true
|
184
|
-
new_book = @bookstore.fetch(@
|
186
|
+
new_book = @bookstore.fetch(@simple_file1)
|
185
187
|
new_book.should == @book
|
186
188
|
new_book.should_not == @book2
|
187
189
|
new_book.close
|
188
190
|
end
|
189
191
|
|
190
192
|
it "should fetch the last book with :prefer_writeable => false" do
|
191
|
-
@book2 = Book.open(@
|
193
|
+
@book2 = Book.open(@simple_file1, :force_excel => :new)
|
192
194
|
@bookstore.store(@book2)
|
193
195
|
@book.ReadOnly.should be_false
|
194
196
|
@book2.ReadOnly.should be_true
|
195
|
-
new_book = @bookstore.fetch(@
|
197
|
+
new_book = @bookstore.fetch(@simple_file1, :prefer_writable => false)
|
196
198
|
new_book.should_not == @book
|
197
199
|
new_book.should == @book2
|
198
200
|
new_book.close
|
199
201
|
end
|
200
202
|
|
201
203
|
it "should fetch the second, open book, if the first book is closed" do
|
202
|
-
@book2 = Book.open(@
|
204
|
+
@book2 = Book.open(@simple_file1, :force_excel => :new)
|
203
205
|
@bookstore.store(@book2)
|
204
206
|
@book.ReadOnly.should be_false
|
205
207
|
@book2.ReadOnly.should be_true
|
206
208
|
@book.close
|
207
|
-
new_book = @bookstore.fetch(@
|
208
|
-
new_book2 = @bookstore.fetch(@
|
209
|
+
new_book = @bookstore.fetch(@simple_file1, :prefer_writable => false)
|
210
|
+
new_book2 = @bookstore.fetch(@simple_file1)
|
209
211
|
new_book.should_not == @book
|
210
212
|
new_book2.should_not == @book
|
211
213
|
new_book.should == @book2
|
@@ -215,13 +217,13 @@ describe Bookstore do
|
|
215
217
|
end
|
216
218
|
|
217
219
|
it "should fetch the first, open book, if the second book is closed, even with :prefer_writeable => false" do
|
218
|
-
@book2 = Book.open(@
|
220
|
+
@book2 = Book.open(@simple_file1, :force_excel => :new)
|
219
221
|
@bookstore.store(@book2)
|
220
222
|
@book.ReadOnly.should be_false
|
221
223
|
@book2.ReadOnly.should be_true
|
222
224
|
@book2.close
|
223
|
-
new_book = @bookstore.fetch(@
|
224
|
-
new_book2 = @bookstore.fetch(@
|
225
|
+
new_book = @bookstore.fetch(@simple_file1, :prefer_writable => false)
|
226
|
+
new_book2 = @bookstore.fetch(@simple_file1)
|
225
227
|
new_book.should_not == @book2
|
226
228
|
new_book2.should_not == @book2
|
227
229
|
new_book.should == @book
|
@@ -245,13 +247,13 @@ describe Bookstore do
|
|
245
247
|
end
|
246
248
|
|
247
249
|
it "should fetch the second, writable book" do
|
248
|
-
@book2 = Book.open(@
|
250
|
+
@book2 = Book.open(@simple_file1, :force_excel => :new)
|
249
251
|
@bookstore.store(@book2)
|
250
252
|
@book.ReadOnly.should be_true
|
251
253
|
@book2.ReadOnly.should be_false
|
252
|
-
new_book = @bookstore.fetch(@
|
253
|
-
new_book2 = @bookstore.fetch(@
|
254
|
-
new_book3 = @bookstore.fetch(@
|
254
|
+
new_book = @bookstore.fetch(@simple_file1)
|
255
|
+
new_book2 = @bookstore.fetch(@simple_file1, :prefer_writable => true)
|
256
|
+
new_book3 = @bookstore.fetch(@simple_file1, :prefer_writable => false)
|
255
257
|
new_book.should == @book2
|
256
258
|
new_book2.should == @book2
|
257
259
|
new_book3.should == @book2
|
@@ -264,19 +266,19 @@ describe Bookstore do
|
|
264
266
|
end
|
265
267
|
|
266
268
|
it "should fetch the recent readonly book when there are only readonly books" do
|
267
|
-
@book2 = Book.open(@
|
269
|
+
@book2 = Book.open(@simple_file1, :force_excel => :new, :read_only => true)
|
268
270
|
@bookstore.store(@book2)
|
269
271
|
@book.ReadOnly.should be_true
|
270
272
|
@book2.ReadOnly.should be_true
|
271
|
-
new_book = @bookstore.fetch(@
|
273
|
+
new_book = @bookstore.fetch(@simple_file1)
|
272
274
|
new_book.should == @book2
|
273
275
|
new_book.should_not == @book
|
274
276
|
new_book.close
|
275
277
|
end
|
276
278
|
|
277
279
|
it "should fetch the second, writable book, if a writable, a readonly and an unsaved readonly book exist" do
|
278
|
-
@book2 = Book.open(@
|
279
|
-
@book3 = Book.open(@
|
280
|
+
@book2 = Book.open(@simple_file1, :force_excel => :new)
|
281
|
+
@book3 = Book.open(@simple_file1, :force_excel => :new)
|
280
282
|
@bookstore.store(@book2)
|
281
283
|
@bookstore.store(@book3)
|
282
284
|
sheet = @book3.sheet(1)
|
@@ -285,8 +287,8 @@ describe Bookstore do
|
|
285
287
|
@book2.ReadOnly.should be_false
|
286
288
|
@book3.ReadOnly.should be_true
|
287
289
|
@book3.Saved.should be_false
|
288
|
-
new_book = @bookstore.fetch(@
|
289
|
-
new_book2 = @bookstore.fetch(@
|
290
|
+
new_book = @bookstore.fetch(@simple_file1)
|
291
|
+
new_book2 = @bookstore.fetch(@simple_file1, :prefer_writable => false)
|
290
292
|
new_book.should == @book2
|
291
293
|
new_book2.should == @book3
|
292
294
|
new_book.should_not == @book
|
@@ -301,9 +303,10 @@ describe Bookstore do
|
|
301
303
|
context "with several closed books" do
|
302
304
|
|
303
305
|
before do
|
304
|
-
@book = Book.open(@
|
306
|
+
@book = Book.open(@simple_file1)
|
307
|
+
@bookstore.store(@book)
|
305
308
|
@bookstore.store(@book)
|
306
|
-
@book2 = Book.open(@
|
309
|
+
@book2 = Book.open(@simple_file1, :force_excel => :new)
|
307
310
|
@bookstore.store(@book2)
|
308
311
|
@book.close
|
309
312
|
@book2.close
|
@@ -341,13 +344,12 @@ describe Bookstore do
|
|
341
344
|
end
|
342
345
|
end
|
343
346
|
|
344
|
-
|
345
347
|
context "with given excel instance and fetching readonly" do
|
346
348
|
|
347
349
|
before do
|
348
|
-
@book = Book.open(@
|
350
|
+
@book = Book.open(@simple_file1)
|
349
351
|
@bookstore.store(@book)
|
350
|
-
@book2 = Book.open(@
|
352
|
+
@book2 = Book.open(@simple_file1, :force_excel => :new)
|
351
353
|
@bookstore.store(@book2)
|
352
354
|
end
|
353
355
|
|
@@ -391,23 +393,64 @@ describe Bookstore do
|
|
391
393
|
end
|
392
394
|
|
393
395
|
it "should have forgotten some books if they have no reference anymore" do
|
394
|
-
|
395
|
-
simple_file1 = @simple_file
|
396
|
-
book_new = Book.open(different_file1)
|
396
|
+
book_new = Book.open(@different_file1)
|
397
397
|
@bookstore.store(book_new)
|
398
398
|
@book = nil
|
399
399
|
@book = "Bla"
|
400
|
-
@book = Book.open(simple_file1)
|
400
|
+
@book = Book.open(@simple_file1)
|
401
401
|
@bookstore.store(@book)
|
402
402
|
@book = nil
|
403
403
|
GC.start
|
404
404
|
sleep 1
|
405
405
|
#@bookstore.fetch(simple_file1).should == nil
|
406
|
-
@bookstore.fetch(different_file1).should == book_new
|
406
|
+
@bookstore.fetch(@different_file1).should == book_new
|
407
407
|
end
|
408
408
|
end
|
409
409
|
end
|
410
410
|
|
411
|
+
describe "books" do
|
412
|
+
|
413
|
+
before do
|
414
|
+
@book = Book.open(@simple_file)
|
415
|
+
@bookstore.store(@book)
|
416
|
+
@book2 = Book.open(@different_file)
|
417
|
+
@bookstore.store(@book2)
|
418
|
+
end
|
419
|
+
|
420
|
+
after do
|
421
|
+
@book.close
|
422
|
+
@book2.close
|
423
|
+
end
|
424
|
+
|
425
|
+
it "should show books" do
|
426
|
+
expect{
|
427
|
+
@bookstore.books}.to_not raise_error
|
428
|
+
end
|
429
|
+
|
430
|
+
end
|
431
|
+
|
432
|
+
describe "print" do
|
433
|
+
|
434
|
+
before do
|
435
|
+
@book = Book.open(@simple_file)
|
436
|
+
@bookstore.store(@book)
|
437
|
+
@book2 = Book.open(@different_file)
|
438
|
+
@bookstore.store(@book2)
|
439
|
+
end
|
440
|
+
|
441
|
+
after do
|
442
|
+
@book.close
|
443
|
+
@book2.close
|
444
|
+
end
|
445
|
+
|
446
|
+
it "should print books" do
|
447
|
+
@bookstore.print
|
448
|
+
end
|
449
|
+
|
450
|
+
end
|
451
|
+
|
452
|
+
|
453
|
+
|
411
454
|
describe "hidden_excel" do
|
412
455
|
|
413
456
|
context "with some open book" do
|
data/spec/data/workbook.xls
CHANGED
Binary file
|
data/spec/excel_spec.rb
CHANGED
@@ -839,6 +839,94 @@ module RobustExcelOle
|
|
839
839
|
end
|
840
840
|
end
|
841
841
|
|
842
|
+
describe "unsaved_known_workbooks" do
|
843
|
+
|
844
|
+
it "should return empty list" do
|
845
|
+
Excel.unsaved_known_workbooks.should be_empty
|
846
|
+
end
|
847
|
+
|
848
|
+
it "should return empty list for first Excel instance" do
|
849
|
+
book = Book.open(@simple_file)
|
850
|
+
Excel.unsaved_known_workbooks.should == [[]]
|
851
|
+
book.close
|
852
|
+
end
|
853
|
+
|
854
|
+
it "should return one unsaved book" do
|
855
|
+
book = Book.open(@simple_file)
|
856
|
+
sheet = book.sheet(1)
|
857
|
+
sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
|
858
|
+
# Excel.unsaved_known_workbooks.should == [[book.ole_workbook]]
|
859
|
+
unsaved_known_wbs = Excel.unsaved_known_workbooks
|
860
|
+
unsaved_known_wbs.size.should == 1
|
861
|
+
unsaved_known_wbs.each do |ole_wb_list|
|
862
|
+
ole_wb_list.size.should == 1
|
863
|
+
ole_wb_list.each do |ole_workbook|
|
864
|
+
ole_workbook.Fullname.tr('\\','/').should == @simple_file
|
865
|
+
end
|
866
|
+
end
|
867
|
+
book2 = Book.open(@another_simple_file)
|
868
|
+
# Excel.unsaved_known_workbooks.should == [[book.ole_workbook]]
|
869
|
+
unsaved_known_wbs = Excel.unsaved_known_workbooks
|
870
|
+
unsaved_known_wbs.size.should == 1
|
871
|
+
unsaved_known_wbs.each do |ole_wb_list|
|
872
|
+
ole_wb_list.size.should == 1
|
873
|
+
ole_wb_list.each do |ole_workbook|
|
874
|
+
ole_workbook.Fullname.tr('\\','/').should == @simple_file
|
875
|
+
end
|
876
|
+
end
|
877
|
+
book2.close
|
878
|
+
book.close(:if_unsaved => :forget)
|
879
|
+
end
|
880
|
+
|
881
|
+
it "should return two unsaved books" do
|
882
|
+
book = Book.open(@simple_file)
|
883
|
+
sheet = book.sheet(1)
|
884
|
+
sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
|
885
|
+
book2 = Book.open(@another_simple_file)
|
886
|
+
sheet2 = book2.sheet(1)
|
887
|
+
sheet2[1,1] = sheet2[1,1].value == "foo" ? "bar" : "foo"
|
888
|
+
#Excel.unsaved_known_workbooks.should == [[book.ole_workbook, book2.ole_workbook]]
|
889
|
+
unsaved_known_wbs = Excel.unsaved_known_workbooks
|
890
|
+
unsaved_known_wbs.size.should == 1
|
891
|
+
unsaved_known_wbs.each do |ole_wb_list|
|
892
|
+
ole_wb_list.size.should == 2
|
893
|
+
ole_workbook1, ole_workbook2 = ole_wb_list
|
894
|
+
ole_workbook1.Fullname.tr('\\','/').should == @simple_file
|
895
|
+
ole_workbook2.Fullname.tr('\\','/').should == @another_simple_file
|
896
|
+
end
|
897
|
+
book2.close(:if_unsaved => :forget)
|
898
|
+
book.close(:if_unsaved => :forget)
|
899
|
+
end
|
900
|
+
|
901
|
+
it "should return two unsaved books" do
|
902
|
+
book = Book.open(@simple_file)
|
903
|
+
sheet = book.sheet(1)
|
904
|
+
sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
|
905
|
+
book2 = Book.open(@another_simple_file, :force_excel => :new)
|
906
|
+
sheet2 = book2.sheet(1)
|
907
|
+
sheet2[1,1] = sheet2[1,1].value == "foo" ? "bar" : "foo"
|
908
|
+
#Excel.unsaved_known_workbooks.should == [[book.ole_workbook], [book2.ole_workbook]]
|
909
|
+
unsaved_known_wbs = Excel.unsaved_known_workbooks
|
910
|
+
unsaved_known_wbs.size.should == 2
|
911
|
+
ole_wb_list1, ole_wb_list2 = unsaved_known_wbs
|
912
|
+
ole_wb_list1.each do |ole_wb_list|
|
913
|
+
ole_wb_list1.size.should == 1
|
914
|
+
ole_wb_list1.each do |ole_workbook|
|
915
|
+
ole_workbook.Fullname.tr('\\','/').should == @simple_file
|
916
|
+
end
|
917
|
+
end
|
918
|
+
ole_wb_list2.each do |ole_wb_list|
|
919
|
+
ole_wb_list2.size.should == 1
|
920
|
+
ole_wb_list2.each do |ole_workbook|
|
921
|
+
ole_workbook.Fullname.tr('\\','/').should == @another_simple_file
|
922
|
+
end
|
923
|
+
end
|
924
|
+
book2.close(:if_unsaved => :forget)
|
925
|
+
book.close(:if_unsaved => :forget)
|
926
|
+
end
|
927
|
+
|
928
|
+
end
|
929
|
+
|
842
930
|
describe "alive" do
|
843
931
|
|
844
932
|
it "should yield alive" do
|
@@ -1450,6 +1538,45 @@ module RobustExcelOle
|
|
1450
1538
|
|
1451
1539
|
end
|
1452
1540
|
|
1541
|
+
describe "set_options" do
|
1542
|
+
|
1543
|
+
before do
|
1544
|
+
@excel = Excel.new(:reuse => false)
|
1545
|
+
end
|
1546
|
+
|
1547
|
+
it "should set options" do
|
1548
|
+
@excel.set_options(:displayalerts => true, :visible => true, :screenupdating => true, :calculaiton => :manual)
|
1549
|
+
@excel.DisplayAlerts.should be_true
|
1550
|
+
@excel.Visible.should be_true
|
1551
|
+
@excel.ScreenUpdating.should be_true
|
1552
|
+
book = Book.open(@simple_file)
|
1553
|
+
@excel.Calculation.should == -4135
|
1554
|
+
book.close
|
1555
|
+
end
|
1556
|
+
|
1557
|
+
end
|
1558
|
+
|
1559
|
+
describe "excel_processes" do
|
1560
|
+
|
1561
|
+
it "should return empty list" do
|
1562
|
+
Excel.excel_processes.should be_empty
|
1563
|
+
end
|
1564
|
+
|
1565
|
+
it "should return list of one Excel process" do
|
1566
|
+
excel = Excel.new
|
1567
|
+
Excel.excel_processes.should == [excel]
|
1568
|
+
excel.close
|
1569
|
+
end
|
1570
|
+
|
1571
|
+
it "should return list of two Excel processes" do
|
1572
|
+
excel1 = Excel.new
|
1573
|
+
excel2 = Excel.current
|
1574
|
+
excel3 = Excel.create
|
1575
|
+
Excel.excel_processes.should == [excel1,excel3]
|
1576
|
+
end
|
1577
|
+
|
1578
|
+
end
|
1579
|
+
|
1453
1580
|
context "with hwnd and hwnd2excel" do
|
1454
1581
|
|
1455
1582
|
before do
|
data/spec/general_spec.rb
CHANGED
@@ -49,7 +49,13 @@ module RobustExcelOle
|
|
49
49
|
["ActiveCell", "ActiveSheet", "ActiveWorkbook", "Application", "Calculate", "Cells", "Columns",
|
50
50
|
"DisplayAlerts", "Evaluate", "Hwnd", "Name", "Names", "Quit", "Range", "Ready", "Save",
|
51
51
|
"Sheets", "UserName", "Value", "Visible", "Workbooks", "Worksheets"]
|
52
|
-
@excel_methods = ["alive?", "book_class", "close", "displayalerts", "recreate", "visible",
|
52
|
+
@excel_methods = ["alive?", "book_class", "close", "displayalerts", "recreate", "visible",
|
53
|
+
"with_displayalerts"]
|
54
|
+
@ole_sheet_methods = []
|
55
|
+
# ["Activate", "Calculate", "Copy", "Name", "Select", "Evaluate", "Protect", "Unprotect"]
|
56
|
+
@sheet_methods = ["book_class", "col_range", "each", "each_column", "each_column_with_index",
|
57
|
+
"each_row", "each_row_with_index", "nameval", "rangeval",
|
58
|
+
"set_rangeval", "row_range", "set_nameval"]
|
53
59
|
end
|
54
60
|
|
55
61
|
after do
|
@@ -84,6 +90,20 @@ module RobustExcelOle
|
|
84
90
|
@excel_methods.each{|m| @book1.excel.respond_to?(m).should be_true}
|
85
91
|
end
|
86
92
|
|
93
|
+
it "should do methods for sheet" do
|
94
|
+
((@ole_sheet_methods + @sheet_methods) - @book1.sheet(1).methods).should be_empty
|
95
|
+
(Object.instance_methods.select{|m| m =~ /^(?!\_)/} - @book1.sheet(1).methods).sort.should be_empty
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should do own_methods with popular ole_excel and excel methods" do
|
99
|
+
((@ole_sheet_methods + @sheet_methods) - @book1.sheet(1).own_methods).should == [] #be_empty
|
100
|
+
(Object.instance_methods - @book1.sheet(1).own_methods).should == Object.instance_methods
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should respond to popular sheet methods" do
|
104
|
+
@sheet_methods.each{|m| @book1.sheet(1).respond_to?(m).should be_true}
|
105
|
+
end
|
106
|
+
|
87
107
|
end
|
88
108
|
|
89
109
|
describe "#absolute_path" do
|
@@ -157,6 +177,20 @@ module RobustExcelOle
|
|
157
177
|
end
|
158
178
|
end
|
159
179
|
|
180
|
+
describe "path" do
|
181
|
+
|
182
|
+
it "should create a path" do
|
183
|
+
path1 = "this" / "is" / "a" / "path"
|
184
|
+
path1.should == "this/is/a/path"
|
185
|
+
path2 = "this" / "is" / "a" / "path" /
|
186
|
+
#path2.should == "this/is/a/path/"
|
187
|
+
path3 = "this" /
|
188
|
+
#path3.should == "this/"
|
189
|
+
path4 = "this" / nil
|
190
|
+
path4.should == "this"
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
160
194
|
describe "Object methods" do
|
161
195
|
|
162
196
|
before do
|
data/spec/reo_common_spec.rb
CHANGED
@@ -104,5 +104,27 @@ module RobustExcelOle
|
|
104
104
|
end
|
105
105
|
|
106
106
|
end
|
107
|
+
|
108
|
+
describe "misc" do
|
109
|
+
|
110
|
+
LOG_TO_STDOUT = true
|
111
|
+
REOCommon::trace "foo"
|
112
|
+
|
113
|
+
LOG_TO_STDOUT = false
|
114
|
+
REOCommon::trace "foo"
|
115
|
+
|
116
|
+
REO_LOG_DIR = ""
|
117
|
+
REOCommon::trace "foo"
|
118
|
+
|
119
|
+
REO_LOG_DIR = "C:"
|
120
|
+
REOCommon::trace "foo"
|
121
|
+
|
122
|
+
REOCommon::tr1 "foo"
|
123
|
+
|
124
|
+
h = {:a => {:c => 4}, :b => 2}
|
125
|
+
REOCommon::puts_hash(h)
|
126
|
+
|
127
|
+
end
|
128
|
+
|
107
129
|
end
|
108
130
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: robust_excel_ole
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 3
|
10
|
+
version: 1.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- traths
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2017-
|
18
|
+
date: 2017-08-27 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|