rspec-core 2.99.0.beta2 → 2.99.0.rc1
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.
- checksums.yaml +7 -0
- data/Changelog.md +122 -43
- data/features/command_line/line_number_option.feature +6 -11
- data/features/configuration/read_options_from_file.feature +2 -2
- data/features/expectation_framework_integration/configure_expectation_framework.feature +120 -25
- data/lib/autotest/discover.rb +10 -1
- data/lib/autotest/rspec2.rb +1 -1
- data/lib/rspec/core/command_line.rb +16 -5
- data/lib/rspec/core/configuration.rb +151 -119
- data/lib/rspec/core/deprecated_mutable_array_proxy.rb +32 -0
- data/lib/rspec/core/example.rb +3 -1
- data/lib/rspec/core/example_group.rb +174 -125
- data/lib/rspec/core/filter_manager.rb +48 -10
- data/lib/rspec/core/formatters.rb +137 -0
- data/lib/rspec/core/formatters/base_text_formatter.rb +25 -29
- data/lib/rspec/core/formatters/console_codes.rb +42 -0
- data/lib/rspec/core/formatters/deprecation_formatter.rb +14 -5
- data/lib/rspec/core/formatters/helpers.rb +1 -1
- data/lib/rspec/core/memoized_helpers.rb +2 -1
- data/lib/rspec/core/metadata.rb +63 -1
- data/lib/rspec/core/minitest_assertions_adapter.rb +28 -0
- data/lib/rspec/core/option_parser.rb +20 -1
- data/lib/rspec/core/pending.rb +26 -4
- data/lib/rspec/core/reporter.rb +1 -1
- data/lib/rspec/core/runner.rb +2 -2
- data/lib/rspec/core/shared_example_group.rb +11 -4
- data/lib/rspec/core/test_unit_assertions_adapter.rb +30 -0
- data/lib/rspec/core/version.rb +1 -1
- data/lib/rspec/core/world.rb +2 -2
- data/spec/autotest/discover_spec.rb +38 -8
- data/spec/rspec/core/command_line_spec.rb +47 -29
- data/spec/rspec/core/configuration_options_spec.rb +1 -1
- data/spec/rspec/core/configuration_spec.rb +223 -37
- data/spec/rspec/core/example_group_spec.rb +116 -6
- data/spec/rspec/core/formatters/base_text_formatter_spec.rb +24 -4
- data/spec/rspec/core/formatters/console_codes_spec.rb +50 -0
- data/spec/rspec/core/formatters/deprecation_formatter_spec.rb +20 -3
- data/spec/rspec/core/formatters/documentation_formatter_spec.rb +1 -0
- data/spec/rspec/core/formatters/html_formatted.html +3 -4
- data/spec/rspec/core/formatters/html_formatter_spec.rb +10 -4
- data/spec/rspec/core/formatters/text_mate_formatted.html +3 -4
- data/spec/rspec/core/formatters/text_mate_formatter_spec.rb +9 -3
- data/spec/rspec/core/hooks_filtering_spec.rb +5 -5
- data/spec/rspec/core/memoized_helpers_spec.rb +38 -0
- data/spec/rspec/core/metadata_spec.rb +24 -1
- data/spec/rspec/core/option_parser_spec.rb +39 -2
- data/spec/rspec/core/pending_example_spec.rb +14 -0
- data/spec/rspec/core/pending_spec.rb +27 -0
- data/spec/rspec/core/runner_spec.rb +3 -3
- data/spec/rspec/core/shared_context_spec.rb +1 -1
- data/spec/rspec/core/shared_example_group_spec.rb +18 -0
- data/spec/support/helper_methods.rb +4 -0
- metadata +105 -106
@@ -0,0 +1,28 @@
|
|
1
|
+
begin
|
2
|
+
# Only the minitest 5.x gem includes the minitest.rb and assertions.rb files
|
3
|
+
require 'minitest'
|
4
|
+
require 'minitest/assertions'
|
5
|
+
rescue LoadError => _ignored
|
6
|
+
# We must be using Ruby Core's MiniTest or the Minitest gem 4.x
|
7
|
+
require 'minitest/unit'
|
8
|
+
Minitest = MiniTest
|
9
|
+
end
|
10
|
+
|
11
|
+
module RSpec
|
12
|
+
module Core
|
13
|
+
# @private
|
14
|
+
module MinitestAssertionsAdapter
|
15
|
+
include ::Minitest::Assertions
|
16
|
+
|
17
|
+
# Minitest 5.x requires this accessor to be available. See
|
18
|
+
# https://github.com/seattlerb/minitest/blob/38f0a5fcbd9c37c3f80a3eaad4ba84d3fc9947a0/lib/minitest/assertions.rb#L8
|
19
|
+
#
|
20
|
+
# It is not required for other extension libraries, and RSpec does not
|
21
|
+
# report or make this information available to formatters.
|
22
|
+
attr_writer :assertions
|
23
|
+
def assertions
|
24
|
+
@assertions ||= 0
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -14,6 +14,7 @@ module RSpec::Core
|
|
14
14
|
def parse!(args)
|
15
15
|
return {} if args.empty?
|
16
16
|
|
17
|
+
pre_parse(args)
|
17
18
|
convert_deprecated_args(args)
|
18
19
|
|
19
20
|
options = args.delete('--tty') ? {:tty => true} : {}
|
@@ -30,9 +31,10 @@ module RSpec::Core
|
|
30
31
|
args.map! { |arg|
|
31
32
|
case arg
|
32
33
|
when "--formatter"
|
33
|
-
RSpec.deprecate("
|
34
|
+
RSpec.deprecate("The `--formatter` option", :replacement => "-f or --format", :call_site => nil)
|
34
35
|
"--format"
|
35
36
|
when "--default_path"
|
37
|
+
RSpec.deprecate("The `--default_path` option", :replacement => "--default-path", :call_site => nil)
|
36
38
|
"--default-path"
|
37
39
|
when "--line_number"
|
38
40
|
"--line-number"
|
@@ -132,6 +134,11 @@ module RSpec::Core
|
|
132
134
|
options[:formatters].last << o
|
133
135
|
end
|
134
136
|
|
137
|
+
parser.on('--deprecation-out FILE', 'Write deprecation warnings to a file instead of $stdout.') do |file|
|
138
|
+
# Handled in `pre_parse` so we can set the deprecation stream as early as
|
139
|
+
# possible in case any other options cause deprecations to be issued.
|
140
|
+
end
|
141
|
+
|
135
142
|
parser.on('-b', '--backtrace', 'Enable full backtrace.') do |o|
|
136
143
|
options[:full_backtrace] = true
|
137
144
|
end
|
@@ -184,6 +191,10 @@ FILTERING
|
|
184
191
|
|
185
192
|
parser.on('-l', '--line-number LINE', 'Specify line number of an example or group (may be',
|
186
193
|
' used more than once).') do |o|
|
194
|
+
Metadata.line_number_filter_deprecation_issued = true
|
195
|
+
RSpec.deprecate("The `--line-number`/`-l` CLI option",
|
196
|
+
:replacement => "the `path/to/file.rb:num` form",
|
197
|
+
:call_site => nil)
|
187
198
|
(options[:line_numbers] ||= []) << o
|
188
199
|
end
|
189
200
|
|
@@ -220,5 +231,13 @@ FILTERING
|
|
220
231
|
|
221
232
|
end
|
222
233
|
end
|
234
|
+
|
235
|
+
def pre_parse(args)
|
236
|
+
args.each_cons(2) do |arg, value|
|
237
|
+
if arg == "--deprecation-out"
|
238
|
+
RSpec.configuration.deprecation_stream = value
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
223
242
|
end
|
224
243
|
end
|
data/lib/rspec/core/pending.rb
CHANGED
@@ -1,7 +1,14 @@
|
|
1
1
|
module RSpec
|
2
2
|
module Core
|
3
3
|
module Pending
|
4
|
-
class
|
4
|
+
class SkipDeclaredInExample < StandardError
|
5
|
+
attr_reader :argument
|
6
|
+
|
7
|
+
def initialize(argument)
|
8
|
+
super(argument.to_s)
|
9
|
+
@argument = argument
|
10
|
+
end
|
11
|
+
end
|
5
12
|
|
6
13
|
# If Test::Unit is loaed, we'll use its error as baseclass, so that Test::Unit
|
7
14
|
# will report unmet RSpec expectations as failures rather than errors.
|
@@ -126,11 +133,24 @@ module RSpec
|
|
126
133
|
raise PendingExampleFixedError.new
|
127
134
|
end
|
128
135
|
end
|
129
|
-
raise
|
136
|
+
raise SkipDeclaredInExample.new(message)
|
130
137
|
end
|
131
138
|
|
132
139
|
# Backport from RSpec 3 to aid in upgrading.
|
133
|
-
|
140
|
+
#
|
141
|
+
# Not using alias method because we explictly want to discard any block.
|
142
|
+
def skip(*args)
|
143
|
+
pending_no_warning(*args)
|
144
|
+
end
|
145
|
+
|
146
|
+
def self.const_missing(name)
|
147
|
+
return super unless name == :PendingDeclaredInExample
|
148
|
+
|
149
|
+
RSpec.deprecate("RSpec::Core::PendingDeclaredInExample",
|
150
|
+
:replacement => "RSpec::Core::Pending::SkipDeclaredInExample")
|
151
|
+
|
152
|
+
SkipDeclaredInExample
|
153
|
+
end
|
134
154
|
end
|
135
155
|
|
136
156
|
# Alias the error for compatibility with extension gems (e.g. formatters)
|
@@ -138,7 +158,9 @@ module RSpec
|
|
138
158
|
def self.const_missing(name)
|
139
159
|
return super unless name == :PendingExampleFixedError
|
140
160
|
|
141
|
-
RSpec.deprecate("RSpec::Core::PendingExampleFixedError",
|
161
|
+
RSpec.deprecate("RSpec::Core::PendingExampleFixedError",
|
162
|
+
:replacement => "RSpec::Core::Pending::PendingExampleFixedError")
|
163
|
+
|
142
164
|
Pending::PendingExampleFixedError
|
143
165
|
end
|
144
166
|
end
|
data/lib/rspec/core/reporter.rb
CHANGED
@@ -107,8 +107,8 @@ module RSpec::Core
|
|
107
107
|
notify :start_dump
|
108
108
|
notify :dump_pending
|
109
109
|
notify :dump_failures
|
110
|
-
notify :dump_summary, @duration, @example_count, @failure_count, @pending_count
|
111
110
|
notify :deprecation_summary
|
111
|
+
notify :dump_summary, @duration, @example_count, @failure_count, @pending_count
|
112
112
|
notify :seed, seed if seed
|
113
113
|
ensure
|
114
114
|
notify :close
|
data/lib/rspec/core/runner.rb
CHANGED
@@ -83,10 +83,10 @@ module RSpec
|
|
83
83
|
DRbCommandLine.new(options).run(err, out)
|
84
84
|
rescue DRb::DRbConnError
|
85
85
|
err.puts "No DRb server is running. Running in local process instead ..."
|
86
|
-
|
86
|
+
new(options).run(err, out)
|
87
87
|
end
|
88
88
|
else
|
89
|
-
|
89
|
+
new(options).run(err, out)
|
90
90
|
end
|
91
91
|
ensure
|
92
92
|
RSpec.reset
|
@@ -33,9 +33,13 @@ module RSpec
|
|
33
33
|
end
|
34
34
|
|
35
35
|
alias_method :shared_context, :shared_examples
|
36
|
-
alias_method :share_examples_for, :shared_examples
|
37
36
|
alias_method :shared_examples_for, :shared_examples
|
38
37
|
|
38
|
+
def share_examples_for(*args, &block)
|
39
|
+
RSpec.deprecate("`share_examples_for`", :replacement => "`shared_examples` or `shared_examples_for`")
|
40
|
+
shared_examples(*args, &block)
|
41
|
+
end
|
42
|
+
|
39
43
|
# @deprecated
|
40
44
|
def share_as(name, &block)
|
41
45
|
RSpec.deprecate("Rspec::Core::SharedExampleGroup#share_as",
|
@@ -53,12 +57,15 @@ module RSpec
|
|
53
57
|
end
|
54
58
|
|
55
59
|
alias_method :shared_context, :shared_examples
|
56
|
-
alias_method :share_examples_for, :shared_examples
|
57
60
|
alias_method :shared_examples_for, :shared_examples
|
58
61
|
|
62
|
+
def share_examples_for(*args, &block)
|
63
|
+
RSpec.deprecate("`share_examples_for`", :replacement => "`shared_examples` or `shared_examples_for`")
|
64
|
+
shared_examples(*args, &block)
|
65
|
+
end
|
66
|
+
|
59
67
|
def share_as(name, &block)
|
60
|
-
RSpec.deprecate("
|
61
|
-
:replacement => "RSpec::SharedContext or shared_examples")
|
68
|
+
RSpec.deprecate("`share_as`", :replacement => "`RSpec::SharedContext` or `shared_examples`")
|
62
69
|
SharedExampleGroup.registry.add_const('main', name, &block)
|
63
70
|
end
|
64
71
|
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'test/unit/assertions'
|
2
|
+
|
3
|
+
module RSpec
|
4
|
+
module Core
|
5
|
+
# @private
|
6
|
+
module TestUnitAssertionsAdapter
|
7
|
+
include ::Test::Unit::Assertions
|
8
|
+
|
9
|
+
# If using test/unit from Ruby core with Ruby 1.9+, it includes
|
10
|
+
# MiniTest::Assertions by default. Note the upcasing of 'Test'.
|
11
|
+
#
|
12
|
+
# If the test/unit gem is being loaded, it will not include any minitest
|
13
|
+
# assertions.
|
14
|
+
#
|
15
|
+
# Only if Minitest 5.x is included / loaded do we need to worry about
|
16
|
+
# adding a shim for the new updates. Thus instead of checking on the
|
17
|
+
# RUBY_VERSION we need to check ancestors.
|
18
|
+
begin
|
19
|
+
# MiniTest is 4.x
|
20
|
+
# Minitest is 5.x
|
21
|
+
if ancestors.include?(::Minitest::Assertions)
|
22
|
+
require 'rspec/core/minitest_assertions_adapter'
|
23
|
+
include ::RSpec::Core::MinitestAssertionsAdapter
|
24
|
+
end
|
25
|
+
rescue NameError => _ignored
|
26
|
+
# No-op. Minitest 5.x was not loaded
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/rspec/core/version.rb
CHANGED
data/lib/rspec/core/world.rb
CHANGED
@@ -86,7 +86,7 @@ module RSpec
|
|
86
86
|
example_groups.clear
|
87
87
|
if filter_manager.empty?
|
88
88
|
reporter.message("No examples found.")
|
89
|
-
elsif exclusion_filter.
|
89
|
+
elsif exclusion_filter.rules_empty?
|
90
90
|
message = everything_filtered_message
|
91
91
|
if @configuration.run_all_when_everything_filtered?
|
92
92
|
message << "; ignoring #{inclusion_filter.description}"
|
@@ -109,7 +109,7 @@ module RSpec
|
|
109
109
|
end
|
110
110
|
|
111
111
|
def announce_exclusion_filter(announcements)
|
112
|
-
unless exclusion_filter.
|
112
|
+
unless exclusion_filter.rules_empty?
|
113
113
|
announcements << "exclude #{exclusion_filter.description}"
|
114
114
|
end
|
115
115
|
end
|
@@ -1,19 +1,49 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe "autotest/discover.rb" do
|
4
|
+
before { File.stub(:exist?).and_call_original }
|
5
|
+
|
4
6
|
context "with ./.rspec present" do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
7
|
+
before { File.stub(:exist?).with("./.rspec") { true } }
|
8
|
+
|
9
|
+
context "when RSpec::Autotest is defined" do
|
10
|
+
before { stub_const "RSpec::Autotest", Module.new }
|
11
|
+
|
12
|
+
it "does not add 'rspec2' to the list of discoveries" do
|
13
|
+
Autotest.should_not_receive(:add_discovery)
|
14
|
+
load File.expand_path("../../../lib/autotest/discover.rb", __FILE__)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context "when RSpec::Autotest is not defined" do
|
19
|
+
before { hide_const "RSpec::Autotest" }
|
20
|
+
|
21
|
+
it "adds 'rspec2' to the list of discoveries" do
|
22
|
+
Autotest.should_receive(:add_discovery)
|
23
|
+
load File.expand_path("../../../lib/autotest/discover.rb", __FILE__)
|
24
|
+
end
|
9
25
|
end
|
10
26
|
end
|
11
27
|
|
12
28
|
context "with ./.rspec absent" do
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
29
|
+
before { File.stub(:exist?).with("./.rspec") { false } }
|
30
|
+
|
31
|
+
context "when RSpec::Autotest is defined" do
|
32
|
+
before { stub_const "RSpec::Autotest", Module.new }
|
33
|
+
|
34
|
+
it "does not add 'rspec2' to the list of discoveries" do
|
35
|
+
Autotest.should_not_receive(:add_discovery)
|
36
|
+
load File.expand_path("../../../lib/autotest/discover.rb", __FILE__)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "when RSpec::Autotest is not defined" do
|
41
|
+
before { hide_const "RSpec::Autotest" }
|
42
|
+
|
43
|
+
it "does not add 'rspec2' to the list of discoveries" do
|
44
|
+
Autotest.should_not_receive(:add_discovery)
|
45
|
+
load File.expand_path("../../../lib/autotest/discover.rb", __FILE__)
|
46
|
+
end
|
17
47
|
end
|
18
48
|
end
|
19
49
|
end
|
@@ -3,7 +3,7 @@ require "stringio"
|
|
3
3
|
require 'tmpdir'
|
4
4
|
|
5
5
|
module RSpec::Core
|
6
|
-
describe
|
6
|
+
describe Runner do
|
7
7
|
|
8
8
|
let(:out) { StringIO.new }
|
9
9
|
let(:err) { StringIO.new }
|
@@ -21,20 +21,14 @@ module RSpec::Core
|
|
21
21
|
config.should_receive(:output_stream=).ordered
|
22
22
|
config.should_receive(:force).at_least(:once).ordered
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
end
|
27
|
-
|
28
|
-
it "assigns ConfigurationOptions built from Array of options to @options" do
|
29
|
-
config_options = ConfigurationOptions.new(%w[--color])
|
30
|
-
command_line = CommandLine.new(%w[--color])
|
31
|
-
expect(command_line.instance_eval { @options.options }).to eq(config_options.parse_options)
|
24
|
+
runner = build_runner
|
25
|
+
runner.run err, out
|
32
26
|
end
|
33
27
|
|
34
28
|
it "assigns submitted ConfigurationOptions to @options" do
|
35
29
|
config_options = ConfigurationOptions.new(%w[--color])
|
36
|
-
|
37
|
-
expect(
|
30
|
+
runner = Runner.new(config_options)
|
31
|
+
expect(runner.instance_eval { @options }).to be(config_options)
|
38
32
|
end
|
39
33
|
|
40
34
|
describe "#run" do
|
@@ -42,18 +36,18 @@ module RSpec::Core
|
|
42
36
|
include_context "spec files"
|
43
37
|
|
44
38
|
it "returns 0 if spec passes" do
|
45
|
-
|
46
|
-
expect(
|
39
|
+
runner = build_runner passing_spec_filename
|
40
|
+
expect(runner.run(err, out)).to eq 0
|
47
41
|
end
|
48
42
|
|
49
43
|
it "returns 1 if spec fails" do
|
50
|
-
|
51
|
-
expect(
|
44
|
+
runner = build_runner failing_spec_filename
|
45
|
+
expect(runner.run(err, out)).to eq 1
|
52
46
|
end
|
53
47
|
|
54
48
|
it "returns 2 if spec fails and --failure-exit-code is 2" do
|
55
|
-
|
56
|
-
expect(
|
49
|
+
runner = build_runner failing_spec_filename, "--failure-exit-code", "2"
|
50
|
+
expect(runner.run(err, out)).to eq 2
|
57
51
|
end
|
58
52
|
end
|
59
53
|
|
@@ -62,22 +56,22 @@ module RSpec::Core
|
|
62
56
|
|
63
57
|
it "runs before suite hooks" do
|
64
58
|
config.should_receive(:run_hook).with(:before, :suite)
|
65
|
-
|
66
|
-
|
59
|
+
runner = build_runner
|
60
|
+
runner.run err, out
|
67
61
|
end
|
68
62
|
|
69
63
|
it "runs after suite hooks" do
|
70
64
|
config.should_receive(:run_hook).with(:after, :suite)
|
71
|
-
|
72
|
-
|
65
|
+
runner = build_runner
|
66
|
+
runner.run err, out
|
73
67
|
end
|
74
68
|
|
75
69
|
it "runs after suite hooks even after an error" do
|
76
70
|
config.should_receive(:run_hook).with(:before, :suite).and_raise "this error"
|
77
71
|
config.should_receive(:run_hook).with(:after , :suite)
|
78
72
|
expect do
|
79
|
-
|
80
|
-
|
73
|
+
runner = build_runner
|
74
|
+
runner.run err, out
|
81
75
|
end.to raise_error
|
82
76
|
end
|
83
77
|
end
|
@@ -86,18 +80,18 @@ module RSpec::Core
|
|
86
80
|
describe "#run with custom output" do
|
87
81
|
before { config.stub :files_to_run => [] }
|
88
82
|
|
89
|
-
let(:output_file) { File.new("#{Dir.tmpdir}/
|
83
|
+
let(:output_file) { File.new("#{Dir.tmpdir}/runner_spec_output.txt", 'w') }
|
90
84
|
|
91
85
|
it "doesn't override output_stream" do
|
92
86
|
config.output_stream = output_file
|
93
|
-
|
94
|
-
|
95
|
-
expect(
|
87
|
+
runner = build_runner
|
88
|
+
runner.run err, out
|
89
|
+
expect(runner.instance_eval { @configuration.output_stream }).to eq output_file
|
96
90
|
end
|
97
91
|
end
|
98
92
|
|
99
|
-
def
|
100
|
-
|
93
|
+
def build_runner *args
|
94
|
+
Runner.new build_config_options(*args)
|
101
95
|
end
|
102
96
|
|
103
97
|
def build_config_options *args
|
@@ -106,4 +100,28 @@ module RSpec::Core
|
|
106
100
|
options
|
107
101
|
end
|
108
102
|
end
|
103
|
+
|
104
|
+
describe CommandLine do
|
105
|
+
it 'is a subclass of `Runner` so that it inherits the same behavior' do
|
106
|
+
expect(CommandLine.superclass).to be(Runner)
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'prints a deprecation when instantiated' do
|
110
|
+
expect_deprecation_with_call_site(__FILE__, __LINE__ + 1, /RSpec::Core::CommandLine/)
|
111
|
+
CommandLine.new(ConfigurationOptions.new([]))
|
112
|
+
end
|
113
|
+
|
114
|
+
context "when given an array as the first arg" do
|
115
|
+
it 'parses it into configuration options' do
|
116
|
+
cl = CommandLine.new(%w[ --require foo ])
|
117
|
+
options = cl.instance_eval { @options }
|
118
|
+
expect(options.options).to include(:requires => ['foo'])
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'issues a deprecation about the array arg' do
|
122
|
+
expect_deprecation_with_call_site(__FILE__, __LINE__ + 1, /array/)
|
123
|
+
CommandLine.new(%w[ --require foo ])
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
109
127
|
end
|