rspec-core 2.0.0.rc → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +2 -0
- data/History.markdown +11 -0
- data/README.markdown +1 -1
- data/Rakefile +35 -26
- data/Upgrade.markdown +54 -2
- data/features/README.markdown +15 -8
- data/features/command_line/configure.feature +2 -1
- data/features/configuration/read_options_from_file.feature +6 -0
- data/features/hooks/before_and_after_hooks.feature +23 -0
- data/features/{hooks → metadata}/described_class.feature +0 -0
- data/lib/autotest/rspec2.rb +10 -7
- data/lib/rspec/core/command_line.rb +3 -25
- data/lib/rspec/core/configuration.rb +26 -11
- data/lib/rspec/core/example.rb +1 -7
- data/lib/rspec/core/example_group.rb +17 -2
- data/lib/rspec/core/hooks.rb +20 -7
- data/lib/rspec/core/option_parser.rb +5 -1
- data/lib/rspec/core/rake_task.rb +23 -9
- data/lib/rspec/core/version.rb +1 -1
- data/spec/autotest/failed_results_re_spec.rb +5 -6
- data/spec/autotest/rspec_spec.rb +18 -27
- data/spec/rspec/core/command_line_spec.rb +13 -3
- data/spec/rspec/core/configuration_spec.rb +74 -6
- data/spec/rspec/core/example_group_spec.rb +26 -0
- data/spec/rspec/core/example_spec.rb +0 -12
- data/spec/rspec/core/hooks_filtering_spec.rb +20 -0
- data/spec/rspec/core/option_parser_spec.rb +7 -3
- data/spec/rspec/core/rake_task_spec.rb +24 -3
- data/spec/spec_helper.rb +17 -17
- data/specs.watchr +1 -2
- metadata +38 -52
data/lib/rspec/core/example.rb
CHANGED
@@ -16,7 +16,7 @@ module RSpec
|
|
16
16
|
@example_group_class, @options, @example_block = example_group_class, options, example_block
|
17
17
|
@metadata = @example_group_class.metadata.for_example(desc, options)
|
18
18
|
@exception = nil
|
19
|
-
@pending_declared_in_example =
|
19
|
+
@pending_declared_in_example = false
|
20
20
|
end
|
21
21
|
|
22
22
|
def example_group
|
@@ -28,10 +28,6 @@ module RSpec
|
|
28
28
|
example_group
|
29
29
|
end
|
30
30
|
|
31
|
-
def in_block?
|
32
|
-
@in_block
|
33
|
-
end
|
34
|
-
|
35
31
|
def pending?
|
36
32
|
!!pending
|
37
33
|
end
|
@@ -48,12 +44,10 @@ module RSpec
|
|
48
44
|
with_around_hooks do
|
49
45
|
begin
|
50
46
|
run_before_each
|
51
|
-
@in_block = true
|
52
47
|
@example_group_instance.instance_eval(&@example_block)
|
53
48
|
rescue Exception => e
|
54
49
|
set_exception(e)
|
55
50
|
ensure
|
56
|
-
@in_block = false
|
57
51
|
run_after_each
|
58
52
|
end
|
59
53
|
end
|
@@ -159,12 +159,14 @@ module RSpec
|
|
159
159
|
end
|
160
160
|
|
161
161
|
def self.store_before_all_ivars(example_group_instance)
|
162
|
+
return if example_group_instance.instance_variables.empty?
|
162
163
|
example_group_instance.instance_variables.each { |ivar|
|
163
164
|
before_all_ivars[ivar] = example_group_instance.instance_variable_get(ivar)
|
164
165
|
}
|
165
166
|
end
|
166
167
|
|
167
168
|
def self.assign_before_all_ivars(ivars, example_group_instance)
|
169
|
+
return if ivars.empty?
|
168
170
|
ivars.each { |ivar, val| example_group_instance.instance_variable_set(ivar, val) }
|
169
171
|
end
|
170
172
|
|
@@ -196,7 +198,20 @@ module RSpec
|
|
196
198
|
def self.eval_after_alls(example_group_instance)
|
197
199
|
return if descendant_filtered_examples.empty?
|
198
200
|
assign_before_all_ivars(before_all_ivars, example_group_instance)
|
199
|
-
|
201
|
+
|
202
|
+
begin
|
203
|
+
run_hook!(:after, :all, example_group_instance)
|
204
|
+
rescue => e
|
205
|
+
# TODO: come up with a better solution for this.
|
206
|
+
RSpec.configuration.reporter.message <<-EOS
|
207
|
+
|
208
|
+
An error occurred in an after(:all) hook.
|
209
|
+
#{e.class}: #{e.message}
|
210
|
+
occurred at #{e.backtrace.first}
|
211
|
+
|
212
|
+
EOS
|
213
|
+
end
|
214
|
+
|
200
215
|
world.run_hook_filtered(:after, :all, self, example_group_instance) if top_level?
|
201
216
|
end
|
202
217
|
|
@@ -209,7 +224,6 @@ module RSpec
|
|
209
224
|
RSpec.clear_remaining_example_groups if top_level?
|
210
225
|
return
|
211
226
|
end
|
212
|
-
@reporter = reporter
|
213
227
|
example_group_instance = new
|
214
228
|
reporter.example_group_started(self)
|
215
229
|
|
@@ -289,6 +303,7 @@ module RSpec
|
|
289
303
|
begin
|
290
304
|
instance_eval(&hook)
|
291
305
|
rescue Exception => e
|
306
|
+
raise unless example
|
292
307
|
example.set_exception(e)
|
293
308
|
end
|
294
309
|
end
|
data/lib/rspec/core/hooks.rb
CHANGED
@@ -5,7 +5,7 @@ module RSpec
|
|
5
5
|
class Hook
|
6
6
|
attr_reader :options
|
7
7
|
|
8
|
-
def initialize(options, block)
|
8
|
+
def initialize(options, &block)
|
9
9
|
@options = options
|
10
10
|
@block = block
|
11
11
|
end
|
@@ -85,16 +85,19 @@ module RSpec
|
|
85
85
|
}
|
86
86
|
end
|
87
87
|
|
88
|
-
def before(
|
89
|
-
|
88
|
+
def before(*args, &block)
|
89
|
+
scope, options = scope_and_options_from(*args)
|
90
|
+
hooks[:before][scope] << BeforeHook.new(options, &block)
|
90
91
|
end
|
91
92
|
|
92
|
-
def after(
|
93
|
-
|
93
|
+
def after(*args, &block)
|
94
|
+
scope, options = scope_and_options_from(*args)
|
95
|
+
hooks[:after][scope] << AfterHook.new(options, &block)
|
94
96
|
end
|
95
97
|
|
96
|
-
def around(
|
97
|
-
|
98
|
+
def around(*args, &block)
|
99
|
+
scope, options = scope_and_options_from(*args)
|
100
|
+
hooks[:around][scope] << AroundHook.new(options, &block)
|
98
101
|
end
|
99
102
|
|
100
103
|
# Runs all of the blocks stored with the hook in the context of the
|
@@ -116,6 +119,16 @@ module RSpec
|
|
116
119
|
def find_hook(hook, scope, example_group_class)
|
117
120
|
hooks[hook][scope].find_hooks_for(example_group_class)
|
118
121
|
end
|
122
|
+
|
123
|
+
private
|
124
|
+
|
125
|
+
def scope_and_options_from(scope=:each, options={})
|
126
|
+
if Hash === scope
|
127
|
+
options = scope
|
128
|
+
scope = :each
|
129
|
+
end
|
130
|
+
return scope, options
|
131
|
+
end
|
119
132
|
end
|
120
133
|
end
|
121
134
|
end
|
@@ -52,7 +52,7 @@ module RSpec::Core
|
|
52
52
|
end
|
53
53
|
|
54
54
|
parser.on('-o', '--out FILE', 'output to a file instead of STDOUT') do |o|
|
55
|
-
options[:output_stream] = o
|
55
|
+
options[:output_stream] = File.open(o,'w')
|
56
56
|
end
|
57
57
|
|
58
58
|
parser.on_tail('-h', '--help', "You're looking at it.") do
|
@@ -95,6 +95,10 @@ module RSpec::Core
|
|
95
95
|
parser.on('--drb-port [PORT]', 'Port to connect to on the DRb server') do |o|
|
96
96
|
options[:drb_port] = o.to_i
|
97
97
|
end
|
98
|
+
|
99
|
+
parser.on('--autotest') do |o|
|
100
|
+
options[:autotest] = true
|
101
|
+
end
|
98
102
|
end
|
99
103
|
end
|
100
104
|
end
|
data/lib/rspec/core/rake_task.rb
CHANGED
@@ -73,6 +73,12 @@ module RSpec
|
|
73
73
|
# nil
|
74
74
|
attr_accessor :ruby_opts
|
75
75
|
|
76
|
+
# Path to rspec
|
77
|
+
#
|
78
|
+
# default:
|
79
|
+
# 'rspec'
|
80
|
+
attr_accessor :rspec_path
|
81
|
+
|
76
82
|
# Command line options to pass to rspec.
|
77
83
|
#
|
78
84
|
# default:
|
@@ -93,8 +99,9 @@ module RSpec
|
|
93
99
|
|
94
100
|
yield self if block_given?
|
95
101
|
|
96
|
-
@rcov_path
|
97
|
-
@
|
102
|
+
@rcov_path ||= 'rcov'
|
103
|
+
@rspec_path ||= 'rspec'
|
104
|
+
@pattern ||= './spec/**/*_spec.rb'
|
98
105
|
|
99
106
|
desc("Run RSpec code examples") unless ::Rake.application.last_comment
|
100
107
|
|
@@ -117,7 +124,11 @@ module RSpec
|
|
117
124
|
private
|
118
125
|
|
119
126
|
def files_to_run # :nodoc:
|
120
|
-
|
127
|
+
if ENV['SPEC']
|
128
|
+
FileList[ ENV['SPEC'] ]
|
129
|
+
else
|
130
|
+
FileList[ pattern ].map { |f| %["#{f}"] }
|
131
|
+
end
|
121
132
|
end
|
122
133
|
|
123
134
|
def spec_command
|
@@ -127,8 +138,15 @@ module RSpec
|
|
127
138
|
cmd_parts << "-S"
|
128
139
|
cmd_parts << "bundle exec" if bundler?
|
129
140
|
cmd_parts << runner
|
130
|
-
|
141
|
+
if rcov
|
142
|
+
cmd_parts << ["-Ispec", rcov_opts]
|
143
|
+
else
|
144
|
+
cmd_parts << rspec_opts
|
145
|
+
end
|
131
146
|
cmd_parts << files_to_run
|
147
|
+
if rcov && rspec_opts
|
148
|
+
cmd_parts << ["--", rspec_opts]
|
149
|
+
end
|
132
150
|
cmd_parts.flatten.compact.reject(&blank).join(" ")
|
133
151
|
end
|
134
152
|
end
|
@@ -136,11 +154,7 @@ module RSpec
|
|
136
154
|
private
|
137
155
|
|
138
156
|
def runner
|
139
|
-
rcov ? rcov_path :
|
140
|
-
end
|
141
|
-
|
142
|
-
def runner_options
|
143
|
-
rcov ? [rcov_opts] : [rspec_opts]
|
157
|
+
rcov ? rcov_path : rspec_path
|
144
158
|
end
|
145
159
|
|
146
160
|
def bundler?
|
data/lib/rspec/core/version.rb
CHANGED
@@ -5,17 +5,16 @@ describe "failed_results_re for autotest" do
|
|
5
5
|
let(:formatter) { RSpec::Core::Formatters::BaseTextFormatter.new(output) }
|
6
6
|
let(:example_output) do
|
7
7
|
group = RSpec::Core::ExampleGroup.describe("group name")
|
8
|
-
|
8
|
+
group.example("example name") { "this".should eq("that") }
|
9
9
|
group.run(formatter)
|
10
10
|
RSpec.configuration.stub(:color_enabled?) { false }
|
11
11
|
formatter.dump_failures
|
12
12
|
output.string
|
13
13
|
end
|
14
|
-
|
15
|
-
it "
|
14
|
+
|
15
|
+
it "matches a failure" do
|
16
16
|
re = Autotest::Rspec2.new.failed_results_re
|
17
|
-
|
18
|
-
|
19
|
-
$2.should == __FILE__.sub(File.expand_path('.'),'.')
|
17
|
+
example_output.should =~ re
|
18
|
+
example_output[re, 2].should == __FILE__.sub(File.expand_path('.'),'.')
|
20
19
|
end
|
21
20
|
end
|
data/spec/autotest/rspec_spec.rb
CHANGED
@@ -66,39 +66,32 @@ describe Autotest::Rspec2 do
|
|
66
66
|
end
|
67
67
|
|
68
68
|
describe "consolidating failures" do
|
69
|
-
|
70
|
-
|
71
|
-
rspec_autotest.instance_variable_set("@files", {@spec_file => Time.now})
|
72
|
-
rspec_autotest.stub!(:find_files_to_test).and_return true
|
73
|
-
end
|
69
|
+
let(:subject_file) { "lib/autotest/some.rb" }
|
70
|
+
let(:spec_file) { "spec/autotest/some_spec.rb" }
|
74
71
|
|
75
72
|
it "returns no failures if no failures were given in the output" do
|
76
73
|
rspec_autotest.consolidate_failures([[]]).should == {}
|
77
74
|
end
|
78
75
|
|
79
76
|
it "returns a hash with the spec filename => spec name for each failure or error" do
|
80
|
-
|
81
|
-
failures = [
|
82
|
-
[
|
83
|
-
"false should be false",
|
84
|
-
"#{@spec_file}"
|
85
|
-
]
|
86
|
-
]
|
77
|
+
failures = [ [ "false should be false", spec_file ] ]
|
87
78
|
rspec_autotest.consolidate_failures(failures).should == {
|
88
|
-
|
79
|
+
spec_file => ["false should be false"]
|
89
80
|
}
|
90
81
|
end
|
91
82
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
83
|
+
context "when subject file appears before the spec file in the backtrace" do
|
84
|
+
let(:failures) do
|
85
|
+
[ [ "false should be false", "#{subject_file}:143:\n#{spec_file}:203:" ] ]
|
86
|
+
end
|
87
|
+
|
88
|
+
it "excludes the subject file" do
|
89
|
+
rspec_autotest.consolidate_failures(failures).keys.should_not include(subject_file)
|
90
|
+
end
|
91
|
+
|
92
|
+
it "includes the spec file" do
|
93
|
+
rspec_autotest.consolidate_failures(failures).keys.should include(spec_file)
|
94
|
+
end
|
102
95
|
end
|
103
96
|
end
|
104
97
|
|
@@ -116,16 +109,14 @@ describe Autotest::Rspec2 do
|
|
116
109
|
context "using bundler" do
|
117
110
|
it "returns 'bundle exec'" do
|
118
111
|
File.stub(:exists?).with("./Gemfile") { true }
|
119
|
-
rspec_autotest.
|
112
|
+
rspec_autotest.make_test_cmd({'a' => 'b'}).should =~ /bundle exec .*ruby/
|
120
113
|
end
|
121
114
|
end
|
122
115
|
|
123
116
|
context "not using bundler" do
|
124
117
|
it "returns the ruby command generated by Autotest" do
|
125
|
-
autotest = Autotest.new
|
126
|
-
autotest_ruby_command = autotest.ruby
|
127
118
|
File.stub(:exists?).with("./Gemfile") { false }
|
128
|
-
rspec_autotest.
|
119
|
+
rspec_autotest.make_test_cmd({'a' => 'b'}).should_not =~ /bundle exec/
|
129
120
|
end
|
130
121
|
end
|
131
122
|
end
|
@@ -39,20 +39,29 @@ module RSpec::Core
|
|
39
39
|
RSpec::Core::Configuration.new
|
40
40
|
end
|
41
41
|
|
42
|
+
let(:err) { ::StringIO.new }
|
42
43
|
let(:out) { ::StringIO.new }
|
43
44
|
|
44
45
|
before do
|
45
46
|
config.stub(:run_hook)
|
46
47
|
end
|
47
48
|
|
49
|
+
it "configures streams before command line options" do
|
50
|
+
# this is necessary to ensure that color works correctly on windows
|
51
|
+
config.should_receive(:error_stream=).ordered
|
52
|
+
config.should_receive(:output_stream=).ordered
|
53
|
+
config.should_receive(:color_enabled=).ordered
|
54
|
+
command_line.run(err, out) rescue nil
|
55
|
+
end
|
56
|
+
|
48
57
|
it "runs before suite hooks" do
|
49
58
|
config.should_receive(:run_hook).with(:before, :suite)
|
50
|
-
command_line.run(
|
59
|
+
command_line.run(err, out)
|
51
60
|
end
|
52
61
|
|
53
62
|
it "runs after suite hooks" do
|
54
63
|
config.should_receive(:run_hook).with(:after, :suite)
|
55
|
-
command_line.run(
|
64
|
+
command_line.run(err, out)
|
56
65
|
end
|
57
66
|
|
58
67
|
it "runs after suite hooks even after an error" do
|
@@ -66,10 +75,11 @@ module RSpec::Core
|
|
66
75
|
end
|
67
76
|
end
|
68
77
|
expect do
|
69
|
-
command_line.run(
|
78
|
+
command_line.run(err, out)
|
70
79
|
end.to raise_error
|
71
80
|
after_suite_called.should be_true
|
72
81
|
end
|
82
|
+
|
73
83
|
end
|
74
84
|
|
75
85
|
describe "#run with custom output" do
|
@@ -204,9 +204,41 @@ module RSpec::Core
|
|
204
204
|
|
205
205
|
describe "#color_enabled=" do
|
206
206
|
context "given true" do
|
207
|
+
context "with non-tty output and no autotest" do
|
208
|
+
it "does not set color_enabled" do
|
209
|
+
config.output_stream = StringIO.new
|
210
|
+
config.output_stream.stub(:tty?) { false }
|
211
|
+
config.autotest = false
|
212
|
+
config.color_enabled = true
|
213
|
+
config.color_enabled.should be_false
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
context "with tty output" do
|
218
|
+
it "does not set color_enabled" do
|
219
|
+
config.output_stream = StringIO.new
|
220
|
+
config.output_stream.stub(:tty?) { true }
|
221
|
+
config.autotest = false
|
222
|
+
config.color_enabled = true
|
223
|
+
config.color_enabled.should be_true
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
context "with autotest output" do
|
228
|
+
it "does not set color_enabled" do
|
229
|
+
config.output_stream = StringIO.new
|
230
|
+
config.output_stream.stub(:tty?) { false }
|
231
|
+
config.autotest = true
|
232
|
+
config.color_enabled = true
|
233
|
+
config.color_enabled.should be_true
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
207
237
|
context "on windows" do
|
208
238
|
before do
|
209
239
|
@original_host = RbConfig::CONFIG['host_os']
|
240
|
+
@original_stdout = $stdout
|
241
|
+
@original_stderr = $stderr
|
210
242
|
RbConfig::CONFIG['host_os'] = 'mswin'
|
211
243
|
config.stub(:require)
|
212
244
|
config.stub(:warn)
|
@@ -214,6 +246,8 @@ module RSpec::Core
|
|
214
246
|
|
215
247
|
after do
|
216
248
|
RbConfig::CONFIG['host_os'] = @original_host
|
249
|
+
$stdout = @original_stdout
|
250
|
+
$stderr = @original_stderr
|
217
251
|
end
|
218
252
|
|
219
253
|
context "with win32console available" do
|
@@ -223,14 +257,48 @@ module RSpec::Core
|
|
223
257
|
config.color_enabled = true
|
224
258
|
end
|
225
259
|
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
260
|
+
context "with $stdout/err assigned to config.output/error_stream" do
|
261
|
+
it "reassigns new $stdout to output_stream" do
|
262
|
+
config.output_stream = $stdout
|
263
|
+
substitute_stdout = StringIO.new
|
264
|
+
config.stub(:require) do |what|
|
265
|
+
$stdout = substitute_stdout if what =~ /Win32/
|
266
|
+
end
|
267
|
+
config.color_enabled = true
|
268
|
+
config.output_stream.should eq(substitute_stdout)
|
269
|
+
end
|
270
|
+
|
271
|
+
it "reassigns new $stderr to error_stream" do
|
272
|
+
config.error_stream = $stderr
|
273
|
+
substitute_stderr = StringIO.new
|
274
|
+
config.stub(:require) do |what|
|
275
|
+
$stderr = substitute_stderr if what =~ /Win32/
|
276
|
+
end
|
277
|
+
config.color_enabled = true
|
278
|
+
config.error_stream.should eq(substitute_stderr)
|
230
279
|
end
|
231
|
-
config.color_enabled = true
|
232
|
-
config.output_stream.should eq($stdout)
|
233
280
|
end
|
281
|
+
|
282
|
+
context "without $stdout/err assigned to config.output/error_stream" do
|
283
|
+
it "leaves output stream intact" do
|
284
|
+
config.output_stream = output_stream = StringIO.new
|
285
|
+
config.stub(:require) do |what|
|
286
|
+
$stdout = StringIO.new if what =~ /Win32/
|
287
|
+
end
|
288
|
+
config.color_enabled = true
|
289
|
+
config.output_stream.should eq(output_stream)
|
290
|
+
end
|
291
|
+
|
292
|
+
it "leaves error stream intact" do
|
293
|
+
config.error_stream = error_stream = StringIO.new
|
294
|
+
config.stub(:require) do |what|
|
295
|
+
$stderr = StringIO.new if what =~ /Win32/
|
296
|
+
end
|
297
|
+
config.color_enabled = true
|
298
|
+
config.error_stream.should eq(error_stream)
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
234
302
|
end
|
235
303
|
|
236
304
|
context "with win32console NOT available" do
|