rspec-core 3.0.4 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/Changelog.md +67 -0
  5. data/lib/rspec/core.rb +3 -1
  6. data/lib/rspec/core/backtrace_formatter.rb +13 -10
  7. data/lib/rspec/core/configuration.rb +123 -57
  8. data/lib/rspec/core/configuration_options.rb +12 -12
  9. data/lib/rspec/core/drb.rb +11 -11
  10. data/lib/rspec/core/dsl.rb +0 -1
  11. data/lib/rspec/core/example.rb +39 -12
  12. data/lib/rspec/core/example_group.rb +31 -98
  13. data/lib/rspec/core/filter_manager.rb +16 -17
  14. data/lib/rspec/core/formatters.rb +14 -13
  15. data/lib/rspec/core/formatters/base_formatter.rb +8 -113
  16. data/lib/rspec/core/formatters/base_text_formatter.rb +3 -5
  17. data/lib/rspec/core/formatters/console_codes.rb +1 -2
  18. data/lib/rspec/core/formatters/deprecation_formatter.rb +2 -3
  19. data/lib/rspec/core/formatters/documentation_formatter.rb +3 -4
  20. data/lib/rspec/core/formatters/helpers.rb +5 -6
  21. data/lib/rspec/core/formatters/html_formatter.rb +20 -19
  22. data/lib/rspec/core/formatters/html_printer.rb +6 -5
  23. data/lib/rspec/core/formatters/json_formatter.rb +3 -2
  24. data/lib/rspec/core/formatters/profile_formatter.rb +0 -2
  25. data/lib/rspec/core/formatters/progress_formatter.rb +4 -4
  26. data/lib/rspec/core/formatters/protocol.rb +163 -0
  27. data/lib/rspec/core/formatters/snippet_extractor.rb +7 -6
  28. data/lib/rspec/core/hooks.rb +25 -10
  29. data/lib/rspec/core/memoized_helpers.rb +7 -5
  30. data/lib/rspec/core/metadata.rb +29 -30
  31. data/lib/rspec/core/metadata_filter.rb +66 -66
  32. data/lib/rspec/core/minitest_assertions_adapter.rb +1 -1
  33. data/lib/rspec/core/mocking_adapters/flexmock.rb +3 -1
  34. data/lib/rspec/core/mocking_adapters/mocha.rb +3 -1
  35. data/lib/rspec/core/mocking_adapters/null.rb +2 -0
  36. data/lib/rspec/core/mocking_adapters/rr.rb +3 -1
  37. data/lib/rspec/core/mocking_adapters/rspec.rb +3 -1
  38. data/lib/rspec/core/notifications.rb +36 -29
  39. data/lib/rspec/core/option_parser.rb +29 -25
  40. data/lib/rspec/core/ordering.rb +8 -9
  41. data/lib/rspec/core/pending.rb +6 -8
  42. data/lib/rspec/core/project_initializer.rb +4 -2
  43. data/lib/rspec/core/project_initializer/.rspec +0 -1
  44. data/lib/rspec/core/project_initializer/spec/spec_helper.rb +37 -26
  45. data/lib/rspec/core/rake_task.rb +37 -19
  46. data/lib/rspec/core/reporter.rb +13 -16
  47. data/lib/rspec/core/ruby_project.rb +2 -2
  48. data/lib/rspec/core/runner.rb +11 -14
  49. data/lib/rspec/core/shared_example_group.rb +14 -13
  50. data/lib/rspec/core/test_unit_assertions_adapter.rb +1 -1
  51. data/lib/rspec/core/version.rb +1 -1
  52. data/lib/rspec/core/warnings.rb +4 -4
  53. data/lib/rspec/core/world.rb +22 -24
  54. metadata +6 -5
  55. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3bd37cf851aa9d257e6cbc74c9faac447d71d106
4
- data.tar.gz: bbbd5d2fb3839f3f59b29e26c789da6a507fc47a
3
+ metadata.gz: ee058acded3da2b270f4643a7cbf909f86a708ce
4
+ data.tar.gz: 88eaf5e071b90d31c28ce0d9ec9f92722a25bc88
5
5
  SHA512:
6
- metadata.gz: 986789472c22b14c4f619b381e4c0d70da004dded0a2c57ca9f7abf082efa7696ebe580252e240b6d8fee50a5b502a6f1f1983b100d81d416b5cc6ecf45158f5
7
- data.tar.gz: 1e5406a618c112457adde4f8923b5045b63b14f8e3cc0f017e8c46cec7cf3c3e4a0e837d2773c94107f4ebcb17a99c0d935a2f09967bfd06128d2bd0b076ca42
6
+ metadata.gz: 3ce2c03aa04796bc5fd6414bd84ebde8b80ba3f0e7ec379b00fdb1fc53210c953b6758ee618e16b6969658a15536c217cc02b952263215df4a398d85b128e789
7
+ data.tar.gz: 7c554927f21c2eb43b24b423950ffeb0c7239943f3871be8b2f86cb5beb433693bfa252f97ac7fc574246f8e97f10e3064a13658a6ec2acb20933d2b13bd2f70
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -1,3 +1,62 @@
1
+ ### 3.1.0 / 2014-09-04
2
+ [Full Changelog](http://github.com/rspec/rspec-core/compare/v3.0.4...v3.1.0)
3
+
4
+ Enhancements:
5
+
6
+ * Update files generated by `rspec --init` so that warnings are enabled
7
+ in commented out section of `spec_helper` rather than `.rspec` so users
8
+ have to consciously opt-in to the setting. (Andrew Hooker, #1572)
9
+ * Update `spec_helper` generated by `rspec --init` so that it sets the new
10
+ rspec-expectations `include_chain_clauses_in_custom_matcher_descriptions`
11
+ config option (which will be on by default in RSpec 4) and also sets the
12
+ rspec-mocks `verify_partial_doubles` option (which will also default
13
+ to on in RSpec 4). (Myron Marston, #1647)
14
+ * Provide an `inspect` output for example procsy objects (used in around
15
+ hooks) that doesn't make them look like procs. (Jon Rowe, #1620)
16
+ * Remove a few unneeded `require` statements from
17
+ `rspec/core/rake_task.rb`, making it even more lighterweight.
18
+ (Myron Marston, #1640)
19
+ * Allow rspec-core to be used when neither rspec-mocks or
20
+ rspec-expectations are installed, without requiring any
21
+ user configuration. (Sam Phippen, Myron Marston, #1615)
22
+ * Don't filter out gems from backtraces by default. (The RSpec
23
+ gems will still be filtered). User feedback has indicated
24
+ that including gems in default backtraces will be useful.
25
+ (Myron Marston, #1641)
26
+ * Add new `config.filter_gems_from_backtrace "rack", "rake"` API
27
+ to easily filter the named gems from backtraces. (Myron Marston, #1682)
28
+ * Fix default backtrace filters so that the RSpec binary is
29
+ excluded when installing RSpec as a bundler `:git` dependency.
30
+ (Myron Marston, #1648)
31
+ * Simplify command generated by the rake task so that it no longer
32
+ includes unnecessary `-S`. (Myron Marston, #1559)
33
+ * Add `--exclude-pattern` CLI option, `config.exclude_pattern =` config
34
+ option and `task.exclude_pattern =` rake task config option. Matching
35
+ files will be excluded. (John Gesimondo, Myron Marston, #1651, #1671)
36
+ * When an around hook fails to execute the example, mark it as
37
+ pending (rather than passing) so the user is made aware of the
38
+ fact that the example did not actually run. (Myron Marston, #1660)
39
+ * Remove dependency on `FileUtils` from the standard library so that users do
40
+ not get false positives where their code relies on it but they are not
41
+ requiring it. (Sam Phippen, #1565)
42
+
43
+ Bug Fixes:
44
+
45
+ * Fix rake task `t.pattern =` option so that it does not run all specs
46
+ when it matches no files, by passing along a `--pattern` option to
47
+ the `rspec` command, rather than resolving the file list and passing
48
+ along the files individually. (Evgeny Zislis, #1653)
49
+ * Fix rake task default pattern so that it follows symlinks properly.
50
+ (Myron Marston, #1672)
51
+ * Fix default pattern used with `rspec` command so that it follows
52
+ symlinks properly. (Myron Marston, #1672)
53
+ * Change how we assign constant names to example group classes so that
54
+ it avoids a problem with `describe "Core"`. (Daniela Wellisz, #1679)
55
+ * Handle rendering exceptions that have a different encoding than that
56
+ of their original source file. (Jon Rowe, #1681)
57
+ * Allow access to message_lines without colour for failed examples even
58
+ when they're part of a shared example group. (tomykaira, #1689)
59
+
1
60
  ### 3.0.4 / 2014-08-14
2
61
  [Full Changelog](http://github.com/rspec/rspec-core/compare/v3.0.3...v3.0.4)
3
62
 
@@ -385,6 +444,14 @@ Deprecations:
385
444
  longer has an affect now that the behavior it enabled is always
386
445
  enabled. (Myron Marston)
387
446
 
447
+ ### 2.99.2 / 2014-08-19
448
+ [Full Changelog](http://github.com/rspec/rspec-core/compare/v2.99.1...v2.99.2)
449
+
450
+ Enhancements:
451
+
452
+ * Improve deprecation warning for RSpec 3 change in `describe <a symbol>`
453
+ behavior. (Jon Rowe, #1667)
454
+
388
455
  ### 2.99.1 / 2014-06-19
389
456
  [Full Changelog](http://github.com/rspec/rspec-core/compare/v2.99.0...v2.99.1)
390
457
 
@@ -1,4 +1,7 @@
1
+ # rubocop:disable Style/GlobalVars
1
2
  $_rspec_core_load_started_at = Time.now
3
+ # rubocop:enable Style/GlobalVars
4
+
2
5
  require 'rbconfig'
3
6
 
4
7
  require "rspec/support"
@@ -64,7 +67,6 @@ module RSpec
64
67
  config.expose_dsl_globally = true
65
68
  config
66
69
  end
67
-
68
70
  end
69
71
 
70
72
  # Yields the global configuration to a block.
@@ -8,27 +8,30 @@ module RSpec
8
8
  def initialize
9
9
  @full_backtrace = false
10
10
 
11
- patterns = [
12
- "/lib\d*/ruby/",
13
- "org/jruby/",
14
- "bin/",
15
- "/gems/",
16
- ].map { |s| Regexp.new(s.gsub("/", File::SEPARATOR)) }
11
+ patterns = %w[ /lib\d*/ruby/ bin/ exe/rspec ]
12
+ patterns << "org/jruby/" if RUBY_PLATFORM == 'java'
13
+ patterns.map! { |s| Regexp.new(s.gsub("/", File::SEPARATOR)) }
17
14
 
18
15
  @system_exclusion_patterns = [Regexp.union(RSpec::CallerFilter::IGNORE_REGEX, *patterns)]
19
16
  @exclusion_patterns = [] + @system_exclusion_patterns
20
17
  @inclusion_patterns = [Regexp.new(Dir.getwd)]
21
18
  end
22
19
 
23
- def full_backtrace=(full_backtrace)
24
- @full_backtrace = full_backtrace
25
- end
20
+ attr_writer :full_backtrace
26
21
 
27
22
  def full_backtrace?
28
23
  @full_backtrace || @exclusion_patterns.empty?
29
24
  end
30
25
 
31
- def format_backtrace(backtrace, options = {})
26
+ def filter_gem(gem_name)
27
+ sep = File::SEPARATOR
28
+ pattern = /#{sep}#{gem_name}(-[^#{sep}]+)?#{sep}/
29
+
30
+ @exclusion_patterns << pattern
31
+ @system_exclusion_patterns << pattern
32
+ end
33
+
34
+ def format_backtrace(backtrace, options={})
32
35
  return backtrace if options[:full_backtrace]
33
36
 
34
37
  backtrace.map { |l| backtrace_line(l) }.compact.
@@ -1,11 +1,11 @@
1
- require 'fileutils'
2
-
3
1
  RSpec::Support.require_rspec_core "backtrace_formatter"
4
2
  RSpec::Support.require_rspec_core "ruby_project"
5
3
  RSpec::Support.require_rspec_core "formatters/deprecation_formatter"
6
4
 
7
5
  module RSpec
8
6
  module Core
7
+ # rubocop:disable Style/ClassLength
8
+
9
9
  # Stores runtime configuration information.
10
10
  #
11
11
  # Configuration options are loaded from `~/.rspec`, `.rspec`,
@@ -52,7 +52,7 @@ module RSpec
52
52
 
53
53
  # @private
54
54
  def self.define_predicate_for(*names)
55
- names.each {|name| alias_method "#{name}?", name}
55
+ names.each { |name| alias_method "#{name}?", name }
56
56
  end
57
57
 
58
58
  # @private
@@ -60,7 +60,7 @@ module RSpec
60
60
  # Invoked by the `add_setting` instance method. Use that method on a
61
61
  # `Configuration` instance rather than this class method.
62
62
  def self.add_setting(name, opts={})
63
- raise "Use the instance add_setting method if you want to set a default" if opts.has_key?(:default)
63
+ raise "Use the instance add_setting method if you want to set a default" if opts.key?(:default)
64
64
  attr_writer name
65
65
  add_read_only_setting name
66
66
 
@@ -73,7 +73,7 @@ module RSpec
73
73
  #
74
74
  # As `add_setting` but only add the reader
75
75
  def self.add_read_only_setting(name, opts={})
76
- raise "Use the instance add_setting method if you want to set a default" if opts.has_key?(:default)
76
+ raise "Use the instance add_setting method if you want to set a default" if opts.key?(:default)
77
77
  define_reader name
78
78
  define_predicate_for name
79
79
  end
@@ -89,6 +89,9 @@ module RSpec
89
89
  # Path to use if no path is provided to the `rspec` command (default:
90
90
  # `"spec"`). Allows you to just type `rspec` instead of `rspec spec` to
91
91
  # run all the examples in the `spec` directory.
92
+ #
93
+ # Note: Other scripts invoking `rspec` indirectly will ignore this
94
+ # setting.
92
95
  add_setting :default_path
93
96
 
94
97
  # @macro add_setting
@@ -133,10 +136,10 @@ module RSpec
133
136
  # @param value [IO, String] IO to write to or filename to write to
134
137
  def deprecation_stream=(value)
135
138
  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. " +
139
+ warn "RSpec's reporter has already been initialized with " \
140
+ "#{deprecation_stream.inspect} as the deprecation stream, so your change to "\
141
+ "`deprecation_stream` will be ignored. You should configure it earlier for " \
142
+ "it to take effect, or use the `--deprecation-out` CLI option. " \
140
143
  "(Called from #{CallerFilter.first_non_rspec_line})"
141
144
  else
142
145
  @deprecation_stream = value
@@ -173,9 +176,9 @@ module RSpec
173
176
  # @attr value [IO] value for output, defaults to $stdout
174
177
  def output_stream=(value)
175
178
  if @reporter && !value.equal?(@output_stream)
176
- warn "RSpec's reporter has already been initialized with " +
177
- "#{output_stream.inspect} as the output stream, so your change to "+
178
- "`output_stream` will be ignored. You should configure it earlier for " +
179
+ warn "RSpec's reporter has already been initialized with " \
180
+ "#{output_stream.inspect} as the output stream, so your change to "\
181
+ "`output_stream` will be ignored. You should configure it earlier for " \
179
182
  "it to take effect. (Called from #{CallerFilter.first_non_rspec_line})"
180
183
  else
181
184
  @output_stream = value
@@ -183,17 +186,23 @@ module RSpec
183
186
  end
184
187
 
185
188
  # @macro define_reader
186
- # Load files matching this pattern (default: `'**/*_spec.rb'`)
189
+ # Load files matching this pattern (default: `'**{,/*/**}/*_spec.rb'`)
187
190
  define_reader :pattern
188
191
 
189
192
  # Set pattern to match files to load
190
193
  # @attr value [String] the filename pattern to filter spec files by
191
194
  def pattern=(value)
192
- if @spec_files_loaded
193
- RSpec.warning "Configuring `pattern` to #{value} has no effect since RSpec has already loaded the spec files."
194
- end
195
- @pattern = value
196
- @files_to_run = nil
195
+ update_pattern_attr :pattern, value
196
+ end
197
+
198
+ # @macro define_reader
199
+ # Exclude files matching this pattern
200
+ define_reader :exclude_pattern
201
+
202
+ # Set pattern to match files to exclude
203
+ # @attr value [String] the filename pattern to exclude spec files by
204
+ def exclude_pattern=(value)
205
+ update_pattern_attr :exclude_pattern, value
197
206
  end
198
207
 
199
208
  # @macro add_setting
@@ -250,9 +259,9 @@ module RSpec
250
259
  # Deprecated. This config option was added in RSpec 2 to pave the way
251
260
  # for this being the default behavior in RSpec 3. Now this option is
252
261
  # a no-op.
253
- def treat_symbols_as_metadata_keys_with_true_values=(value)
262
+ def treat_symbols_as_metadata_keys_with_true_values=(_value)
254
263
  RSpec.deprecate("RSpec::Core::Configuration#treat_symbols_as_metadata_keys_with_true_values=",
255
- :message => "RSpec::Core::Configuration#treat_symbols_as_metadata_keys_with_true_values= " +
264
+ :message => "RSpec::Core::Configuration#treat_symbols_as_metadata_keys_with_true_values= " \
256
265
  "is deprecated, it is now set to true as default and setting it to false has no effect.")
257
266
  end
258
267
 
@@ -273,13 +282,16 @@ module RSpec
273
282
  attr_reader :backtrace_formatter, :ordering_manager
274
283
 
275
284
  def initialize
285
+ # rubocop:disable Style/GlobalVars
276
286
  @start_time = $_rspec_core_load_started_at || ::RSpec::Core::Time.now
287
+ # rubocop:enable Style/GlobalVars
277
288
  @expectation_frameworks = []
278
289
  @include_or_extend_modules = []
279
290
  @mock_framework = nil
280
291
  @files_or_directories_to_run = []
281
292
  @color = false
282
- @pattern = '**/*_spec.rb'
293
+ @pattern = '**{,/*/**}/*_spec.rb'
294
+ @exclude_pattern = ''
283
295
  @failure_exit_code = 1
284
296
  @spec_files_loaded = false
285
297
 
@@ -365,7 +377,13 @@ module RSpec
365
377
 
366
378
  # Returns the configured mock framework adapter module
367
379
  def mock_framework
368
- mock_with :rspec unless @mock_framework
380
+ if @mock_framework.nil?
381
+ begin
382
+ mock_with :rspec
383
+ rescue LoadError
384
+ mock_with :nothing
385
+ end
386
+ end
369
387
  @mock_framework
370
388
  end
371
389
 
@@ -413,6 +431,28 @@ module RSpec
413
431
  @backtrace_formatter.inclusion_patterns = patterns
414
432
  end
415
433
 
434
+ # Adds {#backtrace_exclusion_patterns} that will filter lines from
435
+ # the named gems from backtraces.
436
+ #
437
+ # @param gem_names [Array<String>] Names of the gems to filter
438
+ #
439
+ # @example
440
+ # RSpec.configure do |config|
441
+ # config.filter_gems_from_backtrace "rack", "rake"
442
+ # end
443
+ #
444
+ # @note The patterns this adds will match the named gems in their common
445
+ # locations (e.g. system gems, vendored with bundler, installed as a
446
+ # :git dependency with bundler, etc) but is not guaranteed to work for
447
+ # all possible gem locations. For example, if you have the gem source
448
+ # in a directory with a completely unrelated name, and use bundler's
449
+ # :path option, this will not filter it.
450
+ def filter_gems_from_backtrace(*gem_names)
451
+ gem_names.each do |name|
452
+ @backtrace_formatter.filter_gem(name)
453
+ end
454
+ end
455
+
416
456
  # @private
417
457
  MOCKING_ADAPTERS = {
418
458
  :rspec => :RSpec,
@@ -452,19 +492,20 @@ module RSpec
452
492
  # mod_config.custom_setting = true
453
493
  # end
454
494
  def mock_with(framework)
455
- framework_module = if framework.is_a?(Module)
456
- framework
457
- else
458
- const_name = MOCKING_ADAPTERS.fetch(framework) do
459
- raise ArgumentError,
460
- "Unknown mocking framework: #{framework.inspect}. " +
461
- "Pass a module or one of #{MOCKING_ADAPTERS.keys.inspect}"
495
+ framework_module =
496
+ if framework.is_a?(Module)
497
+ framework
498
+ else
499
+ const_name = MOCKING_ADAPTERS.fetch(framework) do
500
+ raise ArgumentError,
501
+ "Unknown mocking framework: #{framework.inspect}. " \
502
+ "Pass a module or one of #{MOCKING_ADAPTERS.keys.inspect}"
503
+ end
504
+
505
+ RSpec::Support.require_rspec_core "mocking_adapters/#{const_name.to_s.downcase}"
506
+ RSpec::Core::MockingAdapters.const_get(const_name)
462
507
  end
463
508
 
464
- RSpec::Support.require_rspec_core "mocking_adapters/#{const_name.to_s.downcase}"
465
- RSpec::Core::MockingAdapters.const_get(const_name)
466
- end
467
-
468
509
  new_name, old_name = [framework_module, @mock_framework].map do |mod|
469
510
  mod.respond_to?(:framework_name) ? mod.framework_name : :unnamed
470
511
  end
@@ -483,7 +524,13 @@ module RSpec
483
524
 
484
525
  # Returns the configured expectation framework adapter module(s)
485
526
  def expectation_frameworks
486
- expect_with :rspec if @expectation_frameworks.empty?
527
+ if @expectation_frameworks.empty?
528
+ begin
529
+ expect_with :rspec
530
+ rescue LoadError
531
+ expect_with Module.new
532
+ end
533
+ end
487
534
  @expectation_frameworks
488
535
  end
489
536
 
@@ -573,20 +620,20 @@ module RSpec
573
620
  # @param output [IO] an output stream to use, defaults to the current
574
621
  # `output_stream`
575
622
  # @return [Boolean]
576
- def color_enabled?(output = output_stream)
623
+ def color_enabled?(output=output_stream)
577
624
  output_to_tty?(output) && color
578
625
  end
579
626
 
580
627
  # Toggle output color
581
628
  # @attr true_or_false [Boolean] toggle color enabled
582
629
  def color=(true_or_false)
583
- if true_or_false
584
- if RSpec.world.windows_os? and not ENV['ANSICON']
585
- RSpec.warning "You must use ANSICON 1.31 or later (http://adoxa.3eeweb.com/ansicon/) to use colour on Windows"
586
- @color = false
587
- else
588
- @color = true
589
- end
630
+ return unless true_or_false
631
+
632
+ if RSpec.world.windows_os? && !ENV['ANSICON']
633
+ RSpec.warning "You must use ANSICON 1.31 or later (http://adoxa.3eeweb.com/ansicon/) to use colour on Windows"
634
+ @color = false
635
+ else
636
+ @color = true
590
637
  end
591
638
  end
592
639
 
@@ -601,7 +648,7 @@ module RSpec
601
648
  # Run examples matching on `description` in all files to run.
602
649
  # @param description [String, Regexp] the pattern to filter on
603
650
  def full_description=(description)
604
- filter_run :full_description => Regexp.union(*Array(description).map {|d| Regexp.new(d) })
651
+ filter_run :full_description => Regexp.union(*Array(description).map { |d| Regexp.new(d) })
605
652
  end
606
653
 
607
654
  # @return [Array] full description filter
@@ -816,7 +863,7 @@ module RSpec
816
863
  # specs, but does not add any additional documentation. We use this
817
864
  # in rspec to define `it_should_behave_like` (for backward
818
865
  # compatibility), but we also add docs for that method.
819
- def alias_it_behaves_like_to(new_name, report_label = '')
866
+ def alias_it_behaves_like_to(new_name, report_label='')
820
867
  RSpec::Core::ExampleGroup.define_nested_shared_group_method(new_name, report_label)
821
868
  end
822
869
  alias_method :alias_it_should_behave_like_to, :alias_it_behaves_like_to
@@ -1022,7 +1069,7 @@ module RSpec
1022
1069
  def requires=(paths)
1023
1070
  directories = ['lib', default_path].select { |p| File.directory? p }
1024
1071
  RSpec::Core::RubyProject.add_to_load_path(*directories)
1025
- paths.each {|path| require path}
1072
+ paths.each { |path| require path }
1026
1073
  @requires += paths
1027
1074
  end
1028
1075
 
@@ -1055,7 +1102,7 @@ module RSpec
1055
1102
 
1056
1103
  # @private
1057
1104
  def load_spec_files
1058
- files_to_run.uniq.each {|f| load File.expand_path(f) }
1105
+ files_to_run.uniq.each { |f| load File.expand_path(f) }
1059
1106
  @spec_files_loaded = true
1060
1107
  end
1061
1108
 
@@ -1283,16 +1330,25 @@ module RSpec
1283
1330
  end
1284
1331
 
1285
1332
  def gather_directories(path)
1333
+ include_files = get_matching_files(path, pattern)
1334
+ exclude_files = get_matching_files(path, exclude_pattern)
1335
+ (include_files - exclude_files).sort.uniq
1336
+ end
1337
+
1338
+ def get_matching_files(path, pattern)
1286
1339
  stripped = "{#{pattern.gsub(/\s*,\s*/, ',')}}"
1287
- files = pattern =~ /^#{Regexp.escape path}/ ? Dir[stripped] : Dir["#{path}/#{stripped}"]
1288
- files.sort
1340
+ pattern =~ /^#{Regexp.escape path}/ ? Dir[stripped] : Dir["#{path}/#{stripped}"]
1289
1341
  end
1290
1342
 
1291
1343
  def extract_location(path)
1292
- if path =~ /^(.*?)((?:\:\d+)+)$/
1293
- path, lines = $1, $2[1..-1].split(":").map{|n| n.to_i}
1344
+ match = /^(.*?)((?:\:\d+)+)$/.match(path)
1345
+
1346
+ if match
1347
+ captures = match.captures
1348
+ path, lines = captures[0], captures[1][1..-1].split(":").map { |n| n.to_i }
1294
1349
  filter_manager.add_location path, lines
1295
1350
  end
1351
+
1296
1352
  path
1297
1353
  end
1298
1354
 
@@ -1301,16 +1357,16 @@ module RSpec
1301
1357
  end
1302
1358
 
1303
1359
  def value_for(key, default=nil)
1304
- @preferred_options.has_key?(key) ? @preferred_options[key] : default
1360
+ @preferred_options.key?(key) ? @preferred_options[key] : default
1305
1361
  end
1306
1362
 
1307
1363
  def assert_no_example_groups_defined(config_option)
1308
- if RSpec.world.example_groups.any?
1309
- raise MustBeConfiguredBeforeExampleGroupsError.new(
1310
- "RSpec's #{config_option} configuration option must be configured before " +
1311
- "any example groups are defined, but you have already defined a group."
1312
- )
1313
- end
1364
+ return unless RSpec.world.example_groups.any?
1365
+
1366
+ raise MustBeConfiguredBeforeExampleGroupsError.new(
1367
+ "RSpec's #{config_option} configuration option must be configured before " \
1368
+ "any example groups are defined, but you have already defined a group."
1369
+ )
1314
1370
  end
1315
1371
 
1316
1372
  def output_to_tty?(output=output_stream)
@@ -1339,6 +1395,16 @@ module RSpec
1339
1395
  def rspec_expectations_loaded?
1340
1396
  defined?(RSpec::Expectations.configuration)
1341
1397
  end
1398
+
1399
+ def update_pattern_attr(name, value)
1400
+ if @spec_files_loaded
1401
+ RSpec.warning "Configuring `#{name}` to #{value} has no effect since RSpec has already loaded the spec files."
1402
+ end
1403
+
1404
+ instance_variable_set(:"@#{name}", value)
1405
+ @files_to_run = nil
1406
+ end
1342
1407
  end
1408
+ # rubocop:enable Style/ClassLength
1343
1409
  end
1344
1410
  end