rspec-core 2.8.0.rc1 → 2.8.0.rc2

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 (73) hide show
  1. data/License.txt +24 -0
  2. data/README.md +197 -37
  3. data/features/command_line/format_option.feature +3 -3
  4. data/features/command_line/init.feature +18 -0
  5. data/features/example_groups/shared_examples.feature +1 -1
  6. data/features/hooks/around_hooks.feature +4 -4
  7. data/features/pending/pending_examples.feature +5 -5
  8. data/features/support/env.rb +8 -1
  9. data/lib/autotest/rspec2.rb +2 -6
  10. data/lib/rspec/core.rb +48 -158
  11. data/lib/rspec/core/backward_compatibility.rb +2 -0
  12. data/lib/rspec/core/command_line.rb +4 -0
  13. data/lib/rspec/core/configuration.rb +201 -106
  14. data/lib/rspec/core/configuration_options.rb +2 -1
  15. data/lib/rspec/core/deprecation.rb +2 -3
  16. data/lib/rspec/core/drb_options.rb +69 -58
  17. data/lib/rspec/core/dsl.rb +12 -0
  18. data/lib/rspec/core/example.rb +53 -18
  19. data/lib/rspec/core/example_group.rb +144 -54
  20. data/lib/rspec/core/extensions.rb +4 -4
  21. data/lib/rspec/core/extensions/instance_eval_with_args.rb +5 -0
  22. data/lib/rspec/core/extensions/kernel.rb +1 -1
  23. data/lib/rspec/core/extensions/module_eval_with_args.rb +4 -0
  24. data/lib/rspec/core/extensions/ordered.rb +7 -2
  25. data/lib/rspec/core/filter_manager.rb +69 -36
  26. data/lib/rspec/core/formatters/base_text_formatter.rb +1 -1
  27. data/lib/rspec/core/formatters/html_formatter.rb +10 -4
  28. data/lib/rspec/core/hooks.rb +93 -34
  29. data/lib/rspec/core/let.rb +62 -61
  30. data/lib/rspec/core/metadata.rb +103 -80
  31. data/lib/rspec/core/metadata_hash_builder.rb +4 -0
  32. data/lib/rspec/core/option_parser.rb +42 -44
  33. data/lib/rspec/core/pending.rb +25 -3
  34. data/lib/rspec/core/project_initializer.rb +62 -0
  35. data/lib/rspec/core/rake_task.rb +7 -13
  36. data/lib/rspec/core/runner.rb +2 -2
  37. data/lib/rspec/core/shared_context.rb +1 -1
  38. data/lib/rspec/core/shared_example_group.rb +11 -5
  39. data/lib/rspec/core/subject.rb +3 -3
  40. data/lib/rspec/core/version.rb +1 -1
  41. data/lib/rspec/monkey.rb +1 -1
  42. data/lib/rspec/monkey/spork/test_framework/rspec.rb +2 -0
  43. data/spec/command_line/order_spec.rb +19 -13
  44. data/spec/rspec/core/command_line_spec.rb +1 -5
  45. data/spec/rspec/core/configuration_options_spec.rb +22 -27
  46. data/spec/rspec/core/configuration_spec.rb +32 -14
  47. data/spec/rspec/core/drb_command_line_spec.rb +20 -37
  48. data/spec/rspec/core/drb_options_spec.rb +51 -3
  49. data/spec/rspec/core/example_group_spec.rb +101 -84
  50. data/spec/rspec/core/example_spec.rb +14 -0
  51. data/spec/rspec/core/filter_manager_spec.rb +114 -33
  52. data/spec/rspec/core/formatters/html_formatted-1.8.7-jruby.html +17 -69
  53. data/spec/rspec/core/formatters/html_formatted-1.8.7.html +14 -4
  54. data/spec/rspec/core/formatters/html_formatted-1.9.2.html +14 -4
  55. data/spec/rspec/core/formatters/html_formatted-1.9.3.html +14 -4
  56. data/spec/rspec/core/formatters/html_formatter_spec.rb +1 -1
  57. data/spec/rspec/core/formatters/text_mate_formatted-1.8.7-jruby.html +20 -72
  58. data/spec/rspec/core/formatters/text_mate_formatted-1.8.7.html +24 -14
  59. data/spec/rspec/core/formatters/text_mate_formatted-1.9.2.html +29 -19
  60. data/spec/rspec/core/formatters/text_mate_formatted-1.9.3.html +29 -19
  61. data/spec/rspec/core/formatters/text_mate_formatter_spec.rb +1 -2
  62. data/spec/rspec/core/metadata_spec.rb +77 -45
  63. data/spec/rspec/core/option_parser_spec.rb +5 -0
  64. data/spec/rspec/core/pending_example_spec.rb +44 -12
  65. data/spec/rspec/core/project_initializer_spec.rb +130 -0
  66. data/spec/rspec/core/rake_task_spec.rb +1 -1
  67. data/spec/spec_helper.rb +2 -0
  68. data/spec/support/matchers.rb +2 -12
  69. metadata +18 -16
  70. data/features/command_line/configure.feature +0 -22
  71. data/lib/rspec/core/command_line_configuration.rb +0 -62
  72. data/lib/rspec/core/errors.rb +0 -13
  73. data/spec/rspec/core/command_line_configuration_spec.rb +0 -26
@@ -1,56 +1,67 @@
1
- require 'rspec/core/filter_manager'
2
- require 'rspec/core/dsl'
3
- require 'rspec/core/extensions'
4
- require 'rspec/core/load_path'
5
- require 'rspec/core/deprecation'
6
- require 'rspec/core/backward_compatibility'
7
- require 'rspec/core/reporter'
1
+ if defined?(require_relative)
2
+ # @private
3
+ def require_rspec(path)
4
+ require_relative path
5
+ end
6
+ else
7
+ # @private
8
+ def require_rspec(path)
9
+ require "rspec/#{path}"
10
+ end
11
+ end
8
12
 
9
- require 'rspec/core/metadata_hash_builder'
10
- require 'rspec/core/hooks'
11
- require 'rspec/core/subject'
12
- require 'rspec/core/let'
13
- require 'rspec/core/metadata'
14
- require 'rspec/core/pending'
13
+ require_rspec 'core/filter_manager'
14
+ require_rspec 'core/dsl'
15
+ require_rspec 'core/extensions'
16
+ require_rspec 'core/load_path'
17
+ require_rspec 'core/deprecation'
18
+ require_rspec 'core/backward_compatibility'
19
+ require_rspec 'core/reporter'
15
20
 
16
- require 'rspec/core/world'
17
- require 'rspec/core/configuration'
18
- require 'rspec/core/command_line_configuration'
19
- require 'rspec/core/option_parser'
20
- require 'rspec/core/drb_options'
21
- require 'rspec/core/configuration_options'
22
- require 'rspec/core/command_line'
23
- require 'rspec/core/drb_command_line'
24
- require 'rspec/core/runner'
25
- require 'rspec/core/example'
26
- require 'rspec/core/shared_example_group'
27
- require 'rspec/core/example_group'
28
- require 'rspec/core/version'
29
- require 'rspec/core/errors'
21
+ require_rspec 'core/metadata_hash_builder'
22
+ require_rspec 'core/hooks'
23
+ require_rspec 'core/subject'
24
+ require_rspec 'core/let'
25
+ require_rspec 'core/metadata'
26
+ require_rspec 'core/pending'
27
+
28
+ require_rspec 'core/world'
29
+ require_rspec 'core/configuration'
30
+ require_rspec 'core/project_initializer'
31
+ require_rspec 'core/option_parser'
32
+ require_rspec 'core/drb_options'
33
+ require_rspec 'core/configuration_options'
34
+ require_rspec 'core/command_line'
35
+ require_rspec 'core/drb_command_line'
36
+ require_rspec 'core/runner'
37
+ require_rspec 'core/example'
38
+ require_rspec 'core/shared_example_group'
39
+ require_rspec 'core/example_group'
40
+ require_rspec 'core/version'
30
41
 
31
42
  module RSpec
32
43
  autoload :Matchers, 'rspec/matchers'
33
44
  autoload :SharedContext, 'rspec/core/shared_context'
34
45
 
35
- # @api private
36
- # Used internally to determine what to do when a SIGINT is received
46
+ # @private
37
47
  def self.wants_to_quit
48
+ # Used internally to determine what to do when a SIGINT is received
38
49
  world.wants_to_quit
39
50
  end
40
51
 
41
- # @api private
52
+ # @private
42
53
  # Used internally to determine what to do when a SIGINT is received
43
54
  def self.wants_to_quit=(maybe)
44
55
  world.wants_to_quit=(maybe)
45
56
  end
46
57
 
47
- # @api private
58
+ # @private
48
59
  # Internal container for global non-configuration data
49
60
  def self.world
50
61
  @world ||= RSpec::Core::World.new
51
62
  end
52
63
 
53
- # @api private
64
+ # @private
54
65
  # Used internally to ensure examples get reloaded between multiple runs in
55
66
  # the same process.
56
67
  def self.reset
@@ -58,7 +69,7 @@ module RSpec
58
69
  configuration.reset
59
70
  end
60
71
 
61
- # Returns the global [Configuration](Core/Configuration) object. While you
72
+ # Returns the global [Configuration](RSpec/Core/Configuration) object. While you
62
73
  # _can_ use this method to access the configuration, the more common
63
74
  # convention is to use [RSpec.configure](RSpec#configure-class_method).
64
75
  #
@@ -70,6 +81,7 @@ module RSpec
70
81
  @configuration ||= RSpec::Core::Configuration.new
71
82
  end
72
83
 
84
+ # Yields the global configuration to a block.
73
85
  # @yield [Configuration] global configuration
74
86
  #
75
87
  # @example
@@ -81,137 +93,15 @@ module RSpec
81
93
  yield configuration if block_given?
82
94
  end
83
95
 
84
- # @api private
96
+ # @private
85
97
  # Used internally to clear remaining groups when fail_fast is set
86
98
  def self.clear_remaining_example_groups
87
99
  world.example_groups.clear
88
100
  end
89
101
 
90
- # rspec-core provides the structure for writing executable examples of how
91
- # your code should behave. It uses the words "describe" and "it" so we can
92
- # express concepts like a conversation:
93
- #
94
- # "Describe an order."
95
- # "It sums the prices of its line items."
96
- #
97
- # ## Basic structure
98
- #
99
- # describe Order do
100
- # it "sums the prices of its line items" do
101
- # order = Order.new
102
- # order.add_entry(LineItem.new(:item => Item.new(
103
- # :price => Money.new(1.11, :USD)
104
- # )
105
- # order.add_entry(LineItem.new(:item => Item.new(
106
- # :price => Money.new(2.22, :USD),
107
- # :quantity => 2
108
- # )
109
- # order.total.should eq(Money.new(5.55, :USD))
110
- # end
111
- # end
112
- #
113
- # The `describe` method creates an [ExampleGroup](Core/ExampleGroup). Within the
114
- # block passed to `describe` you can declare examples using the `it` method.
115
- #
116
- # Under the hood, an example group is a class in which the block passed to
117
- # `describe` is evaluated. The blocks passed to `it` are evaluated in the
118
- # context of an _instance_ of that class.
119
- #
120
- # ## Nested groups
121
- #
122
- # You can also declare nested nested groups using the `describe` or `context`
123
- # methods:
124
- #
125
- # describe Order to
126
- # context "with no items" do
127
- # it "behaves one way" do
128
- # # ...
129
- # end
130
- # end
131
- #
132
- # context "with one item" do
133
- # it "behaves another way" do
134
- # # ...
135
- # end
136
- # end
137
- # end
138
- #
139
- # ## Aliases
140
- #
141
- # You can declare example groups using either `describe` or `context`, though
142
- # only `describe` is available at the top level.
143
- #
144
- # You can declare examples within a group using any of `it`, `specify`, or
145
- # `example`.
146
- #
147
- # ## Shared examples
148
- #
149
- # Declare a shared example group using `shared_examples`, and then include it
150
- # in each group using `include_examples`.
151
- #
152
- # shared_examples "collections" do |collection_class|
153
- # it "is empty when first created" do
154
- # collection_class.new.should be_empty
155
- # end
156
- # end
157
- #
158
- # describe Array do
159
- # include_examples "collections", Array
160
- # end
161
- #
162
- # ## Metadata
163
- #
164
- # rspec-core stores a metadata hash with every example and group, which
165
- # contains like their descriptions, the locations at which they were
166
- # declared, etc, etc. This hash powers many of rspec-core's features,
167
- # including output formatters (which access descriptions and locations),
168
- # and filtering before and after hooks.
169
- #
170
- # Although you probably won't ever need this unless you are writing an
171
- # extension, you can access it from an example like this:
172
- #
173
- # it "does something" do
174
- # example.metadata[:description].should eq("does something")
175
- # end
176
- #
177
- # ### `described_class`
178
- #
179
- # When a class is passed to `describe`, you can access it from an example
180
- # using the `described_class` method, which is a wrapper for
181
- # `example.metadata[:described_class]`.
182
- #
183
- # describe Widget do
184
- # example do
185
- # described_class.should equal(Widget)
186
- # end
187
- # end
188
- #
189
- # This is useful in extensions or shared example groups in which the specific
190
- # class is unknown. Taking the shared examples example from above, we can
191
- # clean it up a bit using `described_class`:
192
- #
193
- # shared_examples "collections" do
194
- # it "is empty when first created" do
195
- # described.new.should be_empty
196
- # end
197
- # end
198
- #
199
- # describe Array do
200
- # include_examples "collections"
201
- # end
202
- #
203
- # describe Hash do
204
- # include_examples "collections"
205
- # end
206
- #
207
- # ## The `rspec` command
208
- #
209
- # When you install the rspec-core gem, it installs the `rspec` executable,
210
- # which you'll use to run rspec. The `rspec` comes with many useful options.
211
- # Run `rspec --help` to see the complete list.
212
102
  module Core
213
103
  end
214
104
  end
215
105
 
216
- require 'rspec/core/backward_compatibility'
217
- require 'rspec/monkey'
106
+ require_rspec 'core/backward_compatibility'
107
+ require_rspec 'monkey'
@@ -1,5 +1,6 @@
1
1
  module RSpec
2
2
  module Core
3
+ # @private
3
4
  module ConstMissing
4
5
  # Used to print deprecation warnings for Rspec and Spec constants (use
5
6
  # RSpec instead)
@@ -38,6 +39,7 @@ WARNING
38
39
  end
39
40
  end
40
41
 
42
+ # @private
41
43
  module Rake
42
44
  # Used to print deprecation warnings for Rake::SpecTask constant (use
43
45
  # RSpec::Core::RakeTask instead)
@@ -11,6 +11,10 @@ module RSpec
11
11
  @world = world
12
12
  end
13
13
 
14
+ # Configures and runs a suite
15
+ #
16
+ # @param [IO] err
17
+ # @param [IO] out
14
18
  def run(err, out)
15
19
  @configuration.error_stream = err
16
20
  @configuration.output_stream ||= out
@@ -7,7 +7,9 @@ module RSpec
7
7
  #
8
8
  # @example Standard settings
9
9
  # RSpec.configure do |c|
10
- # c.drb_port = 1234
10
+ # c.drb = true
11
+ # c.drb_port = 1234
12
+ # c.default_path = 'behavior'
11
13
  # end
12
14
  #
13
15
  # @example Hooks
@@ -24,60 +26,147 @@ module RSpec
24
26
 
25
27
  class MustBeConfiguredBeforeExampleGroupsError < StandardError; end
26
28
 
29
+ # @private
30
+ def self.define_reader(name)
31
+ eval <<-CODE
32
+ def #{name}
33
+ value_for(#{name.inspect}, defined?(@#{name}) ? @#{name} : nil)
34
+ end
35
+ CODE
36
+ end
37
+
38
+ # @private
39
+ def self.deprecate_alias_key
40
+ RSpec.warn_deprecation <<-MESSAGE
41
+ The :alias option to add_setting is deprecated. Use :alias_with on the original setting instead.
42
+ Called from #{caller(0)[5]}
43
+ MESSAGE
44
+ end
45
+
46
+ # @private
47
+ def self.define_aliases(name, alias_name)
48
+ alias_method alias_name, name
49
+ alias_method "#{alias_name}=", "#{name}="
50
+ define_predicate_for alias_name
51
+ end
52
+
53
+ # @private
27
54
  def self.define_predicate_for(*names)
28
55
  names.each {|name| alias_method "#{name}?", name}
29
56
  end
30
57
 
31
- # @api private
58
+ # @private
32
59
  #
33
60
  # Invoked by the `add_setting` instance method. Use that method on a
34
61
  # `Configuration` instance rather than this class method.
35
62
  def self.add_setting(name, opts={})
36
63
  raise "Use the instance add_setting method if you want to set a default" if opts.has_key?(:default)
37
64
  if opts[:alias]
38
- RSpec.warn_deprecation <<-MESSAGE
39
- The :alias option to add_setting is deprecated. Use :alias_with on the original setting instead.
40
- Called from #{caller(0)[4]}
41
- MESSAGE
42
- alias_method name, opts[:alias]
43
- alias_method "#{name}=", "#{opts[:alias]}="
44
- define_predicate_for name
65
+ deprecate_alias_key
66
+ define_aliases(opts[:alias], name)
45
67
  else
46
68
  attr_writer name
47
- eval <<-CODE
48
- def #{name}
49
- value_for(#{name.inspect}, defined?(@#{name}) ? @#{name} : nil)
50
- end
51
- CODE
69
+ define_reader name
52
70
  define_predicate_for name
53
71
  end
54
- if opts[:alias_with]
55
- [opts[:alias_with]].flatten.each do |alias_name|
56
- alias_method alias_name, name
57
- alias_method "#{alias_name}=", "#{name}="
58
- define_predicate_for alias_name
59
- end
72
+ [opts[:alias_with]].flatten.compact.each do |alias_name|
73
+ define_aliases(name, alias_name)
60
74
  end
61
75
  end
62
76
 
63
- add_setting :error_stream
64
- add_setting :output_stream, :alias_with => [:output, :out]
77
+ # @macro [attach] add_setting
78
+ # @attribute $1
79
+ # Patterns to match against lines in backtraces presented in failure
80
+ # messages in order to filter them out (default:
81
+ # DEFAULT_BACKTRACE_PATTERNS). You can either replace this list using
82
+ # the setter or modify it using the getter.
83
+ #
84
+ # To override this behavior and display a full backtrace, use
85
+ # `--backtrace` on the command line, in a `.rspec` file, or in the
86
+ # `rspec_options` attribute of RSpec's rake task.
87
+ add_setting :backtrace_clean_patterns
88
+
89
+ # Path to use if no path is provided to the `rspec` command (default:
90
+ # `"spec"`). Allows you to just type `rspec` instead of `rspec spec` to
91
+ # run all the examples in the `spec` directory.
92
+ add_setting :default_path
93
+
94
+ # Run examples over DRb (default: `false`). RSpec doesn't supply the DRb
95
+ # server, but you can use tools like spork.
65
96
  add_setting :drb
97
+
98
+ # The drb_port (default: `8989`).
66
99
  add_setting :drb_port
67
- add_setting :profile_examples
100
+
101
+ # Default: `$stderr`.
102
+ add_setting :error_stream
103
+
104
+ # Clean up and exit after the first failure (default: `false`).
68
105
  add_setting :fail_fast
106
+
107
+ # The exit code to return if there are any failures (default: 1).
69
108
  add_setting :failure_exit_code
70
- add_setting :run_all_when_everything_filtered
109
+
110
+ # Determines the order in which examples are run (default: OS standard
111
+ # load order for files, declaration order for groups and examples).
112
+ define_reader :order
113
+
114
+ # Default: `$stdout`.
115
+ # Also known as `output` and `out`
116
+ add_setting :output_stream, :alias_with => [:output, :out]
117
+
118
+ # Load files matching this pattern (default: `'**/*_spec.rb'`)
71
119
  add_setting :pattern, :alias_with => :filename_pattern
72
- add_setting :files_to_run
73
- add_setting :include_or_extend_modules
74
- add_setting :backtrace_clean_patterns
75
- add_setting :tty
120
+
121
+ # Report the times for the 10 slowest examples (default: `false`).
122
+ add_setting :profile_examples
123
+
124
+ # Run all examples if none match the configured filters (default: `false`).
125
+ add_setting :run_all_when_everything_filtered
126
+
127
+ # Seed for random ordering (default: generated randomly each run).
128
+ #
129
+ # When you run specs with `--order random`, RSpec generates a random seed
130
+ # for the randomization and prints it to the `output_stream` (assuming
131
+ # you're using RSpec's built-in formatters). If you discover an ordering
132
+ # dependency (i.e. examples fail intermittently depending on order), set
133
+ # this (on Configuration or on the command line with `--seed`) to run
134
+ # using the same seed while you debug the issue.
135
+ #
136
+ # We recommend, actually, that you use the command line approach so you
137
+ # don't accidentally leave the seed encoded.
138
+ define_reader :seed
139
+
140
+ # When a block passed to pending fails (as expected), display the failure
141
+ # without reporting it as a failure (default: false).
142
+ add_setting :show_failures_in_pending_blocks
143
+
144
+ # Convert symbols to hashes with the symbol as a key with a value of
145
+ # `true` (default: false).
146
+ #
147
+ # This allows you to tag a group or example like this:
148
+ #
149
+ # describe "something slow", :slow do
150
+ # # ...
151
+ # end
152
+ #
153
+ # ... instead of having to type:
154
+ #
155
+ # describe "something slow", :slow => true do
156
+ # # ...
157
+ # end
76
158
  add_setting :treat_symbols_as_metadata_keys_with_true_values
159
+
160
+ # @private
161
+ add_setting :tty
162
+ # @private
163
+ add_setting :include_or_extend_modules
164
+ # @private
165
+ add_setting :files_to_run
166
+ # @private
77
167
  add_setting :expecting_with_rspec
78
- add_setting :default_path
79
- add_setting :show_failures_in_pending_blocks
80
- add_setting :order
168
+ # @private
169
+ attr_accessor :filter_manager
81
170
 
82
171
  DEFAULT_BACKTRACE_PATTERNS = [
83
172
  /\/lib\d*\/ruby\//,
@@ -104,27 +193,39 @@ MESSAGE
104
193
  @seed = srand % 0xFFFF
105
194
  end
106
195
 
107
- attr_accessor :filter_manager
108
-
196
+ # @private
197
+ #
198
+ # Used to set higher priority option values from the command line.
109
199
  def force(hash)
200
+ if hash.has_key?(:seed)
201
+ hash[:order], hash[:seed] = order_and_seed_from_seed(hash[:seed])
202
+ elsif hash.has_key?(:order)
203
+ set_order_and_seed(hash)
204
+ end
110
205
  @preferred_options.merge!(hash)
111
206
  end
112
207
 
113
- def force_include(hash)
114
- filter_manager.include hash
115
- end
116
-
117
- def force_exclude(hash)
118
- filter_manager.exclude hash
119
- end
120
-
208
+ # @api private
121
209
  def reset
122
210
  @reporter = nil
123
211
  @formatters.clear
124
212
  end
125
213
 
126
214
  # @overload add_setting(name)
127
- # @overload add_setting(name, options_hash)
215
+ # @overload add_setting(name, opts)
216
+ # @option opts [Symbol] :default
217
+ #
218
+ # set a default value for the generated getter and predicate methods:
219
+ #
220
+ # add_setting(:foo, :default => "default value")
221
+ #
222
+ # @option opts [Symbol] :alias_with
223
+ #
224
+ # Use `:alias_with` to alias the setter, getter, and predicate to another
225
+ # name, or names:
226
+ #
227
+ # add_setting(:foo, :alias_with => :bar)
228
+ # add_setting(:foo, :alias_with => [:bar, :baz])
128
229
  #
129
230
  # Adds a custom setting to the RSpec.configuration object.
130
231
  #
@@ -145,23 +246,6 @@ MESSAGE
145
246
  # RSpec.configuration.foo=(value)
146
247
  # RSpec.configuration.foo
147
248
  # RSpec.configuration.foo? # returns true if foo returns anything but nil or false
148
- #
149
- # ### Options
150
- #
151
- # `add_setting` takes an optional hash that supports the keys `:default`
152
- # and `:alias_with`.
153
- #
154
- # Use `:default` to set a default value for the generated getter and
155
- # predicate methods:
156
- #
157
- # add_setting(:foo, :default => "default value")
158
- #
159
- # Use `:alias_with` to alias the setter, getter, and predicate to another
160
- # name, or names:
161
- #
162
- # add_setting(:foo, :alias_with => :bar)
163
- # add_setting(:foo, :alias_with => [:bar, :baz])
164
- #
165
249
  def add_setting(name, opts={})
166
250
  default = opts.delete(:default)
167
251
  (class << self; self; end).class_eval do
@@ -384,35 +468,6 @@ EOM
384
468
  self.files_to_run = get_files_to_run(files)
385
469
  end
386
470
 
387
- # @api private
388
- def command
389
- $0.split(File::SEPARATOR).last
390
- end
391
-
392
- # @api private
393
- def get_files_to_run(files)
394
- patterns = pattern.split(",")
395
- files.map do |file|
396
- if File.directory?(file)
397
- patterns.map do |pattern|
398
- if pattern =~ /^#{file}/
399
- Dir[pattern.strip]
400
- else
401
- Dir["#{file}/{#{pattern.strip}}"]
402
- end
403
- end
404
- else
405
- if file =~ /^(.*?)((?:\:\d+)+)$/
406
- path, lines = $1, $2[1..-1].split(":").map{|n| n.to_i}
407
- filter_manager.add_location path, lines
408
- path
409
- else
410
- file
411
- end
412
- end
413
- end.flatten
414
- end
415
-
416
471
  # Creates a method that delegates to `example` including the submitted
417
472
  # `args`. Used internally to add variants of `example` like `pending`:
418
473
  #
@@ -480,7 +535,7 @@ EOM
480
535
  # # with treat_symbols_as_metadata_keys_with_true_values = true
481
536
  # filter_run_including :foo # results in {:foo => true}
482
537
  def filter_run_including(*args)
483
- filter_manager.include :low_priority, build_metadata_hash_from(args)
538
+ filter_manager.include_with_low_priority build_metadata_hash_from(args)
484
539
  end
485
540
 
486
541
  alias_method :filter_run, :filter_run_including
@@ -493,7 +548,7 @@ EOM
493
548
  # This overrides any inclusion filters/tags set on the command line or in
494
549
  # configuration files.
495
550
  def inclusion_filter=(filter)
496
- filter_manager.include :replace, build_metadata_hash_from([filter])
551
+ filter_manager.include! build_metadata_hash_from([filter])
497
552
  end
498
553
 
499
554
  alias_method :filter=, :inclusion_filter=
@@ -522,7 +577,7 @@ EOM
522
577
  # # with treat_symbols_as_metadata_keys_with_true_values = true
523
578
  # filter_run_excluding :foo # results in {:foo => true}
524
579
  def filter_run_excluding(*args)
525
- filter_manager.exclude :low_priority, build_metadata_hash_from(args)
580
+ filter_manager.exclude_with_low_priority build_metadata_hash_from(args)
526
581
  end
527
582
 
528
583
  # Clears and reassigns the `exclusion_filter`. Set to `nil` if you don't
@@ -533,7 +588,7 @@ EOM
533
588
  # This overrides any exclusion filters/tags set on the command line or in
534
589
  # configuration files.
535
590
  def exclusion_filter=(filter)
536
- filter_manager.exclude :replace, build_metadata_hash_from([filter])
591
+ filter_manager.exclude! build_metadata_hash_from([filter])
537
592
  end
538
593
 
539
594
  # Returns the `exclusion_filter`. If none has been set, returns an empty
@@ -563,45 +618,68 @@ EOM
563
618
  end
564
619
  end
565
620
 
621
+ # @api private
566
622
  def configure_mock_framework
567
623
  RSpec::Core::ExampleGroup.send(:include, mock_framework)
568
624
  end
569
625
 
626
+ # @api private
570
627
  def configure_expectation_framework
571
628
  expectation_frameworks.each do |framework|
572
629
  RSpec::Core::ExampleGroup.send(:include, framework)
573
630
  end
574
631
  end
575
632
 
633
+ # @api private
576
634
  def load_spec_files
577
635
  files_to_run.map {|f| load File.expand_path(f) }
578
636
  raise_if_rspec_1_is_loaded
579
637
  end
580
638
 
581
- attr_reader :seed
582
-
639
+ # @api
640
+ #
641
+ # Sets the seed value and sets `order='rand'`
583
642
  def seed=(seed)
584
- @order = 'rand'
585
- @seed = seed.to_i
643
+ order_and_seed_from_seed(seed)
644
+ end
645
+
646
+ # @api
647
+ #
648
+ # Sets the order and, if order is `'rand:<seed>'`, also sets the seed.
649
+ def order=(type)
650
+ order_and_seed_from_order(type)
586
651
  end
587
652
 
588
653
  def randomize?
589
654
  order.to_s.match(/rand/)
590
655
  end
591
656
 
592
- remove_method :order=
593
- def order=(type)
594
- order, seed = type.to_s.split(':')
595
- if order == 'default'
596
- @order = nil
597
- @seed = nil
598
- else
599
- @order = order
600
- @seed = seed.to_i if seed
657
+ private
658
+
659
+ def get_files_to_run(paths)
660
+ patterns = pattern.split(",")
661
+ paths.map do |path|
662
+ File.directory?(path) ? gather_directories(path, patterns) : extract_location(path)
663
+ end.flatten
664
+ end
665
+
666
+ def gather_directories(path, patterns)
667
+ patterns.map do |pattern|
668
+ pattern =~ /^#{path}/ ? Dir[pattern.strip] : Dir["#{path}/{#{pattern.strip}}"]
601
669
  end
602
670
  end
603
671
 
604
- private
672
+ def extract_location(path)
673
+ if path =~ /^(.*?)((?:\:\d+)+)$/
674
+ path, lines = $1, $2[1..-1].split(":").map{|n| n.to_i}
675
+ filter_manager.add_location path, lines
676
+ end
677
+ path
678
+ end
679
+
680
+ def command
681
+ $0.split(File::SEPARATOR).last
682
+ end
605
683
 
606
684
  def value_for(key, default=nil)
607
685
  @preferred_options.has_key?(key) ? @preferred_options[key] : default
@@ -698,6 +776,23 @@ MESSAGE
698
776
  File.new(path, 'w')
699
777
  end
700
778
 
779
+ def order_and_seed_from_seed(value)
780
+ @order, @seed = 'rand', value.to_i
781
+ end
782
+
783
+ def set_order_and_seed(hash)
784
+ hash[:order], seed = order_and_seed_from_order(hash[:order])
785
+ hash[:seed] = seed if seed
786
+ end
787
+
788
+ def order_and_seed_from_order(type)
789
+ order, seed = type.to_s.split(':')
790
+ @order = order
791
+ @seed = seed = seed.to_i if seed
792
+ @order, @seed = nil, nil if order == 'default'
793
+ return order, seed
794
+ end
795
+
701
796
  end
702
797
  end
703
798
  end