robust_excel_ole 1.1.3 → 1.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Changelog +9 -1
- data/README.rdoc +122 -169
- data/README_detail.rdoc +10 -4
- data/README_development.rdoc +5 -0
- data/README_excel.rdoc +145 -0
- data/README_open.rdoc +202 -0
- data/README_ranges.rdoc +134 -0
- data/README_save_close.rdoc +77 -0
- data/README_sheet.rdoc +71 -0
- data/examples/open_save_close/example_control_to_excel.rb +2 -2
- data/lib/robust_excel_ole/book.rb +80 -44
- data/lib/robust_excel_ole/excel.rb +30 -7
- data/lib/robust_excel_ole/general.rb +1 -1
- data/lib/robust_excel_ole/reo_common.rb +65 -49
- data/lib/robust_excel_ole/sheet.rb +2 -6
- data/lib/robust_excel_ole/version.rb +1 -1
- data/spec/book_spec.rb +5 -5
- data/spec/book_specs/book_misc_spec.rb +69 -1
- data/spec/book_specs/book_open_spec.rb +11 -17
- data/spec/book_specs/book_unobtr_spec.rb +1 -1
- data/spec/data/another_workbook.xls +0 -0
- data/spec/data/workbook.xls +0 -0
- data/spec/excel_spec.rb +51 -53
- data/spec/general_spec.rb +2 -2
- data/spec/reo_common_spec.rb +1 -1
- data/spec/sheet_spec.rb +14 -0
- metadata +8 -2
@@ -9,7 +9,7 @@ module General
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def canonize(filename) # :nodoc: #
|
12
|
-
raise
|
12
|
+
raise TypeREOError, "No string given to canonize, but #{filename.inspect}" unless filename.is_a?(String)
|
13
13
|
normalize(filename).downcase
|
14
14
|
end
|
15
15
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
|
-
LOG_TO_STDOUT = true
|
4
|
-
REO_LOG_DIR = ""
|
3
|
+
LOG_TO_STDOUT = true unless Object.const_defined?(:LOG_TO_STDOUT)
|
4
|
+
REO_LOG_DIR = "" unless Object.const_defined?(:REO_LOG_DIR)
|
5
5
|
REO_LOG_FILE = "reo.log" unless Object.const_defined?(:REO_LOG_FILE)
|
6
6
|
|
7
7
|
File.delete REO_LOG_FILE rescue nil
|
@@ -11,76 +11,76 @@ module RobustExcelOle
|
|
11
11
|
class REOError < RuntimeError # :nodoc: #
|
12
12
|
end
|
13
13
|
|
14
|
-
class
|
14
|
+
class ExcelREOError < REOError # :nodoc: #
|
15
15
|
end
|
16
16
|
|
17
|
-
class
|
17
|
+
class WorkbookREOError < REOError # :nodoc: #
|
18
18
|
end
|
19
19
|
|
20
|
-
class
|
20
|
+
class FileREOError < REOError # :nodoc: #
|
21
21
|
end
|
22
22
|
|
23
|
-
class
|
23
|
+
class NamesREOError < REOError # :nodoc: #
|
24
24
|
end
|
25
25
|
|
26
|
-
class
|
26
|
+
class MiscREOError < REOError # :nodoc: #
|
27
27
|
end
|
28
28
|
|
29
|
-
class ExcelDamaged <
|
29
|
+
class ExcelDamaged < ExcelREOError # :nodoc: #
|
30
30
|
end
|
31
31
|
|
32
|
-
class UnsavedWorkbooks <
|
32
|
+
class UnsavedWorkbooks < ExcelREOError # :nodoc: #
|
33
33
|
end
|
34
34
|
|
35
|
-
class WorkbookBlocked <
|
35
|
+
class WorkbookBlocked < WorkbookREOError # :nodoc: #
|
36
36
|
end
|
37
37
|
|
38
|
-
class WorkbookNotSaved <
|
38
|
+
class WorkbookNotSaved < WorkbookREOError # :nodoc: #
|
39
39
|
end
|
40
40
|
|
41
|
-
class WorkbookReadOnly <
|
41
|
+
class WorkbookReadOnly < WorkbookREOError # :nodoc: #
|
42
42
|
end
|
43
43
|
|
44
|
-
class WorkbookBeingUsed <
|
44
|
+
class WorkbookBeingUsed < WorkbookREOError # :nodoc: #
|
45
45
|
end
|
46
46
|
|
47
|
-
class FileNotFound <
|
47
|
+
class FileNotFound < FileREOError # :nodoc: #
|
48
48
|
end
|
49
49
|
|
50
|
-
class FileNameNotGiven <
|
50
|
+
class FileNameNotGiven < FileREOError # :nodoc: #
|
51
51
|
end
|
52
52
|
|
53
|
-
class FileAlreadyExists <
|
53
|
+
class FileAlreadyExists < FileREOError # :nodoc: #
|
54
54
|
end
|
55
55
|
|
56
|
-
class NameNotFound <
|
56
|
+
class NameNotFound < NamesREOError # :nodoc: #
|
57
57
|
end
|
58
58
|
|
59
|
-
class NameAlreadyExists <
|
59
|
+
class NameAlreadyExists < NamesREOError # :nodoc: #
|
60
60
|
end
|
61
61
|
|
62
|
-
class RangeNotEvaluatable <
|
62
|
+
class RangeNotEvaluatable < MiscREOError # :nodoc: #
|
63
63
|
end
|
64
64
|
|
65
|
-
class OptionInvalid <
|
65
|
+
class OptionInvalid < MiscREOError # :nodoc: #
|
66
66
|
end
|
67
67
|
|
68
|
-
class ObjectNotAlive <
|
68
|
+
class ObjectNotAlive < MiscREOError # :nodoc: #
|
69
69
|
end
|
70
70
|
|
71
|
-
class
|
71
|
+
class TypeREOError < REOError # :nodoc: #
|
72
72
|
end
|
73
73
|
|
74
|
-
class TimeOut < REOError
|
74
|
+
class TimeOut < REOError # :nodoc: #
|
75
75
|
end
|
76
76
|
|
77
|
-
class
|
77
|
+
class UnexpectedREOError < REOError # :nodoc: #
|
78
78
|
end
|
79
79
|
|
80
80
|
class REOCommon
|
81
81
|
|
82
82
|
def excel
|
83
|
-
raise
|
83
|
+
raise TypeREOError, "receiver instance is neither an Excel nor a Book"
|
84
84
|
end
|
85
85
|
|
86
86
|
def own_methods
|
@@ -126,31 +126,41 @@ module RobustExcelOle
|
|
126
126
|
class RangeOwners < REOCommon
|
127
127
|
|
128
128
|
# returns the contents of a range with given name
|
129
|
-
#
|
130
|
-
#
|
131
|
-
# Excel Bug: if a local name without a qualifier is given,
|
132
|
-
#
|
129
|
+
# if the name could not be found or the value could not be determined,
|
130
|
+
# then return default value, if provided, raise error otherwise
|
131
|
+
# Excel Bug: if a local name without a qualifier is given,
|
132
|
+
# then by default Excel takes the first worksheet,
|
133
|
+
# even if a different worksheet is active
|
133
134
|
# @param [String] name the name of the range
|
134
135
|
# @param [Hash] opts the options
|
135
136
|
# @option opts [Symbol] :default the default value that is provided if no contents could be returned
|
136
137
|
# @return [Variant] the contents of a range with given name
|
137
|
-
def nameval(name, opts = {:default =>
|
138
|
-
name_obj =
|
138
|
+
def nameval(name, opts = {:default => :__not_provided})
|
139
|
+
name_obj = begin
|
140
|
+
name_object(name)
|
141
|
+
rescue NameNotFound => msg
|
142
|
+
return opts[:default] unless opts[:default] == :__not_provided
|
143
|
+
raise
|
144
|
+
end
|
139
145
|
value = begin
|
140
146
|
name_obj.RefersToRange.Value
|
141
|
-
rescue
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
147
|
+
rescue WIN32OLERuntimeError
|
148
|
+
sheet = if self.is_a?(Sheet) then self
|
149
|
+
elsif self.is_a?(Book) then self.sheet(1)
|
150
|
+
elsif self.is_a?(Excel) then self.workbook.sheet(1)
|
151
|
+
end
|
152
|
+
begin
|
153
|
+
sheet.Evaluate(name_obj.Name).Value
|
154
|
+
rescue # WIN32OLERuntimeError
|
155
|
+
return opts[:default] unless opts[:default] == :__not_provided
|
156
|
+
raise RangeNotEvaluatable, "cannot evaluate range named #{name.inspect} in #{self}"
|
157
|
+
end
|
148
158
|
end
|
149
|
-
if value
|
150
|
-
return opts[:default]
|
159
|
+
if value == -2146828288 + RobustExcelOle::XlErrName
|
160
|
+
return opts[:default] unless opts[:default] == __not_provided
|
151
161
|
raise RangeNotEvaluatable, "cannot evaluate range named #{name.inspect} in #{File.basename(workbook.stored_filename).inspect rescue nil}"
|
152
162
|
end
|
153
|
-
return opts[:default]
|
163
|
+
return opts[:default] unless opts[:default] == :__not_provided or value.nil?
|
154
164
|
value
|
155
165
|
end
|
156
166
|
|
@@ -172,27 +182,33 @@ module RobustExcelOle
|
|
172
182
|
|
173
183
|
# returns the contents of a range with a locally defined name
|
174
184
|
# evaluates the formula if the contents is a formula
|
175
|
-
# if
|
185
|
+
# if the name could not be found or the range or value could not be determined,
|
186
|
+
# then return default value, if provided, raise error otherwise
|
176
187
|
# @param [String] name the name of a range
|
177
188
|
# @param [Hash] opts the options
|
178
189
|
# @option opts [Symbol] :default the default value that is provided if no contents could be returned
|
179
190
|
# @return [Variant] the contents of a range with given name
|
180
|
-
def rangeval(name, opts = {:default =>
|
191
|
+
def rangeval(name, opts = {:default => :__not_provided})
|
181
192
|
begin
|
182
193
|
range = self.Range(name)
|
183
194
|
rescue WIN32OLERuntimeError
|
184
|
-
return opts[:default]
|
195
|
+
return opts[:default] unless opts[:default] == :__not_provided
|
185
196
|
raise NameNotFound, "name #{name.inspect} not in #{self.inspect}"
|
186
197
|
end
|
187
198
|
begin
|
188
199
|
value = range.Value
|
189
200
|
rescue WIN32OLERuntimeError
|
190
|
-
return opts[:default]
|
201
|
+
return opts[:default] unless opts[:default] == :__not_provided
|
191
202
|
raise RangeNotEvaluatable, "cannot determine value of range named #{name.inspect} in #{self.inspect}"
|
192
203
|
end
|
193
|
-
|
194
|
-
|
195
|
-
|
204
|
+
if value == -2146828288 + RobustExcelOle::XlErrName
|
205
|
+
return opts[:default] unless opts[:default] == __not_provided
|
206
|
+
raise RangeNotEvaluatable, "cannot evaluate range named #{name.inspect} in #{File.basename(workbook.stored_filename).inspect rescue nil}"
|
207
|
+
end
|
208
|
+
return opts[:default] unless opts[:default] == :__not_provided or value.nil?
|
209
|
+
value
|
210
|
+
#return opts[:default] unless opts[:default] == :__not_provided
|
211
|
+
#raise RangeNotEvaluatable, "cannot evaluate range named #{name.inspect}" if value == -2146828288 + RobustExcelOle::XlErrName
|
196
212
|
end
|
197
213
|
|
198
214
|
# assigns a value to a range given a locally defined name
|
@@ -228,7 +244,7 @@ module RobustExcelOle
|
|
228
244
|
end
|
229
245
|
end
|
230
246
|
end
|
231
|
-
|
247
|
+
|
232
248
|
def cell_modified?(cell)
|
233
249
|
workbook.modified_cells.each{|c| return true if c.Name.Value == cell.Name.Value}
|
234
250
|
false
|
@@ -35,7 +35,7 @@ module RobustExcelOle
|
|
35
35
|
if msg.message =~ /800A03EC/
|
36
36
|
raise NameAlreadyExists, "sheet name #{new_name.inspect} already exists"
|
37
37
|
else
|
38
|
-
raise
|
38
|
+
raise UnexpectedREOError, "unexpected WIN32OLERuntimeError: #{msg.message}"
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
@@ -57,11 +57,7 @@ module RobustExcelOle
|
|
57
57
|
begin
|
58
58
|
nameval(name)
|
59
59
|
rescue REOError
|
60
|
-
|
61
|
-
book_class.new(self.Parent).nameval(name)
|
62
|
-
rescue REOError
|
63
|
-
rangeval(name)
|
64
|
-
end
|
60
|
+
rangeval(name)
|
65
61
|
end
|
66
62
|
end
|
67
63
|
end
|
data/spec/book_spec.rb
CHANGED
@@ -41,7 +41,7 @@ describe Book do
|
|
41
41
|
context "with standard" do
|
42
42
|
it "open an existing file" do
|
43
43
|
expect {
|
44
|
-
@book = Book.
|
44
|
+
@book = Book.open(@simple_file)
|
45
45
|
}.to_not raise_error
|
46
46
|
@book.should be_a Book
|
47
47
|
@book.close
|
@@ -400,7 +400,7 @@ describe Book do
|
|
400
400
|
@key_sender.puts "{right}{enter}"
|
401
401
|
#expect{
|
402
402
|
# Book.open(@simple_file, :if_unsaved => :alert)
|
403
|
-
# }.to raise_error(
|
403
|
+
# }.to raise_error(ExcelREOError, /user canceled or runtime error/)
|
404
404
|
@book.should be_alive
|
405
405
|
end
|
406
406
|
|
@@ -422,7 +422,7 @@ describe Book do
|
|
422
422
|
@key_sender.puts "{right}{enter}"
|
423
423
|
#expect{
|
424
424
|
# Book.open(@simple_file, :if_unsaved => :excel)
|
425
|
-
# }.to raise_error(
|
425
|
+
# }.to raise_error(ExcelREOError, /user canceled or runtime error/)
|
426
426
|
@book.should be_alive
|
427
427
|
end
|
428
428
|
|
@@ -653,8 +653,8 @@ describe Book do
|
|
653
653
|
begin
|
654
654
|
@excel1.close
|
655
655
|
@excel2.close
|
656
|
-
rescue
|
657
|
-
# puts "
|
656
|
+
rescue ExcelREOError => msg
|
657
|
+
# puts "ExcelREOError: #{msg.message}" if msg.message =~ /Excel instance not alive or damaged/
|
658
658
|
end
|
659
659
|
end
|
660
660
|
|
@@ -47,6 +47,65 @@ describe Book do
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
+
describe "for_this_workbook" do
|
51
|
+
|
52
|
+
before do
|
53
|
+
@book = Book.open(@simple_file)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should set options" do
|
57
|
+
@book.for_this_workbook(:visible => true)
|
58
|
+
@book.excel.Visible.should be_true
|
59
|
+
@book.Windows(@book.Name).Visible.should be_true
|
60
|
+
@book.visible.should be_true
|
61
|
+
@book.ReadOnly.should be_false
|
62
|
+
@book.CheckCompatibility.should be_false
|
63
|
+
@book.for_this_workbook(:visible => false)
|
64
|
+
@book.excel.Visible.should be_true
|
65
|
+
@book.Windows(@book.Name).Visible.should be_false
|
66
|
+
@book.visible.should be_false
|
67
|
+
@book.ReadOnly.should be_false
|
68
|
+
@book.CheckCompatibility.should be_false
|
69
|
+
@book.for_this_workbook(:read_only => true)
|
70
|
+
@book.excel.Visible.should be_true
|
71
|
+
@book.Windows(@book.Name).Visible.should be_false
|
72
|
+
@book.visible.should be_false
|
73
|
+
@book.ReadOnly.should be_true
|
74
|
+
@book.CheckCompatibility.should be_false
|
75
|
+
@book.for_this_workbook(:visible => true)
|
76
|
+
@book.excel.Visible.should be_true
|
77
|
+
@book.Windows(@book.Name).Visible.should be_true
|
78
|
+
@book.visible.should be_true
|
79
|
+
@book.ReadOnly.should be_true
|
80
|
+
@book.CheckCompatibility.should be_false
|
81
|
+
@book.for_this_workbook(:check_compatibility => true)
|
82
|
+
@book.excel.Visible.should be_true
|
83
|
+
@book.Windows(@book.Name).Visible.should be_true
|
84
|
+
@book.visible.should be_true
|
85
|
+
@book.ReadOnly.should be_true
|
86
|
+
@book.CheckCompatibility.should be_true
|
87
|
+
@book.for_this_workbook(:visible => false, :check_compatibility => false)
|
88
|
+
@book.excel.Visible.should be_true
|
89
|
+
@book.Windows(@book.Name).Visible.should be_false
|
90
|
+
@book.visible.should be_false
|
91
|
+
@book.ReadOnly.should be_true
|
92
|
+
@book.CheckCompatibility.should be_false
|
93
|
+
@book.for_this_workbook(:calculation => true)
|
94
|
+
@book.excel.Visible.should be_true
|
95
|
+
@book.Windows(@book.Name).Visible.should be_false
|
96
|
+
@book.visible.should be_false
|
97
|
+
@book.ReadOnly.should be_true
|
98
|
+
@book.CheckCompatibility.should be_false
|
99
|
+
@book.excel.calculation.should be_true
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should set options" do
|
103
|
+
@book.for_this_workbook(:read_only => true, :check_compatibility => true)
|
104
|
+
@book.CheckCompatibility.should be_true
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
50
109
|
describe "excel_of" do
|
51
110
|
|
52
111
|
before do
|
@@ -654,16 +713,25 @@ describe Book do
|
|
654
713
|
# @book1["named_formula"].should == 4
|
655
714
|
#end
|
656
715
|
|
657
|
-
it "should raise an error if name not defined" do
|
716
|
+
it "should raise an error if name not defined and default value is not provided" do
|
717
|
+
expect {
|
718
|
+
@book1.nameval("foo", :default => nil)
|
719
|
+
}.to_not raise_error
|
720
|
+
expect {
|
721
|
+
@book1.nameval("foo", :default => :__not_provided)
|
722
|
+
}.to raise_error(NameNotFound, /name "foo" not in #<Book: another_workbook/)
|
658
723
|
expect {
|
659
724
|
@book1.nameval("foo")
|
660
725
|
}.to raise_error(NameNotFound, /name "foo" not in #<Book: another_workbook/)
|
726
|
+
@book1.nameval("foo", :default => nil).should be_nil
|
727
|
+
@book1.nameval("foo", :default => 1).should == 1
|
661
728
|
expect {
|
662
729
|
@book1.set_nameval("foo","bar")
|
663
730
|
}.to raise_error(NameNotFound, /name "foo" not in #<Book: another_workbook/)
|
664
731
|
expect {
|
665
732
|
@book1["foo"] = "bar"
|
666
733
|
}.to raise_error(NameNotFound, /name "foo" not in #<Book: another_workbook/)
|
734
|
+
@book1.nameval("empty", :default => 1).should be_nil
|
667
735
|
end
|
668
736
|
|
669
737
|
it "should raise an error if name was defined but contents is calcuated" do
|
@@ -379,7 +379,7 @@ describe Book do
|
|
379
379
|
it "should raise an error if no Excel or Book is given" do
|
380
380
|
expect{
|
381
381
|
Book.open(@simple_file1, :force => {:excel => :b})
|
382
|
-
}.to raise_error(
|
382
|
+
}.to raise_error(TypeREOError, "given object is neither an Excel, a Workbook, nor a Win32ole")
|
383
383
|
end
|
384
384
|
|
385
385
|
it "should do force_excel even if both force_ and default_excel is given" do
|
@@ -537,7 +537,7 @@ describe Book do
|
|
537
537
|
it "should raise an error if no Excel or Book is given" do
|
538
538
|
expect{
|
539
539
|
Book.open(@simple_file1, :force_excel => :b)
|
540
|
-
}.to raise_error(
|
540
|
+
}.to raise_error(TypeREOError, "given object is neither an Excel, a Workbook, nor a Win32ole")
|
541
541
|
end
|
542
542
|
|
543
543
|
it "should do force_excel even if both force_ and default_excel is given" do
|
@@ -766,7 +766,7 @@ describe Book do
|
|
766
766
|
it "should raise an error if no Excel or Book is given" do
|
767
767
|
expect{
|
768
768
|
Book.open(@different_file, :default => {:excel => :a})
|
769
|
-
}.to raise_error(
|
769
|
+
}.to raise_error(TypeREOError, "given object is neither an Excel, a Workbook, nor a Win32ole")
|
770
770
|
end
|
771
771
|
|
772
772
|
end
|
@@ -948,7 +948,7 @@ describe Book do
|
|
948
948
|
it "should raise an error if no Excel or Book is given" do
|
949
949
|
expect{
|
950
950
|
Book.open(@different_file, :default_excel => :a)
|
951
|
-
}.to raise_error(
|
951
|
+
}.to raise_error(TypeREOError, "given object is neither an Excel, a Workbook, nor a Win32ole")
|
952
952
|
end
|
953
953
|
|
954
954
|
end
|
@@ -1240,7 +1240,7 @@ describe Book do
|
|
1240
1240
|
@key_sender.puts "{right}{enter}"
|
1241
1241
|
expect{
|
1242
1242
|
Book.open(@simple_file1, :if_unsaved => :alert)
|
1243
|
-
}.to raise_error(
|
1243
|
+
}.to raise_error(ExcelREOError, "user canceled or runtime error")
|
1244
1244
|
@book.should be_alive
|
1245
1245
|
end
|
1246
1246
|
|
@@ -1274,7 +1274,7 @@ describe Book do
|
|
1274
1274
|
@key_sender.puts "{right}{enter}"
|
1275
1275
|
expect{
|
1276
1276
|
Book.open(@simple_file1, :if_unsaved => :excel)
|
1277
|
-
}.to raise_error(
|
1277
|
+
}.to raise_error(ExcelREOError, "user canceled or runtime error")
|
1278
1278
|
@book.should be_alive
|
1279
1279
|
end
|
1280
1280
|
=end
|
@@ -1407,7 +1407,7 @@ describe Book do
|
|
1407
1407
|
context "with :if_unsaved => #{options_value} and in the same and different path" do
|
1408
1408
|
before do
|
1409
1409
|
@new_book = Book.open(@simple_file1, :reuse => true, :if_unsaved => options_value)
|
1410
|
-
@different_book = Book.
|
1410
|
+
@different_book = Book.open(@different_file, :reuse => true, :if_unsaved => options_value)
|
1411
1411
|
end
|
1412
1412
|
after do
|
1413
1413
|
@new_book.close
|
@@ -1537,8 +1537,8 @@ describe Book do
|
|
1537
1537
|
sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
|
1538
1538
|
book.Saved.should be_false
|
1539
1539
|
new_book = Book.open(@simple_file1, :read_only => true, :if_unsaved => :accept)
|
1540
|
-
new_book.ReadOnly.should
|
1541
|
-
new_book.Saved.should
|
1540
|
+
new_book.ReadOnly.should be_true
|
1541
|
+
new_book.Saved.should be_true
|
1542
1542
|
new_book.should == book
|
1543
1543
|
end
|
1544
1544
|
|
@@ -1569,8 +1569,8 @@ describe Book do
|
|
1569
1569
|
sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
|
1570
1570
|
book.Saved.should be_false
|
1571
1571
|
new_book = Book.open(@simple_file1, :force => {:excel => book.excel}, :read_only => true, :if_unsaved => :accept)
|
1572
|
-
new_book.ReadOnly.should
|
1573
|
-
new_book.Saved.should
|
1572
|
+
new_book.ReadOnly.should be_true
|
1573
|
+
new_book.Saved.should be_true
|
1574
1574
|
new_book.should == book
|
1575
1575
|
end
|
1576
1576
|
|
@@ -1636,12 +1636,6 @@ describe Book do
|
|
1636
1636
|
book.should be_a Book
|
1637
1637
|
end
|
1638
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
|
-
|
1645
1639
|
end
|
1646
1640
|
|
1647
1641
|
context "with WIN32OLE#GetAbsolutePathName" do
|