rspec-core 2.0.0.beta.9 → 2.0.0.beta.10

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 (83) hide show
  1. data/VERSION +1 -1
  2. data/features/configuration/custom_settings.feature +86 -0
  3. data/features/formatters/custom_formatter.feature +1 -1
  4. data/lib/rspec/core.rb +6 -1
  5. data/lib/rspec/core/backward_compatibility.rb +3 -5
  6. data/lib/rspec/core/command_line.rb +52 -0
  7. data/lib/rspec/core/configuration.rb +106 -118
  8. data/lib/rspec/core/configuration_options.rb +30 -88
  9. data/lib/rspec/core/deprecation.rb +3 -4
  10. data/lib/rspec/core/drb_command_line.rb +29 -0
  11. data/lib/rspec/core/formatters/base_formatter.rb +3 -8
  12. data/lib/rspec/core/formatters/base_text_formatter.rb +2 -2
  13. data/lib/rspec/core/formatters/documentation_formatter.rb +2 -2
  14. data/lib/rspec/core/kernel_extensions.rb +1 -1
  15. data/lib/rspec/core/metadata.rb +11 -11
  16. data/lib/rspec/core/option_parser.rb +84 -0
  17. data/lib/rspec/core/runner.rb +17 -42
  18. data/lib/rspec/core/world.rb +2 -2
  19. data/lib/rspec/monkey.rb +1 -0
  20. data/lib/rspec/monkey/spork/test_framework/rspec.rb +7 -0
  21. data/rspec-core.gemspec +18 -59
  22. data/spec/rspec/core/configuration_options_spec.rb +91 -7
  23. data/spec/rspec/core/configuration_spec.rb +52 -18
  24. data/spec/rspec/core/deprecations_spec.rb +4 -2
  25. data/spec/rspec/core/drb_command_line_spec.rb +151 -0
  26. data/spec/rspec/core/formatters/base_formatter_spec.rb +2 -1
  27. data/spec/rspec/core/formatters/base_text_formatter_spec.rb +1 -2
  28. data/spec/rspec/core/formatters/documentation_formatter_spec.rb +1 -2
  29. data/spec/rspec/core/formatters/progress_formatter_spec.rb +1 -2
  30. data/spec/rspec/core/resources/a_spec.rb +1 -1
  31. data/spec/rspec/core/runner_spec.rb +38 -27
  32. data/spec/rspec/core/shared_example_group_spec.rb +1 -1
  33. data/spec/spec_helper.rb +56 -41
  34. metadata +17 -58
  35. data/example_specs/failing/README.txt +0 -7
  36. data/example_specs/failing/diffing_spec.rb +0 -38
  37. data/example_specs/failing/failing_implicit_docstrings_example.rb +0 -19
  38. data/example_specs/failing/failure_in_after.rb +0 -10
  39. data/example_specs/failing/failure_in_before.rb +0 -10
  40. data/example_specs/failing/mocking_example.rb +0 -40
  41. data/example_specs/failing/mocking_with_flexmock.rb +0 -26
  42. data/example_specs/failing/mocking_with_mocha.rb +0 -25
  43. data/example_specs/failing/mocking_with_rr.rb +0 -27
  44. data/example_specs/failing/partial_mock_example.rb +0 -20
  45. data/example_specs/failing/pending_example.rb +0 -9
  46. data/example_specs/failing/predicate_example.rb +0 -34
  47. data/example_specs/failing/raising_example.rb +0 -47
  48. data/example_specs/failing/spec_helper.rb +0 -1
  49. data/example_specs/failing/syntax_error_example.rb +0 -7
  50. data/example_specs/failing/team_spec.rb +0 -43
  51. data/example_specs/failing/timeout_behaviour.rb +0 -7
  52. data/example_specs/passing/custom_formatter.rb +0 -12
  53. data/example_specs/passing/custom_matchers.rb +0 -54
  54. data/example_specs/passing/dynamic_spec.rb +0 -9
  55. data/example_specs/passing/file_accessor.rb +0 -19
  56. data/example_specs/passing/file_accessor_spec.rb +0 -38
  57. data/example_specs/passing/filtered_formatter.rb +0 -18
  58. data/example_specs/passing/filtered_formatter_example.rb +0 -31
  59. data/example_specs/passing/greeter_spec.rb +0 -31
  60. data/example_specs/passing/helper_method_example.rb +0 -14
  61. data/example_specs/passing/implicit_docstrings_example.rb +0 -18
  62. data/example_specs/passing/io_processor.rb +0 -8
  63. data/example_specs/passing/io_processor_spec.rb +0 -21
  64. data/example_specs/passing/mocking_example.rb +0 -27
  65. data/example_specs/passing/multi_threaded_example_group_runner.rb +0 -26
  66. data/example_specs/passing/nested_classes_example.rb +0 -36
  67. data/example_specs/passing/options_example.rb +0 -31
  68. data/example_specs/passing/options_formatter.rb +0 -20
  69. data/example_specs/passing/partial_mock_example.rb +0 -29
  70. data/example_specs/passing/pending_example.rb +0 -20
  71. data/example_specs/passing/predicate_example.rb +0 -27
  72. data/example_specs/passing/shared_example_group_example.rb +0 -81
  73. data/example_specs/passing/shared_stack_examples.rb +0 -36
  74. data/example_specs/passing/spec_helper.rb +0 -1
  75. data/example_specs/passing/stack.rb +0 -36
  76. data/example_specs/passing/stack_spec.rb +0 -64
  77. data/example_specs/passing/stack_spec_with_nested_example_groups.rb +0 -67
  78. data/example_specs/passing/stubbing_example.rb +0 -69
  79. data/example_specs/passing/subject_example.rb +0 -45
  80. data/example_specs/passing/yielding_example.rb +0 -33
  81. data/example_specs/ruby1.9.compatibility/access_to_constants_spec.rb +0 -85
  82. data/example_specs/spec_helper.rb +0 -10
  83. data/features/configuration/custom_options.feature +0 -71
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.0.beta.9
1
+ 2.0.0.beta.10
@@ -0,0 +1,86 @@
1
+ Feature: custom settings
2
+
3
+ In order to seamlessly provide users more configuration settings
4
+ As an RSpec extenstion-library author
5
+ I want to define new settings on the RSpec.configuration object
6
+
7
+ Scenario: simple setting
8
+ Given a file named "additional_setting_spec.rb" with:
9
+ """
10
+ RSpec.configure do |c|
11
+ c.add_setting :custom_setting
12
+ end
13
+
14
+ describe "custom setting" do
15
+ it "is nil by default" do
16
+ RSpec.configuration.custom_setting.should be_nil
17
+ end
18
+
19
+ it "acts false by default" do
20
+ RSpec.configuration.custom_setting.should be_false
21
+ end
22
+
23
+ it "is exposed as a predicate" do
24
+ RSpec.configuration.custom_setting?.should be_false
25
+ end
26
+
27
+ it "can be overridden" do
28
+ RSpec.configuration.custom_setting = true
29
+ RSpec.configuration.custom_setting.should be_true
30
+ RSpec.configuration.custom_setting?.should be_true
31
+ end
32
+ end
33
+ """
34
+ When I run "rspec ./additional_setting_spec.rb"
35
+ Then I should see "0 failures"
36
+
37
+ Scenario: default to true
38
+ Given a file named "additional_setting_spec.rb" with:
39
+ """
40
+ RSpec.configure do |c|
41
+ c.add_setting :custom_setting, :default => true
42
+ end
43
+
44
+ describe "custom setting" do
45
+ it "is true by default" do
46
+ RSpec.configuration.custom_setting.should be_true
47
+ end
48
+
49
+ it "is exposed as a predicate" do
50
+ RSpec.configuration.custom_setting?.should be_true
51
+ end
52
+
53
+ it "can be overridden" do
54
+ RSpec.configuration.custom_setting = false
55
+ RSpec.configuration.custom_setting.should be_false
56
+ RSpec.configuration.custom_setting?.should be_false
57
+ end
58
+ end
59
+ """
60
+ When I run "rspec ./additional_setting_spec.rb"
61
+ Then I should see "0 failures"
62
+
63
+ Scenario: overridden in a subsequent RSpec.configure block
64
+ Given a file named "additional_setting_spec.rb" with:
65
+ """
66
+ RSpec.configure do |c|
67
+ c.add_setting :custom_setting
68
+ end
69
+
70
+ RSpec.configure do |c|
71
+ c.custom_setting = true
72
+ end
73
+
74
+ describe "custom setting" do
75
+ it "returns the value set in the last cofigure block to get eval'd" do
76
+ RSpec.configuration.custom_setting.should be_true
77
+ end
78
+
79
+ it "is exposed as a predicate" do
80
+ RSpec.configuration.custom_setting?.should be_true
81
+ end
82
+ end
83
+ """
84
+ When I run "rspec ./additional_setting_spec.rb"
85
+ Then I should see "0 failures"
86
+
@@ -10,7 +10,7 @@ Feature: custom formatters
10
10
  """
11
11
  require "rspec/runner/formatter/base_formatter"
12
12
 
13
- class CustomFormatter < Spec::Runner::Formatter::BaseFormatter
13
+ class CustomFormatter < RSpec::Runner::Formatter::BaseFormatter
14
14
  def initialize(options, output)
15
15
  @output = output
16
16
  end
@@ -2,6 +2,7 @@ require 'rspec/core/kernel_extensions'
2
2
  require 'rspec/core/object_extensions'
3
3
  require 'rspec/core/load_path'
4
4
  require 'rspec/core/deprecation'
5
+ require 'rspec/core/formatters'
5
6
 
6
7
  require 'rspec/core/hooks'
7
8
  require 'rspec/core/subject'
@@ -12,12 +13,14 @@ require 'rspec/core/pending'
12
13
  require 'rspec/core/around_proxy'
13
14
  require 'rspec/core/world'
14
15
  require 'rspec/core/configuration'
16
+ require 'rspec/core/option_parser'
15
17
  require 'rspec/core/configuration_options'
18
+ require 'rspec/core/command_line'
19
+ require 'rspec/core/drb_command_line'
16
20
  require 'rspec/core/runner'
17
21
  require 'rspec/core/example'
18
22
  require 'rspec/core/shared_example_group'
19
23
  require 'rspec/core/example_group'
20
- require 'rspec/core/formatters'
21
24
  require 'rspec/core/version'
22
25
  require 'rspec/core/errors'
23
26
 
@@ -62,3 +65,5 @@ require 'rspec/core/backward_compatibility'
62
65
 
63
66
  # TODO - make this configurable with default 'on'
64
67
  require 'rspec/expectations'
68
+
69
+ require 'rspec/monkey'
@@ -9,15 +9,13 @@ module RSpec
9
9
  module ConstMissing
10
10
  def const_missing(name)
11
11
  case name
12
- when :Rspec
13
- RSpec
14
- when :Spec
15
- RSpec.warn <<-WARNING
12
+ when :Rspec, :Spec
13
+ RSpec.warn_deprecation <<-WARNING
16
14
  *****************************************************************
17
15
  DEPRECATION WARNING: you are using a deprecated constant that will
18
16
  be removed from a future version of RSpec.
19
17
 
20
- * Spec is deprecated.
18
+ * #{name} is deprecated.
21
19
  * RSpec is the new top-level module in RSpec-2
22
20
 
23
21
  #{caller(0)[1]}
@@ -0,0 +1,52 @@
1
+ module RSpec
2
+ module Core
3
+ class CommandLine
4
+ def initialize(argv)
5
+ @options = RSpec::Core::ConfigurationOptions.new(argv)
6
+ @options.configure(configuration)
7
+ configuration.require_files_to_run
8
+ configuration.configure_mock_framework
9
+ end
10
+
11
+ def run(err, out)
12
+ configuration.error_stream = err
13
+ configuration.output_stream = out
14
+ world.announce_inclusion_filter
15
+
16
+ configuration.reporter.report(example_count) do |reporter|
17
+ example_groups.run_examples(reporter)
18
+ end
19
+
20
+ example_groups.success?
21
+ end
22
+
23
+ private
24
+
25
+ def example_count
26
+ world.example_count
27
+ end
28
+
29
+ module ExampleGroups
30
+ def run_examples(reporter)
31
+ @success = self.inject(true) {|success, group| success &= group.run(reporter)}
32
+ end
33
+
34
+ def success?
35
+ @success ||= false
36
+ end
37
+ end
38
+
39
+ def example_groups
40
+ world.example_groups.extend(ExampleGroups)
41
+ end
42
+
43
+ def configuration
44
+ RSpec.configuration
45
+ end
46
+
47
+ def world
48
+ RSpec.world
49
+ end
50
+ end
51
+ end
52
+ end
@@ -1,66 +1,109 @@
1
1
  module RSpec
2
2
  module Core
3
3
  class Configuration
4
- attr_reader :hooks # :nodoc:
5
-
6
- # Control what examples are run by filtering
7
- attr_accessor :filter
8
-
9
- # Control what examples are not run by filtering
10
- attr_accessor :exclusion_filter
11
-
12
- # Run all examples if the run is filtered, and no examples were found.
13
- attr_writer :run_all_when_everything_filtered
14
-
15
- attr_reader :options
4
+ def self.add_setting(name, opts={})
5
+ if opts[:alias]
6
+ alias_method name, opts[:alias]
7
+ alias_method "#{name}=", "#{opts[:alias]}="
8
+ alias_method "#{name}?", "#{opts[:alias]}?"
9
+ else
10
+ define_method("#{name}=") {|val| settings[name] = val}
11
+ define_method(name) { settings.has_key?(name) ? settings[name] : opts[:default] }
12
+ define_method("#{name}?") { !!(send name) }
13
+ end
14
+ end
16
15
 
17
- def initialize
18
- @run_all_when_everything_filtered = false
19
- @hooks = {
16
+ add_setting :error_stream
17
+ add_setting :output_stream
18
+ add_setting :output, :alias => :output_stream
19
+ add_setting :drb_port
20
+ add_setting :color_enabled
21
+ add_setting :profile_examples
22
+ add_setting :run_all_when_everything_filtered
23
+ add_setting :mock_framework, :default => :rspec
24
+ add_setting :filter
25
+ add_setting :exclusion_filter
26
+ add_setting :filename_pattern, :default => '**/*_spec.rb'
27
+ add_setting :files_to_run, :default => []
28
+ add_setting :include_or_extend_modules, :default => []
29
+ add_setting :formatter_class, :default => RSpec::Core::Formatters::ProgressFormatter
30
+ add_setting :backtrace_clean_patterns, :default => [
31
+ /\/lib\/ruby\//,
32
+ /bin\/rcov:/,
33
+ /vendor\/rails/,
34
+ /bin\/rspec/,
35
+ /bin\/spec/,
36
+ /lib\/rspec\/(core|expectations|matchers|mocks)/
37
+ ]
38
+
39
+ # :call-seq:
40
+ # add_setting(:name)
41
+ # add_setting(:name, :default => "default_value")
42
+ # add_setting(:name, :alias => :other_setting)
43
+ #
44
+ # Use this to add custom settings to the RSpec.configuration object.
45
+ #
46
+ # RSpec.configuration.add_setting :foo
47
+ #
48
+ # Creates three methods on the configuration object, a setter, a getter,
49
+ # and a predicate:
50
+ #
51
+ # RSpec.configuration.foo=(value)
52
+ # RSpec.configuration.foo()
53
+ # RSpec.configuration.foo?() # returns !!foo
54
+ #
55
+ # Intended for extension frameworks like rspec-rails, so they can add config
56
+ # settings that are domain specific. For example:
57
+ #
58
+ # RSpec.configure do |c|
59
+ # c.add_setting :use_transactional_fixtures, :default => true
60
+ # c.add_setting :use_transactional_examples, :alias => :use_transactional_fixtures
61
+ # end
62
+ #
63
+ # == Options
64
+ #
65
+ # +add_setting+ takes an optional hash that supports the following
66
+ # keys:
67
+ #
68
+ # :default => "default value"
69
+ #
70
+ # This sets the default value for the getter and the predicate (which
71
+ # will return +true+ as long as the value is not +false+ or +nil+).
72
+ #
73
+ # :alias => :other_setting
74
+ #
75
+ # Aliases its setter, getter, and predicate, to those for the
76
+ # +other_setting+.
77
+ def add_setting(name, opts={})
78
+ self.class.add_setting(name, opts)
79
+ end
80
+
81
+ def puts(message)
82
+ output_stream.puts(message)
83
+ end
84
+
85
+ def hooks
86
+ @hooks ||= {
20
87
  :before => { :each => [], :all => [], :suite => [] },
21
88
  :after => { :each => [], :all => [], :suite => [] }
22
89
  }
23
- @include_or_extend_modules = []
24
- @filter, @exclusion_filter = nil, nil
25
- @options = default_options
26
90
  end
27
-
28
- def default_options
29
- {
30
- :color_enabled => false,
31
- :mock_framework => nil,
32
- :profile_examples => false,
33
- :files_to_run => [],
34
- :filename_pattern => '**/*_spec.rb',
35
- :formatter_class => RSpec::Core::Formatters::ProgressFormatter,
36
- :backtrace_clean_patterns => [/\/lib\/ruby\//,
37
- /bin\/rcov:/,
38
- /vendor\/rails/,
39
- /bin\/rspec/,
40
- /bin\/spec/,
41
- /lib\/rspec\/(core|expectations|matchers|mocks)/]
42
- }
91
+
92
+ def settings
93
+ @settings ||= {}
43
94
  end
44
95
 
45
96
  def clear_inclusion_filter
46
97
  self.filter = nil
47
98
  end
48
-
49
- def cleaned_from_backtrace?(line)
50
- @options[:backtrace_clean_patterns].any? { |regex| line =~ regex }
51
- end
52
-
53
- def backtrace_clean_patterns
54
- @options[:backtrace_clean_patterns]
55
- end
56
99
 
57
- def mock_framework=(use_me_to_mock)
58
- @options[:mock_framework] = use_me_to_mock
100
+ def cleaned_from_backtrace?(line)
101
+ backtrace_clean_patterns.any? { |regex| line =~ regex }
59
102
  end
60
103
 
61
104
  def require_mock_framework_adapter
62
- require case @options[:mock_framework].to_s
63
- when "", /rspec/i
105
+ require case mock_framework.to_s
106
+ when /rspec/i
64
107
  'rspec/core/mocking/with_rspec'
65
108
  when /mocha/i
66
109
  'rspec/core/mocking/with_mocha'
@@ -73,20 +116,8 @@ module RSpec
73
116
  end
74
117
  end
75
118
 
76
- def filename_pattern
77
- @options[:filename_pattern]
78
- end
79
-
80
- def filename_pattern=(new_pattern)
81
- @options[:filename_pattern] = new_pattern
82
- end
83
-
84
- def color_enabled=(on_or_off)
85
- @options[:color_enabled] = on_or_off
86
- end
87
-
88
119
  def full_backtrace=(bool)
89
- @options[:backtrace_clean_patterns].clear
120
+ backtrace_clean_patterns.clear
90
121
  end
91
122
 
92
123
  def libs=(libs)
@@ -111,10 +142,6 @@ EOM
111
142
  end
112
143
  end
113
144
 
114
- def color_enabled?
115
- @options[:color_enabled]
116
- end
117
-
118
145
  def line_number=(line_number)
119
146
  filter_run :line_number => line_number.to_i
120
147
  end
@@ -123,19 +150,6 @@ EOM
123
150
  filter_run :full_description => /#{description}/
124
151
  end
125
152
 
126
- # Enable profiling of example run - defaults to false
127
- def profile_examples
128
- @options[:profile_examples]
129
- end
130
-
131
- def profile_examples=(on_or_off)
132
- @options[:profile_examples] = on_or_off
133
- end
134
-
135
- def formatter_class
136
- @options[:formatter_class]
137
- end
138
-
139
153
  def formatter=(formatter_to_use)
140
154
  formatter_class = case formatter_to_use.to_s
141
155
  when 'd', 'doc', 'documentation', 's', 'n', 'spec', 'nested'
@@ -145,19 +159,17 @@ EOM
145
159
  else
146
160
  raise ArgumentError, "Formatter '#{formatter_to_use}' unknown - maybe you meant 'documentation' or 'progress'?."
147
161
  end
148
- @options[:formatter_class] = formatter_class
162
+ self.formatter_class = formatter_class
149
163
  end
150
-
164
+
151
165
  def formatter
152
- @formatter ||= formatter_class.new
166
+ @formatter ||= formatter_class.new(output)
153
167
  end
154
-
155
- def files_to_run
156
- @options[:files_to_run]
157
- end
158
-
168
+
169
+ alias_method :reporter, :formatter
170
+
159
171
  def files_or_directories_to_run=(*files)
160
- @options[:files_to_run] = files.flatten.inject([]) do |result, file|
172
+ self.files_to_run = files.flatten.inject([]) do |result, file|
161
173
  if File.directory?(file)
162
174
  filename_pattern.split(",").each do |pattern|
163
175
  result += Dir["#{file}/#{pattern.strip}"]
@@ -178,45 +190,33 @@ EOM
178
190
  end
179
191
 
180
192
  def filter_run(options={})
181
- @filter = options unless @filter and @filter[:line_number] || @filter[:full_description]
193
+ self.filter = options unless filter and filter[:line_number] || filter[:full_description]
182
194
  end
183
195
 
184
- def run_all_when_everything_filtered?
185
- @run_all_when_everything_filtered
196
+ def include(mod, filters={})
197
+ include_or_extend_modules << [:include, mod, filters]
186
198
  end
187
199
 
188
- def output
189
- $stdout
190
- end
191
-
192
- def puts(msg="")
193
- output.puts(msg)
194
- end
195
-
196
- def include(mod, options={})
197
- @include_or_extend_modules << [:include, mod, options]
198
- end
199
-
200
- def extend(mod, options={})
201
- @include_or_extend_modules << [:extend, mod, options]
200
+ def extend(mod, filters={})
201
+ include_or_extend_modules << [:extend, mod, filters]
202
202
  end
203
203
 
204
204
  def find_modules(group)
205
- @include_or_extend_modules.select do |include_or_extend, mod, filters|
205
+ include_or_extend_modules.select do |include_or_extend, mod, filters|
206
206
  group.all_apply?(filters)
207
207
  end
208
208
  end
209
209
 
210
210
  def before(each_or_all=:each, options={}, &block)
211
- @hooks[:before][each_or_all] << [options, block]
211
+ hooks[:before][each_or_all] << [options, block]
212
212
  end
213
213
 
214
214
  def after(each_or_all=:each, options={}, &block)
215
- @hooks[:after][each_or_all] << [options, block]
215
+ hooks[:after][each_or_all] << [options, block]
216
216
  end
217
217
 
218
218
  def find_hook(hook, each_or_all, group)
219
- @hooks[hook][each_or_all].select do |filters, block|
219
+ hooks[hook][each_or_all].select do |filters, block|
220
220
  group.all_apply?(filters)
221
221
  end.map { |filters, block| block }
222
222
  end
@@ -229,18 +229,6 @@ EOM
229
229
  def require_files_to_run
230
230
  files_to_run.map {|f| require File.expand_path(f) }
231
231
  end
232
-
233
- def add_option(mname, options)
234
- case options[:type]
235
- when :boolean
236
- (class << self; self; end).class_eval do
237
- attr_accessor mname
238
- define_method("#{mname}?") { !!(send mname) }
239
- end
240
- instance_variable_set "@#{mname}", options[:default]
241
- end
242
- end
243
-
244
232
  end
245
233
  end
246
234
  end