rspec-core 3.0.0.beta1 → 3.0.0.beta2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|