rspec-core 3.2.3 → 3.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/Changelog.md +75 -0
- data/README.md +137 -20
- data/lib/rspec/autorun.rb +1 -0
- data/lib/rspec/core.rb +8 -16
- data/lib/rspec/core/backtrace_formatter.rb +1 -3
- data/lib/rspec/core/bisect/coordinator.rb +66 -0
- data/lib/rspec/core/bisect/example_minimizer.rb +130 -0
- data/lib/rspec/core/bisect/runner.rb +139 -0
- data/lib/rspec/core/bisect/server.rb +61 -0
- data/lib/rspec/core/bisect/subset_enumerator.rb +39 -0
- data/lib/rspec/core/configuration.rb +134 -5
- data/lib/rspec/core/configuration_options.rb +21 -10
- data/lib/rspec/core/example.rb +84 -50
- data/lib/rspec/core/example_group.rb +46 -18
- data/lib/rspec/core/example_status_persister.rb +235 -0
- data/lib/rspec/core/filter_manager.rb +43 -28
- data/lib/rspec/core/flat_map.rb +2 -0
- data/lib/rspec/core/formatters.rb +30 -20
- data/lib/rspec/core/formatters/base_text_formatter.rb +1 -0
- data/lib/rspec/core/formatters/bisect_formatter.rb +68 -0
- data/lib/rspec/core/formatters/bisect_progress_formatter.rb +115 -0
- data/lib/rspec/core/formatters/deprecation_formatter.rb +0 -1
- data/lib/rspec/core/formatters/documentation_formatter.rb +0 -4
- data/lib/rspec/core/formatters/exception_presenter.rb +389 -0
- data/lib/rspec/core/formatters/fallback_message_formatter.rb +28 -0
- data/lib/rspec/core/formatters/helpers.rb +22 -2
- data/lib/rspec/core/formatters/html_formatter.rb +1 -4
- data/lib/rspec/core/formatters/html_printer.rb +2 -6
- data/lib/rspec/core/formatters/json_formatter.rb +6 -4
- data/lib/rspec/core/formatters/snippet_extractor.rb +12 -7
- data/lib/rspec/core/hooks.rb +8 -2
- data/lib/rspec/core/memoized_helpers.rb +77 -17
- data/lib/rspec/core/metadata.rb +24 -10
- data/lib/rspec/core/metadata_filter.rb +16 -3
- data/lib/rspec/core/mutex.rb +63 -0
- data/lib/rspec/core/notifications.rb +84 -189
- data/lib/rspec/core/option_parser.rb +105 -32
- data/lib/rspec/core/ordering.rb +28 -25
- data/lib/rspec/core/profiler.rb +32 -0
- data/lib/rspec/core/project_initializer/spec/spec_helper.rb +6 -1
- data/lib/rspec/core/rake_task.rb +6 -20
- data/lib/rspec/core/reentrant_mutex.rb +52 -0
- data/lib/rspec/core/reporter.rb +65 -17
- data/lib/rspec/core/runner.rb +38 -14
- data/lib/rspec/core/set.rb +49 -0
- data/lib/rspec/core/shared_example_group.rb +3 -1
- data/lib/rspec/core/shell_escape.rb +49 -0
- data/lib/rspec/core/version.rb +1 -1
- data/lib/rspec/core/world.rb +31 -20
- metadata +35 -7
- metadata.gz.sig +0 -0
- data/lib/rspec/core/backport_random.rb +0 -339
@@ -0,0 +1,28 @@
|
|
1
|
+
module RSpec
|
2
|
+
module Core
|
3
|
+
module Formatters
|
4
|
+
# @api private
|
5
|
+
# Formatter for providing message output as a fallback when no other
|
6
|
+
# profiler implements #message
|
7
|
+
class FallbackMessageFormatter
|
8
|
+
Formatters.register self, :message
|
9
|
+
|
10
|
+
def initialize(output)
|
11
|
+
@output = output
|
12
|
+
end
|
13
|
+
|
14
|
+
# @private
|
15
|
+
attr_reader :output
|
16
|
+
|
17
|
+
# @api public
|
18
|
+
#
|
19
|
+
# Used by the reporter to send messages to the output stream.
|
20
|
+
#
|
21
|
+
# @param notification [MessageNotification] containing message
|
22
|
+
def message(notification)
|
23
|
+
output.puts notification.message
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
RSpec::Support.require_rspec_core "shell_escape"
|
2
|
+
|
1
3
|
module RSpec
|
2
4
|
module Core
|
3
5
|
module Formatters
|
@@ -65,11 +67,13 @@ module RSpec
|
|
65
67
|
#
|
66
68
|
# Remove trailing zeros from a string.
|
67
69
|
#
|
70
|
+
# Only remove trailing zeros after a decimal place.
|
71
|
+
# see: http://rubular.com/r/ojtTydOgpn
|
72
|
+
#
|
68
73
|
# @param string [String] string with trailing zeros
|
69
74
|
# @return [String] string with trailing zeros removed
|
70
75
|
def self.strip_trailing_zeroes(string)
|
71
|
-
|
72
|
-
stripped.empty? ? "0" : stripped
|
76
|
+
string.sub(/(?:(\..*[^0])0+|\.0+)$/, '\1')
|
73
77
|
end
|
74
78
|
private_class_method :strip_trailing_zeroes
|
75
79
|
|
@@ -83,6 +87,22 @@ module RSpec
|
|
83
87
|
def self.pluralize(count, string)
|
84
88
|
"#{count} #{string}#{'s' unless count.to_f == 1}"
|
85
89
|
end
|
90
|
+
|
91
|
+
# @api private
|
92
|
+
# Given a list of example ids, organizes them into a compact, ordered list.
|
93
|
+
def self.organize_ids(ids)
|
94
|
+
grouped = ids.inject(Hash.new { |h, k| h[k] = [] }) do |hash, id|
|
95
|
+
file, id = id.split(Configuration::ON_SQUARE_BRACKETS)
|
96
|
+
hash[file] << id
|
97
|
+
hash
|
98
|
+
end
|
99
|
+
|
100
|
+
grouped.sort_by(&:first).map do |file, grouped_ids|
|
101
|
+
grouped_ids = grouped_ids.sort_by { |id| id.split(':').map(&:to_i) }
|
102
|
+
id = Metadata.id_from(:rerun_file_path => file, :scoped_id => grouped_ids.join(','))
|
103
|
+
ShellEscape.conditionally_quote(id)
|
104
|
+
end
|
105
|
+
end
|
86
106
|
end
|
87
107
|
end
|
88
108
|
end
|
@@ -74,8 +74,6 @@ module RSpec
|
|
74
74
|
:message => exception.message,
|
75
75
|
:backtrace => failure.formatted_backtrace.join("\n")
|
76
76
|
}
|
77
|
-
else
|
78
|
-
false
|
79
77
|
end
|
80
78
|
extra = extra_failure_content(failure)
|
81
79
|
|
@@ -85,8 +83,7 @@ module RSpec
|
|
85
83
|
example.execution_result.run_time,
|
86
84
|
@failed_examples.size,
|
87
85
|
exception_details,
|
88
|
-
(extra == "") ? false : extra
|
89
|
-
true
|
86
|
+
(extra == "") ? false : extra
|
90
87
|
)
|
91
88
|
@printer.flush
|
92
89
|
end
|
@@ -35,7 +35,7 @@ module RSpec
|
|
35
35
|
|
36
36
|
# rubocop:disable Style/ParameterLists
|
37
37
|
def print_example_failed(pending_fixed, description, run_time, failure_id,
|
38
|
-
exception, extra_content
|
38
|
+
exception, extra_content)
|
39
39
|
# rubocop:enable Style/ParameterLists
|
40
40
|
formatted_run_time = "%.5f" % run_time
|
41
41
|
|
@@ -45,11 +45,7 @@ module RSpec
|
|
45
45
|
@output.puts " <div class=\"failure\" id=\"failure_#{failure_id}\">"
|
46
46
|
if exception
|
47
47
|
@output.puts " <div class=\"message\"><pre>#{h(exception[:message])}</pre></div>"
|
48
|
-
|
49
|
-
@output.puts " <div class=\"backtrace\"><pre>#{h exception[:backtrace]}</pre></div>"
|
50
|
-
else
|
51
|
-
@output.puts " <div class=\"backtrace\"><pre>#{exception[:backtrace]}</pre></div>"
|
52
|
-
end
|
48
|
+
@output.puts " <div class=\"backtrace\"><pre>#{h exception[:backtrace]}</pre></div>"
|
53
49
|
end
|
54
50
|
@output.puts extra_content if extra_content
|
55
51
|
@output.puts " </div>"
|
@@ -12,7 +12,9 @@ module RSpec
|
|
12
12
|
|
13
13
|
def initialize(output)
|
14
14
|
super
|
15
|
-
@output_hash = {
|
15
|
+
@output_hash = {
|
16
|
+
:version => RSpec::Core::Version::STRING
|
17
|
+
}
|
16
18
|
end
|
17
19
|
|
18
20
|
def message(notification)
|
@@ -58,8 +60,7 @@ module RSpec
|
|
58
60
|
# @api private
|
59
61
|
def dump_profile_slowest_examples(profile)
|
60
62
|
@output_hash[:profile] = {}
|
61
|
-
|
62
|
-
@output_hash[:profile][:examples] = sorted_examples.map do |example|
|
63
|
+
@output_hash[:profile][:examples] = profile.slowest_examples.map do |example|
|
63
64
|
format_example(example).tap do |hash|
|
64
65
|
hash[:run_time] = example.execution_result.run_time
|
65
66
|
end
|
@@ -85,7 +86,8 @@ module RSpec
|
|
85
86
|
:status => example.execution_result.status.to_s,
|
86
87
|
:file_path => example.metadata[:file_path],
|
87
88
|
:line_number => example.metadata[:line_number],
|
88
|
-
:run_time => example.execution_result.run_time
|
89
|
+
:run_time => example.execution_result.run_time,
|
90
|
+
:pending_message => example.execution_result.pending_message,
|
89
91
|
}
|
90
92
|
end
|
91
93
|
end
|
@@ -7,26 +7,30 @@ module RSpec
|
|
7
7
|
# and applies synax highlighting and line numbers using html.
|
8
8
|
class SnippetExtractor
|
9
9
|
# @private
|
10
|
-
|
11
|
-
def convert(code)
|
10
|
+
module NullConverter
|
11
|
+
def self.convert(code)
|
12
12
|
%Q(#{code}\n<span class="comment"># Install the coderay gem to get syntax highlighting</span>)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
# @private
|
17
|
-
|
18
|
-
def convert(code)
|
17
|
+
module CoderayConverter
|
18
|
+
def self.convert(code)
|
19
19
|
CodeRay.scan(code, :ruby).html(:line_numbers => false)
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
+
# rubocop:disable Style/ClassVars
|
24
|
+
@@converter = NullConverter
|
23
25
|
begin
|
24
26
|
require 'coderay'
|
25
|
-
|
26
|
-
|
27
|
+
@@converter = CoderayConverter
|
28
|
+
# rubocop:disable Lint/HandleExceptions
|
27
29
|
rescue LoadError
|
28
|
-
|
30
|
+
# it'll fall back to the NullConverter assigned above
|
31
|
+
# rubocop:enable Lint/HandleExceptions
|
29
32
|
end
|
33
|
+
|
30
34
|
# rubocop:enable Style/ClassVars
|
31
35
|
|
32
36
|
# @api private
|
@@ -43,6 +47,7 @@ module RSpec
|
|
43
47
|
highlighted = @@converter.convert(raw_code)
|
44
48
|
post_process(highlighted, line)
|
45
49
|
end
|
50
|
+
# rubocop:enable Style/ClassVars
|
46
51
|
|
47
52
|
# @api private
|
48
53
|
#
|
data/lib/rspec/core/hooks.rb
CHANGED
@@ -361,7 +361,9 @@ module RSpec
|
|
361
361
|
# @private
|
362
362
|
class AfterHook < Hook
|
363
363
|
def run(example)
|
364
|
-
example.
|
364
|
+
example.instance_exec(example, &block)
|
365
|
+
rescue Exception => ex
|
366
|
+
example.set_exception(ex)
|
365
367
|
end
|
366
368
|
end
|
367
369
|
|
@@ -394,10 +396,12 @@ EOS
|
|
394
396
|
def hook_description
|
395
397
|
"around hook at #{Metadata.relative_path(block.source_location.join(':'))}"
|
396
398
|
end
|
397
|
-
else
|
399
|
+
else # for 1.8.7
|
400
|
+
# :nocov:
|
398
401
|
def hook_description
|
399
402
|
"around hook"
|
400
403
|
end
|
404
|
+
# :nocov:
|
401
405
|
end
|
402
406
|
end
|
403
407
|
|
@@ -622,9 +626,11 @@ EOS
|
|
622
626
|
@owner.parent_groups
|
623
627
|
end
|
624
628
|
else # Ruby < 2.1 (see https://bugs.ruby-lang.org/issues/8035)
|
629
|
+
# :nocov:
|
625
630
|
def owner_parent_groups
|
626
631
|
@owner_parent_groups ||= [@owner] + @owner.parent_groups
|
627
632
|
end
|
633
|
+
# :nocov:
|
628
634
|
end
|
629
635
|
end
|
630
636
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'rspec/core/reentrant_mutex'
|
2
|
+
|
1
3
|
module RSpec
|
2
4
|
module Core
|
3
5
|
# This module is included in {ExampleGroup}, making the methods
|
@@ -53,11 +55,9 @@ module RSpec
|
|
53
55
|
# @see #should_not
|
54
56
|
# @see #is_expected
|
55
57
|
def subject
|
56
|
-
__memoized.
|
57
|
-
|
58
|
-
|
59
|
-
Class === described ? described.new : described
|
60
|
-
end
|
58
|
+
__memoized.fetch_or_store(:subject) do
|
59
|
+
described = described_class || self.class.metadata.fetch(:description_args).first
|
60
|
+
Class === described ? described.new : described
|
61
61
|
end
|
62
62
|
end
|
63
63
|
|
@@ -119,33 +119,85 @@ module RSpec
|
|
119
119
|
expect(subject)
|
120
120
|
end
|
121
121
|
|
122
|
+
# @private
|
123
|
+
# should just be placed in private section,
|
124
|
+
# but Ruby issues warnings on private attributes.
|
125
|
+
# and expanding it to the equivalent method upsets Rubocop,
|
126
|
+
# b/c it should obviously be a reader
|
127
|
+
attr_reader :__memoized
|
128
|
+
private :__memoized
|
129
|
+
|
122
130
|
private
|
123
131
|
|
124
132
|
# @private
|
125
|
-
def
|
126
|
-
|
133
|
+
def initialize(*)
|
134
|
+
__init_memoized
|
135
|
+
super
|
136
|
+
end
|
137
|
+
|
138
|
+
# @private
|
139
|
+
def __init_memoized
|
140
|
+
@__memoized = if RSpec.configuration.threadsafe?
|
141
|
+
ThreadsafeMemoized.new
|
142
|
+
else
|
143
|
+
NonThreadSafeMemoized.new
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
# @private
|
148
|
+
class ThreadsafeMemoized
|
149
|
+
def initialize
|
150
|
+
@memoized = {}
|
151
|
+
@mutex = ReentrantMutex.new
|
152
|
+
end
|
153
|
+
|
154
|
+
def fetch_or_store(key)
|
155
|
+
@memoized.fetch(key) do # only first access pays for synchronization
|
156
|
+
@mutex.synchronize do
|
157
|
+
@memoized.fetch(key) { @memoized[key] = yield }
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
# @private
|
164
|
+
class NonThreadSafeMemoized
|
165
|
+
def initialize
|
166
|
+
@memoized = {}
|
167
|
+
end
|
168
|
+
|
169
|
+
def fetch_or_store(key)
|
170
|
+
@memoized.fetch(key) { @memoized[key] = yield }
|
171
|
+
end
|
127
172
|
end
|
128
173
|
|
129
174
|
# Used internally to customize the behavior of the
|
130
175
|
# memoized hash when used in a `before(:context)` hook.
|
131
176
|
#
|
132
177
|
# @private
|
133
|
-
class
|
178
|
+
class ContextHookMemoized
|
134
179
|
def self.isolate_for_context_hook(example_group_instance)
|
135
|
-
|
180
|
+
exploding_memoized = self
|
136
181
|
|
137
182
|
example_group_instance.instance_exec do
|
138
|
-
@__memoized =
|
183
|
+
@__memoized = exploding_memoized
|
139
184
|
|
140
185
|
begin
|
141
186
|
yield
|
142
187
|
ensure
|
143
|
-
|
188
|
+
# This is doing a reset instead of just isolating for context hook.
|
189
|
+
# Really, this should set the old @__memoized back into place.
|
190
|
+
#
|
191
|
+
# Caller is the before and after context hooks
|
192
|
+
# which are both called from self.run
|
193
|
+
# I didn't look at why it made tests fail, maybe an object was getting reused in RSpec tests,
|
194
|
+
# if so, then that probably already works, and its the tests that are wrong.
|
195
|
+
__init_memoized
|
144
196
|
end
|
145
197
|
end
|
146
198
|
end
|
147
199
|
|
148
|
-
def self.
|
200
|
+
def self.fetch_or_store(key, &_block)
|
149
201
|
description = if key == :subject
|
150
202
|
"subject"
|
151
203
|
else
|
@@ -206,9 +258,10 @@ EOS
|
|
206
258
|
# maybe 3 declarations) in any given example group, but that can
|
207
259
|
# quickly degrade with overuse. YMMV.
|
208
260
|
#
|
209
|
-
# @note `let`
|
210
|
-
#
|
211
|
-
#
|
261
|
+
# @note `let` can be configured to be threadsafe or not.
|
262
|
+
# If it is threadsafe, it will take longer to access the value.
|
263
|
+
# If it is not threadsafe, it may behave in surprising ways in examples
|
264
|
+
# that spawn separate threads. Specify this on `RSpec.configure`
|
212
265
|
#
|
213
266
|
# @note Because `let` is designed to create state that is reset between
|
214
267
|
# each example, and `before(:context)` is designed to setup state that
|
@@ -237,9 +290,9 @@ EOS
|
|
237
290
|
# Apply the memoization. The method has been defined in an ancestor
|
238
291
|
# module so we can use `super` here to get the value.
|
239
292
|
if block.arity == 1
|
240
|
-
define_method(name) { __memoized.
|
293
|
+
define_method(name) { __memoized.fetch_or_store(name) { super(RSpec.current_example, &nil) } }
|
241
294
|
else
|
242
|
-
define_method(name) { __memoized.
|
295
|
+
define_method(name) { __memoized.fetch_or_store(name) { super(&nil) } }
|
243
296
|
end
|
244
297
|
end
|
245
298
|
|
@@ -312,6 +365,11 @@ EOS
|
|
312
365
|
#
|
313
366
|
# When given a `name`, calling `super` in the block is not supported.
|
314
367
|
#
|
368
|
+
# @note `subject` can be configured to be threadsafe or not.
|
369
|
+
# If it is threadsafe, it will take longer to access the value.
|
370
|
+
# If it is not threadsafe, it may behave in surprising ways in examples
|
371
|
+
# that spawn separate threads. Specify this on `RSpec.configure`
|
372
|
+
#
|
315
373
|
# @param name [String,Symbol] used to define an accessor with an
|
316
374
|
# intention revealing name
|
317
375
|
# @param block defines the value to be returned by `subject` in examples
|
@@ -443,6 +501,7 @@ EOS
|
|
443
501
|
# Gets the named constant or yields.
|
444
502
|
# On 1.8, const_defined? / const_get do not take into
|
445
503
|
# account the inheritance hierarchy.
|
504
|
+
# :nocov:
|
446
505
|
def self.get_constant_or_yield(example_group, name)
|
447
506
|
if example_group.const_defined?(name)
|
448
507
|
example_group.const_get(name)
|
@@ -450,6 +509,7 @@ EOS
|
|
450
509
|
yield
|
451
510
|
end
|
452
511
|
end
|
512
|
+
# :nocov:
|
453
513
|
else
|
454
514
|
# @private
|
455
515
|
#
|
data/lib/rspec/core/metadata.rb
CHANGED
@@ -100,9 +100,8 @@ module RSpec
|
|
100
100
|
end
|
101
101
|
|
102
102
|
# @private
|
103
|
-
def self.
|
104
|
-
|
105
|
-
[block.source_location.join(':')]
|
103
|
+
def self.id_from(metadata)
|
104
|
+
"#{metadata[:rerun_file_path]}[#{metadata[:scoped_id]}]"
|
106
105
|
end
|
107
106
|
|
108
107
|
# @private
|
@@ -111,9 +110,10 @@ module RSpec
|
|
111
110
|
class HashPopulator
|
112
111
|
attr_reader :metadata, :user_metadata, :description_args, :block
|
113
112
|
|
114
|
-
def initialize(metadata, user_metadata, description_args, block)
|
113
|
+
def initialize(metadata, user_metadata, index_provider, description_args, block)
|
115
114
|
@metadata = metadata
|
116
115
|
@user_metadata = user_metadata
|
116
|
+
@index_provider = index_provider
|
117
117
|
@description_args = description_args
|
118
118
|
@block = block
|
119
119
|
end
|
@@ -151,6 +151,8 @@ module RSpec
|
|
151
151
|
metadata[:line_number] = line_number.to_i
|
152
152
|
metadata[:location] = "#{relative_file_path}:#{line_number}"
|
153
153
|
metadata[:absolute_file_path] = File.expand_path(relative_file_path)
|
154
|
+
metadata[:rerun_file_path] ||= relative_file_path
|
155
|
+
metadata[:scoped_id] = build_scoped_id_for(relative_file_path)
|
154
156
|
end
|
155
157
|
|
156
158
|
def file_path_and_line_number_from(backtrace)
|
@@ -173,6 +175,12 @@ module RSpec
|
|
173
175
|
(parent_description.to_s + separator) << my_description.to_s
|
174
176
|
end
|
175
177
|
|
178
|
+
def build_scoped_id_for(file_path)
|
179
|
+
index = @index_provider.call(file_path).to_s
|
180
|
+
parent_scoped_id = metadata.fetch(:scoped_id) { return index }
|
181
|
+
"#{parent_scoped_id}:#{index}"
|
182
|
+
end
|
183
|
+
|
176
184
|
def ensure_valid_user_keys
|
177
185
|
RESERVED_KEYS.each do |key|
|
178
186
|
next unless user_metadata.key?(key)
|
@@ -196,7 +204,7 @@ module RSpec
|
|
196
204
|
|
197
205
|
# @private
|
198
206
|
class ExampleHash < HashPopulator
|
199
|
-
def self.create(group_metadata, user_metadata, description, block)
|
207
|
+
def self.create(group_metadata, user_metadata, index_provider, description, block)
|
200
208
|
example_metadata = group_metadata.dup
|
201
209
|
group_metadata = Hash.new(&ExampleGroupHash.backwards_compatibility_default_proc do |hash|
|
202
210
|
hash[:parent_example_group]
|
@@ -208,7 +216,7 @@ module RSpec
|
|
208
216
|
example_metadata.delete(:parent_example_group)
|
209
217
|
|
210
218
|
description_args = description.nil? ? [] : [description]
|
211
|
-
hash = new(example_metadata, user_metadata, description_args, block)
|
219
|
+
hash = new(example_metadata, user_metadata, index_provider, description_args, block)
|
212
220
|
hash.populate
|
213
221
|
hash.metadata
|
214
222
|
end
|
@@ -229,7 +237,7 @@ module RSpec
|
|
229
237
|
|
230
238
|
# @private
|
231
239
|
class ExampleGroupHash < HashPopulator
|
232
|
-
def self.create(parent_group_metadata, user_metadata, *args, &block)
|
240
|
+
def self.create(parent_group_metadata, user_metadata, example_group_index, *args, &block)
|
233
241
|
group_metadata = hash_with_backwards_compatibility_default_proc
|
234
242
|
|
235
243
|
if parent_group_metadata
|
@@ -237,7 +245,7 @@ module RSpec
|
|
237
245
|
group_metadata[:parent_example_group] = parent_group_metadata
|
238
246
|
end
|
239
247
|
|
240
|
-
hash = new(group_metadata, user_metadata, args, block)
|
248
|
+
hash = new(group_metadata, user_metadata, example_group_index, args, block)
|
241
249
|
hash.populate
|
242
250
|
hash.metadata
|
243
251
|
end
|
@@ -262,7 +270,7 @@ module RSpec
|
|
262
270
|
# that take a metadata hash, and MetadataFilter sets this thread
|
263
271
|
# local to silence the warning here since it would be so
|
264
272
|
# confusing.
|
265
|
-
unless RSpec.
|
273
|
+
unless RSpec::Support.thread_local_data[:silence_metadata_example_group_deprecations]
|
266
274
|
RSpec.deprecate("The `:example_group` key in an example group's metadata hash",
|
267
275
|
:replacement => "the example group's hash directly for the " \
|
268
276
|
"computed keys and `:parent_example_group` to access the parent " \
|
@@ -308,15 +316,21 @@ module RSpec
|
|
308
316
|
# @private
|
309
317
|
RESERVED_KEYS = [
|
310
318
|
:description,
|
319
|
+
:description_args,
|
320
|
+
:described_class,
|
311
321
|
:example_group,
|
312
322
|
:parent_example_group,
|
313
323
|
:execution_result,
|
324
|
+
:last_run_status,
|
314
325
|
:file_path,
|
315
326
|
:absolute_file_path,
|
327
|
+
:rerun_file_path,
|
316
328
|
:full_description,
|
317
329
|
:line_number,
|
318
330
|
:location,
|
319
|
-
:
|
331
|
+
:scoped_id,
|
332
|
+
:block,
|
333
|
+
:shared_group_inclusion_backtrace
|
320
334
|
]
|
321
335
|
end
|
322
336
|
|