rspec-core 3.5.4 → 3.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/Changelog.md +165 -2
- data/README.md +16 -16
- data/lib/rspec/core.rb +2 -1
- data/lib/rspec/core/bisect/coordinator.rb +26 -30
- data/lib/rspec/core/bisect/example_minimizer.rb +12 -8
- data/lib/rspec/core/bisect/fork_runner.rb +134 -0
- data/lib/rspec/core/bisect/server.rb +10 -14
- data/lib/rspec/core/bisect/{runner.rb → shell_command.rb} +27 -70
- data/lib/rspec/core/bisect/shell_runner.rb +73 -0
- data/lib/rspec/core/bisect/utilities.rb +58 -0
- data/lib/rspec/core/configuration.rb +315 -79
- data/lib/rspec/core/configuration_options.rb +43 -4
- data/lib/rspec/core/did_you_mean.rb +46 -0
- data/lib/rspec/core/drb.rb +3 -1
- data/lib/rspec/core/example.rb +19 -12
- data/lib/rspec/core/example_group.rb +17 -7
- data/lib/rspec/core/formatters.rb +28 -11
- data/lib/rspec/core/formatters/base_bisect_formatter.rb +45 -0
- data/lib/rspec/core/formatters/base_formatter.rb +1 -1
- data/lib/rspec/core/formatters/base_text_formatter.rb +3 -5
- data/lib/rspec/core/formatters/bisect_drb_formatter.rb +29 -0
- data/lib/rspec/core/formatters/bisect_progress_formatter.rb +29 -16
- data/lib/rspec/core/formatters/console_codes.rb +7 -4
- data/lib/rspec/core/formatters/deprecation_formatter.rb +9 -9
- data/lib/rspec/core/formatters/documentation_formatter.rb +37 -4
- data/lib/rspec/core/formatters/exception_presenter.rb +21 -4
- data/lib/rspec/core/formatters/failure_list_formatter.rb +23 -0
- data/lib/rspec/core/formatters/html_formatter.rb +4 -2
- data/lib/rspec/core/formatters/html_printer.rb +3 -3
- data/lib/rspec/core/formatters/html_snippet_extractor.rb +4 -0
- data/lib/rspec/core/formatters/json_formatter.rb +9 -3
- data/lib/rspec/core/formatters/progress_formatter.rb +1 -0
- data/lib/rspec/core/formatters/protocol.rb +43 -42
- data/lib/rspec/core/formatters/snippet_extractor.rb +1 -3
- data/lib/rspec/core/{source → formatters}/syntax_highlighter.rb +21 -1
- data/lib/rspec/core/hooks.rb +18 -10
- data/lib/rspec/core/invocations.rb +30 -10
- data/lib/rspec/core/memoized_helpers.rb +36 -14
- data/lib/rspec/core/metadata.rb +2 -3
- data/lib/rspec/core/metadata_filter.rb +29 -17
- data/lib/rspec/core/notifications.rb +34 -11
- data/lib/rspec/core/option_parser.rb +32 -4
- data/lib/rspec/core/output_wrapper.rb +29 -0
- data/lib/rspec/core/profiler.rb +3 -1
- data/lib/rspec/core/project_initializer/.rspec +0 -1
- data/lib/rspec/core/project_initializer/spec/spec_helper.rb +1 -4
- data/lib/rspec/core/rake_task.rb +21 -1
- data/lib/rspec/core/reporter.rb +33 -16
- data/lib/rspec/core/runner.rb +31 -15
- data/lib/rspec/core/set.rb +5 -0
- data/lib/rspec/core/shared_example_group.rb +41 -19
- data/lib/rspec/core/shell_escape.rb +2 -2
- data/lib/rspec/core/version.rb +1 -1
- data/lib/rspec/core/world.rb +24 -5
- metadata +26 -20
- metadata.gz.sig +0 -0
- data/lib/rspec/core/formatters/bisect_formatter.rb +0 -69
- data/lib/rspec/core/source.rb +0 -86
- data/lib/rspec/core/source/location.rb +0 -13
- data/lib/rspec/core/source/node.rb +0 -93
- data/lib/rspec/core/source/token.rb +0 -87
@@ -10,7 +10,7 @@ module RSpec
|
|
10
10
|
# @note `subject` was contributed by Joe Ferris to support the one-liner
|
11
11
|
# syntax embraced by shoulda matchers:
|
12
12
|
#
|
13
|
-
# describe Widget do
|
13
|
+
# RSpec.describe Widget do
|
14
14
|
# it { is_expected.to validate_presence_of(:name) }
|
15
15
|
# # or
|
16
16
|
# it { should validate_presence_of(:name) }
|
@@ -23,7 +23,7 @@ module RSpec
|
|
23
23
|
# @example
|
24
24
|
#
|
25
25
|
# # Explicit declaration of subject.
|
26
|
-
# describe Person do
|
26
|
+
# RSpec.describe Person do
|
27
27
|
# subject { Person.new(:birthdate => 19.years.ago) }
|
28
28
|
# it "should be eligible to vote" do
|
29
29
|
# subject.should be_eligible_to_vote
|
@@ -32,7 +32,7 @@ module RSpec
|
|
32
32
|
# end
|
33
33
|
#
|
34
34
|
# # Implicit subject => { Person.new }.
|
35
|
-
# describe Person do
|
35
|
+
# RSpec.describe Person do
|
36
36
|
# it "should be eligible to vote" do
|
37
37
|
# subject.should be_eligible_to_vote
|
38
38
|
# # ^ ^ explicit reference to subject not recommended
|
@@ -40,7 +40,7 @@ module RSpec
|
|
40
40
|
# end
|
41
41
|
#
|
42
42
|
# # One-liner syntax - expectation is set on the subject.
|
43
|
-
# describe Person do
|
43
|
+
# RSpec.describe Person do
|
44
44
|
# it { is_expected.to be_eligible_to_vote }
|
45
45
|
# # or
|
46
46
|
# it { should be_eligible_to_vote }
|
@@ -67,7 +67,7 @@ module RSpec
|
|
67
67
|
#
|
68
68
|
# @example
|
69
69
|
#
|
70
|
-
# describe Person do
|
70
|
+
# RSpec.describe Person do
|
71
71
|
# it { should be_eligible_to_vote }
|
72
72
|
# end
|
73
73
|
#
|
@@ -86,7 +86,7 @@ module RSpec
|
|
86
86
|
#
|
87
87
|
# @example
|
88
88
|
#
|
89
|
-
# describe Person do
|
89
|
+
# RSpec.describe Person do
|
90
90
|
# it { should_not be_eligible_to_vote }
|
91
91
|
# end
|
92
92
|
#
|
@@ -270,7 +270,7 @@ EOS
|
|
270
270
|
#
|
271
271
|
# @example
|
272
272
|
#
|
273
|
-
# describe Thing do
|
273
|
+
# RSpec.describe Thing do
|
274
274
|
# let(:thing) { Thing.new }
|
275
275
|
#
|
276
276
|
# it "does something" do
|
@@ -285,7 +285,29 @@ EOS
|
|
285
285
|
# We have to pass the block directly to `define_method` to
|
286
286
|
# allow it to use method constructs like `super` and `return`.
|
287
287
|
raise "#let or #subject called without a block" if block.nil?
|
288
|
-
|
288
|
+
raise(
|
289
|
+
"#let or #subject called with a reserved name #initialize"
|
290
|
+
) if :initialize == name
|
291
|
+
our_module = MemoizedHelpers.module_for(self)
|
292
|
+
|
293
|
+
# If we have a module clash in our helper module
|
294
|
+
# then we need to remove it to prevent a warning.
|
295
|
+
#
|
296
|
+
# Note we do not check ancestor modules (see: `instance_methods(false)`)
|
297
|
+
# as we can override them.
|
298
|
+
if our_module.instance_methods(false).include?(name)
|
299
|
+
our_module.__send__(:remove_method, name)
|
300
|
+
end
|
301
|
+
our_module.__send__(:define_method, name, &block)
|
302
|
+
|
303
|
+
# If we have a module clash in the example module
|
304
|
+
# then we need to remove it to prevent a warning.
|
305
|
+
#
|
306
|
+
# Note we do not check ancestor modules (see: `instance_methods(false)`)
|
307
|
+
# as we can override them.
|
308
|
+
if instance_methods(false).include?(name)
|
309
|
+
remove_method(name)
|
310
|
+
end
|
289
311
|
|
290
312
|
# Apply the memoization. The method has been defined in an ancestor
|
291
313
|
# module so we can use `super` here to get the value.
|
@@ -320,7 +342,7 @@ EOS
|
|
320
342
|
# end
|
321
343
|
# end
|
322
344
|
#
|
323
|
-
# describe Thing do
|
345
|
+
# RSpec.describe Thing do
|
324
346
|
# after(:example) { Thing.reset_count }
|
325
347
|
#
|
326
348
|
# context "using let" do
|
@@ -376,13 +398,13 @@ EOS
|
|
376
398
|
#
|
377
399
|
# @example
|
378
400
|
#
|
379
|
-
# describe CheckingAccount, "with $50" do
|
401
|
+
# RSpec.describe CheckingAccount, "with $50" do
|
380
402
|
# subject { CheckingAccount.new(Money.new(50, :USD)) }
|
381
403
|
# it { is_expected.to have_a_balance_of(Money.new(50, :USD)) }
|
382
404
|
# it { is_expected.not_to be_overdrawn }
|
383
405
|
# end
|
384
406
|
#
|
385
|
-
# describe CheckingAccount, "with a non-zero starting balance" do
|
407
|
+
# RSpec.describe CheckingAccount, "with a non-zero starting balance" do
|
386
408
|
# subject(:account) { CheckingAccount.new(Money.new(50, :USD)) }
|
387
409
|
# it { is_expected.not_to be_overdrawn }
|
388
410
|
# it "has a balance equal to the starting balance" do
|
@@ -430,7 +452,7 @@ EOS
|
|
430
452
|
# end
|
431
453
|
# end
|
432
454
|
#
|
433
|
-
# describe Thing do
|
455
|
+
# RSpec.describe Thing do
|
434
456
|
# after(:example) { Thing.reset_count }
|
435
457
|
#
|
436
458
|
# context "using subject" do
|
@@ -480,9 +502,9 @@ EOS
|
|
480
502
|
def self.module_for(example_group)
|
481
503
|
get_constant_or_yield(example_group, :LetDefinitions) do
|
482
504
|
mod = Module.new do
|
483
|
-
include
|
505
|
+
include(Module.new {
|
484
506
|
example_group.const_set(:NamedSubjectPreventSuper, self)
|
485
|
-
}
|
507
|
+
})
|
486
508
|
end
|
487
509
|
|
488
510
|
example_group.const_set(:LetDefinitions, mod)
|
data/lib/rspec/core/metadata.rb
CHANGED
@@ -7,7 +7,7 @@ module RSpec
|
|
7
7
|
# In addition to metadata that is used internally, this also stores
|
8
8
|
# user-supplied metadata, e.g.
|
9
9
|
#
|
10
|
-
# describe Something, :type => :ui do
|
10
|
+
# RSpec.describe Something, :type => :ui do
|
11
11
|
# it "does something", :slow => true do
|
12
12
|
# # ...
|
13
13
|
# end
|
@@ -136,7 +136,6 @@ module RSpec
|
|
136
136
|
|
137
137
|
populate_location_attributes
|
138
138
|
metadata.update(user_metadata)
|
139
|
-
RSpec.configuration.apply_derived_metadata_to(metadata)
|
140
139
|
end
|
141
140
|
|
142
141
|
private
|
@@ -169,7 +168,7 @@ module RSpec
|
|
169
168
|
end
|
170
169
|
|
171
170
|
def description_separator(parent_part, child_part)
|
172
|
-
if parent_part.is_a?(Module) &&
|
171
|
+
if parent_part.is_a?(Module) && /^(?:#|::|\.)/.match(child_part.to_s)
|
173
172
|
''.freeze
|
174
173
|
else
|
175
174
|
' '.freeze
|
@@ -13,24 +13,19 @@ module RSpec
|
|
13
13
|
end
|
14
14
|
|
15
15
|
# @private
|
16
|
-
def filter_applies?(key,
|
16
|
+
def filter_applies?(key, filter_value, metadata)
|
17
17
|
silence_metadata_example_group_deprecations do
|
18
|
-
return location_filter_applies?(
|
19
|
-
return id_filter_applies?(
|
20
|
-
return filters_apply?(key,
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
return
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
when Proc
|
30
|
-
proc_filter_applies?(key, value, metadata)
|
31
|
-
else
|
32
|
-
metadata[key].to_s == value.to_s
|
33
|
-
end
|
18
|
+
return location_filter_applies?(filter_value, metadata) if key == :locations
|
19
|
+
return id_filter_applies?(filter_value, metadata) if key == :ids
|
20
|
+
return filters_apply?(key, filter_value, metadata) if Hash === filter_value
|
21
|
+
|
22
|
+
meta_value = metadata.fetch(key) { return false }
|
23
|
+
|
24
|
+
return true if TrueClass === filter_value && meta_value
|
25
|
+
return proc_filter_applies?(key, filter_value, metadata) if Proc === filter_value
|
26
|
+
return filter_applies_to_any_value?(key, filter_value, metadata) if Array === meta_value
|
27
|
+
|
28
|
+
filter_value === meta_value || filter_value.to_s == meta_value.to_s
|
34
29
|
end
|
35
30
|
end
|
36
31
|
|
@@ -116,6 +111,10 @@ module RSpec
|
|
116
111
|
@items_and_filters.unshift [item, metadata]
|
117
112
|
end
|
118
113
|
|
114
|
+
def delete(item, metadata)
|
115
|
+
@items_and_filters.delete [item, metadata]
|
116
|
+
end
|
117
|
+
|
119
118
|
def items_for(request_meta)
|
120
119
|
@items_and_filters.each_with_object([]) do |(item, item_meta), to_return|
|
121
120
|
to_return << item if item_meta.empty? ||
|
@@ -172,6 +171,11 @@ module RSpec
|
|
172
171
|
handle_mutation(metadata)
|
173
172
|
end
|
174
173
|
|
174
|
+
def delete(item, metadata)
|
175
|
+
super
|
176
|
+
reconstruct_caches
|
177
|
+
end
|
178
|
+
|
175
179
|
def items_for(metadata)
|
176
180
|
# The filtering of `metadata` to `applicable_metadata` is the key thing
|
177
181
|
# that makes the memoization actually useful in practice, since each
|
@@ -196,6 +200,14 @@ module RSpec
|
|
196
200
|
|
197
201
|
private
|
198
202
|
|
203
|
+
def reconstruct_caches
|
204
|
+
@applicable_keys.clear
|
205
|
+
@proc_keys.clear
|
206
|
+
@items_and_filters.each do |_item, metadata|
|
207
|
+
handle_mutation(metadata)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
199
211
|
def handle_mutation(metadata)
|
200
212
|
@applicable_keys.merge(metadata.keys)
|
201
213
|
@proc_keys.merge(proc_keys_from metadata)
|
@@ -1,3 +1,4 @@
|
|
1
|
+
RSpec::Support.require_rspec_core "formatters/console_codes"
|
1
2
|
RSpec::Support.require_rspec_core "formatters/exception_presenter"
|
2
3
|
RSpec::Support.require_rspec_core "formatters/helpers"
|
3
4
|
RSpec::Support.require_rspec_core "shell_escape"
|
@@ -110,7 +111,7 @@ module RSpec::Core
|
|
110
111
|
formatted = "\nFailures:\n"
|
111
112
|
|
112
113
|
failure_notifications.each_with_index do |failure, index|
|
113
|
-
formatted
|
114
|
+
formatted += failure.fully_formatted(index.next, colorizer)
|
114
115
|
end
|
115
116
|
|
116
117
|
formatted
|
@@ -119,7 +120,7 @@ module RSpec::Core
|
|
119
120
|
# @return [String] The list of pending examples, fully formatted in the
|
120
121
|
# way that RSpec's built-in formatters emit.
|
121
122
|
def fully_formatted_pending_examples(colorizer=::RSpec::Core::Formatters::ConsoleCodes)
|
122
|
-
formatted = "\nPending: (Failures listed here are expected and do not affect your suite's status)\n"
|
123
|
+
formatted = "\nPending: (Failures listed here are expected and do not affect your suite's status)\n".dup
|
123
124
|
|
124
125
|
pending_notifications.each_with_index do |notification, index|
|
125
126
|
formatted << notification.fully_formatted(index.next, colorizer)
|
@@ -199,6 +200,12 @@ module RSpec::Core
|
|
199
200
|
@exception_presenter.fully_formatted(failure_number, colorizer)
|
200
201
|
end
|
201
202
|
|
203
|
+
# @return [Array<string>] The failure information fully formatted in the way that
|
204
|
+
# RSpec's built-in formatters emit, split by line.
|
205
|
+
def fully_formatted_lines(failure_number, colorizer=::RSpec::Core::Formatters::ConsoleCodes)
|
206
|
+
@exception_presenter.fully_formatted_lines(failure_number, colorizer)
|
207
|
+
end
|
208
|
+
|
202
209
|
private
|
203
210
|
|
204
211
|
def initialize(example, exception_presenter=Formatters::ExceptionPresenter::Factory.new(example).build)
|
@@ -225,9 +232,14 @@ module RSpec::Core
|
|
225
232
|
# RSpec's built-in formatters emit.
|
226
233
|
def fully_formatted(pending_number, colorizer=::RSpec::Core::Formatters::ConsoleCodes)
|
227
234
|
formatted_caller = RSpec.configuration.backtrace_formatter.backtrace_line(example.location)
|
228
|
-
|
229
|
-
|
230
|
-
|
235
|
+
|
236
|
+
[
|
237
|
+
colorizer.wrap("\n #{pending_number}) #{example.full_description}", :pending),
|
238
|
+
"\n ",
|
239
|
+
Formatters::ExceptionPresenter::PENDING_DETAIL_FORMATTER.call(example, colorizer),
|
240
|
+
"\n",
|
241
|
+
colorizer.wrap(" # #{formatted_caller}\n", :detail)
|
242
|
+
].join("")
|
231
243
|
end
|
232
244
|
end
|
233
245
|
|
@@ -280,8 +292,12 @@ module RSpec::Core
|
|
280
292
|
# @attr pending_examples [Array<RSpec::Core::Example>] the pending examples
|
281
293
|
# @attr load_time [Float] the number of seconds taken to boot RSpec
|
282
294
|
# and load the spec files
|
295
|
+
# @attr errors_outside_of_examples_count [Integer] the number of errors that
|
296
|
+
# have occurred processing
|
297
|
+
# the spec suite
|
283
298
|
SummaryNotification = Struct.new(:duration, :examples, :failed_examples,
|
284
|
-
:pending_examples, :load_time
|
299
|
+
:pending_examples, :load_time,
|
300
|
+
:errors_outside_of_examples_count)
|
285
301
|
class SummaryNotification
|
286
302
|
# @api
|
287
303
|
# @return [Fixnum] the number of examples run
|
@@ -304,9 +320,16 @@ module RSpec::Core
|
|
304
320
|
# @api
|
305
321
|
# @return [String] A line summarising the result totals of the spec run.
|
306
322
|
def totals_line
|
307
|
-
summary = Formatters::Helpers.pluralize(example_count, "example")
|
308
|
-
|
309
|
-
summary
|
323
|
+
summary = Formatters::Helpers.pluralize(example_count, "example") +
|
324
|
+
", " + Formatters::Helpers.pluralize(failure_count, "failure")
|
325
|
+
summary += ", #{pending_count} pending" if pending_count > 0
|
326
|
+
if errors_outside_of_examples_count > 0
|
327
|
+
summary += (
|
328
|
+
", " +
|
329
|
+
Formatters::Helpers.pluralize(errors_outside_of_examples_count, "error") +
|
330
|
+
" occurred outside of examples"
|
331
|
+
)
|
332
|
+
end
|
310
333
|
summary
|
311
334
|
end
|
312
335
|
|
@@ -320,7 +343,7 @@ module RSpec::Core
|
|
320
343
|
# specific colors.
|
321
344
|
# @return [String] A colorized results line.
|
322
345
|
def colorized_totals_line(colorizer=::RSpec::Core::Formatters::ConsoleCodes)
|
323
|
-
if failure_count > 0
|
346
|
+
if failure_count > 0 || errors_outside_of_examples_count > 0
|
324
347
|
colorizer.wrap(totals_line, RSpec.configuration.failure_color)
|
325
348
|
elsif pending_count > 0
|
326
349
|
colorizer.wrap(totals_line, RSpec.configuration.pending_color)
|
@@ -364,7 +387,7 @@ module RSpec::Core
|
|
364
387
|
"#{colorized_totals_line(colorizer)}\n"
|
365
388
|
|
366
389
|
unless failed_examples.empty?
|
367
|
-
formatted
|
390
|
+
formatted += (colorized_rerun_commands(colorizer) + "\n")
|
368
391
|
end
|
369
392
|
|
370
393
|
formatted
|
@@ -37,8 +37,11 @@ module RSpec::Core
|
|
37
37
|
# rubocop:disable Metrics/AbcSize
|
38
38
|
# rubocop:disable CyclomaticComplexity
|
39
39
|
# rubocop:disable PerceivedComplexity
|
40
|
+
# rubocop:disable Metrics/BlockLength
|
40
41
|
def parser(options)
|
41
42
|
OptionParser.new do |parser|
|
43
|
+
parser.summary_width = 34
|
44
|
+
|
42
45
|
parser.banner = "Usage: rspec [options] [files or directories]\n\n"
|
43
46
|
|
44
47
|
parser.on('-I PATH', 'Specify PATH to add to $LOAD_PATH (may be used more than once).') do |dirs|
|
@@ -109,6 +112,7 @@ module RSpec::Core
|
|
109
112
|
' [d]ocumentation (group and example names)',
|
110
113
|
' [h]tml',
|
111
114
|
' [j]son',
|
115
|
+
' [f]ailures ("file:line:reason", suitable for editors integration)',
|
112
116
|
' custom formatter class name') do |o|
|
113
117
|
options[:formatters] ||= []
|
114
118
|
options[:formatters] << [o]
|
@@ -131,8 +135,24 @@ module RSpec::Core
|
|
131
135
|
options[:full_backtrace] = true
|
132
136
|
end
|
133
137
|
|
134
|
-
parser.on('-c', '--
|
135
|
-
|
138
|
+
parser.on('-c', '--color', '--colour', '') do |_o|
|
139
|
+
# flag will be excluded from `--help` output because it is deprecated
|
140
|
+
options[:color] = true
|
141
|
+
options[:color_mode] = :automatic
|
142
|
+
end
|
143
|
+
|
144
|
+
parser.on('--force-color', '--force-colour', 'Force the output to be in color, even if the output is not a TTY') do |_o|
|
145
|
+
if options[:color_mode] == :off
|
146
|
+
abort "Please only use one of `--force-color` and `--no-color`"
|
147
|
+
end
|
148
|
+
options[:color_mode] = :on
|
149
|
+
end
|
150
|
+
|
151
|
+
parser.on('--no-color', '--no-colour', 'Force the output to not be in color, even if the output is a TTY') do |_o|
|
152
|
+
if options[:color_mode] == :on
|
153
|
+
abort "Please only use one of --force-color and --no-color"
|
154
|
+
end
|
155
|
+
options[:color_mode] = :off
|
136
156
|
end
|
137
157
|
|
138
158
|
parser.on('-p', '--[no-]profile [COUNT]',
|
@@ -183,7 +203,7 @@ FILTERING
|
|
183
203
|
configure_only_failures(options)
|
184
204
|
end
|
185
205
|
|
186
|
-
parser.on("--next-failure", "Apply `--only-failures` and abort after one failure.",
|
206
|
+
parser.on("-n", "--next-failure", "Apply `--only-failures` and abort after one failure.",
|
187
207
|
" (Equivalent to `--only-failures --fail-fast --order defined`)") do
|
188
208
|
configure_only_failures(options)
|
189
209
|
set_fail_fast(options, 1)
|
@@ -208,6 +228,11 @@ FILTERING
|
|
208
228
|
(options[:full_description] ||= []) << Regexp.compile(Regexp.escape(o))
|
209
229
|
end
|
210
230
|
|
231
|
+
parser.on('-E', '--example-matches REGEX', "Run examples whose full nested names match REGEX (may be",
|
232
|
+
" used more than once)") do |o|
|
233
|
+
(options[:full_description] ||= []) << Regexp.compile(o)
|
234
|
+
end
|
235
|
+
|
211
236
|
parser.on('-t', '--tag TAG[:VALUE]',
|
212
237
|
'Run examples with the specified tag, or exclude examples',
|
213
238
|
'by adding ~ before the tag.',
|
@@ -256,8 +281,10 @@ FILTERING
|
|
256
281
|
# trigger --default-path.
|
257
282
|
invalid_options = %w[-d --I]
|
258
283
|
|
284
|
+
hidden_options = invalid_options + %w[-c]
|
285
|
+
|
259
286
|
parser.on_tail('-h', '--help', "You're looking at it.") do
|
260
|
-
options[:runner] = RSpec::Core::Invocations::PrintHelp.new(parser,
|
287
|
+
options[:runner] = RSpec::Core::Invocations::PrintHelp.new(parser, hidden_options)
|
261
288
|
end
|
262
289
|
|
263
290
|
# This prevents usage of the invalid_options.
|
@@ -268,6 +295,7 @@ FILTERING
|
|
268
295
|
end
|
269
296
|
end
|
270
297
|
end
|
298
|
+
# rubocop:enable Metrics/BlockLength
|
271
299
|
# rubocop:enable Metrics/AbcSize
|
272
300
|
# rubocop:enable MethodLength
|
273
301
|
# rubocop:enable CyclomaticComplexity
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module RSpec
|
2
|
+
module Core
|
3
|
+
# @private
|
4
|
+
class OutputWrapper
|
5
|
+
# @private
|
6
|
+
attr_accessor :output
|
7
|
+
|
8
|
+
# @private
|
9
|
+
def initialize(output)
|
10
|
+
@output = output
|
11
|
+
end
|
12
|
+
|
13
|
+
def respond_to?(name, priv=false)
|
14
|
+
output.respond_to?(name, priv)
|
15
|
+
end
|
16
|
+
|
17
|
+
def method_missing(name, *args, &block)
|
18
|
+
output.send(name, *args, &block)
|
19
|
+
end
|
20
|
+
|
21
|
+
# Redirect calls for IO interface methods
|
22
|
+
IO.instance_methods(false).each do |method|
|
23
|
+
define_method(method) do |*args, &block|
|
24
|
+
output.send(method, *args, &block)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|