rspec-core 2.13.1 → 2.14.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. data/Changelog.md +80 -0
  2. data/exe/autospec +1 -1
  3. data/features/README.md +2 -2
  4. data/features/command_line/format_option.feature +8 -14
  5. data/features/command_line/line_number_appended_to_path.feature +4 -4
  6. data/features/command_line/line_number_option.feature +1 -1
  7. data/features/command_line/rake_task.feature +2 -2
  8. data/features/command_line/require_option.feature +43 -0
  9. data/features/command_line/ruby.feature +2 -2
  10. data/features/command_line/warnings_option.feature +27 -0
  11. data/features/configuration/backtrace_clean_patterns.feature +2 -2
  12. data/features/configuration/deprecation_stream.feature +58 -0
  13. data/features/configuration/pattern.feature +8 -0
  14. data/features/configuration/profile.feature +59 -2
  15. data/features/configuration/read_options_from_file.feature +8 -5
  16. data/features/configuration/run_all_when_everything_filtered.feature +20 -4
  17. data/features/example_groups/basic_structure.feature +1 -1
  18. data/features/example_groups/shared_context.feature +1 -1
  19. data/features/example_groups/shared_examples.feature +72 -0
  20. data/features/filtering/exclusion_filters.feature +10 -10
  21. data/features/formatters/custom_formatter.feature +1 -1
  22. data/features/hooks/before_and_after_hooks.feature +19 -19
  23. data/features/mock_framework_integration/use_any_framework.feature +6 -6
  24. data/features/mock_framework_integration/use_flexmock.feature +3 -3
  25. data/features/mock_framework_integration/use_mocha.feature +3 -3
  26. data/features/mock_framework_integration/use_rr.feature +3 -3
  27. data/features/mock_framework_integration/use_rspec.feature +3 -3
  28. data/features/subject/implicit_subject.feature +1 -1
  29. data/lib/rspec/core.rb +20 -3
  30. data/lib/rspec/core/backtrace_cleaner.rb +46 -0
  31. data/lib/rspec/core/backward_compatibility.rb +3 -13
  32. data/lib/rspec/core/configuration.rb +136 -49
  33. data/lib/rspec/core/configuration_options.rb +19 -8
  34. data/lib/rspec/core/deprecation.rb +18 -30
  35. data/lib/rspec/core/example.rb +3 -3
  36. data/lib/rspec/core/example_group.rb +4 -3
  37. data/lib/rspec/core/extensions/kernel.rb +1 -1
  38. data/lib/rspec/core/filter_manager.rb +1 -1
  39. data/lib/rspec/core/formatters.rb +1 -1
  40. data/lib/rspec/core/formatters/base_formatter.rb +10 -1
  41. data/lib/rspec/core/formatters/base_text_formatter.rb +47 -10
  42. data/lib/rspec/core/formatters/deprecation_formatter.rb +35 -0
  43. data/lib/rspec/core/formatters/helpers.rb +12 -5
  44. data/lib/rspec/core/formatters/html_formatter.rb +7 -6
  45. data/lib/rspec/core/formatters/html_printer.rb +13 -12
  46. data/lib/rspec/core/formatters/json_formatter.rb +1 -2
  47. data/lib/rspec/core/formatters/text_mate_formatter.rb +1 -1
  48. data/lib/rspec/core/hooks.rb +9 -0
  49. data/lib/rspec/core/memoized_helpers.rb +19 -8
  50. data/lib/rspec/core/metadata.rb +3 -1
  51. data/lib/rspec/core/mocking/with_flexmock.rb +1 -1
  52. data/lib/rspec/core/mocking/with_rr.rb +1 -1
  53. data/lib/rspec/core/option_parser.rb +6 -2
  54. data/lib/rspec/core/pending.rb +1 -0
  55. data/lib/rspec/core/rake_task.rb +11 -19
  56. data/lib/rspec/core/reporter.rb +33 -4
  57. data/lib/rspec/core/shared_example_group.rb +56 -16
  58. data/lib/rspec/core/shared_example_group/collection.rb +42 -0
  59. data/lib/rspec/core/version.rb +1 -1
  60. data/lib/rspec/core/world.rb +2 -3
  61. data/spec/autotest/rspec_spec.rb +2 -2
  62. data/spec/rspec/core/backtrace_cleaner_spec.rb +68 -0
  63. data/spec/rspec/core/configuration_options_spec.rb +15 -4
  64. data/spec/rspec/core/configuration_spec.rb +202 -19
  65. data/spec/rspec/core/deprecation_spec.rb +41 -0
  66. data/spec/rspec/core/deprecations_spec.rb +10 -12
  67. data/spec/rspec/core/drb_command_line_spec.rb +1 -1
  68. data/spec/rspec/core/example_group_spec.rb +37 -36
  69. data/spec/rspec/core/example_spec.rb +25 -4
  70. data/spec/rspec/core/filter_manager_spec.rb +6 -6
  71. data/spec/rspec/core/formatters/base_text_formatter_spec.rb +101 -36
  72. data/spec/rspec/core/formatters/deprecation_formatter_spec.rb +78 -0
  73. data/spec/rspec/core/formatters/documentation_formatter_spec.rb +2 -2
  74. data/spec/rspec/core/formatters/helpers_spec.rb +23 -7
  75. data/spec/rspec/core/formatters/html_formatted-1.8.7-jruby.html +20 -14
  76. data/spec/rspec/core/formatters/html_formatted-1.8.7-rbx.html +69 -169
  77. data/spec/rspec/core/formatters/html_formatted-1.8.7.html +28 -23
  78. data/spec/rspec/core/formatters/html_formatted-1.9.2.html +42 -33
  79. data/spec/rspec/core/formatters/html_formatted-1.9.3-jruby.html +17 -23
  80. data/spec/rspec/core/formatters/html_formatted-1.9.3-rbx.html +57 -157
  81. data/spec/rspec/core/formatters/html_formatted-1.9.3.html +42 -33
  82. data/spec/rspec/core/formatters/html_formatted-2.0.0.html +42 -33
  83. data/spec/rspec/core/formatters/html_formatter_spec.rb +1 -0
  84. data/spec/rspec/core/formatters/progress_formatter_spec.rb +3 -3
  85. data/spec/rspec/core/formatters/text_mate_formatted-1.8.7-jruby.html +11 -14
  86. data/spec/rspec/core/formatters/text_mate_formatted-1.8.7-rbx.html +103 -203
  87. data/spec/rspec/core/formatters/text_mate_formatted-1.8.7.html +30 -25
  88. data/spec/rspec/core/formatters/text_mate_formatted-1.9.2.html +42 -33
  89. data/spec/rspec/core/formatters/text_mate_formatted-1.9.3-jruby.html +20 -14
  90. data/spec/rspec/core/formatters/text_mate_formatted-1.9.3-rbx.html +103 -203
  91. data/spec/rspec/core/formatters/text_mate_formatted-1.9.3.html +42 -33
  92. data/spec/rspec/core/formatters/text_mate_formatted-2.0.0.html +42 -33
  93. data/spec/rspec/core/formatters/text_mate_formatter_spec.rb +1 -0
  94. data/spec/rspec/core/memoized_helpers_spec.rb +28 -0
  95. data/spec/rspec/core/metadata_spec.rb +8 -3
  96. data/spec/rspec/core/option_parser_spec.rb +8 -0
  97. data/spec/rspec/core/project_initializer_spec.rb +2 -2
  98. data/spec/rspec/core/rake_task_spec.rb +8 -8
  99. data/spec/rspec/core/reporter_spec.rb +26 -6
  100. data/spec/rspec/core/resources/formatter_specs.rb +3 -3
  101. data/spec/rspec/core/shared_context_spec.rb +20 -0
  102. data/spec/rspec/core/shared_example_group/collection_spec.rb +70 -0
  103. data/spec/rspec/core/shared_example_group_spec.rb +4 -4
  104. data/spec/rspec/core/world_spec.rb +1 -3
  105. data/spec/rspec/core_spec.rb +20 -0
  106. data/spec/spec_helper.rb +29 -29
  107. data/spec/support/helper_methods.rb +9 -1
  108. data/spec/support/isolate_load_path_mutation.rb +6 -0
  109. data/spec/support/sandboxed_mock_space.rb +100 -0
  110. metadata +28 -13
  111. data/features/filtering/run_all_when_everything_filtered.feature +0 -46
  112. data/lib/rspec/core/load_path.rb +0 -3
@@ -19,7 +19,7 @@ Feature: mock with rspec
19
19
  end
20
20
  """
21
21
  When I run `rspec example_spec.rb`
22
- Then the examples should all pass
22
+ Then the examples should all pass
23
23
 
24
24
  Scenario: failing message expecation
25
25
  Given a file named "example_spec.rb" with:
@@ -80,7 +80,7 @@ Feature: mock with rspec
80
80
  Then the output should contain "1 example, 1 failure"
81
81
  And the exit status should be 1
82
82
 
83
- Scenario: accessing RSpec.configuration.mock_framework.framework_name
83
+ Scenario: accessing RSpec.configuration.mock_framework.framework_name
84
84
  Given a file named "example_spec.rb" with:
85
85
  """ruby
86
86
  RSpec.configure do |config|
@@ -94,4 +94,4 @@ Feature: mock with rspec
94
94
  end
95
95
  """
96
96
  When I run `rspec example_spec.rb`
97
- Then the examples should all pass
97
+ Then the examples should all pass
@@ -6,7 +6,7 @@ Feature: implicitly defined subject
6
6
  While the examples below demonstrate how `subject` can be used as a
7
7
  user-facing concept, we recommend that you reserve it for support of custom
8
8
  matchers and/or extension libraries that hide its use from examples.
9
-
9
+
10
10
  Scenario: subject exposed in top level group
11
11
  Given a file named "top_level_subject_spec.rb" with:
12
12
  """ruby
@@ -9,6 +9,7 @@ else
9
9
  end
10
10
 
11
11
  require 'set'
12
+ require 'time'
12
13
  require 'rbconfig'
13
14
  require_rspec['core/filter_manager']
14
15
  require_rspec['core/dsl']
@@ -16,7 +17,6 @@ require_rspec['core/extensions/kernel']
16
17
  require_rspec['core/extensions/instance_eval_with_args']
17
18
  require_rspec['core/extensions/module_eval_with_args']
18
19
  require_rspec['core/extensions/ordered']
19
- require_rspec['core/load_path']
20
20
  require_rspec['core/deprecation']
21
21
  require_rspec['core/backward_compatibility']
22
22
  require_rspec['core/reporter']
@@ -36,6 +36,7 @@ require_rspec['core/configuration_options']
36
36
  require_rspec['core/command_line']
37
37
  require_rspec['core/runner']
38
38
  require_rspec['core/example']
39
+ require_rspec['core/shared_example_group/collection']
39
40
  require_rspec['core/shared_example_group']
40
41
  require_rspec['core/example_group']
41
42
  require_rspec['core/version']
@@ -61,6 +62,12 @@ module RSpec
61
62
  @world ||= RSpec::Core::World.new
62
63
  end
63
64
 
65
+ # @private
66
+ # Used internally to set the global object
67
+ def self.world=(new_world)
68
+ @world = new_world
69
+ end
70
+
64
71
  # @private
65
72
  # Used internally to ensure examples get reloaded between multiple runs in
66
73
  # the same process.
@@ -95,6 +102,12 @@ WARNING
95
102
  @configuration ||= RSpec::Core::Configuration.new
96
103
  end
97
104
 
105
+ # @private
106
+ # Used internally to set the global object
107
+ def self.configuration=(new_configuration)
108
+ @configuration = new_configuration
109
+ end
110
+
98
111
  # Yields the global configuration to a block.
99
112
  # @yield [Configuration] global configuration
100
113
  #
@@ -115,7 +128,7 @@ WARNING
115
128
 
116
129
  # @private
117
130
  def self.windows_os?
118
- /mswin|mingw/ === ::RbConfig::CONFIG['host_os']
131
+ RbConfig::CONFIG['host_os'] =~ /cygwin|mswin|mingw|bccwin|wince|emx/
119
132
  end
120
133
 
121
134
  module Core
@@ -123,7 +136,11 @@ WARNING
123
136
  # This avoids issues with reporting time caused by examples that
124
137
  # change the value/meaning of Time.now without properly restoring
125
138
  # it.
126
- Time = ::Time.dup
139
+ class Time
140
+ class << self
141
+ define_method(:now,&::Time.method(:now))
142
+ end
143
+ end
127
144
  end
128
145
 
129
146
  def self.const_missing(name)
@@ -0,0 +1,46 @@
1
+ module RSpec
2
+ module Core
3
+ class BacktraceCleaner
4
+
5
+ DEFAULT_EXCLUSION_PATTERNS = [
6
+ /\/lib\d*\/ruby\//,
7
+ /org\/jruby\//,
8
+ /bin\//,
9
+ %r|/gems/|,
10
+ /spec\/spec_helper\.rb/,
11
+ /lib\/rspec\/(core|expectations|matchers|mocks)/
12
+ ]
13
+
14
+ attr_accessor :inclusion_patterns
15
+ attr_accessor :exclusion_patterns
16
+
17
+ def initialize(inclusion_patterns=nil, exclusion_patterns=DEFAULT_EXCLUSION_PATTERNS.dup)
18
+ @exclusion_patterns = exclusion_patterns
19
+
20
+ if inclusion_patterns.nil?
21
+ @inclusion_patterns = (matches_an_exclusion_pattern? Dir.getwd) ? [Regexp.new(Dir.getwd)] : []
22
+ else
23
+ @inclusion_patterns = inclusion_patterns
24
+ end
25
+ end
26
+
27
+ def exclude?(line)
28
+ @inclusion_patterns.none? {|p| line =~ p} and matches_an_exclusion_pattern?(line)
29
+ end
30
+
31
+ def full_backtrace=(true_or_false)
32
+ @exclusion_patterns = true_or_false ? [] : DEFAULT_EXCLUSION_PATTERNS.dup
33
+ end
34
+
35
+ def full_backtrace?
36
+ @exclusion_patterns.empty?
37
+ end
38
+
39
+ private
40
+
41
+ def matches_an_exclusion_pattern?(line)
42
+ @exclusion_patterns.any? {|p| line =~ p}
43
+ end
44
+ end
45
+ end
46
+ end
@@ -7,17 +7,7 @@ module RSpec
7
7
  def const_missing(name)
8
8
  case name
9
9
  when :Rspec, :Spec
10
- RSpec.warn_deprecation <<-WARNING
11
- *****************************************************************
12
- DEPRECATION WARNING: you are using a deprecated constant that will
13
- be removed from a future version of RSpec.
14
-
15
- #{caller(0)[2]}
16
-
17
- * #{name} is deprecated.
18
- * RSpec is the new top-level module in RSpec-2
19
- *****************************************************************
20
- WARNING
10
+ RSpec.deprecate(name.to_s, :replacement => "RSpec")
21
11
  RSpec
22
12
  else
23
13
  begin
@@ -34,7 +24,7 @@ WARNING
34
24
  module Runner
35
25
  # @deprecated use RSpec.configure instead.
36
26
  def self.configure(&block)
37
- RSpec.deprecate("Spec::Runner.configure", "RSpec.configure")
27
+ RSpec.deprecate("Spec::Runner.configure", :replacement => "RSpec.configure")
38
28
  RSpec.configure(&block)
39
29
  end
40
30
  end
@@ -46,7 +36,7 @@ WARNING
46
36
  def self.const_missing(name)
47
37
  case name
48
38
  when :SpecTask
49
- RSpec.deprecate("Spec::Rake::SpecTask", "RSpec::Core::RakeTask")
39
+ RSpec.deprecate("Spec::Rake::SpecTask", :replacement => "RSpec::Core::RakeTask")
50
40
  require 'rspec/core/rake_task'
51
41
  RSpec::Core::RakeTask
52
42
  else
@@ -1,4 +1,7 @@
1
1
  require 'fileutils'
2
+ require 'rspec/core/backtrace_cleaner'
3
+ require 'rspec/core/ruby_project'
4
+ require 'rspec/core/formatters/deprecation_formatter.rb'
2
5
 
3
6
  module RSpec
4
7
  module Core
@@ -32,19 +35,15 @@ module RSpec
32
35
 
33
36
  # @private
34
37
  def self.define_reader(name)
35
- eval <<-CODE
36
- def #{name}
37
- value_for(#{name.inspect}, defined?(@#{name}) ? @#{name} : nil)
38
- end
39
- CODE
38
+ define_method(name) do
39
+ variable = instance_variable_defined?("@#{name}") ? instance_variable_get("@#{name}") : nil
40
+ value_for(name, variable)
41
+ end
40
42
  end
41
43
 
42
44
  # @private
43
45
  def self.deprecate_alias_key
44
- RSpec.warn_deprecation <<-MESSAGE
45
- The :alias option to add_setting is deprecated. Use :alias_with on the original setting instead.
46
- Called from #{caller(0)[5]}
47
- MESSAGE
46
+ RSpec.deprecate("add_setting with :alias option", :replacement => ":alias_with")
48
47
  end
49
48
 
50
49
  # @private
@@ -80,15 +79,6 @@ MESSAGE
80
79
 
81
80
  # @macro [attach] add_setting
82
81
  # @attribute $1
83
- # Patterns to match against lines in backtraces presented in failure
84
- # messages in order to filter them out (default:
85
- # DEFAULT_BACKTRACE_PATTERNS). You can either replace this list using
86
- # the setter or modify it using the getter.
87
- #
88
- # To override this behavior and display a full backtrace, use
89
- # `--backtrace` on the command line, in a `.rspec` file, or in the
90
- # `rspec_options` attribute of RSpec's rake task.
91
- add_setting :backtrace_clean_patterns
92
82
 
93
83
  # Path to use if no path is provided to the `rspec` command (default:
94
84
  # `"spec"`). Allows you to just type `rspec` instead of `rspec spec` to
@@ -105,6 +95,9 @@ MESSAGE
105
95
  # Default: `$stderr`.
106
96
  add_setting :error_stream
107
97
 
98
+ # Default: `$stderr`.
99
+ add_setting :deprecation_stream
100
+
108
101
  # Clean up and exit after the first failure (default: `false`).
109
102
  add_setting :fail_fast
110
103
 
@@ -115,6 +108,12 @@ MESSAGE
115
108
  # load order for files, declaration order for groups and examples).
116
109
  define_reader :order
117
110
 
111
+ # Indicates files configured to be required
112
+ define_reader :requires
113
+
114
+ # Returns dirs that have been prepended to the load path by #lib=
115
+ define_reader :libs
116
+
118
117
  # Default: `$stdout`.
119
118
  # Also known as `output` and `out`
120
119
  add_setting :output_stream, :alias_with => [:output, :out]
@@ -182,14 +181,7 @@ MESSAGE
182
181
  # @private
183
182
  attr_accessor :filter_manager
184
183
 
185
- DEFAULT_BACKTRACE_PATTERNS = [
186
- /\/lib\d*\/ruby\//,
187
- /org\/jruby\//,
188
- /bin\//,
189
- %r|/gems/|,
190
- /spec\/spec_helper\.rb/,
191
- /lib\/rspec\/(core|expectations|matchers|mocks)/
192
- ]
184
+ attr_reader :backtrace_cleaner
193
185
 
194
186
  def initialize
195
187
  @expectation_frameworks = []
@@ -200,8 +192,11 @@ MESSAGE
200
192
  @color = false
201
193
  @pattern = '**/*_spec.rb'
202
194
  @failure_exit_code = 1
203
- @backtrace_clean_patterns = DEFAULT_BACKTRACE_PATTERNS.dup
195
+
196
+ @backtrace_cleaner = BacktraceCleaner.new
197
+
204
198
  @default_path = 'spec'
199
+ @deprecation_stream = $stderr
205
200
  @filter_manager = FilterManager.new
206
201
  @preferred_options = {}
207
202
  @seed = srand % 0xFFFF
@@ -212,6 +207,8 @@ MESSAGE
212
207
  @fixed_color = :blue
213
208
  @detail_color = :cyan
214
209
  @profile_examples = false
210
+ @requires = []
211
+ @libs = []
215
212
  end
216
213
 
217
214
  # @private
@@ -224,6 +221,7 @@ MESSAGE
224
221
  set_order_and_seed(hash)
225
222
  end
226
223
  @preferred_options.merge!(hash)
224
+ self.warnings = value_for :warnings, nil
227
225
  end
228
226
 
229
227
  # @private
@@ -275,15 +273,6 @@ MESSAGE
275
273
  send("#{name}=", default) if default
276
274
  end
277
275
 
278
- # Used by formatters to ask whether a backtrace line should be displayed
279
- # or not, based on the line matching any `backtrace_clean_patterns`.
280
- def cleaned_from_backtrace?(line)
281
- # TODO (David 2011-12-25) why are we asking the configuration to do
282
- # stuff? Either use the patterns directly or enapsulate the filtering
283
- # in a BacktraceCleaner object.
284
- backtrace_clean_patterns.any? { |regex| line =~ regex }
285
- end
286
-
287
276
  # Returns the configured mock framework adapter module
288
277
  def mock_framework
289
278
  mock_with :rspec unless @mock_framework
@@ -295,6 +284,62 @@ MESSAGE
295
284
  mock_with framework
296
285
  end
297
286
 
287
+ # The patterns to discard from backtraces. Deprecated, use
288
+ # Configuration#backtrace_exclusion_patterns instead
289
+ #
290
+ # Defaults to RSpec::Core::BacktraceCleaner::DEFAULT_EXCLUSION_PATTERNS
291
+ #
292
+ # One can replace the list by using the setter or modify it through the
293
+ # getter
294
+ #
295
+ # To override this behaviour and display a full backtrace, use
296
+ # `--backtrace`on the command line, in a `.rspec` file, or in the
297
+ # `rspec_options` attribute of RSpec's rake task.
298
+ def backtrace_clean_patterns
299
+ RSpec.deprecate("RSpec::Core::Configuration#backtrace_clean_patterns",
300
+ :replacement => "RSpec::Core::Configuration#backtrace_exclusion_patterns")
301
+ @backtrace_cleaner.exclusion_patterns
302
+ end
303
+
304
+ def backtrace_clean_patterns=(patterns)
305
+ RSpec.deprecate("RSpec::Core::Configuration#backtrace_clean_patterns",
306
+ :replacement => "RSpec::Core::Configuration#backtrace_exclusion_patterns")
307
+ @backtrace_cleaner.exclusion_patterns = patterns
308
+ end
309
+
310
+ # The patterns to always include to backtraces.
311
+ #
312
+ # Defaults to [Regexp.new Dir.getwd] if the current working directory
313
+ # matches any of the exclusion patterns. Otherwise it defaults to empty.
314
+ #
315
+ # One can replace the list by using the setter or modify it through the
316
+ # getter
317
+ def backtrace_inclusion_patterns
318
+ @backtrace_cleaner.inclusion_patterns
319
+ end
320
+
321
+ def backtrace_inclusion_patterns=(patterns)
322
+ @backtrace_cleaner.inclusion_patterns = patterns
323
+ end
324
+
325
+ # The patterns to discard from backtraces.
326
+ #
327
+ # Defaults to RSpec::Core::BacktraceCleaner::DEFAULT_EXCLUSION_PATTERNS
328
+ #
329
+ # One can replace the list by using the setter or modify it through the
330
+ # getter
331
+ #
332
+ # To override this behaviour and display a full backtrace, use
333
+ # `--backtrace`on the command line, in a `.rspec` file, or in the
334
+ # `rspec_options` attribute of RSpec's rake task.
335
+ def backtrace_exclusion_patterns
336
+ @backtrace_cleaner.exclusion_patterns
337
+ end
338
+
339
+ def backtrace_exclusion_patterns=(patterns)
340
+ @backtrace_cleaner.exclusion_patterns = patterns
341
+ end
342
+
298
343
  # Sets the mock framework adapter module.
299
344
  #
300
345
  # `framework` can be a Symbol or a Module.
@@ -423,8 +468,12 @@ MESSAGE
423
468
  @expectation_frameworks.push(*modules)
424
469
  end
425
470
 
471
+ def full_backtrace?
472
+ @backtrace_cleaner.full_backtrace?
473
+ end
474
+
426
475
  def full_backtrace=(true_or_false)
427
- @backtrace_clean_patterns = true_or_false ? [] : DEFAULT_BACKTRACE_PATTERNS
476
+ @backtrace_cleaner.full_backtrace = true_or_false
428
477
  end
429
478
 
430
479
  def color(output=output_stream)
@@ -453,11 +502,17 @@ MESSAGE
453
502
  define_predicate_for :color_enabled, :color
454
503
 
455
504
  def libs=(libs)
456
- libs.map {|lib| $LOAD_PATH.unshift lib}
505
+ libs.map do |lib|
506
+ @libs.unshift lib
507
+ $LOAD_PATH.unshift lib
508
+ end
457
509
  end
458
510
 
459
511
  def requires=(paths)
512
+ RSpec.deprecate("RSpec::Core::Configuration#requires=(paths)",
513
+ :replacement => "paths.each {|path| require path}")
460
514
  paths.map {|path| require path}
515
+ @requires += paths
461
516
  end
462
517
 
463
518
  def debug=(bool)
@@ -481,15 +536,27 @@ EOM
481
536
  end
482
537
  end
483
538
 
539
+ def debug?
540
+ !!defined?(Debugger)
541
+ end
542
+
484
543
  # Run examples defined on `line_numbers` in all files to run.
485
544
  def line_numbers=(line_numbers)
486
545
  filter_run :line_numbers => line_numbers.map{|l| l.to_i}
487
546
  end
488
547
 
548
+ def line_numbers
549
+ filter.fetch(:line_numbers,[])
550
+ end
551
+
489
552
  def full_description=(description)
490
553
  filter_run :full_description => Regexp.union(*Array(description).map {|d| Regexp.new(d) })
491
554
  end
492
555
 
556
+ def full_description
557
+ filter.fetch :full_description, nil
558
+ end
559
+
493
560
  # @overload add_formatter(formatter)
494
561
  #
495
562
  # Adds a formatter to the formatters collection. `formatter` can be a
@@ -499,15 +566,16 @@ EOM
499
566
  # ### Note
500
567
  #
501
568
  # For internal purposes, `add_formatter` also accepts the name of a class
502
- # and path to a file that contains that class definition, but you should
503
- # consider that a private api that may change at any time without notice.
504
- def add_formatter(formatter_to_use, path=nil)
569
+ # and paths to use for output streams, but you should consider that a
570
+ # private api that may change at any time without notice.
571
+ def add_formatter(formatter_to_use, *paths)
505
572
  formatter_class =
506
573
  built_in_formatter(formatter_to_use) ||
507
574
  custom_formatter(formatter_to_use) ||
508
575
  (raise ArgumentError, "Formatter '#{formatter_to_use}' unknown - maybe you meant 'documentation' or 'progress'?.")
509
576
 
510
- formatters << formatter_class.new(path ? file_at(path) : output)
577
+ paths << output if paths.empty?
578
+ formatters << formatter_class.new(*paths.map {|p| String === p ? file_at(p) : p})
511
579
  end
512
580
 
513
581
  alias_method :formatter=, :add_formatter
@@ -519,6 +587,7 @@ EOM
519
587
  def reporter
520
588
  @reporter ||= begin
521
589
  add_formatter('progress') if formatters.empty?
590
+ add_formatter(RSpec::Core::Formatters::DeprecationFormatter, deprecation_stream, output_stream)
522
591
  Reporter.new(*formatters)
523
592
  end
524
593
  end
@@ -791,6 +860,14 @@ EOM
791
860
  host.send(:include,mod) unless host < mod
792
861
  end
793
862
 
863
+ # @private
864
+ def setup_load_path_and_require(paths)
865
+ directories = ['lib', default_path].select { |p| File.directory? p }
866
+ RSpec::Core::RubyProject.add_to_load_path(*directories)
867
+ paths.each {|path| require path}
868
+ @requires += paths
869
+ end
870
+
794
871
  # @private
795
872
  if RUBY_VERSION.to_f >= 1.9
796
873
  def safe_extend(mod, host)
@@ -863,7 +940,9 @@ EOM
863
940
  # @private
864
941
  RANDOM_ORDERING = lambda do |list|
865
942
  Kernel.srand RSpec.configuration.seed
866
- list.sort_by { Kernel.rand(list.size) }
943
+ ordering = list.sort_by { Kernel.rand(list.size) }
944
+ Kernel.srand # reset random generation
945
+ ordering
867
946
  end
868
947
 
869
948
  # Sets a strategy by which to order examples.
@@ -930,20 +1009,28 @@ EOM
930
1009
  order_examples(&block)
931
1010
  end
932
1011
 
1012
+ # Set Ruby warnings on or off
1013
+ def warnings= value
1014
+ $VERBOSE = !!value
1015
+ end
1016
+
1017
+ def warnings
1018
+ $VERBOSE
1019
+ end
1020
+
933
1021
  private
934
1022
 
935
1023
  def get_files_to_run(paths)
936
- patterns = pattern.split(",")
937
1024
  paths.map do |path|
938
1025
  path = path.gsub(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR
939
- File.directory?(path) ? gather_directories(path, patterns) : extract_location(path)
1026
+ File.directory?(path) ? gather_directories(path) : extract_location(path)
940
1027
  end.flatten.sort
941
1028
  end
942
1029
 
943
- def gather_directories(path, patterns)
944
- patterns.map do |pattern|
945
- pattern =~ /^#{path}/ ? Dir[pattern.strip].sort : Dir["#{path}/{#{pattern.strip}}"].sort
946
- end
1030
+ def gather_directories(path)
1031
+ stripped = "{#{pattern.gsub(/\s*,\s*/, ',')}}"
1032
+ files = pattern =~ /^#{Regexp.escape path}/ ? Dir[stripped] : Dir["#{path}/#{stripped}"]
1033
+ files.sort
947
1034
  end
948
1035
 
949
1036
  def extract_location(path)