rspec-core 3.0.4 → 3.1.0
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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/Changelog.md +67 -0
- data/lib/rspec/core.rb +3 -1
- data/lib/rspec/core/backtrace_formatter.rb +13 -10
- data/lib/rspec/core/configuration.rb +123 -57
- data/lib/rspec/core/configuration_options.rb +12 -12
- data/lib/rspec/core/drb.rb +11 -11
- data/lib/rspec/core/dsl.rb +0 -1
- data/lib/rspec/core/example.rb +39 -12
- data/lib/rspec/core/example_group.rb +31 -98
- data/lib/rspec/core/filter_manager.rb +16 -17
- data/lib/rspec/core/formatters.rb +14 -13
- data/lib/rspec/core/formatters/base_formatter.rb +8 -113
- data/lib/rspec/core/formatters/base_text_formatter.rb +3 -5
- data/lib/rspec/core/formatters/console_codes.rb +1 -2
- data/lib/rspec/core/formatters/deprecation_formatter.rb +2 -3
- data/lib/rspec/core/formatters/documentation_formatter.rb +3 -4
- data/lib/rspec/core/formatters/helpers.rb +5 -6
- data/lib/rspec/core/formatters/html_formatter.rb +20 -19
- data/lib/rspec/core/formatters/html_printer.rb +6 -5
- data/lib/rspec/core/formatters/json_formatter.rb +3 -2
- data/lib/rspec/core/formatters/profile_formatter.rb +0 -2
- data/lib/rspec/core/formatters/progress_formatter.rb +4 -4
- data/lib/rspec/core/formatters/protocol.rb +163 -0
- data/lib/rspec/core/formatters/snippet_extractor.rb +7 -6
- data/lib/rspec/core/hooks.rb +25 -10
- data/lib/rspec/core/memoized_helpers.rb +7 -5
- data/lib/rspec/core/metadata.rb +29 -30
- data/lib/rspec/core/metadata_filter.rb +66 -66
- data/lib/rspec/core/minitest_assertions_adapter.rb +1 -1
- data/lib/rspec/core/mocking_adapters/flexmock.rb +3 -1
- data/lib/rspec/core/mocking_adapters/mocha.rb +3 -1
- data/lib/rspec/core/mocking_adapters/null.rb +2 -0
- data/lib/rspec/core/mocking_adapters/rr.rb +3 -1
- data/lib/rspec/core/mocking_adapters/rspec.rb +3 -1
- data/lib/rspec/core/notifications.rb +36 -29
- data/lib/rspec/core/option_parser.rb +29 -25
- data/lib/rspec/core/ordering.rb +8 -9
- data/lib/rspec/core/pending.rb +6 -8
- data/lib/rspec/core/project_initializer.rb +4 -2
- data/lib/rspec/core/project_initializer/.rspec +0 -1
- data/lib/rspec/core/project_initializer/spec/spec_helper.rb +37 -26
- data/lib/rspec/core/rake_task.rb +37 -19
- data/lib/rspec/core/reporter.rb +13 -16
- data/lib/rspec/core/ruby_project.rb +2 -2
- data/lib/rspec/core/runner.rb +11 -14
- data/lib/rspec/core/shared_example_group.rb +14 -13
- data/lib/rspec/core/test_unit_assertions_adapter.rb +1 -1
- data/lib/rspec/core/version.rb +1 -1
- data/lib/rspec/core/warnings.rb +4 -4
- data/lib/rspec/core/world.rb +22 -24
- metadata +6 -5
- metadata.gz.sig +0 -0
@@ -41,14 +41,16 @@ module RSpec
|
|
41
41
|
def organize_options
|
42
42
|
@filter_manager_options = []
|
43
43
|
|
44
|
-
@options = (file_options << command_line_options << env_options).each
|
44
|
+
@options = (file_options << command_line_options << env_options).each do |opts|
|
45
45
|
@filter_manager_options << [:include, opts.delete(:inclusion_filter)] if opts.key?(:inclusion_filter)
|
46
46
|
@filter_manager_options << [:exclude, opts.delete(:exclusion_filter)] if opts.key?(:exclusion_filter)
|
47
|
-
|
48
|
-
|
47
|
+
end
|
48
|
+
|
49
|
+
@options = @options.inject(:libs => [], :requires => []) do |hash, opts|
|
50
|
+
hash.merge(opts) do |key, oldval, newval|
|
49
51
|
[:libs, :requires].include?(key) ? oldval + newval : newval
|
50
|
-
|
51
|
-
|
52
|
+
end
|
53
|
+
end
|
52
54
|
end
|
53
55
|
|
54
56
|
UNFORCED_OPTIONS = [
|
@@ -84,7 +86,7 @@ module RSpec
|
|
84
86
|
|
85
87
|
# These must be set before `requires` to support checking `config.files_to_run`
|
86
88
|
# from within `spec_helper.rb` when a `-rspec_helper` option is used.
|
87
|
-
:files_or_directories_to_run, :pattern,
|
89
|
+
:files_or_directories_to_run, :pattern, :exclude_pattern,
|
88
90
|
|
89
91
|
# In general, we want to require the specified files as early as possible.
|
90
92
|
# The `--require` option is specifically intended to allow early requires.
|
@@ -161,12 +163,10 @@ module RSpec
|
|
161
163
|
end
|
162
164
|
|
163
165
|
def global_options_file
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
nil
|
169
|
-
end
|
166
|
+
File.join(File.expand_path("~"), ".rspec")
|
167
|
+
rescue ArgumentError
|
168
|
+
RSpec.warning "Unable to find ~/.rspec because the HOME environment variable is not set"
|
169
|
+
nil
|
170
170
|
end
|
171
171
|
end
|
172
172
|
end
|
data/lib/rspec/core/drb.rb
CHANGED
@@ -60,20 +60,20 @@ module RSpec
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def add_failure_exit_code(argv)
|
63
|
-
|
64
|
-
|
65
|
-
|
63
|
+
return unless @submitted_options[:failure_exit_code]
|
64
|
+
|
65
|
+
argv << "--failure-exit-code" << @submitted_options[:failure_exit_code].to_s
|
66
66
|
end
|
67
67
|
|
68
68
|
def add_full_description(argv)
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
69
|
+
return unless @submitted_options[:full_description]
|
70
|
+
|
71
|
+
# The argument to --example is regexp-escaped before being stuffed
|
72
|
+
# into a regexp when received for the first time (see OptionParser).
|
73
|
+
# Hence, merely grabbing the source of this regexp will retain the
|
74
|
+
# backslashes, so we must remove them.
|
75
|
+
@submitted_options[:full_description].each do |description|
|
76
|
+
argv << "--example" << description.source.delete('\\')
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
data/lib/rspec/core/dsl.rb
CHANGED
data/lib/rspec/core/example.rb
CHANGED
@@ -73,9 +73,12 @@ module RSpec
|
|
73
73
|
# there is one, otherwise returns a message including the location of the
|
74
74
|
# example.
|
75
75
|
def description
|
76
|
-
description = metadata[:description].to_s.empty?
|
77
|
-
|
78
|
-
|
76
|
+
description = if metadata[:description].to_s.empty?
|
77
|
+
"example at #{location}"
|
78
|
+
else
|
79
|
+
metadata[:description]
|
80
|
+
end
|
81
|
+
|
79
82
|
RSpec.configuration.format_docstrings_block.call(description)
|
80
83
|
end
|
81
84
|
|
@@ -151,8 +154,8 @@ module RSpec
|
|
151
154
|
Pending.mark_fixed! self
|
152
155
|
|
153
156
|
raise Pending::PendingExampleFixedError,
|
154
|
-
|
155
|
-
|
157
|
+
'Expected example to fail since it is pending, but it passed.',
|
158
|
+
[location]
|
156
159
|
end
|
157
160
|
rescue Pending::SkipDeclaredInExample
|
158
161
|
# no-op, required metadata has already been set by the `skip`
|
@@ -201,25 +204,49 @@ module RSpec
|
|
201
204
|
attr_reader :example
|
202
205
|
|
203
206
|
Example.public_instance_methods(false).each do |name|
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
+
next if name.to_sym == :run || name.to_sym == :inspect
|
208
|
+
|
209
|
+
define_method(name) { |*a, &b| @example.__send__(name, *a, &b) }
|
207
210
|
end
|
208
211
|
|
209
212
|
Proc.public_instance_methods(false).each do |name|
|
213
|
+
next if name.to_sym == :call || name.to_sym == :inspect || name.to_sym == :to_proc
|
214
|
+
|
210
215
|
define_method(name) { |*a, &b| @proc.__send__(name, *a, &b) }
|
211
216
|
end
|
217
|
+
|
218
|
+
# Calls the proc and notes that the example has been executed.
|
219
|
+
def call(*args, &block)
|
220
|
+
@executed = true
|
221
|
+
@proc.call(*args, &block)
|
222
|
+
end
|
212
223
|
alias run call
|
213
224
|
|
225
|
+
# Provides a wrapped proc that will update our `executed?` state when executed.
|
226
|
+
def to_proc
|
227
|
+
method(:call).to_proc
|
228
|
+
end
|
229
|
+
|
214
230
|
def initialize(example, &block)
|
215
|
-
@example
|
216
|
-
@proc
|
231
|
+
@example = example
|
232
|
+
@proc = block
|
233
|
+
@executed = false
|
217
234
|
end
|
218
235
|
|
219
236
|
# @private
|
220
237
|
def wrap(&block)
|
221
238
|
self.class.new(example, &block)
|
222
239
|
end
|
240
|
+
|
241
|
+
# Indicates whether or not the around hook has executed the example.
|
242
|
+
def executed?
|
243
|
+
@executed
|
244
|
+
end
|
245
|
+
|
246
|
+
# @private
|
247
|
+
def inspect
|
248
|
+
@example.inspect.gsub('Example', 'ExampleProcsy')
|
249
|
+
end
|
223
250
|
end
|
224
251
|
|
225
252
|
# @private
|
@@ -451,7 +478,7 @@ module RSpec
|
|
451
478
|
end
|
452
479
|
end
|
453
480
|
|
454
|
-
def issue_deprecation(
|
481
|
+
def issue_deprecation(_method_name, *_args)
|
455
482
|
RSpec.deprecate("Treating `metadata[:execution_result]` as a hash",
|
456
483
|
:replacement => "the attributes methods to access the data")
|
457
484
|
end
|
@@ -466,7 +493,7 @@ module RSpec
|
|
466
493
|
end
|
467
494
|
|
468
495
|
# To ensure we don't silence errors...
|
469
|
-
def set_exception(exception,
|
496
|
+
def set_exception(exception, _context=nil)
|
470
497
|
raise exception
|
471
498
|
end
|
472
499
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
RSpec::Support.require_rspec_support 'recursive_const_methods'
|
2
|
+
|
1
3
|
module RSpec
|
2
4
|
module Core
|
3
5
|
# ExampleGroup and {Example} are the main structural elements of
|
@@ -15,7 +17,7 @@ module RSpec
|
|
15
17
|
#
|
16
18
|
# Example group bodies (e.g. `describe` or `context` blocks) are evaluated
|
17
19
|
# in the context of a new subclass of ExampleGroup. Individual examples are
|
18
|
-
#
|
20
|
+
# evaluated in the context of an instance of the specific ExampleGroup subclass
|
19
21
|
# to which they belong.
|
20
22
|
#
|
21
23
|
# Besides the class methods defined here, there are other interesting macros
|
@@ -23,12 +25,12 @@ module RSpec
|
|
23
25
|
# There are additional instance methods available to your examples defined in
|
24
26
|
# {MemoizedHelpers} and {Pending}.
|
25
27
|
class ExampleGroup
|
26
|
-
extend
|
28
|
+
extend Hooks
|
27
29
|
|
28
30
|
include MemoizedHelpers
|
29
|
-
extend
|
31
|
+
extend MemoizedHelpers::ClassMethods
|
30
32
|
include Pending
|
31
|
-
extend
|
33
|
+
extend SharedExampleGroup
|
32
34
|
|
33
35
|
unless respond_to?(:define_singleton_method)
|
34
36
|
# @private
|
@@ -48,7 +50,7 @@ module RSpec
|
|
48
50
|
# @private
|
49
51
|
# @return [Metadata] belonging to the parent of a nested {ExampleGroup}
|
50
52
|
def self.superclass_metadata
|
51
|
-
@superclass_metadata ||=
|
53
|
+
@superclass_metadata ||= superclass.respond_to?(:metadata) ? superclass.metadata : nil
|
52
54
|
end
|
53
55
|
|
54
56
|
# @private
|
@@ -209,8 +211,8 @@ module RSpec
|
|
209
211
|
|
210
212
|
if top_level
|
211
213
|
if thread_data[:in_example_group]
|
212
|
-
raise "Creating an isolated context from within a context is "
|
213
|
-
"not allowed. Change `RSpec.#{name}` to `#{name}` or "
|
214
|
+
raise "Creating an isolated context from within a context is " \
|
215
|
+
"not allowed. Change `RSpec.#{name}` to `#{name}` or " \
|
214
216
|
"move this to a top-level scope."
|
215
217
|
end
|
216
218
|
|
@@ -313,7 +315,9 @@ module RSpec
|
|
313
315
|
|
314
316
|
# @private
|
315
317
|
def self.find_and_eval_shared(label, name, *args, &customization_block)
|
316
|
-
|
318
|
+
shared_block = RSpec.world.shared_example_group_registry.find(parent_groups, name)
|
319
|
+
|
320
|
+
unless shared_block
|
317
321
|
raise ArgumentError, "Could not find shared #{label} #{name.inspect}"
|
318
322
|
end
|
319
323
|
|
@@ -374,7 +378,7 @@ module RSpec
|
|
374
378
|
|
375
379
|
# @private
|
376
380
|
def self.descendant_filtered_examples
|
377
|
-
@descendant_filtered_examples ||= filtered_examples + children.inject([]){|
|
381
|
+
@descendant_filtered_examples ||= filtered_examples + children.inject([]) { |a, e| a + e.descendant_filtered_examples }
|
378
382
|
end
|
379
383
|
|
380
384
|
# @private
|
@@ -384,12 +388,12 @@ module RSpec
|
|
384
388
|
|
385
389
|
# @private
|
386
390
|
def self.descendants
|
387
|
-
@_descendants ||= [self] + children.inject([]) {|
|
391
|
+
@_descendants ||= [self] + children.inject([]) { |a, e| a + e.descendants }
|
388
392
|
end
|
389
393
|
|
390
394
|
## @private
|
391
395
|
def self.parent_groups
|
392
|
-
@parent_groups ||= ancestors.select {|a| a < RSpec::Core::ExampleGroup}
|
396
|
+
@parent_groups ||= ancestors.select { |a| a < RSpec::Core::ExampleGroup }
|
393
397
|
end
|
394
398
|
|
395
399
|
# @private
|
@@ -402,7 +406,9 @@ module RSpec
|
|
402
406
|
unless defined?(@@example_groups_configured)
|
403
407
|
RSpec.configuration.configure_mock_framework
|
404
408
|
RSpec.configuration.configure_expectation_framework
|
409
|
+
# rubocop:disable Style/ClassVars
|
405
410
|
@@example_groups_configured = true
|
411
|
+
# rubocop:enable Style/ClassVars
|
406
412
|
end
|
407
413
|
end
|
408
414
|
|
@@ -415,9 +421,9 @@ module RSpec
|
|
415
421
|
def self.store_before_context_ivars(example_group_instance)
|
416
422
|
return if example_group_instance.instance_variables.empty?
|
417
423
|
|
418
|
-
example_group_instance.instance_variables.each
|
424
|
+
example_group_instance.instance_variables.each do |ivar|
|
419
425
|
before_context_ivars[ivar] = example_group_instance.instance_variable_get(ivar)
|
420
|
-
|
426
|
+
end
|
421
427
|
end
|
422
428
|
|
423
429
|
# @private
|
@@ -458,10 +464,10 @@ module RSpec
|
|
458
464
|
results_for_descendants = ordering_strategy.order(children).map { |child| child.run(reporter) }.all?
|
459
465
|
result_for_this_group && results_for_descendants
|
460
466
|
rescue Pending::SkipDeclaredInExample => ex
|
461
|
-
for_filtered_examples(reporter) {|example| example.skip_with_exception(reporter, ex) }
|
467
|
+
for_filtered_examples(reporter) { |example| example.skip_with_exception(reporter, ex) }
|
462
468
|
rescue Exception => ex
|
463
469
|
RSpec.world.wants_to_quit = true if fail_fast?
|
464
|
-
for_filtered_examples(reporter) {|example| example.fail_with_exception(reporter, ex) }
|
470
|
+
for_filtered_examples(reporter) { |example| example.fail_with_exception(reporter, ex) }
|
465
471
|
ensure
|
466
472
|
run_after_context_hooks(new)
|
467
473
|
before_context_ivars.clear
|
@@ -527,8 +533,8 @@ module RSpec
|
|
527
533
|
# @private
|
528
534
|
def self.declaration_line_numbers
|
529
535
|
@declaration_line_numbers ||= [metadata[:line_number]] +
|
530
|
-
examples.
|
531
|
-
children.inject([]) {|
|
536
|
+
examples.map { |e| e.metadata[:line_number] } +
|
537
|
+
children.inject([]) { |a, e| a + e.declaration_line_numbers }
|
532
538
|
end
|
533
539
|
|
534
540
|
# @private
|
@@ -538,7 +544,7 @@ module RSpec
|
|
538
544
|
|
539
545
|
# @private
|
540
546
|
def self.set_ivars(instance, ivars)
|
541
|
-
ivars.each {|name, value| instance.instance_variable_set(name, value)}
|
547
|
+
ivars.each { |name, value| instance.instance_variable_set(name, value) }
|
542
548
|
end
|
543
549
|
|
544
550
|
# @private
|
@@ -557,7 +563,10 @@ module RSpec
|
|
557
563
|
# This will fail if no block is provided, which is effectively the
|
558
564
|
# same as failing the example so it will be marked correctly as
|
559
565
|
# pending.
|
560
|
-
callback = Proc.new
|
566
|
+
callback = Proc.new do
|
567
|
+
pending(reason)
|
568
|
+
instance_exec(&block)
|
569
|
+
end
|
561
570
|
|
562
571
|
return options, callback
|
563
572
|
end
|
@@ -572,86 +581,11 @@ module RSpec
|
|
572
581
|
end
|
573
582
|
end
|
574
583
|
|
575
|
-
# Provides recursive constant lookup methods useful for
|
576
|
-
# constant stubbing.
|
577
|
-
# @private
|
578
|
-
module RecursiveConstMethods
|
579
|
-
# We only want to consider constants that are defined directly on a
|
580
|
-
# particular module, and not include top-level/inherited constants.
|
581
|
-
# Unfortunately, the constant API changed between 1.8 and 1.9, so
|
582
|
-
# we need to conditionally define methods to ignore the top-level/inherited
|
583
|
-
# constants.
|
584
|
-
#
|
585
|
-
# Given:
|
586
|
-
# class A; B = 1; end
|
587
|
-
# class C < A; end
|
588
|
-
#
|
589
|
-
# On 1.8:
|
590
|
-
# - C.const_get("Hash") # => ::Hash
|
591
|
-
# - C.const_defined?("Hash") # => false
|
592
|
-
# - C.constants # => ["B"]
|
593
|
-
# - None of these methods accept the extra `inherit` argument
|
594
|
-
# On 1.9:
|
595
|
-
# - C.const_get("Hash") # => ::Hash
|
596
|
-
# - C.const_defined?("Hash") # => true
|
597
|
-
# - C.const_get("Hash", false) # => raises NameError
|
598
|
-
# - C.const_defined?("Hash", false) # => false
|
599
|
-
# - C.constants # => [:B]
|
600
|
-
# - C.constants(false) #=> []
|
601
|
-
if Module.method(:const_defined?).arity == 1
|
602
|
-
def const_defined_on?(mod, const_name)
|
603
|
-
mod.const_defined?(const_name)
|
604
|
-
end
|
605
|
-
|
606
|
-
def get_const_defined_on(mod, const_name)
|
607
|
-
if const_defined_on?(mod, const_name)
|
608
|
-
return mod.const_get(const_name)
|
609
|
-
end
|
610
|
-
|
611
|
-
raise NameError, "uninitialized constant #{mod.name}::#{const_name}"
|
612
|
-
end
|
613
|
-
|
614
|
-
def constants_defined_on(mod)
|
615
|
-
mod.constants.select { |c| const_defined_on?(mod, c) }
|
616
|
-
end
|
617
|
-
else
|
618
|
-
def const_defined_on?(mod, const_name)
|
619
|
-
mod.const_defined?(const_name, false)
|
620
|
-
end
|
621
|
-
|
622
|
-
def get_const_defined_on(mod, const_name)
|
623
|
-
mod.const_get(const_name, false)
|
624
|
-
end
|
625
|
-
|
626
|
-
def constants_defined_on(mod)
|
627
|
-
mod.constants(false)
|
628
|
-
end
|
629
|
-
end
|
630
|
-
|
631
|
-
def recursive_const_get(const_name)
|
632
|
-
normalize_const_name(const_name).split('::').inject(Object) do |mod, name|
|
633
|
-
get_const_defined_on(mod, name)
|
634
|
-
end
|
635
|
-
end
|
636
|
-
|
637
|
-
def recursive_const_defined?(const_name)
|
638
|
-
normalize_const_name(const_name).split('::').inject([Object, '']) do |(mod, full_name), name|
|
639
|
-
yield(full_name, name) if block_given? && !(Module === mod)
|
640
|
-
return false unless const_defined_on?(mod, name)
|
641
|
-
[get_const_defined_on(mod, name), [mod, name].join('::')]
|
642
|
-
end
|
643
|
-
end
|
644
|
-
|
645
|
-
def normalize_const_name(const_name)
|
646
|
-
const_name.sub(/\A::/, '')
|
647
|
-
end
|
648
|
-
end
|
649
|
-
|
650
584
|
# @private
|
651
585
|
#
|
652
586
|
# Namespace for the example group subclasses generated by top-level `describe`.
|
653
587
|
module ExampleGroups
|
654
|
-
extend RecursiveConstMethods
|
588
|
+
extend Support::RecursiveConstMethods
|
655
589
|
|
656
590
|
def self.assign_const(group)
|
657
591
|
base_name = base_name_for(group)
|
@@ -663,7 +597,7 @@ module RSpec
|
|
663
597
|
|
664
598
|
def self.constant_scope_for(group)
|
665
599
|
const_scope = group.superclass
|
666
|
-
const_scope = self if const_scope == Core::ExampleGroup
|
600
|
+
const_scope = self if const_scope == ::RSpec::Core::ExampleGroup
|
667
601
|
const_scope
|
668
602
|
end
|
669
603
|
|
@@ -672,7 +606,7 @@ module RSpec
|
|
672
606
|
|
673
607
|
# convert to CamelCase
|
674
608
|
name = ' ' + group.description
|
675
|
-
name.gsub!(/[^0-9a-zA-Z]+([0-9a-zA-Z])/) {
|
609
|
+
name.gsub!(/[^0-9a-zA-Z]+([0-9a-zA-Z])/) { Regexp.last_match[1].upcase }
|
676
610
|
|
677
611
|
name.lstrip! # Remove leading whitespace
|
678
612
|
name.gsub!(/\W/, '') # JRuby, RBX and others don't like non-ascii in const names
|
@@ -694,4 +628,3 @@ module RSpec
|
|
694
628
|
end
|
695
629
|
end
|
696
630
|
end
|
697
|
-
|
@@ -81,7 +81,7 @@ module RSpec
|
|
81
81
|
# locations is a hash of expanded paths to arrays of line
|
82
82
|
# numbers to match against. e.g.
|
83
83
|
# { "path/to/file.rb" => [37, 42] }
|
84
|
-
locations = inclusions.delete(:locations) || Hash.new { |h,k| h[k] = [] }
|
84
|
+
locations = inclusions.delete(:locations) || Hash.new { |h, k| h[k] = [] }
|
85
85
|
locations[File.expand_path(file_path)].push(*line_numbers)
|
86
86
|
inclusions.add_location(locations)
|
87
87
|
end
|
@@ -93,9 +93,9 @@ module RSpec
|
|
93
93
|
def prune(examples)
|
94
94
|
if inclusions.standalone?
|
95
95
|
base_exclusions = ExclusionRules.new
|
96
|
-
examples.select {|e| !base_exclusions.include_example?(e) && include?(e) }
|
96
|
+
examples.select { |e| !base_exclusions.include_example?(e) && include?(e) }
|
97
97
|
else
|
98
|
-
examples.select {|e| !exclude?(e) && include?(e)}
|
98
|
+
examples.select { |e| !exclude?(e) && include?(e) }
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
@@ -156,9 +156,9 @@ module RSpec
|
|
156
156
|
@rules.merge!(updated).each_key { |k| opposite.delete(k) }
|
157
157
|
end
|
158
158
|
|
159
|
-
def add_with_low_priority(
|
160
|
-
updated =
|
161
|
-
opposite.each_pair { |k,v| updated.delete(k) if updated[k] == v }
|
159
|
+
def add_with_low_priority(updated)
|
160
|
+
updated = updated.merge(@rules)
|
161
|
+
opposite.each_pair { |k, v| updated.delete(k) if updated[k] == v }
|
162
162
|
@rules.replace(updated)
|
163
163
|
end
|
164
164
|
|
@@ -192,7 +192,7 @@ module RSpec
|
|
192
192
|
end
|
193
193
|
|
194
194
|
def description
|
195
|
-
rules.inspect.gsub(PROC_HEX_NUMBER, '').gsub(PROJECT_DIR, '.').gsub(' (lambda)','')
|
195
|
+
rules.inspect.gsub(PROC_HEX_NUMBER, '').gsub(PROJECT_DIR, '.').gsub(' (lambda)', '')
|
196
196
|
end
|
197
197
|
end
|
198
198
|
|
@@ -201,19 +201,19 @@ module RSpec
|
|
201
201
|
STANDALONE_FILTERS = [:locations, :full_description]
|
202
202
|
|
203
203
|
def add_location(locations)
|
204
|
-
replace_filters(
|
204
|
+
replace_filters(:locations => locations)
|
205
205
|
end
|
206
206
|
|
207
207
|
def add(*args)
|
208
|
-
|
208
|
+
apply_standalone_filter(*args) || super
|
209
209
|
end
|
210
210
|
|
211
211
|
def add_with_low_priority(*args)
|
212
|
-
|
212
|
+
apply_standalone_filter(*args) || super
|
213
213
|
end
|
214
214
|
|
215
215
|
def use(*args)
|
216
|
-
|
216
|
+
apply_standalone_filter(*args) || super
|
217
217
|
end
|
218
218
|
|
219
219
|
def include_example?(example)
|
@@ -226,13 +226,12 @@ module RSpec
|
|
226
226
|
|
227
227
|
private
|
228
228
|
|
229
|
-
def
|
229
|
+
def apply_standalone_filter(updated)
|
230
230
|
return true if standalone?
|
231
|
+
return nil unless is_standalone_filter?(updated)
|
231
232
|
|
232
|
-
|
233
|
-
|
234
|
-
true
|
235
|
-
end
|
233
|
+
replace_filters(updated)
|
234
|
+
true
|
236
235
|
end
|
237
236
|
|
238
237
|
def replace_filters(new_rules)
|
@@ -241,7 +240,7 @@ module RSpec
|
|
241
240
|
end
|
242
241
|
|
243
242
|
def is_standalone_filter?(rules)
|
244
|
-
STANDALONE_FILTERS.any? { |key| rules.
|
243
|
+
STANDALONE_FILTERS.any? { |key| rules.key?(key) }
|
245
244
|
end
|
246
245
|
end
|
247
246
|
|