rspec-core 2.99.2 → 3.0.0.beta1

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 (165) hide show
  1. checksums.yaml +14 -6
  2. checksums.yaml.gz.sig +2 -0
  3. data.tar.gz.sig +0 -0
  4. data/Changelog.md +103 -191
  5. data/License.txt +1 -0
  6. data/README.md +4 -25
  7. data/features/Upgrade.md +2 -14
  8. data/features/command_line/dry_run.feature +29 -0
  9. data/features/command_line/example_name_option.feature +1 -1
  10. data/features/command_line/fail_fast.feature +26 -0
  11. data/features/command_line/format_option.feature +3 -3
  12. data/features/command_line/line_number_option.feature +16 -11
  13. data/features/command_line/order.feature +2 -3
  14. data/features/command_line/pattern_option.feature +3 -3
  15. data/features/command_line/randomization.feature +63 -0
  16. data/features/command_line/require_option.feature +2 -2
  17. data/features/command_line/ruby.feature +1 -1
  18. data/features/configuration/alias_example_to.feature +13 -22
  19. data/features/configuration/{backtrace_clean_patterns.feature → backtrace_exclusion_patterns.feature} +17 -14
  20. data/features/configuration/custom_settings.feature +11 -11
  21. data/features/configuration/overriding_global_ordering.feature +93 -0
  22. data/features/configuration/profile.feature +13 -13
  23. data/features/configuration/read_options_from_file.feature +7 -7
  24. data/features/example_groups/basic_structure.feature +1 -1
  25. data/features/example_groups/shared_context.feature +8 -8
  26. data/features/example_groups/shared_examples.feature +6 -14
  27. data/features/expectation_framework_integration/configure_expectation_framework.feature +27 -122
  28. data/features/filtering/exclusion_filters.feature +2 -5
  29. data/features/filtering/inclusion_filters.feature +1 -5
  30. data/features/formatters/json_formatter.feature +2 -2
  31. data/features/formatters/text_formatter.feature +4 -4
  32. data/features/helper_methods/arbitrary_methods.feature +2 -2
  33. data/features/helper_methods/let.feature +5 -5
  34. data/features/helper_methods/modules.feature +5 -8
  35. data/features/hooks/around_hooks.feature +2 -2
  36. data/features/hooks/before_and_after_hooks.feature +14 -14
  37. data/features/hooks/filtering.feature +12 -14
  38. data/features/metadata/described_class.feature +1 -1
  39. data/features/metadata/user_defined.feature +16 -29
  40. data/features/mock_framework_integration/use_flexmock.feature +1 -1
  41. data/features/mock_framework_integration/use_mocha.feature +1 -1
  42. data/features/mock_framework_integration/use_rr.feature +1 -1
  43. data/features/mock_framework_integration/use_rspec.feature +5 -5
  44. data/features/pending/pending_examples.feature +5 -5
  45. data/features/spec_files/arbitrary_file_suffix.feature +1 -1
  46. data/features/step_definitions/additional_cli_steps.rb +3 -3
  47. data/features/subject/explicit_subject.feature +8 -8
  48. data/features/subject/implicit_receiver.feature +29 -0
  49. data/features/subject/implicit_subject.feature +4 -4
  50. data/features/support/env.rb +10 -3
  51. data/features/support/require_expect_syntax_in_aruba_specs.rb +16 -0
  52. data/lib/rspec/core.rb +11 -48
  53. data/lib/rspec/core/backport_random.rb +302 -0
  54. data/lib/rspec/core/backtrace_formatter.rb +65 -0
  55. data/lib/rspec/core/command_line.rb +7 -18
  56. data/lib/rspec/core/configuration.rb +202 -507
  57. data/lib/rspec/core/configuration_options.rb +17 -30
  58. data/lib/rspec/core/example.rb +29 -39
  59. data/lib/rspec/core/example_group.rb +166 -259
  60. data/lib/rspec/core/filter_manager.rb +30 -47
  61. data/lib/rspec/core/flat_map.rb +17 -0
  62. data/lib/rspec/core/formatters.rb +0 -138
  63. data/lib/rspec/core/formatters/base_formatter.rb +46 -1
  64. data/lib/rspec/core/formatters/base_text_formatter.rb +38 -61
  65. data/lib/rspec/core/formatters/deprecation_formatter.rb +21 -52
  66. data/lib/rspec/core/formatters/helpers.rb +0 -28
  67. data/lib/rspec/core/formatters/html_formatter.rb +1 -1
  68. data/lib/rspec/core/formatters/json_formatter.rb +38 -9
  69. data/lib/rspec/core/formatters/snippet_extractor.rb +14 -5
  70. data/lib/rspec/core/hooks.rb +55 -39
  71. data/lib/rspec/core/memoized_helpers.rb +17 -167
  72. data/lib/rspec/core/metadata.rb +16 -64
  73. data/lib/rspec/core/option_parser.rb +30 -39
  74. data/lib/rspec/core/ordering.rb +154 -0
  75. data/lib/rspec/core/pending.rb +12 -69
  76. data/lib/rspec/core/project_initializer.rb +12 -10
  77. data/lib/rspec/core/rake_task.rb +5 -108
  78. data/lib/rspec/core/reporter.rb +15 -18
  79. data/lib/rspec/core/runner.rb +16 -30
  80. data/lib/rspec/core/shared_context.rb +3 -5
  81. data/lib/rspec/core/shared_example_group.rb +3 -51
  82. data/lib/rspec/core/shared_example_group/collection.rb +1 -19
  83. data/lib/rspec/core/version.rb +1 -1
  84. data/lib/rspec/core/warnings.rb +22 -0
  85. data/lib/rspec/core/world.rb +12 -8
  86. data/spec/command_line/order_spec.rb +20 -23
  87. data/spec/rspec/core/backtrace_formatter_spec.rb +216 -0
  88. data/spec/rspec/core/command_line_spec.rb +32 -48
  89. data/spec/rspec/core/configuration_options_spec.rb +19 -50
  90. data/spec/rspec/core/configuration_spec.rb +142 -713
  91. data/spec/rspec/core/drb_command_line_spec.rb +2 -0
  92. data/spec/rspec/core/dsl_spec.rb +0 -1
  93. data/spec/rspec/core/example_group_spec.rb +192 -223
  94. data/spec/rspec/core/example_spec.rb +40 -16
  95. data/spec/rspec/core/filter_manager_spec.rb +2 -2
  96. data/spec/rspec/core/formatters/base_formatter_spec.rb +0 -41
  97. data/spec/rspec/core/formatters/base_text_formatter_spec.rb +5 -123
  98. data/spec/rspec/core/formatters/deprecation_formatter_spec.rb +2 -87
  99. data/spec/rspec/core/formatters/documentation_formatter_spec.rb +2 -3
  100. data/spec/rspec/core/formatters/{text_mate_formatted.html → html_formatted-1.8.7-jruby.html} +44 -25
  101. data/spec/rspec/core/formatters/html_formatted-1.8.7-rbx.html +477 -0
  102. data/spec/rspec/core/formatters/{html_formatted.html → html_formatted-1.8.7.html} +42 -25
  103. data/spec/rspec/core/formatters/html_formatted-1.9.2.html +425 -0
  104. data/spec/rspec/core/formatters/html_formatted-1.9.3-jruby.html +416 -0
  105. data/spec/rspec/core/formatters/html_formatted-1.9.3-rbx.html +477 -0
  106. data/spec/rspec/core/formatters/html_formatted-1.9.3.html +419 -0
  107. data/spec/rspec/core/formatters/html_formatted-2.0.0.html +425 -0
  108. data/spec/rspec/core/formatters/html_formatter_spec.rb +21 -46
  109. data/spec/rspec/core/formatters/json_formatter_spec.rb +97 -8
  110. data/spec/rspec/core/hooks_filtering_spec.rb +5 -5
  111. data/spec/rspec/core/hooks_spec.rb +61 -47
  112. data/spec/rspec/core/memoized_helpers_spec.rb +20 -322
  113. data/spec/rspec/core/metadata_spec.rb +1 -24
  114. data/spec/rspec/core/option_parser_spec.rb +20 -62
  115. data/spec/rspec/core/ordering_spec.rb +102 -0
  116. data/spec/rspec/core/pending_example_spec.rb +0 -40
  117. data/spec/rspec/core/project_initializer_spec.rb +1 -25
  118. data/spec/rspec/core/rake_task_spec.rb +5 -72
  119. data/spec/rspec/core/random_spec.rb +47 -0
  120. data/spec/rspec/core/reporter_spec.rb +23 -48
  121. data/spec/rspec/core/runner_spec.rb +31 -39
  122. data/spec/rspec/core/shared_context_spec.rb +3 -15
  123. data/spec/rspec/core/shared_example_group/collection_spec.rb +4 -17
  124. data/spec/rspec/core/shared_example_group_spec.rb +12 -45
  125. data/spec/rspec/core/{deprecation_spec.rb → warnings_spec.rb} +3 -1
  126. data/spec/rspec/core_spec.rb +4 -21
  127. data/spec/spec_helper.rb +41 -5
  128. data/spec/support/helper_methods.rb +0 -29
  129. data/spec/support/sandboxed_mock_space.rb +0 -16
  130. data/spec/support/shared_example_groups.rb +7 -36
  131. data/spec/support/stderr_splitter.rb +36 -0
  132. metadata +163 -157
  133. metadata.gz.sig +1 -0
  134. data/exe/autospec +0 -13
  135. data/features/Autotest.md +0 -38
  136. data/features/configuration/treat_symbols_as_metadata_keys_with_true_values.feature +0 -52
  137. data/features/subject/attribute_of_subject.feature +0 -124
  138. data/features/subject/one_liner_syntax.feature +0 -71
  139. data/lib/autotest/discover.rb +0 -10
  140. data/lib/autotest/rspec2.rb +0 -77
  141. data/lib/rspec/core/backtrace_cleaner.rb +0 -46
  142. data/lib/rspec/core/backward_compatibility.rb +0 -55
  143. data/lib/rspec/core/caller_filter.rb +0 -60
  144. data/lib/rspec/core/deprecated_mutable_array_proxy.rb +0 -32
  145. data/lib/rspec/core/deprecation.rb +0 -26
  146. data/lib/rspec/core/extensions/instance_eval_with_args.rb +0 -44
  147. data/lib/rspec/core/extensions/kernel.rb +0 -9
  148. data/lib/rspec/core/extensions/module_eval_with_args.rb +0 -38
  149. data/lib/rspec/core/extensions/ordered.rb +0 -27
  150. data/lib/rspec/core/formatters/console_codes.rb +0 -42
  151. data/lib/rspec/core/formatters/text_mate_formatter.rb +0 -34
  152. data/lib/rspec/core/metadata_hash_builder.rb +0 -97
  153. data/lib/rspec/core/minitest_assertions_adapter.rb +0 -28
  154. data/lib/rspec/core/test_unit_assertions_adapter.rb +0 -30
  155. data/spec/autotest/discover_spec.rb +0 -49
  156. data/spec/autotest/failed_results_re_spec.rb +0 -45
  157. data/spec/autotest/rspec_spec.rb +0 -133
  158. data/spec/rspec/core/backtrace_cleaner_spec.rb +0 -68
  159. data/spec/rspec/core/caller_filter_spec.rb +0 -58
  160. data/spec/rspec/core/deprecations_spec.rb +0 -59
  161. data/spec/rspec/core/formatters/console_codes_spec.rb +0 -50
  162. data/spec/rspec/core/formatters/text_mate_formatter_spec.rb +0 -107
  163. data/spec/rspec/core/kernel_extensions_spec.rb +0 -9
  164. data/spec/rspec/core/pending_spec.rb +0 -27
  165. data/spec/support/silence_dsl_deprecations.rb +0 -32
@@ -0,0 +1,65 @@
1
+ module RSpec
2
+ module Core
3
+ class BacktraceFormatter
4
+ # This is only used externally by rspec-expectations. Can be removed once
5
+ # rspec-expectations uses
6
+ # RSpec.configuration.backtrace_formatter.format_backtrace instead.
7
+ def self.format_backtrace(backtrace, options = {})
8
+ RSpec.configuration.backtrace_formatter.format_backtrace(backtrace, options)
9
+ end
10
+
11
+ attr_accessor :exclusion_patterns, :inclusion_patterns
12
+
13
+ def initialize
14
+ @full_backtrace = false
15
+ @exclusion_patterns = [] << Regexp.union(
16
+ *["/lib\d*/ruby/",
17
+ "org/jruby/",
18
+ "bin/",
19
+ "/gems/",
20
+ "lib/rspec/(core|expectations|matchers|mocks)"].
21
+ map {|s| Regexp.new(s.gsub("/", File::SEPARATOR))}
22
+ )
23
+ @inclusion_patterns = [Regexp.new(Dir.getwd)]
24
+ end
25
+
26
+ def full_backtrace=(full_backtrace)
27
+ @full_backtrace = full_backtrace
28
+ end
29
+
30
+ def full_backtrace?
31
+ @full_backtrace || @exclusion_patterns.empty?
32
+ end
33
+
34
+ def format_backtrace(backtrace, options = {})
35
+ return backtrace if options[:full_backtrace]
36
+ backtrace.
37
+ take_while {|l| l != RSpec::Core::Runner::AT_EXIT_HOOK_BACKTRACE_LINE}.
38
+ map {|l| backtrace_line(l)}.
39
+ compact.
40
+ tap do |filtered|
41
+ if filtered.empty?
42
+ filtered.concat backtrace
43
+ filtered << ""
44
+ filtered << " Showing full backtrace because every line was filtered out."
45
+ filtered << " See docs for RSpec::Configuration#backtrace_exclusion_patterns and"
46
+ filtered << " RSpec::Configuration#backtrace_inclusion_patterns for more information."
47
+ end
48
+ end
49
+ end
50
+
51
+ # @api private
52
+ def backtrace_line(line)
53
+ RSpec::Core::Metadata::relative_path(line) unless exclude?(line)
54
+ rescue SecurityError
55
+ nil
56
+ end
57
+
58
+ # @api private
59
+ def exclude?(line)
60
+ return false if @full_backtrace
61
+ @exclusion_patterns.any? {|p| p =~ line} && @inclusion_patterns.none? {|p| p =~ line}
62
+ end
63
+ end
64
+ end
65
+ end
@@ -1,7 +1,11 @@
1
1
  module RSpec
2
2
  module Core
3
- class Runner
3
+ class CommandLine
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
5
9
  @options = options
6
10
  @configuration = configuration
7
11
  @world = world
@@ -18,30 +22,15 @@ module RSpec
18
22
  @configuration.load_spec_files
19
23
  @world.announce_filters
20
24
 
21
- @configuration.reporter.report(@world.example_count, @configuration.send(:_randomize?) ? @configuration.seed : nil) do |reporter|
25
+ @configuration.reporter.report(@world.example_count) do |reporter|
22
26
  begin
23
27
  @configuration.run_hook(:before, :suite)
24
- @world.example_groups.ordered.map {|g| g.run(reporter)}.all? ? 0 : @configuration.failure_exit_code
28
+ @world.ordered_example_groups.map {|g| g.run(reporter) }.all? ? 0 : @configuration.failure_exit_code
25
29
  ensure
26
30
  @configuration.run_hook(:after, :suite)
27
31
  end
28
32
  end
29
33
  end
30
34
  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
46
35
  end
47
36
  end
@@ -1,7 +1,6 @@
1
1
  require 'fileutils'
2
- require 'rspec/core/backtrace_cleaner'
2
+ require 'rspec/core/backtrace_formatter'
3
3
  require 'rspec/core/ruby_project'
4
- require 'rspec/core/deprecated_mutable_array_proxy'
5
4
  require 'rspec/core/formatters/deprecation_formatter'
6
5
 
7
6
  module RSpec
@@ -73,55 +72,62 @@ module RSpec
73
72
  define_reader name
74
73
  define_predicate_for name
75
74
  end
76
- [opts[:alias_with]].flatten.compact.each do |alias_name|
75
+ Array(opts[:alias_with]).each do |alias_name|
77
76
  define_aliases(name, alias_name)
78
77
  end
79
78
  end
80
79
 
81
80
  # @macro [attach] add_setting
82
81
  # @attribute $1
82
+ #
83
+ # @macro [attach] define_reader
84
+ # @attribute $1
83
85
 
86
+ # @macro add_setting
84
87
  # Path to use if no path is provided to the `rspec` command (default:
85
88
  # `"spec"`). Allows you to just type `rspec` instead of `rspec spec` to
86
89
  # run all the examples in the `spec` directory.
87
90
  add_setting :default_path
88
91
 
92
+ # @macro add_setting
89
93
  # Run examples over DRb (default: `false`). RSpec doesn't supply the DRb
90
94
  # server, but you can use tools like spork.
91
95
  add_setting :drb
92
96
 
97
+ # @macro add_setting
93
98
  # The drb_port (default: nil).
94
99
  add_setting :drb_port
95
100
 
101
+ # @macro add_setting
96
102
  # Default: `$stderr`.
97
103
  add_setting :error_stream
98
104
 
105
+ # @macro add_setting
99
106
  # Default: `$stderr`.
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
107
+ add_setting :deprecation_stream
112
108
 
109
+ # @macro add_setting
113
110
  # Clean up and exit after the first failure (default: `false`).
114
111
  add_setting :fail_fast
115
112
 
113
+ # @macro add_setting
114
+ # Prints the formatter output of your suite without running any
115
+ # examples or hooks.
116
+ add_setting :dry_run
117
+
118
+ # @macro add_setting
116
119
  # The exit code to return if there are any failures (default: 1).
117
120
  add_setting :failure_exit_code
118
121
 
122
+ # @macro define_reader
119
123
  # Indicates files configured to be required
120
124
  define_reader :requires
121
125
 
126
+ # @macro define_reader
122
127
  # Returns dirs that have been prepended to the load path by #lib=
123
128
  define_reader :libs
124
129
 
130
+ # @macro add_setting
125
131
  # Default: `$stdout`.
126
132
  # Also known as `output` and `out`
127
133
  define_reader :output_stream
@@ -136,128 +142,67 @@ module RSpec
136
142
  end
137
143
  end
138
144
 
139
- # @deprecated use RSpec::Core::Configuration#output_stream instead.
140
- def output
141
- RSpec.deprecate("RSpec::Core::Configuration#output", :replacement => "RSpec::Core::Configuration#output_stream")
142
- output_stream
143
- end
144
-
145
- # @deprecated use RSpec::Core::Configuration#output_stream= instead.
146
- def output=(value)
147
- RSpec.deprecate("RSpec::Core::Configuration#output=", :replacement => "RSpec::Core::Configuration#output_stream=")
148
- self.output_stream = value
149
- end
150
-
151
- # @deprecated use RSpec::Core::Configuration#output_stream instead.
152
- def out
153
- RSpec.deprecate("RSpec::Core::Configuration#out", :replacement => "RSpec::Core::Configuration#output_stream")
154
- output_stream
155
- end
156
-
157
- # @deprecated use RSpec::Core::Configuration#output_stream= instead.
158
- def out=(value)
159
- RSpec.deprecate("RSpec::Core::Configuration#out=", :replacement => "RSpec::Core::Configuration#output_stream=")
160
- self.output_stream = value
161
- end
162
-
145
+ # @macro add_setting
163
146
  # Load files matching this pattern (default: `'**/*_spec.rb'`)
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
147
+ add_setting :pattern, :alias_with => :filename_pattern
171
148
 
172
149
  def pattern= value
173
150
  if @spec_files_loaded
174
- Kernel.warn "WARNING: Configuring `pattern` to #{value} has no effect since RSpec has already loaded the spec files. Called from #{CallerFilter.first_non_rspec_line}"
151
+ RSpec.warning "Configuring `pattern` to #{value} has no effect since RSpec has already loaded the spec files."
175
152
  end
176
153
  @pattern = value
177
154
  end
155
+ alias :filename_pattern= :pattern=
178
156
 
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
-
185
-
157
+ # @macro add_setting
186
158
  # Report the times for the slowest examples (default: `false`).
187
159
  # Use this to specify the number of examples to include in the profile.
188
160
  add_setting :profile_examples
189
161
 
162
+ # @macro add_setting
190
163
  # Run all examples if none match the configured filters (default: `false`).
191
164
  add_setting :run_all_when_everything_filtered
192
165
 
193
- # Allow user to configure their own success/pending/failure colors
194
- # @param [Symbol] should be one of the following: [:black, :white, :red, :green, :yellow, :blue, :magenta, :cyan]
166
+ # @macro add_setting
167
+ # Color to use to indicate success.
168
+ # @param [Symbol] color one of the following: [:black, :white, :red, :green, :yellow, :blue, :magenta, :cyan]
195
169
  add_setting :success_color
170
+
171
+ # @macro add_setting
172
+ # Color to use to print pending examples.
173
+ # @param [Symbol] color one of the following: [:black, :white, :red, :green, :yellow, :blue, :magenta, :cyan]
196
174
  add_setting :pending_color
175
+
176
+ # @macro add_setting
177
+ # Color to use to indicate failure.
178
+ # @param [Symbol] color one of the following: [:black, :white, :red, :green, :yellow, :blue, :magenta, :cyan]
197
179
  add_setting :failure_color
180
+
181
+ # @macro add_setting
182
+ # The default output color.
183
+ # @param [Symbol] color one of the following: [:black, :white, :red, :green, :yellow, :blue, :magenta, :cyan]
198
184
  add_setting :default_color
185
+
186
+ # @macro add_setting
187
+ # Color used when a pending example is fixed.
188
+ # @param [Symbol] color one of the following: [:black, :white, :red, :green, :yellow, :blue, :magenta, :cyan]
199
189
  add_setting :fixed_color
200
- add_setting :detail_color
201
190
 
202
- # Seed for random ordering (default: generated randomly each run).
203
- #
204
- # When you run specs with `--order random`, RSpec generates a random seed
205
- # for the randomization and prints it to the `output_stream` (assuming
206
- # you're using RSpec's built-in formatters). If you discover an ordering
207
- # dependency (i.e. examples fail intermittently depending on order), set
208
- # this (on Configuration or on the command line with `--seed`) to run
209
- # using the same seed while you debug the issue.
210
- #
211
- # We recommend, actually, that you use the command line approach so you
212
- # don't accidentally leave the seed encoded.
213
- define_reader :seed
191
+ # @macro add_setting
192
+ # Color used to print details.
193
+ # @param [Symbol] color one of the following: [:black, :white, :red, :green, :yellow, :blue, :magenta, :cyan]
194
+ add_setting :detail_color
214
195
 
196
+ # @macro add_setting
215
197
  # When a block passed to pending fails (as expected), display the failure
216
198
  # without reporting it as a failure (default: false).
217
- def show_failures_in_pending_blocks=(value)
218
- RSpec.warn_deprecation(<<-EOS.gsub(/^\s+\|/, ''))
219
- |RSpec.configuration.show_failures_in_pending_blocks is being removed
220
- |with no replacement. Called from #{CallerFilter.first_non_rspec_line}.
221
- EOS
222
-
223
- @show_failures_in_pending_blocks = value
224
- end
225
-
226
- def show_failures_in_pending_blocks
227
- RSpec.warn_deprecation(<<-EOS.gsub(/^\s+\|/, ''))
228
- |RSpec.configuration.show_failures_in_pending_blocks is being removed
229
- |with no replacement. Called from #{CallerFilter.first_non_rspec_line}.
230
- EOS
231
-
232
- @show_failures_in_pending_blocks
233
- end
234
-
235
- def show_failures_in_pending_blocks?
236
- !!show_failures_in_pending_blocks
237
- end
238
-
239
- # Convert symbols to hashes with the symbol as a key with a value of
240
- # `true` (default: false).
241
- #
242
- # This allows you to tag a group or example like this:
243
- #
244
- # describe "something slow", :slow do
245
- # # ...
246
- # end
247
- #
248
- # ... instead of having to type:
249
- #
250
- # describe "something slow", :slow => true do
251
- # # ...
252
- # end
253
- add_setting :treat_symbols_as_metadata_keys_with_true_values
199
+ add_setting :show_failures_in_pending_blocks
254
200
 
201
+ # Deprecated. This config option was added in RSpec 2 to pave the way
202
+ # for this being the default behavior in RSpec 3. Now this option is
203
+ # a no-op.
255
204
  def treat_symbols_as_metadata_keys_with_true_values=(value)
256
- unless value
257
- RSpec.deprecate("RSpec.configuration.treat_symbols_as_metadata_keys_with_true_values = false")
258
- end
259
-
260
- @treat_symbols_as_metadata_keys_with_true_values = value
205
+ RSpec.deprecate("RSpec::Core::Configuration#treat_symbols_as_metadata_keys_with_true_values=")
261
206
  end
262
207
 
263
208
  # @private
@@ -270,36 +215,34 @@ module RSpec
270
215
  add_setting :expecting_with_rspec
271
216
  # @private
272
217
  attr_accessor :filter_manager
218
+ # @private
219
+ attr_reader :backtrace_formatter, :ordering_manager
273
220
 
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
221
+ # Alias for rspec-2.x's backtrace_cleaner (now backtrace_formatter)
222
+ #
223
+ # TODO: consider deprecating and removing this rather than aliasing in rspec-3?
224
+ alias backtrace_cleaner backtrace_formatter
281
225
 
282
226
  def initialize
283
227
  @expectation_frameworks = []
284
228
  @include_or_extend_modules = []
285
229
  @mock_framework = nil
286
230
  @files_to_run = []
231
+ @formatters = []
287
232
  @color = false
288
- @order = nil
289
233
  @pattern = '**/*_spec.rb'
290
234
  @failure_exit_code = 1
291
235
  @spec_files_loaded = false
292
236
 
293
- @backtrace_formatter = BacktraceCleaner.new
237
+ @backtrace_formatter = BacktraceFormatter.new
294
238
 
295
239
  @default_path = 'spec'
296
240
  @deprecation_stream = $stderr
297
241
  @output_stream = $stdout
298
242
  @reporter = nil
299
243
  @filter_manager = FilterManager.new
244
+ @ordering_manager = Ordering::ConfigurationManager.new
300
245
  @preferred_options = {}
301
- @seed = srand % 0xFFFF
302
- @ordering_already_forced = false
303
246
  @failure_color = :red
304
247
  @success_color = :green
305
248
  @pending_color = :yellow
@@ -309,18 +252,13 @@ module RSpec
309
252
  @profile_examples = false
310
253
  @requires = []
311
254
  @libs = []
312
- @show_failures_in_pending_blocks = false
313
255
  end
314
256
 
315
257
  # @private
316
258
  #
317
259
  # Used to set higher priority option values from the command line.
318
260
  def force(hash)
319
- if hash.has_key?(:seed)
320
- hash[:order], hash[:seed] = order_and_seed_from_seed(hash[:seed], true)
321
- elsif hash.has_key?(:order)
322
- set_order_and_seed(hash, true)
323
- end
261
+ ordering_manager.force(hash)
324
262
  @preferred_options.merge!(hash)
325
263
  self.warnings = value_for :warnings, nil
326
264
  end
@@ -329,7 +267,7 @@ module RSpec
329
267
  def reset
330
268
  @spec_files_loaded = false
331
269
  @reporter = nil
332
- @formatter_loader = nil
270
+ @formatters.clear
333
271
  end
334
272
 
335
273
  # @overload add_setting(name)
@@ -386,36 +324,33 @@ module RSpec
386
324
  mock_with framework
387
325
  end
388
326
 
389
- # The patterns to discard from backtraces. Deprecated, use
390
- # Configuration#backtrace_exclusion_patterns instead
327
+ # Regexps used to exclude lines from backtraces.
391
328
  #
392
- # Defaults to RSpec::Core::BacktraceCleaner::DEFAULT_EXCLUSION_PATTERNS
329
+ # Excludes lines from ruby (and jruby) source, installed gems, anything
330
+ # in any "bin" directory, and any of the rspec libs (outside gem
331
+ # installs) by default.
393
332
  #
394
- # One can replace the list by using the setter or modify it through the
395
- # getter
333
+ # You can modify the list via the getter, or replace it with the setter.
396
334
  #
397
335
  # To override this behaviour and display a full backtrace, use
398
336
  # `--backtrace`on the command line, in a `.rspec` file, or in the
399
337
  # `rspec_options` attribute of RSpec's rake task.
400
- def backtrace_clean_patterns
401
- RSpec.deprecate("RSpec::Core::Configuration#backtrace_clean_patterns",
402
- :replacement => "RSpec::Core::Configuration#backtrace_exclusion_patterns")
338
+ def backtrace_exclusion_patterns
403
339
  @backtrace_formatter.exclusion_patterns
404
340
  end
405
341
 
406
- def backtrace_clean_patterns=(patterns)
407
- RSpec.deprecate("RSpec::Core::Configuration#backtrace_clean_patterns",
408
- :replacement => "RSpec::Core::Configuration#backtrace_exclusion_patterns")
342
+ def backtrace_exclusion_patterns=(patterns)
409
343
  @backtrace_formatter.exclusion_patterns = patterns
410
344
  end
411
345
 
412
- # The patterns to always include to backtraces.
346
+ # Regexps used to include lines in backtraces.
413
347
  #
414
- # Defaults to [Regexp.new Dir.getwd] if the current working directory
415
- # matches any of the exclusion patterns. Otherwise it defaults to empty.
348
+ # Defaults to [Regexp.new Dir.getwd].
416
349
  #
417
- # One can replace the list by using the setter or modify it through the
418
- # getter
350
+ # Lines that match an exclusion _and_ an inclusion pattern
351
+ # will be included.
352
+ #
353
+ # You can modify the list via the getter, or replace it with the setter.
419
354
  def backtrace_inclusion_patterns
420
355
  @backtrace_formatter.inclusion_patterns
421
356
  end
@@ -424,24 +359,6 @@ module RSpec
424
359
  @backtrace_formatter.inclusion_patterns = patterns
425
360
  end
426
361
 
427
- # The patterns to discard from backtraces.
428
- #
429
- # Defaults to RSpec::Core::BacktraceCleaner::DEFAULT_EXCLUSION_PATTERNS
430
- #
431
- # One can replace the list by using the setter or modify it through the
432
- # getter
433
- #
434
- # To override this behaviour and display a full backtrace, use
435
- # `--backtrace`on the command line, in a `.rspec` file, or in the
436
- # `rspec_options` attribute of RSpec's rake task.
437
- def backtrace_exclusion_patterns
438
- @backtrace_formatter.exclusion_patterns
439
- end
440
-
441
- def backtrace_exclusion_patterns=(patterns)
442
- @backtrace_formatter.exclusion_patterns = patterns
443
- end
444
-
445
362
  # Sets the mock framework adapter module.
446
363
  #
447
364
  # `framework` can be a Symbol or a Module.
@@ -478,19 +395,14 @@ module RSpec
478
395
  when String, Symbol
479
396
  require case framework.to_s
480
397
  when /rspec/i
481
- deprecate_unless_mock_adapter_name_is_exact(framework, :rspec)
482
398
  'rspec/core/mocking/with_rspec'
483
399
  when /mocha/i
484
- deprecate_unless_mock_adapter_name_is_exact(framework, :mocha)
485
400
  'rspec/core/mocking/with_mocha'
486
401
  when /rr/i
487
- deprecate_unless_mock_adapter_name_is_exact(framework, :rr)
488
402
  'rspec/core/mocking/with_rr'
489
403
  when /flexmock/i
490
- deprecate_unless_mock_adapter_name_is_exact(framework, :flexmock)
491
404
  'rspec/core/mocking/with_flexmock'
492
405
  else
493
- deprecate_unless_mock_adapter_name_is_exact(framework, :nothing)
494
406
  'rspec/core/mocking/with_absolutely_nothing'
495
407
  end
496
408
  RSpec::Core::MockFrameworkAdapter
@@ -526,17 +438,16 @@ module RSpec
526
438
  # Sets the expectation framework module(s) to be included in each example
527
439
  # group.
528
440
  #
529
- # `frameworks` can be `:rspec`, `:test_unit`, `:minitest`, a custom
530
- # module, or any combination thereof:
441
+ # `frameworks` can be `:rspec`, `:stdlib`, a custom module, or any
442
+ # combination thereof:
531
443
  #
532
444
  # config.expect_with :rspec
533
- # config.expect_with :test_unit
534
- # config.expect_with :minitest
535
- # config.expect_with :rspec, :minitest
445
+ # config.expect_with :stdlib
446
+ # config.expect_with :rspec, :stdlib
536
447
  # config.expect_with OtherExpectationFramework
537
448
  #
538
- # RSpec will translate `:rspec`, `:minitest`, and `:test_unit` into the
539
- # appropriate modules.
449
+ # RSpec will translate `:rspec` and `:stdlib` into the appropriate
450
+ # modules.
540
451
  #
541
452
  # ## Configuration
542
453
  #
@@ -556,15 +467,8 @@ module RSpec
556
467
  self.expecting_with_rspec = true
557
468
  ::RSpec::Matchers
558
469
  when :stdlib
559
- RSpec.deprecate ':stdlib', :replacement => ":test_unit or :minitest"
560
470
  require 'test/unit/assertions'
561
471
  ::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
568
472
  else
569
473
  raise ArgumentError, "#{framework.inspect} is not supported"
570
474
  end
@@ -591,32 +495,18 @@ module RSpec
591
495
  @backtrace_formatter.full_backtrace = true_or_false
592
496
  end
593
497
 
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
612
-
613
- color_enabled? output
498
+ def color(output=output_stream)
499
+ # rspec's built-in formatters all call this with the output argument,
500
+ # but defaulting to output_stream for backward compatibility with
501
+ # formatters in extension libs
502
+ return false unless output_to_tty?(output)
503
+ value_for(:color, @color)
614
504
  end
615
505
 
616
506
  def color=(bool)
617
507
  if bool
618
508
  if RSpec.windows_os? and not ENV['ANSICON']
619
- warn "You must use ANSICON 1.31 or later (http://adoxa.3eeweb.com/ansicon/) to use colour on Windows"
509
+ RSpec.warning "You must use ANSICON 1.31 or later (http://adoxa.3eeweb.com/ansicon/) to use colour on Windows"
620
510
  @color = false
621
511
  else
622
512
  @color = true
@@ -624,31 +514,11 @@ module RSpec
624
514
  end
625
515
  end
626
516
 
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
517
+ # TODO - deprecate color_enabled - probably not until the last 2.x
518
+ # release before 3.0
519
+ alias_method :color_enabled, :color
520
+ alias_method :color_enabled=, :color=
521
+ define_predicate_for :color_enabled, :color
652
522
 
653
523
  def libs=(libs)
654
524
  libs.map do |lib|
@@ -664,49 +534,6 @@ module RSpec
664
534
  @requires += paths
665
535
  end
666
536
 
667
- def debug=(bool)
668
- if bool == :cli
669
- RSpec.deprecate("RSpec's built-in debugger support",
670
- :replacement => "a CLI option like `-rruby-debug` or `-rdebugger`",
671
- :call_site => nil)
672
- bool = true
673
- elsif bool
674
- RSpec.deprecate("RSpec::Core::Configuration#debug=",
675
- :replacement => "a CLI option like `-rruby-debug` or `-rdebugger`")
676
- else
677
- # ...but the only way to call this with a false value is to
678
- # call it directly, so here we mention the method name.
679
- # There's no replacement for it since it's a no-op, though.
680
- RSpec.deprecate("RSpec::Core::Configuration#debug=")
681
- end
682
-
683
- return unless bool
684
- begin
685
- require 'ruby-debug'
686
- Debugger.start
687
- rescue LoadError => e
688
- raise <<-EOM
689
-
690
- #{'*'*50}
691
- #{e.message}
692
-
693
- If you have it installed as a ruby gem, then you need to either require
694
- 'rubygems' or configure the RUBYOPT environment variable with the value
695
- 'rubygems'.
696
-
697
- #{e.backtrace.join("\n")}
698
- #{'*'*50}
699
- EOM
700
- end
701
- end
702
-
703
- def debug?
704
- RSpec.deprecate("RSpec::Core::Configuration#debug?",
705
- :replacement => "defined?(Debugger)")
706
-
707
- !!defined?(Debugger)
708
- end
709
-
710
537
  # Run examples defined on `line_numbers` in all files to run.
711
538
  def line_numbers=(line_numbers)
712
539
  filter_run :line_numbers => line_numbers.map{|l| l.to_i}
@@ -736,27 +563,27 @@ EOM
736
563
  # and paths to use for output streams, but you should consider that a
737
564
  # private api that may change at any time without notice.
738
565
  def add_formatter(formatter_to_use, *paths)
566
+ formatter_class =
567
+ built_in_formatter(formatter_to_use) ||
568
+ custom_formatter(formatter_to_use) ||
569
+ (raise ArgumentError, "Formatter '#{formatter_to_use}' unknown - maybe you meant 'documentation' or 'progress'?.")
570
+
739
571
  paths << output_stream if paths.empty?
740
- formatter_loader.add formatter_to_use, *paths
572
+ formatters << formatter_class.new(*paths.map {|p| String === p ? file_at(p) : p})
741
573
  end
574
+
742
575
  alias_method :formatter=, :add_formatter
743
576
 
744
577
  def formatters
745
- DeprecatedMutableArrayProxy.new(formatter_loader.formatters)
746
- end
747
-
748
- # @private
749
- def formatter_loader
750
- @formatter_loader ||= Formatters::Loader.new(Reporter.new)
578
+ @formatters ||= []
751
579
  end
752
580
 
753
- # @private
754
581
  def reporter
755
- @reporter ||=
756
- begin
757
- formatter_loader.setup_default output_stream, deprecation_stream
758
- formatter_loader.reporter
759
- end
582
+ @reporter ||= begin
583
+ add_formatter('progress') if formatters.empty?
584
+ add_formatter(RSpec::Core::Formatters::DeprecationFormatter, deprecation_stream, output_stream)
585
+ Reporter.new(self, *formatters)
586
+ end
760
587
  end
761
588
 
762
589
  # @api private
@@ -801,8 +628,8 @@ EOM
801
628
  # end
802
629
  # end
803
630
  def alias_example_to(new_name, *args)
804
- extra_options = build_metadata_hash_from(args)
805
- RSpec::Core::ExampleGroup.define_example_method(new_name, extra_options)
631
+ extra_options = Metadata.build_hash_from(args)
632
+ RSpec::Core::ExampleGroup.alias_example_to(new_name, extra_options)
806
633
  end
807
634
 
808
635
  # Define an alias for it_should_behave_like that allows different
@@ -827,15 +654,14 @@ EOM
827
654
  # has behavior: sortability
828
655
  # # sortability examples here
829
656
  def alias_it_behaves_like_to(new_name, report_label = '')
830
- RSpec::Core::ExampleGroup.define_nested_shared_group_method(new_name, report_label)
657
+ RSpec::Core::ExampleGroup.alias_it_behaves_like_to(new_name, report_label)
831
658
  end
832
659
 
833
660
  alias_method :alias_it_should_behave_like_to, :alias_it_behaves_like_to
834
661
 
835
- # Adds key/value pairs to the `inclusion_filter`. If the
836
- # `treat_symbols_as_metadata_keys_with_true_values` config option is set
837
- # to true and `args` includes any symbols that are not part of a hash,
838
- # each symbol is treated as a key in the hash with the value `true`.
662
+ # Adds key/value pairs to the `inclusion_filter`. If `args`
663
+ # includes any symbols that are not part of the hash, each symbol
664
+ # is treated as a key in the hash with the value `true`.
839
665
  #
840
666
  # ### Note
841
667
  #
@@ -861,15 +687,12 @@ EOM
861
687
  # # and the metadata itself e.g.
862
688
  # config.filter_run_including :foo => lambda {|v,m| m[:foo] == 'bar'}
863
689
  #
864
- # # with treat_symbols_as_metadata_keys_with_true_values = true
865
690
  # filter_run_including :foo # same as filter_run_including :foo => true
866
691
  def filter_run_including(*args)
867
- __filter_run(__method__, *args)
692
+ filter_manager.include_with_low_priority Metadata.build_hash_from(args)
868
693
  end
869
694
 
870
- def filter_run(*args)
871
- __filter_run(__method__, *args)
872
- end
695
+ alias_method :filter_run, :filter_run_including
873
696
 
874
697
  # Clears and reassigns the `inclusion_filter`. Set to `nil` if you don't
875
698
  # want any inclusion filter at all.
@@ -879,7 +702,7 @@ EOM
879
702
  # This overrides any inclusion filters/tags set on the command line or in
880
703
  # configuration files.
881
704
  def inclusion_filter=(filter)
882
- filter_manager.include_only build_metadata_hash_from([filter])
705
+ filter_manager.include! Metadata.build_hash_from([filter])
883
706
  end
884
707
 
885
708
  alias_method :filter=, :inclusion_filter=
@@ -892,10 +715,9 @@ EOM
892
715
 
893
716
  alias_method :filter, :inclusion_filter
894
717
 
895
- # Adds key/value pairs to the `exclusion_filter`. If the
896
- # `treat_symbols_as_metadata_keys_with_true_values` config option is set
897
- # to true and `args` excludes any symbols that are not part of a hash,
898
- # each symbol is treated as a key in the hash with the value `true`.
718
+ # Adds key/value pairs to the `exclusion_filter`. If `args`
719
+ # includes any symbols that are not part of the hash, each symbol
720
+ # is treated as a key in the hash with the value `true`.
899
721
  #
900
722
  # ### Note
901
723
  #
@@ -921,10 +743,9 @@ EOM
921
743
  # # and the metadata itself e.g.
922
744
  # config.filter_run_excluding :foo => lambda {|v,m| m[:foo] == 'bar'}
923
745
  #
924
- # # with treat_symbols_as_metadata_keys_with_true_values = true
925
746
  # filter_run_excluding :foo # same as filter_run_excluding :foo => true
926
747
  def filter_run_excluding(*args)
927
- filter_manager.exclude_with_low_priority build_metadata_hash_from(args)
748
+ filter_manager.exclude_with_low_priority Metadata.build_hash_from(args)
928
749
  end
929
750
 
930
751
  # Clears and reassigns the `exclusion_filter`. Set to `nil` if you don't
@@ -935,7 +756,7 @@ EOM
935
756
  # This overrides any exclusion filters/tags set on the command line or in
936
757
  # configuration files.
937
758
  def exclusion_filter=(filter)
938
- filter_manager.exclude_only build_metadata_hash_from([filter])
759
+ filter_manager.exclude! Metadata.build_hash_from([filter])
939
760
  end
940
761
 
941
762
  # Returns the `exclusion_filter`. If none has been set, returns an empty
@@ -977,7 +798,7 @@ EOM
977
798
  #
978
799
  # @see #extend
979
800
  def include(mod, *filters)
980
- include_or_extend_modules << [:include, mod, build_metadata_hash_from(filters)]
801
+ include_or_extend_modules << [:include, mod, Metadata.build_hash_from(filters)]
981
802
  end
982
803
 
983
804
  # Tells RSpec to extend example groups with `mod`. Methods defined in
@@ -1010,7 +831,7 @@ EOM
1010
831
  #
1011
832
  # @see #include
1012
833
  def extend(mod, *filters)
1013
- include_or_extend_modules << [:extend, mod, build_metadata_hash_from(filters)]
834
+ include_or_extend_modules << [:extend, mod, Metadata.build_hash_from(filters)]
1014
835
  end
1015
836
 
1016
837
  # @private
@@ -1064,7 +885,6 @@ EOM
1064
885
  def load_spec_files
1065
886
  files_to_run.uniq.each {|f| load File.expand_path(f) }
1066
887
  @spec_files_loaded = true
1067
- raise_if_rspec_1_is_loaded
1068
888
  end
1069
889
 
1070
890
  # @private
@@ -1086,131 +906,47 @@ EOM
1086
906
  @format_docstrings_block ||= DEFAULT_FORMATTER
1087
907
  end
1088
908
 
1089
- # @api
1090
- #
1091
- # Sets the seed value and sets `order='rand'`
1092
- def seed=(seed)
1093
- order_and_seed_from_seed(seed)
1094
- end
1095
-
1096
- # @api
1097
- #
1098
- # Sets the order and, if order is `'rand:<seed>'`, also sets the seed.
1099
- def order=(type)
1100
- order_and_seed_from_order(type)
1101
- end
1102
-
1103
- # Determines the order in which examples are run (default: OS standard
1104
- # load order for files, declaration order for groups and examples).
1105
- def order
1106
- RSpec.warn_deprecation(
1107
- "RSpec::Core::Configuration#order is deprecated with no replacement. " +
1108
- "In RSpec 3 individal example groups can use a particular ordering, " +
1109
- "so `order` is no longer a global property of the entire suite. " +
1110
- "Called from #{CallerFilter.first_non_rspec_line}."
1111
- )
1112
-
1113
- value_for(:order, @order)
1114
- end
1115
-
1116
- def randomize?
1117
- RSpec.warn_deprecation(
1118
- "RSpec::Core::Configuration#randomize? is deprecated with no replacement. " +
1119
- "In RSpec 3 individal example groups can use a particular ordering, " +
1120
- "so `randomize?` is no longer a binary property of the entire suite. " +
1121
- "Called from #{CallerFilter.first_non_rspec_line}."
1122
- )
1123
-
1124
- value_for(:order, @order).to_s.match(/rand/)
1125
- end
1126
-
1127
- # @private
1128
- DEFAULT_ORDERING = lambda { |list| list }
1129
-
1130
909
  # @private
1131
- RANDOM_ORDERING = lambda do |list|
1132
- Kernel.srand RSpec.configuration.seed
1133
- ordering = list.sort_by { Kernel.rand(list.size) }
1134
- Kernel.srand # reset random generation
1135
- ordering
910
+ def self.delegate_to_ordering_manager(*methods)
911
+ methods.each do |method|
912
+ define_method method do |*args, &block|
913
+ ordering_manager.__send__(method, *args, &block)
914
+ end
915
+ end
1136
916
  end
1137
917
 
1138
- # Sets a strategy by which to order examples.
918
+ # @macro delegate_to_ordering_manager
1139
919
  #
1140
- # @example
1141
- # RSpec.configure do |config|
1142
- # config.order_examples do |examples|
1143
- # examples.reverse
1144
- # end
1145
- # end
1146
- #
1147
- # @see #order_groups
1148
- # @see #order_groups_and_examples
1149
- # @see #order=
1150
- # @see #seed=
1151
- def order_examples(&block)
1152
- RSpec.deprecate("RSpec::Configuration#order_examples", :replacement => "RSpec::Configuration#register_ordering(:global)")
1153
- @example_ordering_block = block
1154
- @order = "custom" unless built_in_orderer?(block)
1155
- end
1156
-
1157
- # @private
1158
- def example_ordering_block
1159
- @example_ordering_block ||= DEFAULT_ORDERING
1160
- end
920
+ # Sets the seed value and sets the default global ordering to random.
921
+ delegate_to_ordering_manager :seed=
1161
922
 
1162
- # Sets a strategy by which to order groups.
923
+ # @macro delegate_to_ordering_manager
924
+ # Seed for random ordering (default: generated randomly each run).
1163
925
  #
1164
- # @example
1165
- # RSpec.configure do |config|
1166
- # config.order_groups do |groups|
1167
- # groups.reverse
1168
- # end
1169
- # end
926
+ # When you run specs with `--order random`, RSpec generates a random seed
927
+ # for the randomization and prints it to the `output_stream` (assuming
928
+ # you're using RSpec's built-in formatters). If you discover an ordering
929
+ # dependency (i.e. examples fail intermittently depending on order), set
930
+ # this (on Configuration or on the command line with `--seed`) to run
931
+ # using the same seed while you debug the issue.
1170
932
  #
1171
- # @see #order_examples
1172
- # @see #order_groups_and_examples
1173
- # @see #order=
1174
- # @see #seed=
1175
- def order_groups(&block)
1176
- RSpec.deprecate("RSpec::Configuration#order_groups", :replacement => "RSpec::Configuration#register_ordering(:global)")
1177
- @group_ordering_block = block
1178
- @order = "custom" unless built_in_orderer?(block)
1179
- end
1180
-
1181
- # @private
1182
- def group_ordering_block
1183
- @group_ordering_block ||= DEFAULT_ORDERING
1184
- end
933
+ # We recommend, actually, that you use the command line approach so you
934
+ # don't accidentally leave the seed encoded.
935
+ delegate_to_ordering_manager :seed
1185
936
 
1186
- # Sets a strategy by which to order groups and examples.
937
+ # @macro delegate_to_ordering_manager
1187
938
  #
1188
- # @example
1189
- # RSpec.configure do |config|
1190
- # config.order_groups_and_examples do |groups_or_examples|
1191
- # groups_or_examples.reverse
1192
- # end
1193
- # end
1194
- #
1195
- # @see #order_groups
1196
- # @see #order_examples
1197
- # @see #order=
1198
- # @see #seed=
1199
- def order_groups_and_examples(&block)
1200
- order_groups(&block)
1201
- order_examples(&block)
1202
- end
939
+ # Sets the default global order and, if order is `'rand:<seed>'`, also sets the seed.
940
+ delegate_to_ordering_manager :order=
1203
941
 
1204
- # In RSpec 3, this registers a named ordering strategy that can later be
942
+ # @macro delegate_to_ordering_manager
943
+ # Registers a named ordering strategy that can later be
1205
944
  # used to order an example group's subgroups by adding
1206
945
  # `:order => <name>` metadata to the example group.
1207
946
  #
1208
- # In RSpec 2.99, only `register_ordering(:global)` is supported,
1209
- # to set the global ordering.
1210
- #
1211
947
  # @param name [Symbol] The name of the ordering.
1212
948
  # @yield Block that will order the given examples or example groups
1213
- # @yieldparam list [Array<RSpec::Core::Example>, Array<RSpec::Core::ExampleGropu>] The examples or groups to order
949
+ # @yieldparam list [Array<RSpec::Core::Example>, Array<RSpec::Core::ExampleGroup>] The examples or groups to order
1214
950
  # @yieldreturn [Array<RSpec::Core::Example>, Array<RSpec::Core::ExampleGroup>] The re-ordered examples or groups
1215
951
  #
1216
952
  # @example
@@ -1227,33 +963,18 @@ EOM
1227
963
  # @note Pass the symbol `:global` to set the ordering strategy that
1228
964
  # will be used to order the top-level example groups and any example
1229
965
  # groups that do not have declared `:order` metadata.
1230
- def register_ordering(name, &block)
1231
- unless name == :global
1232
- raise ArgumentError,
1233
- "Ordering name `#{name.inspect}` given, `:global` expected. " +
1234
- "RSpec 3 will support named orderings (that can be used for " +
1235
- "individual example groups) but 2.99 only supports using this " +
1236
- "to set the global order."
1237
- end
966
+ delegate_to_ordering_manager :register_ordering
1238
967
 
1239
- @group_ordering_block = block
1240
- @example_ordering_block = block
1241
- @order = "custom"
1242
- end
968
+ # @private
969
+ delegate_to_ordering_manager :seed_used?, :ordering_registry
1243
970
 
1244
971
  # Set Ruby warnings on or off
1245
972
  def warnings= value
1246
973
  $VERBOSE = !!value
1247
974
  end
1248
975
 
1249
- def warnings?
1250
- $VERBOSE
1251
- end
1252
-
1253
976
  def warnings
1254
- RSpec.deprecate("`RSpec::Core::Configuration#warnings`",
1255
- :replacement => "`RSpec::Core::Configuration#warnings?`")
1256
- warnings?
977
+ $VERBOSE
1257
978
  end
1258
979
 
1259
980
  # Exposes the current running example via the named
@@ -1305,15 +1026,11 @@ EOM
1305
1026
 
1306
1027
  private
1307
1028
 
1308
- def _randomize?
1309
- value_for(:order, @order).to_s.match(/rand/)
1310
- end
1311
-
1312
1029
  def get_files_to_run(paths)
1313
- paths.map do |path|
1030
+ FlatMap.flat_map(paths) do |path|
1314
1031
  path = path.gsub(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR
1315
1032
  File.directory?(path) ? gather_directories(path) : extract_location(path)
1316
- end.flatten.sort
1033
+ end.sort
1317
1034
  end
1318
1035
 
1319
1036
  def gather_directories(path)
@@ -1347,88 +1064,66 @@ EOM
1347
1064
  end
1348
1065
  end
1349
1066
 
1350
- def raise_if_rspec_1_is_loaded
1351
- if defined?(Spec) && defined?(Spec::VERSION::MAJOR) && Spec::VERSION::MAJOR == 1
1352
- raise <<-MESSAGE
1353
-
1354
- #{'*'*80}
1355
- You are running rspec-2, but it seems as though rspec-1 has been loaded as
1356
- well. This is likely due to a statement like this somewhere in the specs:
1357
-
1358
- require 'spec'
1359
-
1360
- Please locate that statement, remove it, and try again.
1361
- #{'*'*80}
1362
- MESSAGE
1363
- end
1364
- end
1365
-
1366
1067
  def output_to_tty?(output=output_stream)
1367
1068
  tty? || (output.respond_to?(:tty?) && output.tty?)
1368
1069
  end
1369
1070
 
1370
- def order_and_seed_from_seed(value, force = false)
1371
- order_and_seed_from_order "rand:#{value}", force
1372
- end
1373
-
1374
- def set_order_and_seed(hash, force = false)
1375
- hash[:order], seed = order_and_seed_from_order(hash[:order], force)
1376
- hash[:seed] = seed if seed
1071
+ def built_in_formatter(key)
1072
+ case key.to_s
1073
+ when 'd', 'doc', 'documentation', 's', 'n', 'spec', 'nested'
1074
+ require 'rspec/core/formatters/documentation_formatter'
1075
+ RSpec::Core::Formatters::DocumentationFormatter
1076
+ when 'h', 'html'
1077
+ require 'rspec/core/formatters/html_formatter'
1078
+ RSpec::Core::Formatters::HtmlFormatter
1079
+ when 'p', 'progress'
1080
+ require 'rspec/core/formatters/progress_formatter'
1081
+ RSpec::Core::Formatters::ProgressFormatter
1082
+ when 'j', 'json'
1083
+ require 'rspec/core/formatters/json_formatter'
1084
+ RSpec::Core::Formatters::JsonFormatter
1085
+ end
1377
1086
  end
1378
1087
 
1379
- def order_and_seed_from_order(type, force = false)
1380
- order, seed = type.to_s.split(':')
1381
- @order = order
1382
- @seed = seed = seed.to_i if seed
1383
-
1384
- if order.to_s.match(/rand/)
1385
- ordering = RANDOM_ORDERING
1386
- elsif %w[ default defined ].include?(order)
1387
- if order == 'default'
1388
- RSpec.deprecate("RSpec::Core::Configuration#order = 'default'",
1389
- :replacement => "RSpec::Core::Configuration#order = 'defined'")
1088
+ def custom_formatter(formatter_ref)
1089
+ if Class === formatter_ref
1090
+ formatter_ref
1091
+ elsif string_const?(formatter_ref)
1092
+ begin
1093
+ formatter_ref.gsub(/^::/,'').split('::').inject(Object) { |const,string| const.const_get string }
1094
+ rescue NameError
1095
+ require( path_for(formatter_ref) ) ? retry : raise
1390
1096
  end
1391
-
1392
- @order, @seed = nil, nil
1393
- ordering = DEFAULT_ORDERING
1394
- end
1395
-
1396
- unless @ordering_already_forced
1397
- @group_ordering_block = ordering
1398
- @example_ordering_block = ordering
1399
1097
  end
1400
- @ordering_already_forced = true if force
1401
-
1402
- return order, seed
1403
1098
  end
1404
1099
 
1405
- def built_in_orderer?(block)
1406
- [DEFAULT_ORDERING, RANDOM_ORDERING].include?(block)
1100
+ def string_const?(str)
1101
+ str.is_a?(String) && /\A[A-Z][a-zA-Z0-9_:]*\z/ =~ str
1407
1102
  end
1408
1103
 
1409
- def deprecate_unless_mock_adapter_name_is_exact(name, expected)
1410
- return if name == expected
1411
- RSpec.deprecate("`config.mock_with #{name.inspect}`", :replacement => "`config.mock_with :#{expected}`")
1104
+ def path_for(const_ref)
1105
+ underscore_with_fix_for_non_standard_rspec_naming(const_ref)
1412
1106
  end
1413
1107
 
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
1108
+ def underscore_with_fix_for_non_standard_rspec_naming(string)
1109
+ underscore(string).sub(%r{(^|/)r_spec($|/)}, '\\1rspec\\2')
1110
+ end
1428
1111
 
1429
- filter_manager.include_with_low_priority metadata_hash
1112
+ # activesupport/lib/active_support/inflector/methods.rb, line 48
1113
+ def underscore(camel_cased_word)
1114
+ word = camel_cased_word.to_s.dup
1115
+ word.gsub!(/::/, '/')
1116
+ word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
1117
+ word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
1118
+ word.tr!("-", "_")
1119
+ word.downcase!
1120
+ word
1430
1121
  end
1431
1122
 
1123
+ def file_at(path)
1124
+ FileUtils.mkdir_p(File.dirname(path))
1125
+ File.new(path, 'w')
1126
+ end
1432
1127
  end
1433
1128
  end
1434
1129
  end