rspec-core 2.13.1 → 2.14.0.rc1

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.
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)