rspec-core 2.99.0.beta2 → 2.99.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 (53) hide show
  1. checksums.yaml +7 -0
  2. data/Changelog.md +122 -43
  3. data/features/command_line/line_number_option.feature +6 -11
  4. data/features/configuration/read_options_from_file.feature +2 -2
  5. data/features/expectation_framework_integration/configure_expectation_framework.feature +120 -25
  6. data/lib/autotest/discover.rb +10 -1
  7. data/lib/autotest/rspec2.rb +1 -1
  8. data/lib/rspec/core/command_line.rb +16 -5
  9. data/lib/rspec/core/configuration.rb +151 -119
  10. data/lib/rspec/core/deprecated_mutable_array_proxy.rb +32 -0
  11. data/lib/rspec/core/example.rb +3 -1
  12. data/lib/rspec/core/example_group.rb +174 -125
  13. data/lib/rspec/core/filter_manager.rb +48 -10
  14. data/lib/rspec/core/formatters.rb +137 -0
  15. data/lib/rspec/core/formatters/base_text_formatter.rb +25 -29
  16. data/lib/rspec/core/formatters/console_codes.rb +42 -0
  17. data/lib/rspec/core/formatters/deprecation_formatter.rb +14 -5
  18. data/lib/rspec/core/formatters/helpers.rb +1 -1
  19. data/lib/rspec/core/memoized_helpers.rb +2 -1
  20. data/lib/rspec/core/metadata.rb +63 -1
  21. data/lib/rspec/core/minitest_assertions_adapter.rb +28 -0
  22. data/lib/rspec/core/option_parser.rb +20 -1
  23. data/lib/rspec/core/pending.rb +26 -4
  24. data/lib/rspec/core/reporter.rb +1 -1
  25. data/lib/rspec/core/runner.rb +2 -2
  26. data/lib/rspec/core/shared_example_group.rb +11 -4
  27. data/lib/rspec/core/test_unit_assertions_adapter.rb +30 -0
  28. data/lib/rspec/core/version.rb +1 -1
  29. data/lib/rspec/core/world.rb +2 -2
  30. data/spec/autotest/discover_spec.rb +38 -8
  31. data/spec/rspec/core/command_line_spec.rb +47 -29
  32. data/spec/rspec/core/configuration_options_spec.rb +1 -1
  33. data/spec/rspec/core/configuration_spec.rb +223 -37
  34. data/spec/rspec/core/example_group_spec.rb +116 -6
  35. data/spec/rspec/core/formatters/base_text_formatter_spec.rb +24 -4
  36. data/spec/rspec/core/formatters/console_codes_spec.rb +50 -0
  37. data/spec/rspec/core/formatters/deprecation_formatter_spec.rb +20 -3
  38. data/spec/rspec/core/formatters/documentation_formatter_spec.rb +1 -0
  39. data/spec/rspec/core/formatters/html_formatted.html +3 -4
  40. data/spec/rspec/core/formatters/html_formatter_spec.rb +10 -4
  41. data/spec/rspec/core/formatters/text_mate_formatted.html +3 -4
  42. data/spec/rspec/core/formatters/text_mate_formatter_spec.rb +9 -3
  43. data/spec/rspec/core/hooks_filtering_spec.rb +5 -5
  44. data/spec/rspec/core/memoized_helpers_spec.rb +38 -0
  45. data/spec/rspec/core/metadata_spec.rb +24 -1
  46. data/spec/rspec/core/option_parser_spec.rb +39 -2
  47. data/spec/rspec/core/pending_example_spec.rb +14 -0
  48. data/spec/rspec/core/pending_spec.rb +27 -0
  49. data/spec/rspec/core/runner_spec.rb +3 -3
  50. data/spec/rspec/core/shared_context_spec.rb +1 -1
  51. data/spec/rspec/core/shared_example_group_spec.rb +18 -0
  52. data/spec/support/helper_methods.rb +4 -0
  53. metadata +105 -106
@@ -27,17 +27,13 @@ Feature: --line_number option
27
27
 
28
28
  end
29
29
  """
30
- When I run `rspec example_spec.rb --line_number 5 --format doc`
30
+ When I run `rspec example_spec.rb --line_number 5`
31
31
  Then the examples should all pass
32
- And the output should contain "should be > 8"
33
- But the output should not contain "should be < 10"
34
- And the output should not contain "should be 3*3"
32
+ And the output should contain "1 example"
35
33
 
36
- When I run `rspec example_spec.rb --line_number 5 --line_number 9 --format doc`
34
+ When I run `rspec example_spec.rb --line_number 5 --line_number 9`
37
35
  Then the examples should all pass
38
- And the output should contain "should be > 8"
39
- And the output should contain "should be < 10"
40
- But the output should not contain "should be 3*3"
36
+ And the output should contain "2 examples"
41
37
 
42
38
  Scenario: one liner
43
39
  Given a file named "example_spec.rb" with:
@@ -52,7 +48,6 @@ Feature: --line_number option
52
48
 
53
49
  end
54
50
  """
55
- When I run `rspec example_spec.rb --line_number 5 --format doc`
51
+ When I run `rspec example_spec.rb --line_number 5`
56
52
  Then the examples should all pass
57
- Then the output should contain "should be > 8"
58
- But the output should not contain "should be < 10"
53
+ And the output should contain "1 example"
@@ -19,7 +19,7 @@ Feature: read command line configuration options from files
19
19
  """
20
20
  And a file named "spec/example_spec.rb" with:
21
21
  """ruby
22
- describe "color_enabled" do
22
+ describe "color" do
23
23
  context "when set with RSpec.configure" do
24
24
  before do
25
25
  # color is disabled for non-tty output, so stub the output stream
@@ -66,7 +66,7 @@ Feature: read command line configuration options from files
66
66
  """ruby
67
67
  describe "custom options file" do
68
68
  it "causes .rspec to be ignored" do
69
- RSpec.configuration.color_enabled.should be_falsey
69
+ RSpec.configuration.color.should be_falsey
70
70
  end
71
71
  end
72
72
  """
@@ -4,16 +4,16 @@ Feature: configure expectation framework
4
4
  desired outcomes. You can also configure RSpec to use:
5
5
 
6
6
  * rspec/expectations (explicitly)
7
- * stdlib assertions
8
- * test/unit assertions in ruby 1.8
9
- * minitest assertions in ruby 1.9
10
- * rspec/expectations _and_ stlib assertions
7
+ * stdlib assertions **DEPRECATED: Use test/unit or minitest explicitly**
8
+ * test/unit assertions
9
+ * minitest assertions
10
+ * any combination of the above libraries
11
11
 
12
- Note that when you do not use rspec-expectations, you must explicitly
13
- provide a description to every example. You cannot rely on the generated
14
- descriptions provided by rspec-expectations.
12
+ Note that when you do not use rspec-expectations, you must explicitly provide
13
+ a description to every example. You cannot rely on the generated descriptions
14
+ provided by rspec-expectations.
15
15
 
16
- Scenario: rspec-expectations can be used by default if nothing is configured
16
+ Scenario: Default configuration uses rspec-expectations
17
17
  Given a file named "example_spec.rb" with:
18
18
  """ruby
19
19
  RSpec::Matchers.define :be_a_multiple_of do |factor|
@@ -29,7 +29,7 @@ Feature: configure expectation framework
29
29
  When I run `rspec example_spec.rb`
30
30
  Then the examples should all pass
31
31
 
32
- Scenario: configure rspec-expectations (explicitly)
32
+ Scenario: Configure rspec-expectations (explicitly)
33
33
  Given a file named "example_spec.rb" with:
34
34
  """ruby
35
35
  RSpec.configure do |config|
@@ -45,7 +45,8 @@ Feature: configure expectation framework
45
45
  When I run `rspec example_spec.rb`
46
46
  Then the examples should all pass
47
47
 
48
- Scenario: configure test/unit assertions (passing examples)
48
+ @deprecated
49
+ Scenario: Configure 'stdlib' assertions
49
50
  Given a file named "example_spec.rb" with:
50
51
  """ruby
51
52
  RSpec.configure do |config|
@@ -58,45 +59,139 @@ Feature: configure expectation framework
58
59
  end
59
60
 
60
61
  specify { assert 5 < 6 }
62
+
63
+ it "is greater than 6 (no it isn't!)" do
64
+ assert 5 > 6, "errantly expected 5 to be greater than 5"
65
+ end
61
66
  end
62
67
  """
63
68
  When I run `rspec example_spec.rb`
64
- Then the output should contain "2 examples, 0 failures"
69
+ Then the output should match:
70
+ """
71
+ (Test::Unit::AssertionFailedError|Mini(T|t)est::Assertion):
72
+ errantly expected 5 to be greater than 5
73
+ """
74
+ And the output should contain "3 examples, 1 failure"
75
+ And the output should contain ":stdlib is deprecated. Use :test_unit or :minitest instead"
65
76
 
66
- Scenario: configure test/unit assertions (failing examples)
77
+ Scenario: Configure test/unit assertions
67
78
  Given a file named "example_spec.rb" with:
68
79
  """ruby
69
80
  RSpec.configure do |config|
70
- config.expect_with :stdlib
81
+ config.expect_with :test_unit
71
82
  end
72
83
 
73
- describe 5 do
74
- it "is greater than 6 (no it isn't!)" do
75
- assert 5 > 6, "errantly expected 5 to be greater than 5"
84
+ RSpec.describe [1] do
85
+ it "is equal to [1]" do
86
+ assert_equal [1], [1], "expected [1] to equal [1]"
76
87
  end
77
88
 
78
- specify { assert 5 > 6 }
89
+ specify { assert_not_equal [1], [] }
90
+
91
+ it "is equal to [2] (intentional failure)" do
92
+ assert [1] == [2], "errantly expected [2] to equal [1]"
93
+ end
79
94
  end
80
95
  """
81
96
  When I run `rspec example_spec.rb`
82
- Then the output should contain "2 examples, 2 failures"
97
+ Then the output should match:
98
+ """
99
+ (Test::Unit::AssertionFailedError|Mini(T|t)est::Assertion):
100
+ errantly expected \[2\] to equal \[1\]
101
+ """
102
+ And the output should contain "3 examples, 1 failure"
83
103
 
84
- Scenario: configure rspec/expecations AND test/unit assertions
104
+ Scenario: Configure minitest assertions
85
105
  Given a file named "example_spec.rb" with:
86
106
  """ruby
87
107
  RSpec.configure do |config|
88
- config.expect_with :rspec, :stdlib
108
+ config.expect_with :minitest
89
109
  end
90
110
 
91
- describe 5 do
92
- it "is greater than 4" do
93
- assert 5 > 4, "expected 5 to be greater than 4"
111
+ RSpec.describe "Object identity" do
112
+ it "the an object is the same as itself" do
113
+ x = [1]
114
+ assert_same x, x, "expected x to be the same x"
94
115
  end
95
116
 
96
- it "is less than 6" do
97
- 5.should be < 6
117
+ specify { refute_same [1], [1] }
118
+
119
+ it "is empty (intentional failure)" do
120
+ assert_empty [1], "errantly expected [1] to be empty"
98
121
  end
99
122
  end
100
123
  """
124
+ When I run `rspec -b example_spec.rb`
125
+ Then the output should match:
126
+ """
127
+ MiniT|test::Assertion:
128
+ errantly expected \[1\] to be empty
129
+ """
130
+ And the output should contain "3 examples, 1 failure"
131
+ And the output should not contain "Warning: you should require 'minitest/autorun' instead."
132
+
133
+ Scenario: Configure rspec/expectations AND test/unit assertions
134
+ Given a file named "example_spec.rb" with:
135
+ """ruby
136
+ RSpec.configure do |config|
137
+ config.expect_with :rspec, :test_unit
138
+ end
139
+
140
+ RSpec.describe [1] do
141
+ it "is equal to [1]" do
142
+ assert_equal [1], [1], "expected [1] to equal [1]"
143
+ end
144
+
145
+ it "matches array [1]" do
146
+ is_expected.to match_array([1])
147
+ end
148
+ end
149
+ """
150
+ When I run `rspec example_spec.rb`
151
+ Then the examples should all pass
152
+
153
+ Scenario: Configure rspec/expecations AND minitest assertions
154
+ Given a file named "example_spec.rb" with:
155
+ """ruby
156
+ RSpec.configure do |config|
157
+ config.expect_with :rspec, :minitest
158
+ end
159
+
160
+ RSpec.describe "Object identity" do
161
+ it "two arrays are not the same object" do
162
+ refute_same [1], [1]
163
+ end
164
+
165
+ it "an array is itself" do
166
+ array = [1]
167
+ expect(array).to be array
168
+ end
169
+ end
170
+ """
171
+ When I run `rspec example_spec.rb`
172
+ Then the examples should all pass
173
+
174
+ Scenario: Configure test/unit and minitest assertions
175
+ Given a file named "example_spec.rb" with:
176
+ """ruby
177
+ RSpec.configure do |config|
178
+ config.expect_with :test_unit, :minitest
179
+ end
180
+
181
+ RSpec.describe [1] do
182
+ it "is equal to [1]" do
183
+ assert_equal [1], [1], "expected [1] to equal [1]"
184
+ end
185
+
186
+ specify { assert_not_equal [1], [] }
187
+
188
+ it "the an object is the same as itself" do
189
+ x = [1]
190
+ assert_same x, x, "expected x to be the same x"
191
+ end
192
+
193
+ specify { refute_same [1], [1] }
194
+ end
195
+ """
101
196
  When I run `rspec example_spec.rb`
102
197
  Then the examples should all pass
@@ -1 +1,10 @@
1
- Autotest.add_discovery { "rspec2" } if File.exist?("./.rspec")
1
+ begin
2
+ # try to load rspec/autotest so we can check if the constant is defined below.
3
+ require 'rspec/autotest'
4
+ rescue LoadError
5
+ # ignore. We print a deprecation warning later.
6
+ end
7
+
8
+ if File.exist?("./.rspec") && !defined?(::RSpec::Autotest)
9
+ Autotest.add_discovery { "rspec2" }
10
+ end
@@ -73,5 +73,5 @@ rescue LoadError
73
73
  File.exist?('./Gemfile')
74
74
  end
75
75
  end
76
- Autotest.add_hook(:ran_command) { warn "\n\e[31mUsing the built in rspec-core autotest support is deprecated and will be removed in RSpec 3. Please switch to the rspec-autotest gem\e[0m" }
76
+ Autotest.add_hook(:ran_command) { warn "\n\e[31mrspec-core's built in autotest support is deprecated and will be removed in RSpec 3. Please switch to the rspec-autotest gem.\e[0m" }
77
77
  end
@@ -1,11 +1,7 @@
1
1
  module RSpec
2
2
  module Core
3
- class CommandLine
3
+ class Runner
4
4
  def initialize(options, configuration=RSpec::configuration, world=RSpec::world)
5
- if Array === options
6
- options = ConfigurationOptions.new(options)
7
- options.parse_options
8
- end
9
5
  @options = options
10
6
  @configuration = configuration
11
7
  @world = world
@@ -32,5 +28,20 @@ module RSpec
32
28
  end
33
29
  end
34
30
  end
31
+
32
+ class CommandLine < Runner
33
+ def initialize(options, configuration=RSpec.configuration, world=RSpec.world)
34
+ if Array === options
35
+ RSpec.deprecate("Instantiating a `RSpec::Core::CommandLine` with an array of options",
36
+ :replacement => "Instantiate a `RSpec::Core::Runner` with a `RSpec::Core::ConfigurationOptions` instance")
37
+ options = ConfigurationOptions.new(options)
38
+ options.parse_options
39
+ else
40
+ RSpec.deprecate("`RSpec::Core::CommandLine`", :replacement => "`RSpec::Core::Runner`")
41
+ end
42
+
43
+ super
44
+ end
45
+ end
35
46
  end
36
47
  end
@@ -1,6 +1,7 @@
1
1
  require 'fileutils'
2
2
  require 'rspec/core/backtrace_cleaner'
3
3
  require 'rspec/core/ruby_project'
4
+ require 'rspec/core/deprecated_mutable_array_proxy'
4
5
  require 'rspec/core/formatters/deprecation_formatter'
5
6
 
6
7
  module RSpec
@@ -96,7 +97,18 @@ module RSpec
96
97
  add_setting :error_stream
97
98
 
98
99
  # Default: `$stderr`.
99
- add_setting :deprecation_stream
100
+ define_reader :deprecation_stream
101
+ def deprecation_stream=(value)
102
+ if @reporter && !value.equal?(@deprecation_stream)
103
+ warn "RSpec's reporter has already been initialized with " +
104
+ "#{deprecation_stream.inspect} as the deprecation stream, so your change to "+
105
+ "`deprecation_stream` will be ignored. You should configure it earlier for " +
106
+ "it to take effect, or use the `--deprecation-out` CLI option. " +
107
+ "(Called from #{CallerFilter.first_non_rspec_line})"
108
+ else
109
+ @deprecation_stream = value
110
+ end
111
+ end
100
112
 
101
113
  # Clean up and exit after the first failure (default: `false`).
102
114
  add_setting :fail_fast
@@ -149,7 +161,13 @@ module RSpec
149
161
  end
150
162
 
151
163
  # Load files matching this pattern (default: `'**/*_spec.rb'`)
152
- add_setting :pattern, :alias_with => :filename_pattern
164
+ add_setting :pattern
165
+
166
+ def filename_pattern
167
+ RSpec.deprecate "`RSpec::Core::Configuration#filename_pattern`",
168
+ :replacement => "`RSpec::Core::Configuration#pattern`"
169
+ pattern
170
+ end
153
171
 
154
172
  def pattern= value
155
173
  if @spec_files_loaded
@@ -157,7 +175,13 @@ module RSpec
157
175
  end
158
176
  @pattern = value
159
177
  end
160
- alias :filename_pattern= :pattern=
178
+
179
+ def filename_pattern=(value)
180
+ RSpec.deprecate "`RSpec::Core::Configuration#filename_pattern=`",
181
+ :replacement => "`RSpec::Core::Configuration#pattern=`"
182
+ self.pattern = value
183
+ end
184
+
161
185
 
162
186
  # Report the times for the slowest examples (default: `false`).
163
187
  # Use this to specify the number of examples to include in the profile.
@@ -247,21 +271,26 @@ module RSpec
247
271
  # @private
248
272
  attr_accessor :filter_manager
249
273
 
250
- attr_reader :backtrace_cleaner
274
+ attr_reader :backtrace_formatter
275
+
276
+ def backtrace_cleaner
277
+ RSpec.deprecate "`RSpec::Core::Configuration#backtrace_cleaner`",
278
+ :replacement => "`RSpec::Core::Configuration#backtrace_formatter`"
279
+ @backtrace_formatter
280
+ end
251
281
 
252
282
  def initialize
253
283
  @expectation_frameworks = []
254
284
  @include_or_extend_modules = []
255
285
  @mock_framework = nil
256
286
  @files_to_run = []
257
- @formatters = []
258
287
  @color = false
259
288
  @order = nil
260
289
  @pattern = '**/*_spec.rb'
261
290
  @failure_exit_code = 1
262
291
  @spec_files_loaded = false
263
292
 
264
- @backtrace_cleaner = BacktraceCleaner.new
293
+ @backtrace_formatter = BacktraceCleaner.new
265
294
 
266
295
  @default_path = 'spec'
267
296
  @deprecation_stream = $stderr
@@ -280,6 +309,7 @@ module RSpec
280
309
  @profile_examples = false
281
310
  @requires = []
282
311
  @libs = []
312
+ @show_failures_in_pending_blocks = false
283
313
  end
284
314
 
285
315
  # @private
@@ -299,7 +329,7 @@ module RSpec
299
329
  def reset
300
330
  @spec_files_loaded = false
301
331
  @reporter = nil
302
- @formatters.clear
332
+ @formatter_loader = nil
303
333
  end
304
334
 
305
335
  # @overload add_setting(name)
@@ -370,13 +400,13 @@ module RSpec
370
400
  def backtrace_clean_patterns
371
401
  RSpec.deprecate("RSpec::Core::Configuration#backtrace_clean_patterns",
372
402
  :replacement => "RSpec::Core::Configuration#backtrace_exclusion_patterns")
373
- @backtrace_cleaner.exclusion_patterns
403
+ @backtrace_formatter.exclusion_patterns
374
404
  end
375
405
 
376
406
  def backtrace_clean_patterns=(patterns)
377
407
  RSpec.deprecate("RSpec::Core::Configuration#backtrace_clean_patterns",
378
408
  :replacement => "RSpec::Core::Configuration#backtrace_exclusion_patterns")
379
- @backtrace_cleaner.exclusion_patterns = patterns
409
+ @backtrace_formatter.exclusion_patterns = patterns
380
410
  end
381
411
 
382
412
  # The patterns to always include to backtraces.
@@ -387,11 +417,11 @@ module RSpec
387
417
  # One can replace the list by using the setter or modify it through the
388
418
  # getter
389
419
  def backtrace_inclusion_patterns
390
- @backtrace_cleaner.inclusion_patterns
420
+ @backtrace_formatter.inclusion_patterns
391
421
  end
392
422
 
393
423
  def backtrace_inclusion_patterns=(patterns)
394
- @backtrace_cleaner.inclusion_patterns = patterns
424
+ @backtrace_formatter.inclusion_patterns = patterns
395
425
  end
396
426
 
397
427
  # The patterns to discard from backtraces.
@@ -405,11 +435,11 @@ module RSpec
405
435
  # `--backtrace`on the command line, in a `.rspec` file, or in the
406
436
  # `rspec_options` attribute of RSpec's rake task.
407
437
  def backtrace_exclusion_patterns
408
- @backtrace_cleaner.exclusion_patterns
438
+ @backtrace_formatter.exclusion_patterns
409
439
  end
410
440
 
411
441
  def backtrace_exclusion_patterns=(patterns)
412
- @backtrace_cleaner.exclusion_patterns = patterns
442
+ @backtrace_formatter.exclusion_patterns = patterns
413
443
  end
414
444
 
415
445
  # Sets the mock framework adapter module.
@@ -496,16 +526,17 @@ module RSpec
496
526
  # Sets the expectation framework module(s) to be included in each example
497
527
  # group.
498
528
  #
499
- # `frameworks` can be `:rspec`, `:stdlib`, a custom module, or any
500
- # combination thereof:
529
+ # `frameworks` can be `:rspec`, `:test_unit`, `:minitest`, a custom
530
+ # module, or any combination thereof:
501
531
  #
502
532
  # config.expect_with :rspec
503
- # config.expect_with :stdlib
504
- # config.expect_with :rspec, :stdlib
533
+ # config.expect_with :test_unit
534
+ # config.expect_with :minitest
535
+ # config.expect_with :rspec, :minitest
505
536
  # config.expect_with OtherExpectationFramework
506
537
  #
507
- # RSpec will translate `:rspec` and `:stdlib` into the appropriate
508
- # modules.
538
+ # RSpec will translate `:rspec`, `:minitest`, and `:test_unit` into the
539
+ # appropriate modules.
509
540
  #
510
541
  # ## Configuration
511
542
  #
@@ -525,8 +556,15 @@ module RSpec
525
556
  self.expecting_with_rspec = true
526
557
  ::RSpec::Matchers
527
558
  when :stdlib
559
+ RSpec.deprecate ':stdlib', :replacement => ":test_unit or :minitest"
528
560
  require 'test/unit/assertions'
529
561
  ::Test::Unit::Assertions
562
+ when :test_unit
563
+ require 'rspec/core/test_unit_assertions_adapter'
564
+ ::RSpec::Core::TestUnitAssertionsAdapter
565
+ when :minitest
566
+ require 'rspec/core/minitest_assertions_adapter'
567
+ ::RSpec::Core::MinitestAssertionsAdapter
530
568
  else
531
569
  raise ArgumentError, "#{framework.inspect} is not supported"
532
570
  end
@@ -546,19 +584,33 @@ module RSpec
546
584
  end
547
585
 
548
586
  def full_backtrace?
549
- @backtrace_cleaner.full_backtrace?
587
+ @backtrace_formatter.full_backtrace?
550
588
  end
551
589
 
552
590
  def full_backtrace=(true_or_false)
553
- @backtrace_cleaner.full_backtrace = true_or_false
554
- end
591
+ @backtrace_formatter.full_backtrace = true_or_false
592
+ end
593
+
594
+ NoArgument = "No such argument"
595
+ def color(output = NoArgument)
596
+ if output == NoArgument
597
+ output = output_stream
598
+ if !output_to_tty?(output) && value_for(:color, @color)
599
+ RSpec.warn_deprecation <<-MSG.gsub(/\s+|/,'')
600
+ | Calling `RSpec::Core::Configuration#color` in RSpec 3 will
601
+ | return the value of the configuration setting, in RSpec 2
602
+ | this value is `false` as your output doesn't support color.
603
+ | Use `RSpec::Core::Configuration#color_enabled?` if you depend
604
+ | on this behavior.
605
+ | Called from #{CallerFilter.first_non_rspec_line}.
606
+ MSG
607
+ end
608
+ else
609
+ RSpec.deprecate '`RSpec::Core::Configuration#color(output)`',
610
+ :replacement => '`RSpec::Core::Configuration#color_enabled?(output)`'
611
+ end
555
612
 
556
- def color(output=output_stream)
557
- # rspec's built-in formatters all call this with the output argument,
558
- # but defaulting to output_stream for backward compatibility with
559
- # formatters in extension libs
560
- return false unless output_to_tty?(output)
561
- value_for(:color, @color)
613
+ color_enabled? output
562
614
  end
563
615
 
564
616
  def color=(bool)
@@ -572,11 +624,31 @@ module RSpec
572
624
  end
573
625
  end
574
626
 
575
- # TODO - deprecate color_enabled - probably not until the last 2.x
576
- # release before 3.0
577
- alias_method :color_enabled, :color
578
- alias_method :color_enabled=, :color=
579
- define_predicate_for :color_enabled, :color
627
+ def color_enabled?(output=output_stream)
628
+ output_to_tty?(output) && value_for(:color, @color)
629
+ end
630
+
631
+ def color_enabled(output=output_stream)
632
+ RSpec.deprecate "`RSpec::Core::Configuration#color_enabled`",
633
+ :replacement =>
634
+ "`RSpec::Core::Configuration#color` if you want the configuration " +
635
+ "value, or `RSpec::Core::Configuration#color_enabled?(output)` if " +
636
+ " you want to know if color output is supported."
637
+
638
+ color_enabled? output
639
+ end
640
+
641
+ def color_enabled=(bool)
642
+ RSpec.deprecate "RSpec::Core::Configuration#color_enabled=",
643
+ :replacement => "RSpec::Core::Configuration#color="
644
+ self.color = bool
645
+ end
646
+
647
+ def color?(output=output_stream)
648
+ RSpec.deprecate "RSpec::Core::Configuration#color?",
649
+ :replacement => "RSpec::Core::Configuration#color_enabled?"
650
+ color_enabled? output_stream
651
+ end
580
652
 
581
653
  def libs=(libs)
582
654
  libs.map do |lib|
@@ -664,27 +736,27 @@ EOM
664
736
  # and paths to use for output streams, but you should consider that a
665
737
  # private api that may change at any time without notice.
666
738
  def add_formatter(formatter_to_use, *paths)
667
- formatter_class =
668
- built_in_formatter(formatter_to_use) ||
669
- custom_formatter(formatter_to_use) ||
670
- (raise ArgumentError, "Formatter '#{formatter_to_use}' unknown - maybe you meant 'documentation' or 'progress'?.")
671
-
672
739
  paths << output_stream if paths.empty?
673
- formatters << formatter_class.new(*paths.map {|p| String === p ? file_at(p) : p})
740
+ formatter_loader.add formatter_to_use, *paths
674
741
  end
675
-
676
742
  alias_method :formatter=, :add_formatter
677
743
 
678
744
  def formatters
679
- @formatters ||= []
745
+ DeprecatedMutableArrayProxy.new(formatter_loader.formatters)
680
746
  end
681
747
 
748
+ # @private
749
+ def formatter_loader
750
+ @formatter_loader ||= Formatters::Loader.new(Reporter.new)
751
+ end
752
+
753
+ # @private
682
754
  def reporter
683
- @reporter ||= begin
684
- add_formatter('progress') if formatters.empty?
685
- add_formatter(RSpec::Core::Formatters::DeprecationFormatter, deprecation_stream, output_stream)
686
- Reporter.new(*formatters)
687
- end
755
+ @reporter ||=
756
+ begin
757
+ formatter_loader.setup_default output_stream, deprecation_stream
758
+ formatter_loader.reporter
759
+ end
688
760
  end
689
761
 
690
762
  # @api private
@@ -730,7 +802,7 @@ EOM
730
802
  # end
731
803
  def alias_example_to(new_name, *args)
732
804
  extra_options = build_metadata_hash_from(args)
733
- RSpec::Core::ExampleGroup.alias_example_to(new_name, extra_options)
805
+ RSpec::Core::ExampleGroup.define_example_method(new_name, extra_options)
734
806
  end
735
807
 
736
808
  # Define an alias for it_should_behave_like that allows different
@@ -755,7 +827,7 @@ EOM
755
827
  # has behavior: sortability
756
828
  # # sortability examples here
757
829
  def alias_it_behaves_like_to(new_name, report_label = '')
758
- RSpec::Core::ExampleGroup.alias_it_behaves_like_to(new_name, report_label)
830
+ RSpec::Core::ExampleGroup.define_nested_shared_group_method(new_name, report_label)
759
831
  end
760
832
 
761
833
  alias_method :alias_it_should_behave_like_to, :alias_it_behaves_like_to
@@ -792,10 +864,12 @@ EOM
792
864
  # # with treat_symbols_as_metadata_keys_with_true_values = true
793
865
  # filter_run_including :foo # same as filter_run_including :foo => true
794
866
  def filter_run_including(*args)
795
- filter_manager.include_with_low_priority build_metadata_hash_from(args)
867
+ __filter_run(__method__, *args)
796
868
  end
797
869
 
798
- alias_method :filter_run, :filter_run_including
870
+ def filter_run(*args)
871
+ __filter_run(__method__, *args)
872
+ end
799
873
 
800
874
  # Clears and reassigns the `inclusion_filter`. Set to `nil` if you don't
801
875
  # want any inclusion filter at all.
@@ -805,7 +879,7 @@ EOM
805
879
  # This overrides any inclusion filters/tags set on the command line or in
806
880
  # configuration files.
807
881
  def inclusion_filter=(filter)
808
- filter_manager.include! build_metadata_hash_from([filter])
882
+ filter_manager.include_only build_metadata_hash_from([filter])
809
883
  end
810
884
 
811
885
  alias_method :filter=, :inclusion_filter=
@@ -861,7 +935,7 @@ EOM
861
935
  # This overrides any exclusion filters/tags set on the command line or in
862
936
  # configuration files.
863
937
  def exclusion_filter=(filter)
864
- filter_manager.exclude! build_metadata_hash_from([filter])
938
+ filter_manager.exclude_only build_metadata_hash_from([filter])
865
939
  end
866
940
 
867
941
  # Returns the `exclusion_filter`. If none has been set, returns an empty
@@ -1172,10 +1246,16 @@ EOM
1172
1246
  $VERBOSE = !!value
1173
1247
  end
1174
1248
 
1175
- def warnings
1249
+ def warnings?
1176
1250
  $VERBOSE
1177
1251
  end
1178
1252
 
1253
+ def warnings
1254
+ RSpec.deprecate("`RSpec::Core::Configuration#warnings`",
1255
+ :replacement => "`RSpec::Core::Configuration#warnings?`")
1256
+ warnings?
1257
+ end
1258
+
1179
1259
  # Exposes the current running example via the named
1180
1260
  # helper method. RSpec 2.x exposed this via `example`,
1181
1261
  # but in RSpec 3.0, the example is instead exposed via
@@ -1287,72 +1367,6 @@ MESSAGE
1287
1367
  tty? || (output.respond_to?(:tty?) && output.tty?)
1288
1368
  end
1289
1369
 
1290
- def built_in_formatter(key)
1291
- case key.to_s
1292
- when 'd', 'doc', 'documentation'
1293
- require 'rspec/core/formatters/documentation_formatter'
1294
- RSpec::Core::Formatters::DocumentationFormatter
1295
- when 's', 'n', 'spec', 'nested'
1296
- RSpec.deprecate "Using `#{key.to_s}` as a shortcut for the DocumentationFormatter",
1297
- :replacement => "`d`, `doc`, or `documentation`"
1298
- require 'rspec/core/formatters/documentation_formatter'
1299
- RSpec::Core::Formatters::DocumentationFormatter
1300
- when 'h', 'html'
1301
- require 'rspec/core/formatters/html_formatter'
1302
- RSpec::Core::Formatters::HtmlFormatter
1303
- when 't', 'textmate'
1304
- require 'rspec/core/formatters/text_mate_formatter'
1305
- RSpec::Core::Formatters::TextMateFormatter
1306
- when 'p', 'progress'
1307
- require 'rspec/core/formatters/progress_formatter'
1308
- RSpec::Core::Formatters::ProgressFormatter
1309
- when 'j', 'json'
1310
- require 'rspec/core/formatters/json_formatter'
1311
- RSpec::Core::Formatters::JsonFormatter
1312
- end
1313
- end
1314
-
1315
- def custom_formatter(formatter_ref)
1316
- if Class === formatter_ref
1317
- formatter_ref
1318
- elsif string_const?(formatter_ref)
1319
- begin
1320
- eval(formatter_ref)
1321
- rescue NameError
1322
- require path_for(formatter_ref)
1323
- eval(formatter_ref)
1324
- end
1325
- end
1326
- end
1327
-
1328
- def string_const?(str)
1329
- str.is_a?(String) && /\A[A-Z][a-zA-Z0-9_:]*\z/ =~ str
1330
- end
1331
-
1332
- def path_for(const_ref)
1333
- underscore_with_fix_for_non_standard_rspec_naming(const_ref)
1334
- end
1335
-
1336
- def underscore_with_fix_for_non_standard_rspec_naming(string)
1337
- underscore(string).sub(%r{(^|/)r_spec($|/)}, '\\1rspec\\2')
1338
- end
1339
-
1340
- # activesupport/lib/active_support/inflector/methods.rb, line 48
1341
- def underscore(camel_cased_word)
1342
- word = camel_cased_word.to_s.dup
1343
- word.gsub!(/::/, '/')
1344
- word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
1345
- word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
1346
- word.tr!("-", "_")
1347
- word.downcase!
1348
- word
1349
- end
1350
-
1351
- def file_at(path)
1352
- FileUtils.mkdir_p(File.dirname(path))
1353
- File.new(path, 'w')
1354
- end
1355
-
1356
1370
  def order_and_seed_from_seed(value, force = false)
1357
1371
  order_and_seed_from_order "rand:#{value}", force
1358
1372
  end
@@ -1397,6 +1411,24 @@ MESSAGE
1397
1411
  RSpec.deprecate("`config.mock_with #{name.inspect}`", :replacement => "`config.mock_with :#{expected}`")
1398
1412
  end
1399
1413
 
1414
+ def __filter_run(method_name, *args)
1415
+ metadata_hash = build_metadata_hash_from(args)
1416
+
1417
+ if metadata_hash[:focused]
1418
+ RSpec.warn_deprecation(<<-EOS.gsub(/^\s*\|/, ''))
1419
+ |In RSpec 2.x, `config.#{method_name} :focused => true` filters
1420
+ |examples defined using `focus` or `fit` since those example aliases
1421
+ |have attached `:focus => true, :focused => true` metadata. In RSpec 3,
1422
+ |the metadata for those example aliases will only have `:focus => true`,
1423
+ |so if you want to continue filtering examples defined with those example
1424
+ |aliases you should update to `config.#{method_name} :focus => true`.
1425
+ |(Called from #{CallerFilter.first_non_rspec_line}).
1426
+ EOS
1427
+ end
1428
+
1429
+ filter_manager.include_with_low_priority metadata_hash
1430
+ end
1431
+
1400
1432
  end
1401
1433
  end
1402
1434
  end