rspec-core 3.0.0.beta1 → 3.0.0.beta2
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.tar.gz.sig +0 -0
- data/Changelog.md +137 -0
- data/README.md +2 -2
- data/exe/rspec +2 -23
- data/features/README.md +1 -5
- data/features/command_line/README.md +7 -10
- data/features/command_line/exit_status.feature +1 -1
- data/features/command_line/format_option.feature +1 -1
- data/features/command_line/init.feature +40 -1
- data/features/command_line/line_number_option.feature +2 -2
- data/features/command_line/ruby.feature +5 -4
- data/features/configuration/enable_global_dsl.feature +54 -0
- data/features/example_groups/aliasing.feature +48 -0
- data/features/example_groups/basic_structure.feature +1 -1
- data/features/expectation_framework_integration/configure_expectation_framework.feature +1 -1
- data/features/filtering/if_and_unless.feature +0 -30
- data/features/formatters/custom_formatter.feature +32 -0
- data/features/formatters/regression_tests.feature +95 -0
- data/features/hooks/around_hooks.feature +1 -0
- data/features/hooks/before_and_after_hooks.feature +2 -2
- data/features/mock_framework_integration/use_flexmock.feature +11 -13
- data/features/mock_framework_integration/use_mocha.feature +11 -13
- data/features/mock_framework_integration/use_rr.feature +11 -13
- data/features/mock_framework_integration/use_rspec.feature +11 -13
- data/features/pending_and_skipped_examples/README.md +3 -0
- data/features/pending_and_skipped_examples/pending_examples.feature +118 -0
- data/features/pending_and_skipped_examples/skipped_examples.feature +106 -0
- data/features/step_definitions/additional_cli_steps.rb +34 -0
- data/features/subject/explicit_subject.feature +1 -1
- data/features/subject/one_liner_syntax.feature +71 -0
- data/lib/rspec/core.rb +6 -14
- data/lib/rspec/core/backtrace_formatter.rb +16 -4
- data/lib/rspec/core/command_line.rb +2 -3
- data/lib/rspec/core/configuration.rb +114 -125
- data/lib/rspec/core/configuration_options.rb +32 -18
- data/lib/rspec/core/dsl.rb +80 -18
- data/lib/rspec/core/example.rb +84 -33
- data/lib/rspec/core/example_group.rb +95 -43
- data/lib/rspec/core/filter_manager.rb +31 -40
- data/lib/rspec/core/formatters.rb +137 -0
- data/lib/rspec/core/formatters/base_formatter.rb +28 -41
- data/lib/rspec/core/formatters/base_text_formatter.rb +26 -37
- data/lib/rspec/core/formatters/deprecation_formatter.rb +48 -27
- data/lib/rspec/core/formatters/documentation_formatter.rb +27 -22
- data/lib/rspec/core/formatters/html_formatter.rb +48 -56
- data/lib/rspec/core/formatters/html_printer.rb +11 -18
- data/lib/rspec/core/formatters/json_formatter.rb +18 -22
- data/lib/rspec/core/formatters/legacy_formatter.rb +227 -0
- data/lib/rspec/core/formatters/progress_formatter.rb +7 -10
- data/lib/rspec/core/hooks.rb +250 -217
- data/lib/rspec/core/memoized_helpers.rb +43 -9
- data/lib/rspec/core/mocking_adapters/flexmock.rb +29 -0
- data/lib/rspec/core/{mocking/with_mocha.rb → mocking_adapters/mocha.rb} +19 -16
- data/lib/rspec/core/mocking_adapters/null.rb +12 -0
- data/lib/rspec/core/mocking_adapters/rr.rb +28 -0
- data/lib/rspec/core/mocking_adapters/rspec.rb +30 -0
- data/lib/rspec/core/notifications.rb +100 -0
- data/lib/rspec/core/option_parser.rb +11 -18
- data/lib/rspec/core/pending.rb +78 -47
- data/lib/rspec/core/project_initializer.rb +2 -49
- data/lib/rspec/core/project_initializer/dot_rspec +3 -0
- data/lib/rspec/core/project_initializer/spec_helper.rb +82 -0
- data/lib/rspec/core/rake_task.rb +5 -14
- data/lib/rspec/core/reporter.rb +24 -32
- data/lib/rspec/core/ruby_project.rb +1 -1
- data/lib/rspec/core/runner.rb +14 -4
- data/lib/rspec/core/shared_example_group.rb +40 -13
- data/lib/rspec/core/version.rb +1 -1
- data/spec/command_line/order_spec.rb +15 -15
- data/spec/rspec/core/backtrace_formatter_spec.rb +15 -1
- data/spec/rspec/core/command_line_spec.rb +18 -17
- data/spec/rspec/core/configuration_options_spec.rb +57 -34
- data/spec/rspec/core/configuration_spec.rb +162 -184
- data/spec/rspec/core/drb_command_line_spec.rb +5 -7
- data/spec/rspec/core/drb_options_spec.rb +2 -2
- data/spec/rspec/core/dsl_spec.rb +79 -15
- data/spec/rspec/core/example_group_spec.rb +253 -39
- data/spec/rspec/core/example_spec.rb +149 -33
- data/spec/rspec/core/filter_manager_spec.rb +9 -26
- data/spec/rspec/core/formatters/base_formatter_spec.rb +2 -5
- data/spec/rspec/core/formatters/base_text_formatter_spec.rb +42 -145
- data/spec/rspec/core/formatters/deprecation_formatter_spec.rb +64 -34
- data/spec/rspec/core/formatters/documentation_formatter_spec.rb +15 -28
- data/spec/rspec/core/formatters/helpers_spec.rb +2 -2
- data/spec/rspec/core/formatters/{html_formatted-1.8.7.html → html_formatted-2.1.0.html} +22 -44
- data/spec/rspec/core/formatters/{html_formatted-1.8.7-jruby.html → html_formatted.html} +30 -49
- data/spec/rspec/core/formatters/html_formatter_spec.rb +35 -19
- data/spec/rspec/core/formatters/json_formatter_spec.rb +42 -40
- data/spec/rspec/core/formatters/legacy_formatter_spec.rb +137 -0
- data/spec/rspec/core/formatters/progress_formatter_spec.rb +38 -25
- data/spec/rspec/core/formatters/snippet_extractor_spec.rb +1 -1
- data/spec/rspec/core/formatters_spec.rb +120 -0
- data/spec/rspec/core/hooks_filtering_spec.rb +1 -1
- data/spec/rspec/core/hooks_spec.rb +13 -2
- data/spec/rspec/core/memoized_helpers_spec.rb +17 -8
- data/spec/rspec/core/metadata_spec.rb +3 -3
- data/spec/rspec/core/option_parser_spec.rb +53 -46
- data/spec/rspec/core/ordering_spec.rb +4 -4
- data/spec/rspec/core/pending_example_spec.rb +23 -126
- data/spec/rspec/core/pending_spec.rb +8 -0
- data/spec/rspec/core/project_initializer_spec.rb +8 -41
- data/spec/rspec/core/rake_task_spec.rb +15 -4
- data/spec/rspec/core/random_spec.rb +1 -1
- data/spec/rspec/core/reporter_spec.rb +50 -37
- data/spec/rspec/core/resources/formatter_specs.rb +9 -11
- data/spec/rspec/core/rspec_matchers_spec.rb +1 -1
- data/spec/rspec/core/ruby_project_spec.rb +3 -3
- data/spec/rspec/core/runner_spec.rb +65 -23
- data/spec/rspec/core/shared_context_spec.rb +4 -4
- data/spec/rspec/core/shared_example_group/collection_spec.rb +1 -1
- data/spec/rspec/core/shared_example_group_spec.rb +20 -11
- data/spec/rspec/core/warnings_spec.rb +1 -1
- data/spec/rspec/core/world_spec.rb +10 -10
- data/spec/rspec/core_spec.rb +2 -2
- data/spec/spec_helper.rb +12 -24
- data/spec/support/config_options_helper.rb +1 -3
- data/spec/support/formatter_support.rb +83 -0
- data/spec/support/isolate_load_path_mutation.rb +1 -2
- data/spec/support/isolated_directory.rb +1 -1
- data/spec/support/isolated_home_directory.rb +1 -1
- data/spec/support/legacy_formatter_using_sub_classing_example.rb +87 -0
- data/spec/support/matchers.rb +20 -0
- data/spec/support/mathn_integration_support.rb +2 -2
- data/spec/support/old_style_formatter_example.rb +69 -0
- data/spec/support/shared_example_groups.rb +1 -1
- data/spec/support/spec_files.rb +3 -3
- metadata +192 -69
- metadata.gz.sig +3 -1
- checksums.yaml +0 -15
- checksums.yaml.gz.sig +0 -2
- data/features/configuration/show_failures_in_pending_blocks.feature +0 -61
- data/features/pending/pending_examples.feature +0 -229
- data/features/subject/implicit_receiver.feature +0 -29
- data/lib/rspec/core/mocking/with_absolutely_nothing.rb +0 -11
- data/lib/rspec/core/mocking/with_flexmock.rb +0 -27
- data/lib/rspec/core/mocking/with_rr.rb +0 -27
- data/lib/rspec/core/mocking/with_rspec.rb +0 -27
- data/spec/rspec/core/formatters/html_formatted-1.8.7-rbx.html +0 -477
- data/spec/rspec/core/formatters/html_formatted-1.9.2.html +0 -425
- data/spec/rspec/core/formatters/html_formatted-1.9.3-jruby.html +0 -416
- data/spec/rspec/core/formatters/html_formatted-1.9.3-rbx.html +0 -477
- data/spec/rspec/core/formatters/html_formatted-1.9.3.html +0 -419
- data/spec/rspec/core/formatters/html_formatted-2.0.0.html +0 -425
- data/spec/support/in_sub_process.rb +0 -37
- data/spec/support/sandboxed_mock_space.rb +0 -100
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
Feature: skipped examples
|
|
2
|
+
|
|
3
|
+
RSpec offers a number of ways to indicate that an example should be skipped
|
|
4
|
+
and not executed.
|
|
5
|
+
|
|
6
|
+
Scenario: no implementation provided
|
|
7
|
+
Given a file named "example_without_block_spec.rb" with:
|
|
8
|
+
"""ruby
|
|
9
|
+
describe "an example" do
|
|
10
|
+
it "is a skipped example"
|
|
11
|
+
end
|
|
12
|
+
"""
|
|
13
|
+
When I run `rspec example_without_block_spec.rb`
|
|
14
|
+
Then the exit status should be 0
|
|
15
|
+
And the output should contain "1 example, 0 failures, 1 pending"
|
|
16
|
+
And the output should contain "Not yet implemented"
|
|
17
|
+
And the output should contain "example_without_block_spec.rb:2"
|
|
18
|
+
|
|
19
|
+
Scenario: skipping using `skip`
|
|
20
|
+
Given a file named "skipped_spec.rb" with:
|
|
21
|
+
"""ruby
|
|
22
|
+
describe "an example" do
|
|
23
|
+
skip "is skipped" do
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
"""
|
|
27
|
+
When I run `rspec skipped_spec.rb`
|
|
28
|
+
Then the exit status should be 0
|
|
29
|
+
And the output should contain "1 example, 0 failures, 1 pending"
|
|
30
|
+
And the output should contain:
|
|
31
|
+
"""
|
|
32
|
+
Pending:
|
|
33
|
+
an example is skipped
|
|
34
|
+
# No reason given
|
|
35
|
+
# ./skipped_spec.rb:2
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
Scenario: skipping using `skip` inside an example
|
|
39
|
+
Given a file named "skipped_spec.rb" with:
|
|
40
|
+
"""ruby
|
|
41
|
+
describe "an example" do
|
|
42
|
+
it "is skipped" do
|
|
43
|
+
skip
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
"""
|
|
47
|
+
When I run `rspec skipped_spec.rb`
|
|
48
|
+
Then the exit status should be 0
|
|
49
|
+
And the output should contain "1 example, 0 failures, 1 pending"
|
|
50
|
+
And the output should contain:
|
|
51
|
+
"""
|
|
52
|
+
Pending:
|
|
53
|
+
an example is skipped
|
|
54
|
+
# No reason given
|
|
55
|
+
# ./skipped_spec.rb:2
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
Scenario: temporarily skipping by prefixing `it`, `specify`, or `example` with an x
|
|
59
|
+
Given a file named "temporarily_skipped_spec.rb" with:
|
|
60
|
+
"""ruby
|
|
61
|
+
describe "an example" do
|
|
62
|
+
xit "is skipped using xit" do
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
xspecify "is skipped using xspecify" do
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
xexample "is skipped using xexample" do
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
"""
|
|
72
|
+
When I run `rspec temporarily_skipped_spec.rb`
|
|
73
|
+
Then the exit status should be 0
|
|
74
|
+
And the output should contain "3 examples, 0 failures, 3 pending"
|
|
75
|
+
And the output should contain:
|
|
76
|
+
"""
|
|
77
|
+
Pending:
|
|
78
|
+
an example is skipped using xit
|
|
79
|
+
# Temporarily skipped with xit
|
|
80
|
+
# ./temporarily_skipped_spec.rb:2
|
|
81
|
+
an example is skipped using xspecify
|
|
82
|
+
# Temporarily skipped with xspecify
|
|
83
|
+
# ./temporarily_skipped_spec.rb:5
|
|
84
|
+
an example is skipped using xexample
|
|
85
|
+
# Temporarily skipped with xexample
|
|
86
|
+
# ./temporarily_skipped_spec.rb:8
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
Scenario: skipping using metadata
|
|
90
|
+
Given a file named "skipped_spec.rb" with:
|
|
91
|
+
"""ruby
|
|
92
|
+
describe "an example" do
|
|
93
|
+
example "is skipped", :skip => true do
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
"""
|
|
97
|
+
When I run `rspec skipped_spec.rb`
|
|
98
|
+
Then the exit status should be 0
|
|
99
|
+
And the output should contain "1 example, 0 failures, 1 pending"
|
|
100
|
+
And the output should contain:
|
|
101
|
+
"""
|
|
102
|
+
Pending:
|
|
103
|
+
an example is skipped
|
|
104
|
+
# No reason given
|
|
105
|
+
# ./skipped_spec.rb:2
|
|
106
|
+
"""
|
|
@@ -41,9 +41,43 @@ Then /^the backtrace\-normalized output should contain:$/ do |partial_output|
|
|
|
41
41
|
expect(normalized_output).to match(regexp(partial_output))
|
|
42
42
|
end
|
|
43
43
|
|
|
44
|
+
Then /^the output should not contain any error backtraces$/ do
|
|
45
|
+
step %q{the output should not contain "lib/rspec/core"}
|
|
46
|
+
end
|
|
47
|
+
|
|
44
48
|
# This step can be generalized if it's ever used to test other colors
|
|
45
49
|
Then /^the failing example is printed in magenta$/ do
|
|
46
50
|
# \e[35m = enable magenta
|
|
47
51
|
# \e[0m = reset colors
|
|
48
52
|
expect(all_output).to include("\e[35m" + "F" + "\e[0m")
|
|
49
53
|
end
|
|
54
|
+
|
|
55
|
+
Given /^I have a brand new project with no files$/ do
|
|
56
|
+
in_current_dir do
|
|
57
|
+
expect(Dir["**/*"]).to eq([])
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
Given /^I have run `([^`]*)`$/ do |cmd|
|
|
62
|
+
fail_on_error = true
|
|
63
|
+
run_simple(unescape(cmd), fail_on_error)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
When "I accept the recommended settings by removing `=begin` and `=end` from `spec/spec_helper.rb`" do
|
|
67
|
+
in_current_dir do
|
|
68
|
+
spec_helper = File.read("spec/spec_helper.rb")
|
|
69
|
+
expect(spec_helper).to include("=begin", "=end")
|
|
70
|
+
|
|
71
|
+
to_keep = spec_helper.lines.reject do |line|
|
|
72
|
+
line.start_with?("=begin") || line.start_with?("=end")
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
File.open("spec/spec_helper.rb", "w") { |f| f.write(to_keep.join) }
|
|
76
|
+
expect(File.read("spec/spec_helper.rb")).not_to include("=begin", "=end")
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
When /^I create "([^"]*)" with the following content:$/ do |file_name, content|
|
|
81
|
+
write_file(file_name, content)
|
|
82
|
+
end
|
|
83
|
+
|
|
@@ -73,7 +73,7 @@ Feature: explicit subject
|
|
|
73
73
|
context "with index out of bounds" do
|
|
74
74
|
before { expect(Array).to receive(:one_two_three).once.and_return([1,2,3]) }
|
|
75
75
|
subject { Array.one_two_three[42] }
|
|
76
|
-
it {
|
|
76
|
+
it { is_expected.to be_nil }
|
|
77
77
|
end
|
|
78
78
|
end
|
|
79
79
|
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
Feature: One-liner syntax
|
|
2
|
+
|
|
3
|
+
RSpec supports a one-liner syntax for setting an expectation
|
|
4
|
+
on the `subject`. RSpec will give the examples a doc string
|
|
5
|
+
that is auto-generated from the matcher used in the example.
|
|
6
|
+
This is designed specifically to help avoid duplication in
|
|
7
|
+
situations where the doc string and the matcher used in the
|
|
8
|
+
example mirror each other exactly. When used excessively,
|
|
9
|
+
it can produce documentation output that does not read well
|
|
10
|
+
or contribute to understanding the object you are describing.
|
|
11
|
+
|
|
12
|
+
This comes in two flavors:
|
|
13
|
+
|
|
14
|
+
* `is_expected` is defined simply as `expect(subject)` and is
|
|
15
|
+
designed for when you are using rspec-expectations with its
|
|
16
|
+
newer expect-based syntax.
|
|
17
|
+
* `should` was designed back when rspec-expectations only had
|
|
18
|
+
a should-based syntax. However, it continues to be available
|
|
19
|
+
and work even if the `:should` syntax is disabled (since that
|
|
20
|
+
merely removes `Object#should` but this is
|
|
21
|
+
`RSpec::Core::ExampleGroup#should`).
|
|
22
|
+
|
|
23
|
+
Note: this feature is only available when using rspec-expectations.
|
|
24
|
+
|
|
25
|
+
Scenario: implicit subject
|
|
26
|
+
Given a file named "example_spec.rb" with:
|
|
27
|
+
"""ruby
|
|
28
|
+
describe Array do
|
|
29
|
+
describe "when first created" do
|
|
30
|
+
# Rather than:
|
|
31
|
+
# it "should be empty" do
|
|
32
|
+
# subject.should be_empty
|
|
33
|
+
# end
|
|
34
|
+
|
|
35
|
+
it { should be_empty }
|
|
36
|
+
# or
|
|
37
|
+
it { is_expected.to be_empty }
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
"""
|
|
41
|
+
When I run `rspec example_spec.rb --format doc`
|
|
42
|
+
Then the examples should all pass
|
|
43
|
+
And the output should contain:
|
|
44
|
+
"""
|
|
45
|
+
Array
|
|
46
|
+
when first created
|
|
47
|
+
should be empty
|
|
48
|
+
should be empty
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
Scenario: explicit subject
|
|
52
|
+
Given a file named "example_spec.rb" with:
|
|
53
|
+
"""ruby
|
|
54
|
+
describe Array do
|
|
55
|
+
describe "with 3 items" do
|
|
56
|
+
subject { [1,2,3] }
|
|
57
|
+
it { should_not be_empty }
|
|
58
|
+
# or
|
|
59
|
+
it { is_expected.not_to be_empty }
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
"""
|
|
63
|
+
When I run `rspec example_spec.rb --format doc`
|
|
64
|
+
Then the examples should all pass
|
|
65
|
+
And the output should contain:
|
|
66
|
+
"""
|
|
67
|
+
Array
|
|
68
|
+
with 3 items
|
|
69
|
+
should not be empty
|
|
70
|
+
should not be empty
|
|
71
|
+
"""
|
data/lib/rspec/core.rb
CHANGED
|
@@ -21,6 +21,7 @@ require 'rspec/support/warnings'
|
|
|
21
21
|
require_rspec['core/flat_map']
|
|
22
22
|
require_rspec['core/filter_manager']
|
|
23
23
|
require_rspec['core/dsl']
|
|
24
|
+
require_rspec['core/notifications']
|
|
24
25
|
require_rspec['core/reporter']
|
|
25
26
|
|
|
26
27
|
require_rspec['core/hooks']
|
|
@@ -85,21 +86,12 @@ module RSpec
|
|
|
85
86
|
# @see RSpec.configure
|
|
86
87
|
# @see Core::Configuration
|
|
87
88
|
def self.configuration
|
|
88
|
-
|
|
89
|
-
|
|
89
|
+
@configuration ||= begin
|
|
90
|
+
config = RSpec::Core::Configuration.new
|
|
91
|
+
config.expose_dsl_globally = true
|
|
92
|
+
config
|
|
93
|
+
end
|
|
90
94
|
|
|
91
|
-
*****************************************************************
|
|
92
|
-
DEPRECATION WARNING
|
|
93
|
-
|
|
94
|
-
* RSpec.configuration with a block is deprecated and has no effect.
|
|
95
|
-
* please use RSpec.configure with a block instead.
|
|
96
|
-
|
|
97
|
-
Called from #{CallerFilter.first_non_rspec_line}
|
|
98
|
-
*****************************************************************
|
|
99
|
-
|
|
100
|
-
WARNING
|
|
101
|
-
end
|
|
102
|
-
@configuration ||= RSpec::Core::Configuration.new
|
|
103
95
|
end
|
|
104
96
|
|
|
105
97
|
# @private
|
|
@@ -12,14 +12,14 @@ module RSpec
|
|
|
12
12
|
|
|
13
13
|
def initialize
|
|
14
14
|
@full_backtrace = false
|
|
15
|
-
@
|
|
15
|
+
@system_exclusion_patterns = [] << Regexp.union(
|
|
16
16
|
*["/lib\d*/ruby/",
|
|
17
17
|
"org/jruby/",
|
|
18
18
|
"bin/",
|
|
19
19
|
"/gems/",
|
|
20
20
|
"lib/rspec/(core|expectations|matchers|mocks)"].
|
|
21
|
-
map {|s| Regexp.new(s.gsub("/", File::SEPARATOR))}
|
|
22
|
-
|
|
21
|
+
map {|s| Regexp.new(s.gsub("/", File::SEPARATOR))})
|
|
22
|
+
@exclusion_patterns = [] + @system_exclusion_patterns
|
|
23
23
|
@inclusion_patterns = [Regexp.new(Dir.getwd)]
|
|
24
24
|
end
|
|
25
25
|
|
|
@@ -58,8 +58,20 @@ module RSpec
|
|
|
58
58
|
# @api private
|
|
59
59
|
def exclude?(line)
|
|
60
60
|
return false if @full_backtrace
|
|
61
|
-
|
|
61
|
+
matches_an_exclusion_pattern?(line) &&
|
|
62
|
+
doesnt_match_inclusion_pattern_unless_system_exclusion?(line)
|
|
62
63
|
end
|
|
64
|
+
|
|
65
|
+
private
|
|
66
|
+
|
|
67
|
+
def matches_an_exclusion_pattern?(line)
|
|
68
|
+
@exclusion_patterns.any? { |p| line =~ p }
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def doesnt_match_inclusion_pattern_unless_system_exclusion?(line)
|
|
72
|
+
@system_exclusion_patterns.any? { |p| line =~ p } || @inclusion_patterns.none? { |p| p =~ line }
|
|
73
|
+
end
|
|
74
|
+
|
|
63
75
|
end
|
|
64
76
|
end
|
|
65
77
|
end
|
|
@@ -4,7 +4,6 @@ module RSpec
|
|
|
4
4
|
def initialize(options, configuration=RSpec::configuration, world=RSpec::world)
|
|
5
5
|
if Array === options
|
|
6
6
|
options = ConfigurationOptions.new(options)
|
|
7
|
-
options.parse_options
|
|
8
7
|
end
|
|
9
8
|
@options = options
|
|
10
9
|
@configuration = configuration
|
|
@@ -24,10 +23,10 @@ module RSpec
|
|
|
24
23
|
|
|
25
24
|
@configuration.reporter.report(@world.example_count) do |reporter|
|
|
26
25
|
begin
|
|
27
|
-
@configuration.
|
|
26
|
+
@configuration.hooks.run(:before, :suite)
|
|
28
27
|
@world.ordered_example_groups.map {|g| g.run(reporter) }.all? ? 0 : @configuration.failure_exit_code
|
|
29
28
|
ensure
|
|
30
|
-
@configuration.
|
|
29
|
+
@configuration.hooks.run(:after, :suite)
|
|
31
30
|
end
|
|
32
31
|
end
|
|
33
32
|
end
|
|
@@ -41,11 +41,6 @@ module RSpec
|
|
|
41
41
|
end
|
|
42
42
|
end
|
|
43
43
|
|
|
44
|
-
# @private
|
|
45
|
-
def self.deprecate_alias_key
|
|
46
|
-
RSpec.deprecate("add_setting with :alias option", :replacement => ":alias_with")
|
|
47
|
-
end
|
|
48
|
-
|
|
49
44
|
# @private
|
|
50
45
|
def self.define_aliases(name, alias_name)
|
|
51
46
|
alias_method alias_name, name
|
|
@@ -64,19 +59,23 @@ module RSpec
|
|
|
64
59
|
# `Configuration` instance rather than this class method.
|
|
65
60
|
def self.add_setting(name, opts={})
|
|
66
61
|
raise "Use the instance add_setting method if you want to set a default" if opts.has_key?(:default)
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
else
|
|
71
|
-
attr_writer name
|
|
72
|
-
define_reader name
|
|
73
|
-
define_predicate_for name
|
|
74
|
-
end
|
|
62
|
+
attr_writer name
|
|
63
|
+
add_read_only_setting name
|
|
64
|
+
|
|
75
65
|
Array(opts[:alias_with]).each do |alias_name|
|
|
76
66
|
define_aliases(name, alias_name)
|
|
77
67
|
end
|
|
78
68
|
end
|
|
79
69
|
|
|
70
|
+
# @private
|
|
71
|
+
#
|
|
72
|
+
# As `add_setting` but only add the reader
|
|
73
|
+
def self.add_read_only_setting(name, opts={})
|
|
74
|
+
raise "Use the instance add_setting method if you want to set a default" if opts.has_key?(:default)
|
|
75
|
+
define_reader name
|
|
76
|
+
define_predicate_for name
|
|
77
|
+
end
|
|
78
|
+
|
|
80
79
|
# @macro [attach] add_setting
|
|
81
80
|
# @attribute $1
|
|
82
81
|
#
|
|
@@ -102,6 +101,26 @@ module RSpec
|
|
|
102
101
|
# Default: `$stderr`.
|
|
103
102
|
add_setting :error_stream
|
|
104
103
|
|
|
104
|
+
# Indicates if the DSL has been exposed off of modules and `main`.
|
|
105
|
+
# Default: true
|
|
106
|
+
def expose_dsl_globally?
|
|
107
|
+
Core::DSL.exposed_globally?
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Use this to expose the core RSpec DSL via `Module` and the `main`
|
|
111
|
+
# object. It will be set automatically but you can override it to
|
|
112
|
+
# remove the DSL.
|
|
113
|
+
# Default: true
|
|
114
|
+
def expose_dsl_globally=(value)
|
|
115
|
+
if value
|
|
116
|
+
Core::DSL.expose_globally!
|
|
117
|
+
Core::SharedExampleGroup::TopLevelDSL.expose_globally!
|
|
118
|
+
else
|
|
119
|
+
Core::DSL.remove_globally!
|
|
120
|
+
Core::SharedExampleGroup::TopLevelDSL.remove_globally!
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
105
124
|
# @macro add_setting
|
|
106
125
|
# Default: `$stderr`.
|
|
107
126
|
add_setting :deprecation_stream
|
|
@@ -193,16 +212,13 @@ module RSpec
|
|
|
193
212
|
# @param [Symbol] color one of the following: [:black, :white, :red, :green, :yellow, :blue, :magenta, :cyan]
|
|
194
213
|
add_setting :detail_color
|
|
195
214
|
|
|
196
|
-
# @macro add_setting
|
|
197
|
-
# When a block passed to pending fails (as expected), display the failure
|
|
198
|
-
# without reporting it as a failure (default: false).
|
|
199
|
-
add_setting :show_failures_in_pending_blocks
|
|
200
|
-
|
|
201
215
|
# Deprecated. This config option was added in RSpec 2 to pave the way
|
|
202
216
|
# for this being the default behavior in RSpec 3. Now this option is
|
|
203
217
|
# a no-op.
|
|
204
218
|
def treat_symbols_as_metadata_keys_with_true_values=(value)
|
|
205
|
-
RSpec.deprecate("RSpec::Core::Configuration#treat_symbols_as_metadata_keys_with_true_values="
|
|
219
|
+
RSpec.deprecate("RSpec::Core::Configuration#treat_symbols_as_metadata_keys_with_true_values=",
|
|
220
|
+
:message => "RSpec::Core::Configuration#treat_symbols_as_metadata_keys_with_true_values=" +
|
|
221
|
+
"is deprecated, it is now set to true as default and setting it to false has no effect.")
|
|
206
222
|
end
|
|
207
223
|
|
|
208
224
|
# @private
|
|
@@ -210,7 +226,7 @@ module RSpec
|
|
|
210
226
|
# @private
|
|
211
227
|
add_setting :include_or_extend_modules
|
|
212
228
|
# @private
|
|
213
|
-
|
|
229
|
+
attr_writer :files_to_run
|
|
214
230
|
# @private
|
|
215
231
|
add_setting :expecting_with_rspec
|
|
216
232
|
# @private
|
|
@@ -227,8 +243,7 @@ module RSpec
|
|
|
227
243
|
@expectation_frameworks = []
|
|
228
244
|
@include_or_extend_modules = []
|
|
229
245
|
@mock_framework = nil
|
|
230
|
-
@
|
|
231
|
-
@formatters = []
|
|
246
|
+
@files_or_directories_to_run = []
|
|
232
247
|
@color = false
|
|
233
248
|
@pattern = '**/*_spec.rb'
|
|
234
249
|
@failure_exit_code = 1
|
|
@@ -267,7 +282,7 @@ module RSpec
|
|
|
267
282
|
def reset
|
|
268
283
|
@spec_files_loaded = false
|
|
269
284
|
@reporter = nil
|
|
270
|
-
@
|
|
285
|
+
@formatter_loader = nil
|
|
271
286
|
end
|
|
272
287
|
|
|
273
288
|
# @overload add_setting(name)
|
|
@@ -310,7 +325,7 @@ module RSpec
|
|
|
310
325
|
(class << self; self; end).class_eval do
|
|
311
326
|
add_setting(name, opts)
|
|
312
327
|
end
|
|
313
|
-
|
|
328
|
+
__send__("#{name}=", default) if default
|
|
314
329
|
end
|
|
315
330
|
|
|
316
331
|
# Returns the configured mock framework adapter module
|
|
@@ -359,6 +374,15 @@ module RSpec
|
|
|
359
374
|
@backtrace_formatter.inclusion_patterns = patterns
|
|
360
375
|
end
|
|
361
376
|
|
|
377
|
+
# @api private
|
|
378
|
+
MOCKING_ADAPTERS = {
|
|
379
|
+
:rspec => :RSpec,
|
|
380
|
+
:flexmock => :Flexmock,
|
|
381
|
+
:rr => :RR,
|
|
382
|
+
:mocha => :Mocha,
|
|
383
|
+
:nothing => :Null
|
|
384
|
+
}
|
|
385
|
+
|
|
362
386
|
# Sets the mock framework adapter module.
|
|
363
387
|
#
|
|
364
388
|
# `framework` can be a Symbol or a Module.
|
|
@@ -389,23 +413,17 @@ module RSpec
|
|
|
389
413
|
# mod_config.custom_setting = true
|
|
390
414
|
# end
|
|
391
415
|
def mock_with(framework)
|
|
392
|
-
framework_module =
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
when /flexmock/i
|
|
404
|
-
'rspec/core/mocking/with_flexmock'
|
|
405
|
-
else
|
|
406
|
-
'rspec/core/mocking/with_absolutely_nothing'
|
|
407
|
-
end
|
|
408
|
-
RSpec::Core::MockFrameworkAdapter
|
|
416
|
+
framework_module = if framework.is_a?(Module)
|
|
417
|
+
framework
|
|
418
|
+
else
|
|
419
|
+
const_name = MOCKING_ADAPTERS.fetch(framework) do
|
|
420
|
+
raise ArgumentError,
|
|
421
|
+
"Unknown mocking framework: #{framework.inspect}. " +
|
|
422
|
+
"Pass a module or one of #{MOCKING_ADAPTERS.keys.inspect}"
|
|
423
|
+
end
|
|
424
|
+
|
|
425
|
+
require "rspec/core/mocking_adapters/#{const_name.to_s.downcase}"
|
|
426
|
+
RSpec::Core::MockingAdapters.const_get(const_name)
|
|
409
427
|
end
|
|
410
428
|
|
|
411
429
|
new_name, old_name = [framework_module, @mock_framework].map do |mod|
|
|
@@ -527,13 +545,6 @@ module RSpec
|
|
|
527
545
|
end
|
|
528
546
|
end
|
|
529
547
|
|
|
530
|
-
def requires=(paths)
|
|
531
|
-
RSpec.deprecate("RSpec::Core::Configuration#requires=(paths)",
|
|
532
|
-
:replacement => "paths.each {|path| require path}")
|
|
533
|
-
paths.map {|path| require path}
|
|
534
|
-
@requires += paths
|
|
535
|
-
end
|
|
536
|
-
|
|
537
548
|
# Run examples defined on `line_numbers` in all files to run.
|
|
538
549
|
def line_numbers=(line_numbers)
|
|
539
550
|
filter_run :line_numbers => line_numbers.map{|l| l.to_i}
|
|
@@ -563,27 +574,28 @@ module RSpec
|
|
|
563
574
|
# and paths to use for output streams, but you should consider that a
|
|
564
575
|
# private api that may change at any time without notice.
|
|
565
576
|
def add_formatter(formatter_to_use, *paths)
|
|
566
|
-
formatter_class =
|
|
567
|
-
built_in_formatter(formatter_to_use) ||
|
|
568
|
-
custom_formatter(formatter_to_use) ||
|
|
569
|
-
(raise ArgumentError, "Formatter '#{formatter_to_use}' unknown - maybe you meant 'documentation' or 'progress'?.")
|
|
570
|
-
|
|
571
577
|
paths << output_stream if paths.empty?
|
|
572
|
-
|
|
578
|
+
formatter_loader.add formatter_to_use, *paths
|
|
573
579
|
end
|
|
574
|
-
|
|
575
580
|
alias_method :formatter=, :add_formatter
|
|
576
581
|
|
|
582
|
+
# @api private
|
|
577
583
|
def formatters
|
|
578
|
-
|
|
584
|
+
formatter_loader.formatters
|
|
579
585
|
end
|
|
580
586
|
|
|
587
|
+
# @api private
|
|
588
|
+
def formatter_loader
|
|
589
|
+
@formatter_loader ||= Formatters::Loader.new(Reporter.new(self))
|
|
590
|
+
end
|
|
591
|
+
|
|
592
|
+
# @api private
|
|
581
593
|
def reporter
|
|
582
|
-
@reporter ||=
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
594
|
+
@reporter ||=
|
|
595
|
+
begin
|
|
596
|
+
formatter_loader.setup_default output_stream, deprecation_stream
|
|
597
|
+
formatter_loader.reporter
|
|
598
|
+
end
|
|
587
599
|
end
|
|
588
600
|
|
|
589
601
|
# @api private
|
|
@@ -603,7 +615,12 @@ module RSpec
|
|
|
603
615
|
def files_or_directories_to_run=(*files)
|
|
604
616
|
files = files.flatten
|
|
605
617
|
files << default_path if (command == 'rspec' || Runner.running_in_drb?) && default_path && files.empty?
|
|
606
|
-
|
|
618
|
+
@files_or_directories_to_run = files
|
|
619
|
+
@files_to_run = nil
|
|
620
|
+
end
|
|
621
|
+
|
|
622
|
+
def files_to_run
|
|
623
|
+
@files_to_run ||= get_files_to_run(@files_or_directories_to_run)
|
|
607
624
|
end
|
|
608
625
|
|
|
609
626
|
# Creates a method that delegates to `example` including the submitted
|
|
@@ -632,6 +649,35 @@ module RSpec
|
|
|
632
649
|
RSpec::Core::ExampleGroup.alias_example_to(new_name, extra_options)
|
|
633
650
|
end
|
|
634
651
|
|
|
652
|
+
# Creates a method that defines an example group with the provided
|
|
653
|
+
# metadata. Can be used to define example group/metadata shortcuts.
|
|
654
|
+
#
|
|
655
|
+
# @example
|
|
656
|
+
# alias_example_group_to :describe_model, :type => :model
|
|
657
|
+
# shared_context_for "model tests", :type => :model do
|
|
658
|
+
# # define common model test helper methods, `let` declarations, etc
|
|
659
|
+
# end
|
|
660
|
+
#
|
|
661
|
+
# # This lets you do this:
|
|
662
|
+
#
|
|
663
|
+
# RSpec.describe_model User do
|
|
664
|
+
# end
|
|
665
|
+
#
|
|
666
|
+
# # ... which is the equivalent of
|
|
667
|
+
#
|
|
668
|
+
# RSpec.describe User, :type => :model do
|
|
669
|
+
# end
|
|
670
|
+
#
|
|
671
|
+
# @note The defined aliased will also be added to the top level
|
|
672
|
+
# (e.g. `main` and from within modules) if
|
|
673
|
+
# `expose_dsl_globally` is set to true.
|
|
674
|
+
# @see #alias_example_to
|
|
675
|
+
# @see #expose_dsl_globally=
|
|
676
|
+
def alias_example_group_to(new_name, *args)
|
|
677
|
+
extra_options = Metadata.build_hash_from(args)
|
|
678
|
+
RSpec::Core::ExampleGroup.alias_example_group_to(new_name, extra_options)
|
|
679
|
+
end
|
|
680
|
+
|
|
635
681
|
# Define an alias for it_should_behave_like that allows different
|
|
636
682
|
# language (like "it_has_behavior" or "it_behaves_like") to be
|
|
637
683
|
# employed when including shared examples.
|
|
@@ -841,17 +887,17 @@ module RSpec
|
|
|
841
887
|
def configure_group(group)
|
|
842
888
|
include_or_extend_modules.each do |include_or_extend, mod, filters|
|
|
843
889
|
next unless filters.empty? || group.any_apply?(filters)
|
|
844
|
-
|
|
890
|
+
__send__("safe_#{include_or_extend}", mod, group)
|
|
845
891
|
end
|
|
846
892
|
end
|
|
847
893
|
|
|
848
894
|
# @private
|
|
849
895
|
def safe_include(mod, host)
|
|
850
|
-
host.
|
|
896
|
+
host.__send__(:include, mod) unless host < mod
|
|
851
897
|
end
|
|
852
898
|
|
|
853
899
|
# @private
|
|
854
|
-
def
|
|
900
|
+
def requires=(paths)
|
|
855
901
|
directories = ['lib', default_path].select { |p| File.directory? p }
|
|
856
902
|
RSpec::Core::RubyProject.add_to_load_path(*directories)
|
|
857
903
|
paths.each {|path| require path}
|
|
@@ -861,7 +907,7 @@ module RSpec
|
|
|
861
907
|
# @private
|
|
862
908
|
if RUBY_VERSION.to_f >= 1.9
|
|
863
909
|
def safe_extend(mod, host)
|
|
864
|
-
host.extend(mod) unless
|
|
910
|
+
host.extend(mod) unless host.singleton_class < mod
|
|
865
911
|
end
|
|
866
912
|
else
|
|
867
913
|
def safe_extend(mod, host)
|
|
@@ -871,13 +917,13 @@ module RSpec
|
|
|
871
917
|
|
|
872
918
|
# @private
|
|
873
919
|
def configure_mock_framework
|
|
874
|
-
RSpec::Core::ExampleGroup.
|
|
920
|
+
RSpec::Core::ExampleGroup.__send__(:include, mock_framework)
|
|
875
921
|
end
|
|
876
922
|
|
|
877
923
|
# @private
|
|
878
924
|
def configure_expectation_framework
|
|
879
925
|
expectation_frameworks.each do |framework|
|
|
880
|
-
RSpec::Core::ExampleGroup.
|
|
926
|
+
RSpec::Core::ExampleGroup.__send__(:include, framework)
|
|
881
927
|
end
|
|
882
928
|
end
|
|
883
929
|
|
|
@@ -1067,63 +1113,6 @@ module RSpec
|
|
|
1067
1113
|
def output_to_tty?(output=output_stream)
|
|
1068
1114
|
tty? || (output.respond_to?(:tty?) && output.tty?)
|
|
1069
1115
|
end
|
|
1070
|
-
|
|
1071
|
-
def built_in_formatter(key)
|
|
1072
|
-
case key.to_s
|
|
1073
|
-
when 'd', 'doc', 'documentation', 's', 'n', 'spec', 'nested'
|
|
1074
|
-
require 'rspec/core/formatters/documentation_formatter'
|
|
1075
|
-
RSpec::Core::Formatters::DocumentationFormatter
|
|
1076
|
-
when 'h', 'html'
|
|
1077
|
-
require 'rspec/core/formatters/html_formatter'
|
|
1078
|
-
RSpec::Core::Formatters::HtmlFormatter
|
|
1079
|
-
when 'p', 'progress'
|
|
1080
|
-
require 'rspec/core/formatters/progress_formatter'
|
|
1081
|
-
RSpec::Core::Formatters::ProgressFormatter
|
|
1082
|
-
when 'j', 'json'
|
|
1083
|
-
require 'rspec/core/formatters/json_formatter'
|
|
1084
|
-
RSpec::Core::Formatters::JsonFormatter
|
|
1085
|
-
end
|
|
1086
|
-
end
|
|
1087
|
-
|
|
1088
|
-
def custom_formatter(formatter_ref)
|
|
1089
|
-
if Class === formatter_ref
|
|
1090
|
-
formatter_ref
|
|
1091
|
-
elsif string_const?(formatter_ref)
|
|
1092
|
-
begin
|
|
1093
|
-
formatter_ref.gsub(/^::/,'').split('::').inject(Object) { |const,string| const.const_get string }
|
|
1094
|
-
rescue NameError
|
|
1095
|
-
require( path_for(formatter_ref) ) ? retry : raise
|
|
1096
|
-
end
|
|
1097
|
-
end
|
|
1098
|
-
end
|
|
1099
|
-
|
|
1100
|
-
def string_const?(str)
|
|
1101
|
-
str.is_a?(String) && /\A[A-Z][a-zA-Z0-9_:]*\z/ =~ str
|
|
1102
|
-
end
|
|
1103
|
-
|
|
1104
|
-
def path_for(const_ref)
|
|
1105
|
-
underscore_with_fix_for_non_standard_rspec_naming(const_ref)
|
|
1106
|
-
end
|
|
1107
|
-
|
|
1108
|
-
def underscore_with_fix_for_non_standard_rspec_naming(string)
|
|
1109
|
-
underscore(string).sub(%r{(^|/)r_spec($|/)}, '\\1rspec\\2')
|
|
1110
|
-
end
|
|
1111
|
-
|
|
1112
|
-
# activesupport/lib/active_support/inflector/methods.rb, line 48
|
|
1113
|
-
def underscore(camel_cased_word)
|
|
1114
|
-
word = camel_cased_word.to_s.dup
|
|
1115
|
-
word.gsub!(/::/, '/')
|
|
1116
|
-
word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
|
|
1117
|
-
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
|
1118
|
-
word.tr!("-", "_")
|
|
1119
|
-
word.downcase!
|
|
1120
|
-
word
|
|
1121
|
-
end
|
|
1122
|
-
|
|
1123
|
-
def file_at(path)
|
|
1124
|
-
FileUtils.mkdir_p(File.dirname(path))
|
|
1125
|
-
File.new(path, 'w')
|
|
1126
|
-
end
|
|
1127
1116
|
end
|
|
1128
1117
|
end
|
|
1129
1118
|
end
|