rspec-core 3.0.0.beta2 → 3.0.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
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.yardopts +1 -0
- data/Changelog.md +297 -57
- data/README.md +16 -13
- data/lib/rspec/core.rb +55 -84
- data/lib/rspec/core/backport_random.rb +35 -3
- data/lib/rspec/core/backtrace_formatter.rb +4 -13
- data/lib/rspec/core/configuration.rb +330 -114
- data/lib/rspec/core/configuration_options.rb +38 -22
- data/lib/rspec/core/drb.rb +111 -0
- data/lib/rspec/core/dsl.rb +8 -2
- data/lib/rspec/core/example.rb +203 -94
- data/lib/rspec/core/example_group.rb +344 -316
- data/lib/rspec/core/filter_manager.rb +135 -90
- data/lib/rspec/core/flat_map.rb +1 -0
- data/lib/rspec/core/formatters.rb +50 -14
- data/lib/rspec/core/formatters/base_formatter.rb +32 -138
- data/lib/rspec/core/formatters/base_text_formatter.rb +32 -253
- data/lib/rspec/core/formatters/console_codes.rb +65 -0
- data/lib/rspec/core/formatters/deprecation_formatter.rb +24 -15
- data/lib/rspec/core/formatters/documentation_formatter.rb +7 -10
- data/lib/rspec/core/formatters/helpers.rb +15 -9
- data/lib/rspec/core/formatters/html_formatter.rb +17 -16
- data/lib/rspec/core/formatters/html_printer.rb +1 -0
- data/lib/rspec/core/formatters/json_formatter.rb +18 -20
- data/lib/rspec/core/formatters/profile_formatter.rb +67 -0
- data/lib/rspec/core/formatters/progress_formatter.rb +6 -7
- data/lib/rspec/core/formatters/snippet_extractor.rb +8 -6
- data/lib/rspec/core/hooks.rb +131 -125
- data/lib/rspec/core/memoized_helpers.rb +31 -26
- data/lib/rspec/core/metadata.rb +277 -184
- data/lib/rspec/core/metadata_filter.rb +86 -0
- data/lib/rspec/core/minitest_assertions_adapter.rb +28 -0
- data/lib/rspec/core/mocking_adapters/flexmock.rb +1 -1
- data/lib/rspec/core/mocking_adapters/mocha.rb +1 -1
- data/lib/rspec/core/mocking_adapters/null.rb +1 -1
- data/lib/rspec/core/mocking_adapters/rr.rb +2 -1
- data/lib/rspec/core/mocking_adapters/rspec.rb +1 -1
- data/lib/rspec/core/notifications.rb +435 -24
- data/lib/rspec/core/option_parser.rb +16 -25
- data/lib/rspec/core/ordering.rb +3 -1
- data/lib/rspec/core/pending.rb +57 -33
- data/lib/rspec/core/project_initializer.rb +2 -0
- data/lib/rspec/core/project_initializer/spec_helper.rb +5 -4
- data/lib/rspec/core/rake_task.rb +45 -20
- data/lib/rspec/core/reporter.rb +50 -22
- data/lib/rspec/core/ruby_project.rb +1 -0
- data/lib/rspec/core/runner.rb +93 -39
- data/lib/rspec/core/shared_context.rb +7 -5
- data/lib/rspec/core/shared_example_group.rb +85 -77
- data/lib/rspec/core/test_unit_assertions_adapter.rb +30 -0
- data/lib/rspec/core/version.rb +3 -1
- data/lib/rspec/core/warnings.rb +35 -17
- data/lib/rspec/core/world.rb +57 -5
- metadata +56 -369
- metadata.gz.sig +3 -3
- data/features/README.md +0 -13
- data/features/Upgrade.md +0 -352
- data/features/command_line/README.md +0 -25
- data/features/command_line/dry_run.feature +0 -29
- data/features/command_line/example_name_option.feature +0 -97
- data/features/command_line/exit_status.feature +0 -82
- data/features/command_line/fail_fast.feature +0 -26
- data/features/command_line/format_option.feature +0 -75
- data/features/command_line/init.feature +0 -57
- data/features/command_line/line_number_appended_to_path.feature +0 -140
- data/features/command_line/line_number_option.feature +0 -58
- data/features/command_line/order.feature +0 -25
- data/features/command_line/pattern_option.feature +0 -49
- data/features/command_line/rake_task.feature +0 -122
- data/features/command_line/randomization.feature +0 -63
- data/features/command_line/require_option.feature +0 -43
- data/features/command_line/ruby.feature +0 -23
- data/features/command_line/tag.feature +0 -98
- data/features/command_line/warnings_option.feature +0 -29
- data/features/configuration/alias_example_to.feature +0 -39
- data/features/configuration/backtrace_exclusion_patterns.feature +0 -105
- data/features/configuration/custom_settings.feature +0 -84
- data/features/configuration/default_path.feature +0 -38
- data/features/configuration/deprecation_stream.feature +0 -58
- data/features/configuration/enable_global_dsl.feature +0 -54
- data/features/configuration/fail_fast.feature +0 -77
- data/features/configuration/failure_exit_code.feature +0 -36
- data/features/configuration/order_and_seed.feature +0 -3
- data/features/configuration/output_stream.feature +0 -24
- data/features/configuration/overriding_global_ordering.feature +0 -93
- data/features/configuration/pattern.feature +0 -38
- data/features/configuration/profile.feature +0 -220
- data/features/configuration/read_options_from_file.feature +0 -90
- data/features/configuration/run_all_when_everything_filtered.feature +0 -76
- data/features/example_groups/aliasing.feature +0 -48
- data/features/example_groups/basic_structure.feature +0 -55
- data/features/example_groups/shared_context.feature +0 -74
- data/features/example_groups/shared_examples.feature +0 -286
- data/features/expectation_framework_integration/configure_expectation_framework.feature +0 -102
- data/features/filtering/exclusion_filters.feature +0 -135
- data/features/filtering/if_and_unless.feature +0 -138
- data/features/filtering/inclusion_filters.feature +0 -101
- data/features/formatters/configurable_colors.feature +0 -31
- data/features/formatters/custom_formatter.feature +0 -68
- data/features/formatters/json_formatter.feature +0 -30
- data/features/formatters/regression_tests.feature +0 -95
- data/features/formatters/text_formatter.feature +0 -46
- data/features/helper_methods/arbitrary_methods.feature +0 -40
- data/features/helper_methods/let.feature +0 -50
- data/features/helper_methods/modules.feature +0 -146
- data/features/hooks/around_hooks.feature +0 -344
- data/features/hooks/before_and_after_hooks.feature +0 -427
- data/features/hooks/filtering.feature +0 -232
- data/features/metadata/current_example.feature +0 -56
- data/features/metadata/described_class.feature +0 -17
- data/features/metadata/user_defined.feature +0 -100
- data/features/mock_framework_integration/use_any_framework.feature +0 -106
- data/features/mock_framework_integration/use_flexmock.feature +0 -94
- data/features/mock_framework_integration/use_mocha.feature +0 -95
- data/features/mock_framework_integration/use_rr.feature +0 -96
- data/features/mock_framework_integration/use_rspec.feature +0 -95
- data/features/pending_and_skipped_examples/README.md +0 -3
- data/features/pending_and_skipped_examples/pending_examples.feature +0 -118
- data/features/pending_and_skipped_examples/skipped_examples.feature +0 -106
- data/features/spec_files/arbitrary_file_suffix.feature +0 -13
- data/features/step_definitions/additional_cli_steps.rb +0 -83
- data/features/subject/explicit_subject.feature +0 -101
- data/features/subject/implicit_subject.feature +0 -63
- data/features/subject/one_liner_syntax.feature +0 -71
- data/features/support/env.rb +0 -21
- data/features/support/require_expect_syntax_in_aruba_specs.rb +0 -16
- data/features/support/rubinius.rb +0 -6
- data/lib/rspec/core/command_line.rb +0 -35
- data/lib/rspec/core/drb_command_line.rb +0 -26
- data/lib/rspec/core/drb_options.rb +0 -87
- data/lib/rspec/core/formatters/legacy_formatter.rb +0 -227
- data/lib/rspec/core/shared_example_group/collection.rb +0 -27
- data/spec/command_line/order_spec.rb +0 -211
- data/spec/rspec/core/backtrace_formatter_spec.rb +0 -230
- data/spec/rspec/core/command_line_spec.rb +0 -112
- data/spec/rspec/core/command_line_spec_output.txt +0 -0
- data/spec/rspec/core/configuration_options_spec.rb +0 -409
- data/spec/rspec/core/configuration_spec.rb +0 -1479
- data/spec/rspec/core/drb_command_line_spec.rb +0 -102
- data/spec/rspec/core/drb_options_spec.rb +0 -193
- data/spec/rspec/core/dsl_spec.rb +0 -88
- data/spec/rspec/core/example_group_spec.rb +0 -1533
- data/spec/rspec/core/example_spec.rb +0 -642
- data/spec/rspec/core/filter_manager_spec.rb +0 -229
- data/spec/rspec/core/formatters/base_formatter_spec.rb +0 -64
- data/spec/rspec/core/formatters/base_text_formatter_spec.rb +0 -303
- data/spec/rspec/core/formatters/deprecation_formatter_spec.rb +0 -208
- data/spec/rspec/core/formatters/documentation_formatter_spec.rb +0 -75
- data/spec/rspec/core/formatters/helpers_spec.rb +0 -104
- data/spec/rspec/core/formatters/html_formatted-2.1.0.html +0 -392
- data/spec/rspec/core/formatters/html_formatted.html +0 -397
- data/spec/rspec/core/formatters/html_formatter_spec.rb +0 -122
- data/spec/rspec/core/formatters/json_formatter_spec.rb +0 -206
- data/spec/rspec/core/formatters/legacy_formatter_spec.rb +0 -137
- data/spec/rspec/core/formatters/progress_formatter_spec.rb +0 -43
- data/spec/rspec/core/formatters/snippet_extractor_spec.rb +0 -26
- data/spec/rspec/core/formatters_spec.rb +0 -120
- data/spec/rspec/core/hooks_filtering_spec.rb +0 -227
- data/spec/rspec/core/hooks_spec.rb +0 -294
- data/spec/rspec/core/memoized_helpers_spec.rb +0 -495
- data/spec/rspec/core/metadata_spec.rb +0 -491
- data/spec/rspec/core/option_parser_spec.rb +0 -262
- data/spec/rspec/core/ordering_spec.rb +0 -102
- data/spec/rspec/core/pending_example_spec.rb +0 -117
- data/spec/rspec/core/pending_spec.rb +0 -8
- data/spec/rspec/core/project_initializer_spec.rb +0 -73
- data/spec/rspec/core/rake_task_spec.rb +0 -146
- data/spec/rspec/core/random_spec.rb +0 -47
- data/spec/rspec/core/reporter_spec.rb +0 -155
- data/spec/rspec/core/resources/a_bar.rb +0 -0
- data/spec/rspec/core/resources/a_foo.rb +0 -0
- data/spec/rspec/core/resources/a_spec.rb +0 -1
- data/spec/rspec/core/resources/custom_example_group_runner.rb +0 -14
- data/spec/rspec/core/resources/formatter_specs.rb +0 -58
- data/spec/rspec/core/resources/utf8_encoded.rb +0 -8
- data/spec/rspec/core/rspec_matchers_spec.rb +0 -45
- data/spec/rspec/core/ruby_project_spec.rb +0 -26
- data/spec/rspec/core/runner_spec.rb +0 -151
- data/spec/rspec/core/shared_context_spec.rb +0 -102
- data/spec/rspec/core/shared_example_group/collection_spec.rb +0 -57
- data/spec/rspec/core/shared_example_group_spec.rb +0 -114
- data/spec/rspec/core/warnings_spec.rb +0 -29
- data/spec/rspec/core/world_spec.rb +0 -142
- data/spec/rspec/core_spec.rb +0 -91
- data/spec/spec_helper.rb +0 -160
- data/spec/support/config_options_helper.rb +0 -13
- data/spec/support/formatter_support.rb +0 -83
- data/spec/support/helper_methods.rb +0 -26
- data/spec/support/isolate_load_path_mutation.rb +0 -5
- data/spec/support/isolated_directory.rb +0 -10
- data/spec/support/isolated_home_directory.rb +0 -16
- data/spec/support/legacy_formatter_using_sub_classing_example.rb +0 -87
- data/spec/support/matchers.rb +0 -85
- data/spec/support/mathn_integration_support.rb +0 -12
- data/spec/support/old_style_formatter_example.rb +0 -69
- data/spec/support/shared_example_groups.rb +0 -13
- data/spec/support/spec_files.rb +0 -44
- data/spec/support/stderr_splitter.rb +0 -36
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# rspec-core [](http://travis-ci.org/rspec/rspec-core) [](https://codeclimate.com/github/rspec/rspec-core)
|
1
|
+
# rspec-core [](http://travis-ci.org/rspec/rspec-core) [](https://codeclimate.com/github/rspec/rspec-core) [](http://inch-pages.github.io/github/rspec/rspec-core)
|
2
2
|
|
3
3
|
rspec-core provides the structure for writing executable examples of how your
|
4
4
|
code should behave, and an `rspec` command with tools to constrain which
|
@@ -18,7 +18,7 @@ RSpec uses the words "describe" and "it" so we can express concepts like a conve
|
|
18
18
|
"It sums the prices of its line items."
|
19
19
|
|
20
20
|
```ruby
|
21
|
-
describe Order do
|
21
|
+
RSpec.describe Order do
|
22
22
|
it "sums the prices of its line items" do
|
23
23
|
order = Order.new
|
24
24
|
order.add_entry(LineItem.new(:item => Item.new(
|
@@ -46,7 +46,7 @@ You can also declare nested nested groups using the `describe` or `context`
|
|
46
46
|
methods:
|
47
47
|
|
48
48
|
```ruby
|
49
|
-
describe Order do
|
49
|
+
RSpec.describe Order do
|
50
50
|
context "with no items" do
|
51
51
|
it "behaves one way" do
|
52
52
|
# ...
|
@@ -63,8 +63,11 @@ end
|
|
63
63
|
|
64
64
|
## aliases
|
65
65
|
|
66
|
-
You can declare example groups using either `describe` or `context
|
67
|
-
|
66
|
+
You can declare example groups using either `describe` or `context`.
|
67
|
+
For a top level example group, `describe` and `context` are available
|
68
|
+
off of `RSpec`. For backwards compatibility, they are also available
|
69
|
+
off of the `main` object and `Module` unless you disable monkey
|
70
|
+
patching.
|
68
71
|
|
69
72
|
You can declare examples within a group using any of `it`, `specify`, or
|
70
73
|
`example`.
|
@@ -75,17 +78,17 @@ Declare a shared example group using `shared_examples`, and then include it
|
|
75
78
|
in any group using `include_examples`.
|
76
79
|
|
77
80
|
```ruby
|
78
|
-
shared_examples "collections" do |collection_class|
|
81
|
+
RSpec.shared_examples "collections" do |collection_class|
|
79
82
|
it "is empty when first created" do
|
80
83
|
expect(collection_class.new).to be_empty
|
81
84
|
end
|
82
85
|
end
|
83
86
|
|
84
|
-
describe Array do
|
87
|
+
RSpec.describe Array do
|
85
88
|
include_examples "collections", Array
|
86
89
|
end
|
87
90
|
|
88
|
-
describe Hash do
|
91
|
+
RSpec.describe Hash do
|
89
92
|
include_examples "collections", Hash
|
90
93
|
end
|
91
94
|
```
|
@@ -123,7 +126,7 @@ using the `described_class` method, which is a wrapper for
|
|
123
126
|
`example.metadata[:described_class]`.
|
124
127
|
|
125
128
|
```ruby
|
126
|
-
describe Widget do
|
129
|
+
RSpec.describe Widget do
|
127
130
|
example do
|
128
131
|
expect(described_class).to equal(Widget)
|
129
132
|
end
|
@@ -135,17 +138,17 @@ class is unknown. Taking the collections shared example group from above, we can
|
|
135
138
|
clean it up a bit using `described_class`:
|
136
139
|
|
137
140
|
```ruby
|
138
|
-
shared_examples "collections" do
|
141
|
+
RSpec.shared_examples "collections" do
|
139
142
|
it "is empty when first created" do
|
140
143
|
expect(described_class.new).to be_empty
|
141
144
|
end
|
142
145
|
end
|
143
146
|
|
144
|
-
describe Array do
|
147
|
+
RSpec.describe Array do
|
145
148
|
include_examples "collections"
|
146
149
|
end
|
147
150
|
|
148
|
-
describe Hash do
|
151
|
+
RSpec.describe Hash do
|
149
152
|
include_examples "collections"
|
150
153
|
end
|
151
154
|
```
|
@@ -176,7 +179,7 @@ this before you write any implementation code:
|
|
176
179
|
|
177
180
|
```ruby
|
178
181
|
# in spec/calculator_spec.rb
|
179
|
-
describe Calculator do
|
182
|
+
RSpec.describe Calculator do
|
180
183
|
describe '#add' do
|
181
184
|
it 'returns the sum of its arguments' do
|
182
185
|
expect(Calculator.new.add(1, 2)).to eq(3)
|
data/lib/rspec/core.rb
CHANGED
@@ -1,77 +1,49 @@
|
|
1
|
-
|
2
|
-
lambda do |path|
|
3
|
-
require_relative path
|
4
|
-
end
|
5
|
-
else # for 1.8.7
|
6
|
-
lambda do |path|
|
7
|
-
require "rspec/#{path}"
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
require 'set'
|
12
|
-
require 'time'
|
1
|
+
$_rspec_core_load_started_at = Time.now
|
13
2
|
require 'rbconfig'
|
14
3
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
4
|
+
require "rspec/support"
|
5
|
+
RSpec::Support.require_rspec_support "caller_filter"
|
6
|
+
|
7
|
+
RSpec::Support.define_optimized_require_for_rspec(:core) { |f| require_relative f }
|
8
|
+
|
9
|
+
%w[
|
10
|
+
version
|
11
|
+
warnings
|
12
|
+
|
13
|
+
flat_map
|
14
|
+
filter_manager
|
15
|
+
dsl
|
16
|
+
notifications
|
17
|
+
reporter
|
18
|
+
|
19
|
+
hooks
|
20
|
+
memoized_helpers
|
21
|
+
metadata
|
22
|
+
metadata_filter
|
23
|
+
pending
|
24
|
+
formatters
|
25
|
+
ordering
|
26
|
+
|
27
|
+
world
|
28
|
+
configuration
|
29
|
+
option_parser
|
30
|
+
configuration_options
|
31
|
+
runner
|
32
|
+
example
|
33
|
+
shared_example_group
|
34
|
+
example_group
|
35
|
+
].each { |name| RSpec::Support.require_rspec_core name }
|
44
36
|
|
45
37
|
module RSpec
|
46
38
|
autoload :SharedContext, 'rspec/core/shared_context'
|
47
39
|
|
48
|
-
|
49
|
-
def self.wants_to_quit
|
50
|
-
# Used internally to determine what to do when a SIGINT is received
|
51
|
-
world.wants_to_quit
|
52
|
-
end
|
53
|
-
|
54
|
-
# @private
|
55
|
-
# Used internally to determine what to do when a SIGINT is received
|
56
|
-
def self.wants_to_quit=(maybe)
|
57
|
-
world.wants_to_quit=(maybe)
|
58
|
-
end
|
59
|
-
|
60
|
-
# @private
|
61
|
-
# Internal container for global non-configuration data
|
62
|
-
def self.world
|
63
|
-
@world ||= RSpec::Core::World.new
|
64
|
-
end
|
65
|
-
|
66
|
-
# @private
|
67
|
-
# Used internally to set the global object
|
68
|
-
def self.world=(new_world)
|
69
|
-
@world = new_world
|
70
|
-
end
|
40
|
+
extend RSpec::Core::Warnings
|
71
41
|
|
72
|
-
#
|
73
|
-
# Used internally to ensure examples get reloaded between multiple runs in
|
42
|
+
# Used to ensure examples get reloaded between multiple runs in
|
74
43
|
# the same process.
|
44
|
+
#
|
45
|
+
# Users must invoke this if they want to have the configuration reset when
|
46
|
+
# they use runner multiple times within the same process.
|
75
47
|
def self.reset
|
76
48
|
@world = nil
|
77
49
|
@configuration = nil
|
@@ -94,12 +66,6 @@ module RSpec
|
|
94
66
|
|
95
67
|
end
|
96
68
|
|
97
|
-
# @private
|
98
|
-
# Used internally to set the global object
|
99
|
-
def self.configuration=(new_configuration)
|
100
|
-
@configuration = new_configuration
|
101
|
-
end
|
102
|
-
|
103
69
|
# Yields the global configuration to a block.
|
104
70
|
# @yield [Configuration] global configuration
|
105
71
|
#
|
@@ -112,12 +78,6 @@ module RSpec
|
|
112
78
|
yield configuration if block_given?
|
113
79
|
end
|
114
80
|
|
115
|
-
# @private
|
116
|
-
# Used internally to clear remaining groups when fail_fast is set
|
117
|
-
def self.clear_remaining_example_groups
|
118
|
-
world.example_groups.clear
|
119
|
-
end
|
120
|
-
|
121
81
|
# The example being executed.
|
122
82
|
#
|
123
83
|
# The primary audience for this method is library authors who need access
|
@@ -132,7 +92,7 @@ module RSpec
|
|
132
92
|
# fetch_current_example = RSpec.respond_to?(:current_example) ?
|
133
93
|
# proc { RSpec.current_example } : proc { |context| context.example }
|
134
94
|
#
|
135
|
-
# c.before(:
|
95
|
+
# c.before(:example) do
|
136
96
|
# example = fetch_current_example.call(self)
|
137
97
|
#
|
138
98
|
# # ...
|
@@ -140,20 +100,29 @@ module RSpec
|
|
140
100
|
# end
|
141
101
|
#
|
142
102
|
def self.current_example
|
143
|
-
|
103
|
+
thread_local_metadata[:current_example]
|
144
104
|
end
|
145
105
|
|
146
106
|
# Set the current example being executed.
|
147
107
|
# @api private
|
148
108
|
def self.current_example=(example)
|
149
|
-
|
109
|
+
thread_local_metadata[:current_example] = example
|
150
110
|
end
|
151
111
|
|
152
112
|
# @private
|
153
|
-
|
154
|
-
|
113
|
+
# A single thread local variable so we don't excessively pollute that
|
114
|
+
# namespace.
|
115
|
+
def self.thread_local_metadata
|
116
|
+
Thread.current[:_rspec] ||= {}
|
155
117
|
end
|
156
118
|
|
119
|
+
# @private
|
120
|
+
# Internal container for global non-configuration data
|
121
|
+
def self.world
|
122
|
+
@world ||= RSpec::Core::World.new
|
123
|
+
end
|
124
|
+
|
125
|
+
# Namespace for the rspec-core code.
|
157
126
|
module Core
|
158
127
|
# @private
|
159
128
|
# This avoids issues with reporting time caused by examples that
|
@@ -171,12 +140,14 @@ module RSpec
|
|
171
140
|
end
|
172
141
|
end
|
173
142
|
|
143
|
+
# @private
|
174
144
|
MODULES_TO_AUTOLOAD = {
|
175
145
|
:Matchers => "rspec/expectations",
|
176
146
|
:Expectations => "rspec/expectations",
|
177
147
|
:Mocks => "rspec/mocks"
|
178
148
|
}
|
179
149
|
|
150
|
+
# @private
|
180
151
|
def self.const_missing(name)
|
181
152
|
# Load rspec-expectations when RSpec::Matchers is referenced. This allows
|
182
153
|
# people to define custom matchers (using `RSpec::Matchers.define`) before
|
@@ -188,7 +159,7 @@ module RSpec
|
|
188
159
|
#
|
189
160
|
# As of rspec 2.14.1, we no longer require `rspec/mocks` and
|
190
161
|
# `rspec/expectations` when `rspec` is required, so we want
|
191
|
-
# to make them available as an autoload.
|
162
|
+
# to make them available as an autoload.
|
192
163
|
require MODULES_TO_AUTOLOAD.fetch(name) { return super }
|
193
164
|
::RSpec.const_get(name)
|
194
165
|
end
|
@@ -1,12 +1,40 @@
|
|
1
|
-
# This code was (mostly) ported from the backports gem
|
2
|
-
#
|
3
|
-
#
|
1
|
+
# This code was (mostly) ported from the backports gem found at
|
2
|
+
# https://github.com/marcandre/backports which is subject to this license:
|
3
|
+
#
|
4
|
+
# =============================================================================
|
5
|
+
#
|
6
|
+
# Copyright (c) 2009 Marc-Andre Lafortune
|
7
|
+
#
|
8
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
9
|
+
# a copy of this software and associated documentation files (the
|
10
|
+
# "Software"), to deal in the Software without restriction, including
|
11
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
12
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
13
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
14
|
+
# the following conditions:
|
15
|
+
#
|
16
|
+
# The above copyright notice and this permission notice shall be
|
17
|
+
# included in all copies or substantial portions of the Software.
|
18
|
+
#
|
19
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
20
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
21
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
22
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
23
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
24
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
25
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
26
|
+
#
|
27
|
+
# =============================================================================
|
28
|
+
#
|
29
|
+
# The goal is to provide a random number generator in Ruby versions that do
|
30
|
+
# not have one. This was added to support localization of random spec ordering.
|
4
31
|
#
|
5
32
|
# These were in multiple files in backports, but merged into one here.
|
6
33
|
|
7
34
|
module RSpec
|
8
35
|
module Core
|
9
36
|
# Methods used internally by the backports.
|
37
|
+
# @private
|
10
38
|
module Backports
|
11
39
|
# Helper method to coerce a value into a specific class.
|
12
40
|
# Raises a TypeError if the coercion fails or the returned value
|
@@ -25,6 +53,7 @@ module RSpec
|
|
25
53
|
ret
|
26
54
|
end
|
27
55
|
|
56
|
+
# @private
|
28
57
|
def self.coerce_to_int(obj)
|
29
58
|
coerce_to(obj, Integer, :to_int)
|
30
59
|
end
|
@@ -33,7 +62,9 @@ module RSpec
|
|
33
62
|
# (from Rubinius)
|
34
63
|
Undefined = Object.new
|
35
64
|
|
65
|
+
# @private
|
36
66
|
class Random
|
67
|
+
# @private
|
37
68
|
# An implementation of Mersenne Twister MT19937 in Ruby
|
38
69
|
class MT19937
|
39
70
|
STATE_SIZE = 624
|
@@ -198,6 +229,7 @@ module RSpec
|
|
198
229
|
end
|
199
230
|
end
|
200
231
|
|
232
|
+
# @private
|
201
233
|
# Implementation corresponding to the actual Random class of Ruby
|
202
234
|
# The actual random generator (mersenne twister) is in MT19937.
|
203
235
|
# Ruby specific conversions are handled in bits_and_bytes.
|
@@ -1,13 +1,8 @@
|
|
1
1
|
module RSpec
|
2
2
|
module Core
|
3
|
+
# @private
|
3
4
|
class BacktraceFormatter
|
4
|
-
#
|
5
|
-
# rspec-expectations uses
|
6
|
-
# RSpec.configuration.backtrace_formatter.format_backtrace instead.
|
7
|
-
def self.format_backtrace(backtrace, options = {})
|
8
|
-
RSpec.configuration.backtrace_formatter.format_backtrace(backtrace, options)
|
9
|
-
end
|
10
|
-
|
5
|
+
# @private
|
11
6
|
attr_accessor :exclusion_patterns, :inclusion_patterns
|
12
7
|
|
13
8
|
def initialize
|
@@ -33,10 +28,8 @@ module RSpec
|
|
33
28
|
|
34
29
|
def format_backtrace(backtrace, options = {})
|
35
30
|
return backtrace if options[:full_backtrace]
|
36
|
-
|
37
|
-
|
38
|
-
map {|l| backtrace_line(l)}.
|
39
|
-
compact.
|
31
|
+
|
32
|
+
backtrace.map { |l| backtrace_line(l) }.compact.
|
40
33
|
tap do |filtered|
|
41
34
|
if filtered.empty?
|
42
35
|
filtered.concat backtrace
|
@@ -48,14 +41,12 @@ module RSpec
|
|
48
41
|
end
|
49
42
|
end
|
50
43
|
|
51
|
-
# @api private
|
52
44
|
def backtrace_line(line)
|
53
45
|
RSpec::Core::Metadata::relative_path(line) unless exclude?(line)
|
54
46
|
rescue SecurityError
|
55
47
|
nil
|
56
48
|
end
|
57
49
|
|
58
|
-
# @api private
|
59
50
|
def exclude?(line)
|
60
51
|
return false if @full_backtrace
|
61
52
|
matches_an_exclusion_pattern?(line) &&
|
@@ -1,7 +1,8 @@
|
|
1
1
|
require 'fileutils'
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
|
3
|
+
RSpec::Support.require_rspec_core "backtrace_formatter"
|
4
|
+
RSpec::Support.require_rspec_core "ruby_project"
|
5
|
+
RSpec::Support.require_rspec_core "formatters/deprecation_formatter"
|
5
6
|
|
6
7
|
module RSpec
|
7
8
|
module Core
|
@@ -21,9 +22,9 @@ module RSpec
|
|
21
22
|
#
|
22
23
|
# @example Hooks
|
23
24
|
# RSpec.configure do |c|
|
24
|
-
# c.before(:suite)
|
25
|
-
# c.before(:
|
26
|
-
# c.around(:
|
25
|
+
# c.before(:suite) { establish_connection }
|
26
|
+
# c.before(:example) { log_in_as :authorized }
|
27
|
+
# c.around(:example) { |ex| Database.transaction(&ex) }
|
27
28
|
# end
|
28
29
|
#
|
29
30
|
# @see RSpec.configure
|
@@ -31,6 +32,7 @@ module RSpec
|
|
31
32
|
class Configuration
|
32
33
|
include RSpec::Core::Hooks
|
33
34
|
|
35
|
+
# @private
|
34
36
|
class MustBeConfiguredBeforeExampleGroupsError < StandardError; end
|
35
37
|
|
36
38
|
# @private
|
@@ -77,10 +79,11 @@ module RSpec
|
|
77
79
|
end
|
78
80
|
|
79
81
|
# @macro [attach] add_setting
|
80
|
-
#
|
82
|
+
# @!attribute [rw] $1
|
83
|
+
# @!method $1=(value)
|
81
84
|
#
|
82
85
|
# @macro [attach] define_reader
|
83
|
-
#
|
86
|
+
# @!attribute [r] $1
|
84
87
|
|
85
88
|
# @macro add_setting
|
86
89
|
# Path to use if no path is provided to the `rspec` command (default:
|
@@ -121,9 +124,24 @@ module RSpec
|
|
121
124
|
end
|
122
125
|
end
|
123
126
|
|
124
|
-
#
|
125
|
-
#
|
126
|
-
|
127
|
+
# Determines where deprecation warnings are printed.
|
128
|
+
# Defaults to `$stderr`.
|
129
|
+
# @return [IO, String] IO to write to or filename to write to
|
130
|
+
define_reader :deprecation_stream
|
131
|
+
|
132
|
+
# Determines where deprecation warnings are printed.
|
133
|
+
# @param value [IO, String] IO to write to or filename to write to
|
134
|
+
def deprecation_stream=(value)
|
135
|
+
if @reporter && !value.equal?(@deprecation_stream)
|
136
|
+
warn "RSpec's reporter has already been initialized with " +
|
137
|
+
"#{deprecation_stream.inspect} as the deprecation stream, so your change to "+
|
138
|
+
"`deprecation_stream` will be ignored. You should configure it earlier for " +
|
139
|
+
"it to take effect, or use the `--deprecation-out` CLI option. " +
|
140
|
+
"(Called from #{CallerFilter.first_non_rspec_line})"
|
141
|
+
else
|
142
|
+
@deprecation_stream = value
|
143
|
+
end
|
144
|
+
end
|
127
145
|
|
128
146
|
# @macro add_setting
|
129
147
|
# Clean up and exit after the first failure (default: `false`).
|
@@ -143,13 +161,16 @@ module RSpec
|
|
143
161
|
define_reader :requires
|
144
162
|
|
145
163
|
# @macro define_reader
|
146
|
-
# Returns dirs that have been prepended to the load path by
|
164
|
+
# Returns dirs that have been prepended to the load path by the `-I` command line option
|
147
165
|
define_reader :libs
|
148
166
|
|
149
167
|
# @macro add_setting
|
168
|
+
# Determines where RSpec will send its output.
|
150
169
|
# Default: `$stdout`.
|
151
|
-
# Also known as `output` and `out`
|
152
170
|
define_reader :output_stream
|
171
|
+
|
172
|
+
# Set the output stream for reporter
|
173
|
+
# @attr value [IO] value for output, defaults to $stdout
|
153
174
|
def output_stream=(value)
|
154
175
|
if @reporter && !value.equal?(@output_stream)
|
155
176
|
warn "RSpec's reporter has already been initialized with " +
|
@@ -163,15 +184,16 @@ module RSpec
|
|
163
184
|
|
164
185
|
# @macro add_setting
|
165
186
|
# Load files matching this pattern (default: `'**/*_spec.rb'`)
|
166
|
-
add_setting :pattern
|
187
|
+
add_setting :pattern
|
167
188
|
|
168
|
-
|
189
|
+
# Set pattern to match files to load
|
190
|
+
# @attr value [String] the filename pattern to filter spec files by
|
191
|
+
def pattern=(value)
|
169
192
|
if @spec_files_loaded
|
170
193
|
RSpec.warning "Configuring `pattern` to #{value} has no effect since RSpec has already loaded the spec files."
|
171
194
|
end
|
172
195
|
@pattern = value
|
173
196
|
end
|
174
|
-
alias :filename_pattern= :pattern=
|
175
197
|
|
176
198
|
# @macro add_setting
|
177
199
|
# Report the times for the slowest examples (default: `false`).
|
@@ -184,32 +206,44 @@ module RSpec
|
|
184
206
|
|
185
207
|
# @macro add_setting
|
186
208
|
# Color to use to indicate success.
|
187
|
-
# @param [Symbol]
|
209
|
+
# @param color [Symbol] defaults to `:green` but can be set to one of the
|
210
|
+
# following: `[:black, :white, :red, :green, :yellow,
|
211
|
+
# :blue, :magenta, :cyan]`
|
188
212
|
add_setting :success_color
|
189
213
|
|
190
214
|
# @macro add_setting
|
191
215
|
# Color to use to print pending examples.
|
192
|
-
# @param [Symbol]
|
216
|
+
# @param color [Symbol] defaults to `:yellow` but can be set to one of the
|
217
|
+
# following: `[:black, :white, :red, :green, :yellow,
|
218
|
+
# :blue, :magenta, :cyan]`
|
193
219
|
add_setting :pending_color
|
194
220
|
|
195
221
|
# @macro add_setting
|
196
222
|
# Color to use to indicate failure.
|
197
|
-
# @param [Symbol]
|
223
|
+
# @param color [Symbol] defaults to `:red` but can be set to one of the
|
224
|
+
# following: `[:black, :white, :red, :green, :yellow,
|
225
|
+
# :blue, :magenta, :cyan]`
|
198
226
|
add_setting :failure_color
|
199
227
|
|
200
228
|
# @macro add_setting
|
201
229
|
# The default output color.
|
202
|
-
# @param [Symbol]
|
230
|
+
# @param color [Symbol] defaults to `:white` but can be set to one of the
|
231
|
+
# following:`[:black, :white, :red, :green, :yellow,
|
232
|
+
# :blue, :magenta, :cyan]`
|
203
233
|
add_setting :default_color
|
204
234
|
|
205
235
|
# @macro add_setting
|
206
236
|
# Color used when a pending example is fixed.
|
207
|
-
# @param [Symbol]
|
237
|
+
# @param color [Symbol] defaults to `:blue` but can be set to one of the
|
238
|
+
# following: `[:black, :white, :red, :green, :yellow,
|
239
|
+
# :blue, :magenta, :cyan]`
|
208
240
|
add_setting :fixed_color
|
209
241
|
|
210
242
|
# @macro add_setting
|
211
243
|
# Color used to print details.
|
212
|
-
# @param [Symbol]
|
244
|
+
# @param color [Symbol] defaults to `:cyan` but can be set to one of the
|
245
|
+
# following: `[:black, :white, :red, :green, :yellow,
|
246
|
+
# :blue, :magenta, :cyan]`
|
213
247
|
add_setting :detail_color
|
214
248
|
|
215
249
|
# Deprecated. This config option was added in RSpec 2 to pave the way
|
@@ -217,10 +251,13 @@ module RSpec
|
|
217
251
|
# a no-op.
|
218
252
|
def treat_symbols_as_metadata_keys_with_true_values=(value)
|
219
253
|
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=" +
|
254
|
+
:message => "RSpec::Core::Configuration#treat_symbols_as_metadata_keys_with_true_values= " +
|
221
255
|
"is deprecated, it is now set to true as default and setting it to false has no effect.")
|
222
256
|
end
|
223
257
|
|
258
|
+
# Record the start time of the spec suite to measure load time
|
259
|
+
add_setting :start_time
|
260
|
+
|
224
261
|
# @private
|
225
262
|
add_setting :tty
|
226
263
|
# @private
|
@@ -234,12 +271,8 @@ module RSpec
|
|
234
271
|
# @private
|
235
272
|
attr_reader :backtrace_formatter, :ordering_manager
|
236
273
|
|
237
|
-
# Alias for rspec-2.x's backtrace_cleaner (now backtrace_formatter)
|
238
|
-
#
|
239
|
-
# TODO: consider deprecating and removing this rather than aliasing in rspec-3?
|
240
|
-
alias backtrace_cleaner backtrace_formatter
|
241
|
-
|
242
274
|
def initialize
|
275
|
+
@start_time = $_rspec_core_load_started_at || ::RSpec::Core::Time.now
|
243
276
|
@expectation_frameworks = []
|
244
277
|
@include_or_extend_modules = []
|
245
278
|
@mock_framework = nil
|
@@ -255,6 +288,7 @@ module RSpec
|
|
255
288
|
@deprecation_stream = $stderr
|
256
289
|
@output_stream = $stdout
|
257
290
|
@reporter = nil
|
291
|
+
@reporter_buffer = nil
|
258
292
|
@filter_manager = FilterManager.new
|
259
293
|
@ordering_manager = Ordering::ConfigurationManager.new
|
260
294
|
@preferred_options = {}
|
@@ -267,6 +301,7 @@ module RSpec
|
|
267
301
|
@profile_examples = false
|
268
302
|
@requires = []
|
269
303
|
@libs = []
|
304
|
+
@derived_metadata_blocks = []
|
270
305
|
end
|
271
306
|
|
272
307
|
# @private
|
@@ -275,7 +310,6 @@ module RSpec
|
|
275
310
|
def force(hash)
|
276
311
|
ordering_manager.force(hash)
|
277
312
|
@preferred_options.merge!(hash)
|
278
|
-
self.warnings = value_for :warnings, nil
|
279
313
|
end
|
280
314
|
|
281
315
|
# @private
|
@@ -322,7 +356,7 @@ module RSpec
|
|
322
356
|
# RSpec.configuration.foo? # returns true if foo returns anything but nil or false
|
323
357
|
def add_setting(name, opts={})
|
324
358
|
default = opts.delete(:default)
|
325
|
-
(class << self; self; end).
|
359
|
+
(class << self; self; end).class_exec do
|
326
360
|
add_setting(name, opts)
|
327
361
|
end
|
328
362
|
__send__("#{name}=", default) if default
|
@@ -354,6 +388,8 @@ module RSpec
|
|
354
388
|
@backtrace_formatter.exclusion_patterns
|
355
389
|
end
|
356
390
|
|
391
|
+
# Set regular expressions used to exclude lines in backtrace
|
392
|
+
# @param patterns [Regexp] set the backtrace exlusion pattern
|
357
393
|
def backtrace_exclusion_patterns=(patterns)
|
358
394
|
@backtrace_formatter.exclusion_patterns = patterns
|
359
395
|
end
|
@@ -370,11 +406,13 @@ module RSpec
|
|
370
406
|
@backtrace_formatter.inclusion_patterns
|
371
407
|
end
|
372
408
|
|
409
|
+
# Set regular expressions used to include lines in backtrace
|
410
|
+
# @attr patterns [Regexp] set backtrace_formatter inclusion_patterns
|
373
411
|
def backtrace_inclusion_patterns=(patterns)
|
374
412
|
@backtrace_formatter.inclusion_patterns = patterns
|
375
413
|
end
|
376
414
|
|
377
|
-
# @
|
415
|
+
# @private
|
378
416
|
MOCKING_ADAPTERS = {
|
379
417
|
:rspec => :RSpec,
|
380
418
|
:flexmock => :Flexmock,
|
@@ -400,8 +438,8 @@ module RSpec
|
|
400
438
|
# - called before each example
|
401
439
|
#
|
402
440
|
# verify_mocks_for_rspec
|
403
|
-
# - called after each example
|
404
|
-
# when expectations fail
|
441
|
+
# - called after each example if the example hasn't yet failed.
|
442
|
+
# Framework should raise an exception when expectations fail
|
405
443
|
#
|
406
444
|
# teardown_mocks_for_rspec
|
407
445
|
# - called after verify_mocks_for_rspec (even if there are errors)
|
@@ -422,7 +460,7 @@ module RSpec
|
|
422
460
|
"Pass a module or one of #{MOCKING_ADAPTERS.keys.inspect}"
|
423
461
|
end
|
424
462
|
|
425
|
-
|
463
|
+
RSpec::Support.require_rspec_core "mocking_adapters/#{const_name.to_s.downcase}"
|
426
464
|
RSpec::Core::MockingAdapters.const_get(const_name)
|
427
465
|
end
|
428
466
|
|
@@ -456,16 +494,17 @@ module RSpec
|
|
456
494
|
# Sets the expectation framework module(s) to be included in each example
|
457
495
|
# group.
|
458
496
|
#
|
459
|
-
# `frameworks` can be `:rspec`, `:
|
460
|
-
# combination thereof:
|
497
|
+
# `frameworks` can be `:rspec`, `:test_unit`, `:minitest`, a custom
|
498
|
+
# module, or any combination thereof:
|
461
499
|
#
|
462
500
|
# config.expect_with :rspec
|
463
|
-
# config.expect_with :
|
464
|
-
# config.expect_with :
|
501
|
+
# config.expect_with :test_unit
|
502
|
+
# config.expect_with :minitest
|
503
|
+
# config.expect_with :rspec, :minitest
|
465
504
|
# config.expect_with OtherExpectationFramework
|
466
505
|
#
|
467
|
-
# RSpec will translate `:rspec
|
468
|
-
# modules.
|
506
|
+
# RSpec will translate `:rspec`, `:minitest`, and `:test_unit` into the
|
507
|
+
# appropriate modules.
|
469
508
|
#
|
470
509
|
# ## Configuration
|
471
510
|
#
|
@@ -484,9 +523,12 @@ module RSpec
|
|
484
523
|
require 'rspec/expectations'
|
485
524
|
self.expecting_with_rspec = true
|
486
525
|
::RSpec::Matchers
|
487
|
-
when :
|
488
|
-
require '
|
489
|
-
::
|
526
|
+
when :test_unit
|
527
|
+
require 'rspec/core/test_unit_assertions_adapter'
|
528
|
+
::RSpec::Core::TestUnitAssertionsAdapter
|
529
|
+
when :minitest
|
530
|
+
require 'rspec/core/minitest_assertions_adapter'
|
531
|
+
::RSpec::Core::MinitestAssertionsAdapter
|
490
532
|
else
|
491
533
|
raise ArgumentError, "#{framework.inspect} is not supported"
|
492
534
|
end
|
@@ -505,25 +547,40 @@ module RSpec
|
|
505
547
|
@expectation_frameworks.push(*modules)
|
506
548
|
end
|
507
549
|
|
550
|
+
# Check if full backtrace is enabled
|
551
|
+
# @return [Boolean] is full backtrace enabled
|
508
552
|
def full_backtrace?
|
509
553
|
@backtrace_formatter.full_backtrace?
|
510
554
|
end
|
511
555
|
|
556
|
+
# Toggle full backtrace
|
557
|
+
# @attr true_or_false [Boolean] toggle full backtrace display
|
512
558
|
def full_backtrace=(true_or_false)
|
513
559
|
@backtrace_formatter.full_backtrace = true_or_false
|
514
560
|
end
|
515
561
|
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
562
|
+
# Returns the configuration option for color, but should not
|
563
|
+
# be used to check if color is supported.
|
564
|
+
#
|
565
|
+
# @see color_enabled?
|
566
|
+
# @return [Boolean]
|
567
|
+
def color
|
521
568
|
value_for(:color, @color)
|
522
569
|
end
|
523
570
|
|
524
|
-
|
525
|
-
|
526
|
-
|
571
|
+
# Check if color is enabled for a particular output
|
572
|
+
# @param output [IO] an output stream to use, defaults to the current
|
573
|
+
# `output_stream`
|
574
|
+
# @return [Boolean]
|
575
|
+
def color_enabled?(output = output_stream)
|
576
|
+
output_to_tty?(output) && color
|
577
|
+
end
|
578
|
+
|
579
|
+
# Toggle output color
|
580
|
+
# @attr true_or_false [Boolean] toggle color enabled
|
581
|
+
def color=(true_or_false)
|
582
|
+
if true_or_false
|
583
|
+
if RSpec.world.windows_os? and not ENV['ANSICON']
|
527
584
|
RSpec.warning "You must use ANSICON 1.31 or later (http://adoxa.3eeweb.com/ansicon/) to use colour on Windows"
|
528
585
|
@color = false
|
529
586
|
else
|
@@ -532,12 +589,7 @@ module RSpec
|
|
532
589
|
end
|
533
590
|
end
|
534
591
|
|
535
|
-
#
|
536
|
-
# release before 3.0
|
537
|
-
alias_method :color_enabled, :color
|
538
|
-
alias_method :color_enabled=, :color=
|
539
|
-
define_predicate_for :color_enabled, :color
|
540
|
-
|
592
|
+
# @private
|
541
593
|
def libs=(libs)
|
542
594
|
libs.map do |lib|
|
543
595
|
@libs.unshift lib
|
@@ -545,19 +597,13 @@ module RSpec
|
|
545
597
|
end
|
546
598
|
end
|
547
599
|
|
548
|
-
# Run examples
|
549
|
-
|
550
|
-
filter_run :line_numbers => line_numbers.map{|l| l.to_i}
|
551
|
-
end
|
552
|
-
|
553
|
-
def line_numbers
|
554
|
-
filter.fetch(:line_numbers,[])
|
555
|
-
end
|
556
|
-
|
600
|
+
# Run examples matching on `description` in all files to run.
|
601
|
+
# @param description [String, Regexp] the pattern to filter on
|
557
602
|
def full_description=(description)
|
558
603
|
filter_run :full_description => Regexp.union(*Array(description).map {|d| Regexp.new(d) })
|
559
604
|
end
|
560
605
|
|
606
|
+
# @return [Array] full description filter
|
561
607
|
def full_description
|
562
608
|
filter.fetch :full_description, nil
|
563
609
|
end
|
@@ -579,21 +625,70 @@ module RSpec
|
|
579
625
|
end
|
580
626
|
alias_method :formatter=, :add_formatter
|
581
627
|
|
582
|
-
#
|
628
|
+
# The formatter that will be used if no formatter has been set.
|
629
|
+
# Defaults to 'progress'.
|
630
|
+
def default_formatter
|
631
|
+
formatter_loader.default_formatter
|
632
|
+
end
|
633
|
+
|
634
|
+
# Sets a fallback formatter to use if none other has been set.
|
635
|
+
#
|
636
|
+
# @example
|
637
|
+
#
|
638
|
+
# RSpec.configure do |rspec|
|
639
|
+
# rspec.default_formatter = 'doc'
|
640
|
+
# end
|
641
|
+
def default_formatter=(value)
|
642
|
+
formatter_loader.default_formatter = value
|
643
|
+
end
|
644
|
+
|
645
|
+
# Returns a duplicate of the formatters currently loaded in
|
646
|
+
# the `FormatterLoader` for introspection.
|
647
|
+
#
|
648
|
+
# Note as this is a duplicate, any mutations will be disregarded.
|
649
|
+
#
|
650
|
+
# @return [Array] the formatters currently loaded
|
583
651
|
def formatters
|
584
|
-
formatter_loader.formatters
|
652
|
+
formatter_loader.formatters.dup
|
585
653
|
end
|
586
654
|
|
587
|
-
# @
|
655
|
+
# @private
|
588
656
|
def formatter_loader
|
589
657
|
@formatter_loader ||= Formatters::Loader.new(Reporter.new(self))
|
590
658
|
end
|
591
659
|
|
592
|
-
# @
|
660
|
+
# @private
|
661
|
+
#
|
662
|
+
# This buffer is used to capture all messages sent to the reporter during
|
663
|
+
# reporter initialization. It can then replay those messages after the
|
664
|
+
# formatter is correctly initialized. Otherwise, deprecation warnings
|
665
|
+
# during formatter initialization can cause an infinite loop.
|
666
|
+
class DeprecationReporterBuffer
|
667
|
+
def initialize
|
668
|
+
@calls = []
|
669
|
+
end
|
670
|
+
|
671
|
+
def deprecation(*args)
|
672
|
+
@calls << args
|
673
|
+
end
|
674
|
+
|
675
|
+
def play_onto(reporter)
|
676
|
+
@calls.each do |args|
|
677
|
+
reporter.deprecation(*args)
|
678
|
+
end
|
679
|
+
end
|
680
|
+
end
|
681
|
+
|
682
|
+
# @private
|
593
683
|
def reporter
|
594
|
-
@
|
684
|
+
# @reporter_buffer should only ever be set in this method to cover
|
685
|
+
# initialization of @reporter.
|
686
|
+
@reporter_buffer || @reporter ||=
|
595
687
|
begin
|
688
|
+
@reporter_buffer = DeprecationReporterBuffer.new
|
596
689
|
formatter_loader.setup_default output_stream, deprecation_stream
|
690
|
+
@reporter_buffer.play_onto(formatter_loader.reporter)
|
691
|
+
@reporter_buffer = nil
|
597
692
|
formatter_loader.reporter
|
598
693
|
end
|
599
694
|
end
|
@@ -619,54 +714,70 @@ module RSpec
|
|
619
714
|
@files_to_run = nil
|
620
715
|
end
|
621
716
|
|
717
|
+
# The spec files RSpec will run
|
718
|
+
# @return [Array] specified files about to run
|
622
719
|
def files_to_run
|
623
720
|
@files_to_run ||= get_files_to_run(@files_or_directories_to_run)
|
624
721
|
end
|
625
722
|
|
626
723
|
# Creates a method that delegates to `example` including the submitted
|
627
724
|
# `args`. Used internally to add variants of `example` like `pending`:
|
725
|
+
# @param name [String] example name alias
|
726
|
+
# @param args [Array<Symbol>, Hash] metadata for the generated example
|
727
|
+
#
|
728
|
+
# @note The specific example alias below (`pending`) is already
|
729
|
+
# defined for you.
|
730
|
+
# @note Use with caution. This extends the language used in your
|
731
|
+
# specs, but does not add any additional documentation. We use this
|
732
|
+
# in rspec to define methods like `focus` and `xit`, but we also add
|
733
|
+
# docs for those methods.
|
628
734
|
#
|
629
735
|
# @example
|
630
|
-
#
|
736
|
+
# RSpec.configure do |config|
|
737
|
+
# config.alias_example_to :pending, :pending => true
|
738
|
+
# end
|
631
739
|
#
|
632
|
-
#
|
740
|
+
# # This lets you do this:
|
633
741
|
#
|
634
|
-
#
|
635
|
-
#
|
636
|
-
#
|
637
|
-
# end
|
742
|
+
# describe Thing do
|
743
|
+
# pending "does something" do
|
744
|
+
# thing = Thing.new
|
638
745
|
# end
|
746
|
+
# end
|
639
747
|
#
|
640
|
-
#
|
748
|
+
# # ... which is the equivalent of
|
641
749
|
#
|
642
|
-
#
|
643
|
-
#
|
644
|
-
#
|
645
|
-
# end
|
750
|
+
# describe Thing do
|
751
|
+
# it "does something", :pending => true do
|
752
|
+
# thing = Thing.new
|
646
753
|
# end
|
647
|
-
|
754
|
+
# end
|
755
|
+
def alias_example_to(name, *args)
|
648
756
|
extra_options = Metadata.build_hash_from(args)
|
649
|
-
RSpec::Core::ExampleGroup.
|
757
|
+
RSpec::Core::ExampleGroup.define_example_method(name, extra_options)
|
650
758
|
end
|
651
759
|
|
652
760
|
# Creates a method that defines an example group with the provided
|
653
761
|
# metadata. Can be used to define example group/metadata shortcuts.
|
654
762
|
#
|
655
763
|
# @example
|
656
|
-
#
|
657
|
-
#
|
658
|
-
#
|
659
|
-
# end
|
764
|
+
# RSpec.configure do |config|
|
765
|
+
# config.alias_example_group_to :describe_model, :type => :model
|
766
|
+
# end
|
660
767
|
#
|
661
|
-
#
|
768
|
+
# shared_context_for "model tests", :type => :model do
|
769
|
+
# # define common model test helper methods, `let` declarations, etc
|
770
|
+
# end
|
662
771
|
#
|
663
|
-
#
|
664
|
-
# end
|
772
|
+
# # This lets you do this:
|
665
773
|
#
|
666
|
-
#
|
774
|
+
# RSpec.describe_model User do
|
775
|
+
# end
|
667
776
|
#
|
668
|
-
#
|
669
|
-
#
|
777
|
+
# # ... which is the equivalent of
|
778
|
+
#
|
779
|
+
# RSpec.describe User, :type => :model do
|
780
|
+
# end
|
670
781
|
#
|
671
782
|
# @note The defined aliased will also be added to the top level
|
672
783
|
# (e.g. `main` and from within modules) if
|
@@ -675,34 +786,38 @@ module RSpec
|
|
675
786
|
# @see #expose_dsl_globally=
|
676
787
|
def alias_example_group_to(new_name, *args)
|
677
788
|
extra_options = Metadata.build_hash_from(args)
|
678
|
-
RSpec::Core::ExampleGroup.
|
789
|
+
RSpec::Core::ExampleGroup.define_example_group_method(new_name, extra_options)
|
679
790
|
end
|
680
791
|
|
681
792
|
# Define an alias for it_should_behave_like that allows different
|
682
793
|
# language (like "it_has_behavior" or "it_behaves_like") to be
|
683
794
|
# employed when including shared examples.
|
684
795
|
#
|
685
|
-
#
|
686
|
-
#
|
687
|
-
# alias_it_behaves_like_to(:it_has_behavior, 'has behavior:')
|
796
|
+
# @example
|
797
|
+
# RSpec.configure do |config|
|
798
|
+
# config.alias_it_behaves_like_to(:it_has_behavior, 'has behavior:')
|
799
|
+
# end
|
688
800
|
#
|
689
|
-
# allows the user to include a shared example group like:
|
801
|
+
# # allows the user to include a shared example group like:
|
690
802
|
#
|
691
|
-
#
|
692
|
-
#
|
693
|
-
#
|
694
|
-
# end
|
803
|
+
# describe Entity do
|
804
|
+
# it_has_behavior 'sortability' do
|
805
|
+
# let(:sortable) { Entity.new }
|
695
806
|
# end
|
807
|
+
# end
|
696
808
|
#
|
697
|
-
# which is reported in the output as:
|
809
|
+
# # which is reported in the output as:
|
810
|
+
# # Entity
|
811
|
+
# # has behavior: sortability
|
812
|
+
# # ...sortability examples here
|
698
813
|
#
|
699
|
-
#
|
700
|
-
#
|
701
|
-
#
|
814
|
+
# @note Use with caution. This extends the language used in your
|
815
|
+
# specs, but does not add any additional documentation. We use this
|
816
|
+
# in rspec to define `it_should_behave_like` (for backward
|
817
|
+
# compatibility), but we also add docs for that method.
|
702
818
|
def alias_it_behaves_like_to(new_name, report_label = '')
|
703
|
-
RSpec::Core::ExampleGroup.
|
819
|
+
RSpec::Core::ExampleGroup.define_nested_shared_group_method(new_name, report_label)
|
704
820
|
end
|
705
|
-
|
706
821
|
alias_method :alias_it_should_behave_like_to, :alias_it_behaves_like_to
|
707
822
|
|
708
823
|
# Adds key/value pairs to the `inclusion_filter`. If `args`
|
@@ -748,7 +863,7 @@ module RSpec
|
|
748
863
|
# This overrides any inclusion filters/tags set on the command line or in
|
749
864
|
# configuration files.
|
750
865
|
def inclusion_filter=(filter)
|
751
|
-
filter_manager.
|
866
|
+
filter_manager.include_only Metadata.build_hash_from([filter])
|
752
867
|
end
|
753
868
|
|
754
869
|
alias_method :filter=, :inclusion_filter=
|
@@ -802,7 +917,7 @@ module RSpec
|
|
802
917
|
# This overrides any exclusion filters/tags set on the command line or in
|
803
918
|
# configuration files.
|
804
919
|
def exclusion_filter=(filter)
|
805
|
-
filter_manager.
|
920
|
+
filter_manager.exclude_only Metadata.build_hash_from([filter])
|
806
921
|
end
|
807
922
|
|
808
923
|
# Returns the `exclusion_filter`. If none has been set, returns an empty
|
@@ -906,10 +1021,12 @@ module RSpec
|
|
906
1021
|
|
907
1022
|
# @private
|
908
1023
|
if RUBY_VERSION.to_f >= 1.9
|
1024
|
+
# @private
|
909
1025
|
def safe_extend(mod, host)
|
910
1026
|
host.extend(mod) unless host.singleton_class < mod
|
911
1027
|
end
|
912
1028
|
else
|
1029
|
+
# @private
|
913
1030
|
def safe_extend(mod, host)
|
914
1031
|
host.extend(mod) unless (class << host; self; end).included_modules.include?(mod)
|
915
1032
|
end
|
@@ -918,6 +1035,7 @@ module RSpec
|
|
918
1035
|
# @private
|
919
1036
|
def configure_mock_framework
|
920
1037
|
RSpec::Core::ExampleGroup.__send__(:include, mock_framework)
|
1038
|
+
conditionally_disable_mocks_monkey_patching
|
921
1039
|
end
|
922
1040
|
|
923
1041
|
# @private
|
@@ -925,6 +1043,7 @@ module RSpec
|
|
925
1043
|
expectation_frameworks.each do |framework|
|
926
1044
|
RSpec::Core::ExampleGroup.__send__(:include, framework)
|
927
1045
|
end
|
1046
|
+
conditionally_disable_expectations_monkey_patching
|
928
1047
|
end
|
929
1048
|
|
930
1049
|
# @private
|
@@ -1015,11 +1134,12 @@ module RSpec
|
|
1015
1134
|
delegate_to_ordering_manager :seed_used?, :ordering_registry
|
1016
1135
|
|
1017
1136
|
# Set Ruby warnings on or off
|
1018
|
-
def warnings=
|
1137
|
+
def warnings=(value)
|
1019
1138
|
$VERBOSE = !!value
|
1020
1139
|
end
|
1021
1140
|
|
1022
|
-
|
1141
|
+
# @return [Boolean] Whether or not ruby warnings are enabled.
|
1142
|
+
def warnings?
|
1023
1143
|
$VERBOSE
|
1024
1144
|
end
|
1025
1145
|
|
@@ -1046,7 +1166,7 @@ module RSpec
|
|
1046
1166
|
# end
|
1047
1167
|
# end
|
1048
1168
|
def expose_current_running_example_as(method_name)
|
1049
|
-
ExposeCurrentExample.
|
1169
|
+
ExposeCurrentExample.module_exec do
|
1050
1170
|
extend RSpec::SharedContext
|
1051
1171
|
let(method_name) { |ex| ex }
|
1052
1172
|
end
|
@@ -1054,6 +1174,7 @@ module RSpec
|
|
1054
1174
|
include ExposeCurrentExample
|
1055
1175
|
end
|
1056
1176
|
|
1177
|
+
# @private
|
1057
1178
|
module ExposeCurrentExample; end
|
1058
1179
|
|
1059
1180
|
# Turns deprecation warnings into errors, in order to surface
|
@@ -1070,6 +1191,78 @@ module RSpec
|
|
1070
1191
|
self.deprecation_stream = Formatters::DeprecationFormatter::RaiseErrorStream.new
|
1071
1192
|
end
|
1072
1193
|
|
1194
|
+
# Enables zero monkey patching mode for RSpec. It removes monkey
|
1195
|
+
# patching of the top-level DSL methods (`describe`,
|
1196
|
+
# `shared_examples_for`, etc) onto `main` and `Module`, instead
|
1197
|
+
# requiring you to prefix these methods with `RSpec.`. It enables
|
1198
|
+
# expect-only syntax for rspec-mocks and rspec-expectations. It
|
1199
|
+
# simply disables monkey patching on whatever pieces of rspec
|
1200
|
+
# the user is using.
|
1201
|
+
#
|
1202
|
+
# @note It configures rspec-mocks and rspec-expectations only
|
1203
|
+
# if the user is using those (either explicitly or implicitly
|
1204
|
+
# by not setting `mock_with` or `expect_with` to anything else).
|
1205
|
+
#
|
1206
|
+
# @note If the user uses this options with `mock_with :mocha`
|
1207
|
+
# (or similiar) they will still have monkey patching active
|
1208
|
+
# in their test environment from mocha.
|
1209
|
+
#
|
1210
|
+
# @example
|
1211
|
+
#
|
1212
|
+
# # It disables all monkey patching
|
1213
|
+
# RSpec.configure do |config|
|
1214
|
+
# config.disable_monkey_patching!
|
1215
|
+
# end
|
1216
|
+
#
|
1217
|
+
# # Is an equivalent to
|
1218
|
+
# RSpec.configure do |config|
|
1219
|
+
# config.expose_dsl_globally = false
|
1220
|
+
#
|
1221
|
+
# config.mock_with :rspec do |mocks|
|
1222
|
+
# mocks.syntax = :expect
|
1223
|
+
# mocks.patch_marshal_to_support_partial_doubles = false
|
1224
|
+
# end
|
1225
|
+
#
|
1226
|
+
# config.mock_with :rspec do |expectations|
|
1227
|
+
# expectations.syntax = :expect
|
1228
|
+
# end
|
1229
|
+
# end
|
1230
|
+
def disable_monkey_patching!
|
1231
|
+
self.expose_dsl_globally = false
|
1232
|
+
self.disable_monkey_patching = true
|
1233
|
+
conditionally_disable_mocks_monkey_patching
|
1234
|
+
conditionally_disable_expectations_monkey_patching
|
1235
|
+
end
|
1236
|
+
|
1237
|
+
# @private
|
1238
|
+
attr_accessor :disable_monkey_patching
|
1239
|
+
|
1240
|
+
# Defines a callback that can assign derived metadata values.
|
1241
|
+
#
|
1242
|
+
# @param filters [Array<Symbol>, Hash] metadata filters that determine which example
|
1243
|
+
# or group metadata hashes the callback will be triggered for. If none are given,
|
1244
|
+
# the callback will be run against the metadata hashes of all groups and examples.
|
1245
|
+
# @yieldparam metadata [Hash] original metadata hash from an example or group. Mutate this in
|
1246
|
+
# your block as needed.
|
1247
|
+
#
|
1248
|
+
# @example
|
1249
|
+
# RSpec.configure do |config|
|
1250
|
+
# # Tag all groups and examples in the spec/unit directory with :type => :unit
|
1251
|
+
# config.define_derived_metadata(:file_path => %r{/spec/unit/}) do |metadata|
|
1252
|
+
# metadata[:type] = :unit
|
1253
|
+
# end
|
1254
|
+
# end
|
1255
|
+
def define_derived_metadata(*filters, &block)
|
1256
|
+
@derived_metadata_blocks << [Metadata.build_hash_from(filters), block]
|
1257
|
+
end
|
1258
|
+
|
1259
|
+
# @private
|
1260
|
+
def apply_derived_metadata_to(metadata)
|
1261
|
+
@derived_metadata_blocks.each do |filter, block|
|
1262
|
+
block.call(metadata) if filter.empty? || MetadataFilter.any_apply?(filter, metadata)
|
1263
|
+
end
|
1264
|
+
end
|
1265
|
+
|
1073
1266
|
private
|
1074
1267
|
|
1075
1268
|
def get_files_to_run(paths)
|
@@ -1113,6 +1306,29 @@ module RSpec
|
|
1113
1306
|
def output_to_tty?(output=output_stream)
|
1114
1307
|
tty? || (output.respond_to?(:tty?) && output.tty?)
|
1115
1308
|
end
|
1309
|
+
|
1310
|
+
def conditionally_disable_mocks_monkey_patching
|
1311
|
+
return unless disable_monkey_patching && rspec_mocks_loaded?
|
1312
|
+
|
1313
|
+
RSpec::Mocks.configuration.tap do |config|
|
1314
|
+
config.syntax = :expect
|
1315
|
+
config.patch_marshal_to_support_partial_doubles = false
|
1316
|
+
end
|
1317
|
+
end
|
1318
|
+
|
1319
|
+
def conditionally_disable_expectations_monkey_patching
|
1320
|
+
return unless disable_monkey_patching && rspec_expectations_loaded?
|
1321
|
+
|
1322
|
+
RSpec::Expectations.configuration.syntax = :expect
|
1323
|
+
end
|
1324
|
+
|
1325
|
+
def rspec_mocks_loaded?
|
1326
|
+
defined?(RSpec::Mocks.configuration)
|
1327
|
+
end
|
1328
|
+
|
1329
|
+
def rspec_expectations_loaded?
|
1330
|
+
defined?(RSpec::Expectations.configuration)
|
1331
|
+
end
|
1116
1332
|
end
|
1117
1333
|
end
|
1118
1334
|
end
|