rspec-core 2.99.2 → 3.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
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