rspec-core 2.0.0.rc → 2.0.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/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
|