rspec-core 2.0.0.beta.17 → 2.0.0.beta.18

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 (70) hide show
  1. data/README.markdown +5 -1
  2. data/Rakefile +4 -1
  3. data/Upgrade.markdown +28 -2
  4. data/VERSION +1 -1
  5. data/autotest/discover.rb +1 -1
  6. data/features/command_line/configure.feature +19 -0
  7. data/features/example_groups/shared_example_group.feature +125 -0
  8. data/features/hooks/around_hooks.feature +11 -2
  9. data/features/pending/pending_examples.feature +18 -6
  10. data/lib/autotest/rspec2.rb +1 -1
  11. data/lib/rspec/core.rb +1 -0
  12. data/lib/rspec/core/command_line_configuration.rb +62 -0
  13. data/lib/rspec/core/configuration.rb +39 -12
  14. data/lib/rspec/core/configuration_options.rb +5 -5
  15. data/lib/rspec/core/deprecation.rb +6 -6
  16. data/lib/rspec/core/errors.rb +1 -1
  17. data/lib/rspec/core/example.rb +25 -25
  18. data/lib/rspec/core/example_group.rb +30 -14
  19. data/lib/rspec/core/formatters/base_formatter.rb +25 -25
  20. data/lib/rspec/core/formatters/base_text_formatter.rb +11 -10
  21. data/lib/rspec/core/formatters/documentation_formatter.rb +2 -2
  22. data/lib/rspec/core/formatters/helpers.rb +6 -6
  23. data/lib/rspec/core/formatters/html_formatter.rb +13 -12
  24. data/lib/rspec/core/formatters/progress_formatter.rb +1 -1
  25. data/lib/rspec/core/formatters/snippet_extractor.rb +5 -5
  26. data/lib/rspec/core/hooks.rb +3 -3
  27. data/lib/rspec/core/kernel_extensions.rb +1 -1
  28. data/lib/rspec/core/let.rb +5 -5
  29. data/lib/rspec/core/metadata.rb +2 -2
  30. data/lib/rspec/core/mocking/with_absolutely_nothing.rb +3 -3
  31. data/lib/rspec/core/mocking/with_mocha.rb +5 -5
  32. data/lib/rspec/core/mocking/with_rr.rb +3 -3
  33. data/lib/rspec/core/mocking/with_rspec.rb +3 -3
  34. data/lib/rspec/core/option_parser.rb +8 -4
  35. data/lib/rspec/core/rake_task.rb +5 -0
  36. data/lib/rspec/core/ruby_project.rb +1 -1
  37. data/lib/rspec/core/shared_example_group.rb +2 -2
  38. data/lib/rspec/core/subject.rb +10 -4
  39. data/lib/rspec/core/world.rb +5 -5
  40. data/rspec-core.gemspec +19 -11
  41. data/spec/autotest/rspec_spec.rb +14 -14
  42. data/spec/rspec/core/command_line_configuration_spec.rb +26 -0
  43. data/spec/rspec/core/command_line_spec.rb +5 -5
  44. data/spec/rspec/core/configuration_options_spec.rb +20 -20
  45. data/spec/rspec/core/configuration_spec.rb +10 -10
  46. data/spec/rspec/core/core_spec.rb +8 -8
  47. data/spec/rspec/core/deprecations_spec.rb +2 -2
  48. data/spec/rspec/core/drb_command_line_spec.rb +10 -10
  49. data/spec/rspec/core/example_group_spec.rb +46 -10
  50. data/spec/rspec/core/example_spec.rb +46 -12
  51. data/spec/rspec/core/formatters/base_formatter_spec.rb +2 -46
  52. data/spec/rspec/core/formatters/base_text_formatter_spec.rb +4 -3
  53. data/spec/rspec/core/formatters/documentation_formatter_spec.rb +1 -1
  54. data/spec/rspec/core/formatters/helpers_spec.rb +2 -2
  55. data/spec/rspec/core/formatters/html_formatted-1.8.7.html +1 -1
  56. data/spec/rspec/core/formatters/html_formatted-1.9.1.html +1 -1
  57. data/spec/rspec/core/formatters/html_formatted-1.9.2.html +1 -1
  58. data/spec/rspec/core/formatters/progress_formatter_spec.rb +10 -9
  59. data/spec/rspec/core/formatters/text_mate_formatted-1.8.7.html +13 -13
  60. data/spec/rspec/core/formatters/text_mate_formatted-1.9.2.html +1 -1
  61. data/spec/rspec/core/let_spec.rb +1 -1
  62. data/spec/rspec/core/metadata_spec.rb +9 -9
  63. data/spec/rspec/core/option_parser_spec.rb +3 -3
  64. data/spec/rspec/core/pending_example_spec.rb +1 -1
  65. data/spec/rspec/core/resources/custom_example_group_runner.rb +1 -1
  66. data/spec/rspec/core/runner_spec.rb +4 -4
  67. data/spec/rspec/core/shared_example_group_spec.rb +66 -162
  68. data/spec/rspec/core/subject_spec.rb +4 -4
  69. data/spec/rspec/core/world_spec.rb +38 -38
  70. metadata +21 -13
@@ -7,22 +7,22 @@ module RSpec
7
7
  module Helpers
8
8
  SUB_SECOND_PRECISION = 5
9
9
  DEFAULT_PRECISION = 2
10
-
10
+
11
11
  def format_seconds(float)
12
12
  precision ||= (float < 1) ? SUB_SECOND_PRECISION : DEFAULT_PRECISION
13
13
  formatted = sprintf("%.#{precision}f", float)
14
14
  strip_trailing_zeroes(formatted)
15
15
  end
16
-
16
+
17
17
  def strip_trailing_zeroes(string)
18
18
  stripped = string.sub(/[^1-9]+$/, '')
19
19
  stripped.empty? ? "0" : stripped
20
20
  end
21
-
21
+
22
22
  end
23
-
23
+
24
24
  end
25
-
25
+
26
26
  end
27
-
27
+
28
28
  end
@@ -13,24 +13,24 @@ module RSpec
13
13
 
14
14
  def message(message)
15
15
  end
16
-
16
+
17
17
  def initialize(output)
18
18
  super
19
19
  @example_group_number = 0
20
20
  @example_number = 0
21
21
  @header_red = nil
22
22
  end
23
-
23
+
24
24
  # The number of the currently running example_group
25
25
  def example_group_number
26
26
  @example_group_number
27
27
  end
28
-
28
+
29
29
  # The number of the currently running example (a global counter)
30
30
  def example_number
31
31
  @example_number
32
32
  end
33
-
33
+
34
34
  def start(example_count)
35
35
  super
36
36
  @output.puts html_header
@@ -38,7 +38,7 @@ module RSpec
38
38
  @output.flush
39
39
  end
40
40
 
41
- def add_example_group(example_group)
41
+ def example_group_started(example_group)
42
42
  super
43
43
  @example_group_red = false
44
44
  @example_group_number += 1
@@ -52,7 +52,7 @@ module RSpec
52
52
  @output.flush
53
53
  end
54
54
 
55
- def start_dump(duration)
55
+ def start_dump
56
56
  @output.puts " </dl>"
57
57
  @output.puts "</div>"
58
58
  @output.flush
@@ -108,7 +108,7 @@ module RSpec
108
108
  @snippet_extractor ||= SnippetExtractor.new
109
109
  " <pre class=\"ruby\"><code>#{@snippet_extractor.snippet(exception)}</code></pre>"
110
110
  end
111
-
111
+
112
112
  def move_progress
113
113
  @output.puts " <script type=\"text/javascript\">moveProgressBar('#{percent_done}');</script>"
114
114
  @output.flush
@@ -128,12 +128,13 @@ module RSpec
128
128
  def dump_pending
129
129
  end
130
130
 
131
- def dump_summary
131
+ def dump_summary(duration, example_count, failure_count, pending_count)
132
+ # TODO - kill dry_run?
132
133
  if dry_run?
133
134
  totals = "This was a dry-run"
134
135
  else
135
136
  totals = "#{example_count} example#{'s' unless example_count == 1}, #{failure_count} failure#{'s' unless failure_count == 1}"
136
- totals << ", #{pending_count} pending" if pending_count > 0
137
+ totals << ", #{pending_count} pending" if pending_count > 0
137
138
  end
138
139
  @output.puts "<script type=\"text/javascript\">document.getElementById('duration').innerHTML = \"Finished in <strong>#{duration} seconds</strong>\";</script>"
139
140
  @output.puts "<script type=\"text/javascript\">document.getElementById('totals').innerHTML = \"#{totals}\";</script>"
@@ -144,10 +145,10 @@ module RSpec
144
145
  @output.flush
145
146
  end
146
147
 
147
- def html_header
148
+ def html_header
148
149
  <<-EOF
149
150
  <?xml version="1.0" encoding="UTF-8"?>
150
- <!DOCTYPE html
151
+ <!DOCTYPE html
151
152
  PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
152
153
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
153
154
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
@@ -220,7 +221,7 @@ function makeYellow(element_id) {
220
221
  }
221
222
  EOF
222
223
  end
223
-
224
+
224
225
  def global_styles
225
226
  <<-EOF
226
227
  #rspec-header {
@@ -19,7 +19,7 @@ module RSpec
19
19
  output.print red('F')
20
20
  end
21
21
 
22
- def start_dump(duration)
22
+ def start_dump
23
23
  super
24
24
  output.puts
25
25
  end
@@ -5,14 +5,14 @@ module RSpec
5
5
  class SnippetExtractor #:nodoc:
6
6
  class NullConverter; def convert(code, pre); code; end; end #:nodoc:
7
7
  begin; require 'syntax/convertors/html'; @@converter = Syntax::Convertors::HTML.for_syntax "ruby"; rescue LoadError => e; @@converter = NullConverter.new; end
8
-
8
+
9
9
  def snippet(error)
10
10
  raw_code, line = snippet_for(error.backtrace[0])
11
11
  highlighted = @@converter.convert(raw_code, false)
12
12
  highlighted << "\n<span class=\"comment\"># gem install syntax to get syntax highlighting</span>" if @@converter.is_a?(NullConverter)
13
13
  post_process(highlighted, line)
14
14
  end
15
-
15
+
16
16
  def snippet_for(error_line)
17
17
  if error_line =~ /(.*):(\d+)/
18
18
  file = $1
@@ -22,7 +22,7 @@ module RSpec
22
22
  ["# Couldn't get snippet for #{error_line}", 1]
23
23
  end
24
24
  end
25
-
25
+
26
26
  def lines_around(file, line)
27
27
  if File.file?(file)
28
28
  lines = File.open(file).read.split("\n")
@@ -35,7 +35,7 @@ module RSpec
35
35
  "# Couldn't get snippet for #{file}"
36
36
  end
37
37
  end
38
-
38
+
39
39
  def post_process(highlighted, offending_line)
40
40
  new_lines = []
41
41
  highlighted.split("\n").each_with_index do |line, i|
@@ -45,7 +45,7 @@ module RSpec
45
45
  end
46
46
  new_lines.join("\n")
47
47
  end
48
-
48
+
49
49
  end
50
50
  end
51
51
  end
@@ -80,10 +80,10 @@ module RSpec
80
80
  class AroundHooks < HookCollection; end
81
81
 
82
82
  def hooks
83
- @hooks ||= {
83
+ @hooks ||= {
84
84
  :around => { :each => AroundHooks.new },
85
- :before => { :each => BeforeHooks.new, :all => BeforeHooks.new, :suite => BeforeHooks.new },
86
- :after => { :each => AfterHooks.new, :all => AfterHooks.new, :suite => AfterHooks.new }
85
+ :before => { :each => BeforeHooks.new, :all => BeforeHooks.new, :suite => BeforeHooks.new },
86
+ :after => { :each => AfterHooks.new, :all => AfterHooks.new, :suite => AfterHooks.new }
87
87
  }
88
88
  end
89
89
 
@@ -1,5 +1,5 @@
1
1
  module Kernel
2
2
  def debugger(*args)
3
3
  RSpec.configuration.error_stream.puts "debugger statement ignored, use -d or --debug option to enable debugging\n#{caller(0)[1]}"
4
- end
4
+ end unless respond_to?(:debugger)
5
5
  end
@@ -4,7 +4,7 @@ module RSpec
4
4
 
5
5
  module ClassMethods
6
6
  # Generates a method whose return value is memoized
7
- # after the first call.
7
+ # after the first call.
8
8
  #
9
9
  # == Examples
10
10
  #
@@ -13,7 +13,7 @@ module RSpec
13
13
  #
14
14
  # it "does something" do
15
15
  # # first invocation, executes block, memoizes and returns result
16
- # thing.do_something
16
+ # thing.do_something
17
17
  #
18
18
  # # second invocation, returns the memoized value
19
19
  # thing.should be_something
@@ -36,7 +36,7 @@ module RSpec
36
36
  # def self.count
37
37
  # @count ||= 0
38
38
  # end
39
- #
39
+ #
40
40
  # def self.count=(val)
41
41
  # @count += val
42
42
  # end
@@ -72,7 +72,7 @@ module RSpec
72
72
  # it "is invoked implicitly" do
73
73
  # Thing.count.should == 1
74
74
  # end
75
- #
75
+ #
76
76
  # it "returns memoized version on first invocation" do
77
77
  # thing
78
78
  # Thing.count.should == 1
@@ -81,7 +81,7 @@ module RSpec
81
81
  # end
82
82
  def let!(name, &block)
83
83
  let(name, &block)
84
- before { __send__(name) }
84
+ before { __send__(name) }
85
85
  end
86
86
  end
87
87
 
@@ -49,7 +49,7 @@ module RSpec
49
49
  #{"*"*50}
50
50
  :#{key} is not allowed
51
51
 
52
- RSpec reserves some hash keys for its own internal use,
52
+ RSpec reserves some hash keys for its own internal use,
53
53
  including :#{key}, which is used on:
54
54
 
55
55
  #{caller(0)[4]}.
@@ -157,7 +157,7 @@ EOM
157
157
  line_number = file_and_line_number(metadata)[1] if file_and_line_number(metadata)
158
158
  line_number && line_number.to_i
159
159
  end
160
-
160
+
161
161
  def location_from(metadata)
162
162
  "#{metadata[:file_path]}:#{metadata[:line_number]}"
163
163
  end
@@ -2,9 +2,9 @@ module RSpec
2
2
  module Core
3
3
  module MockFrameworkAdapter
4
4
 
5
- def _setup_mocks; end
6
- def _verify_mocks; end
7
- def _teardown_mocks; end
5
+ def setup_mocks_for_rspec; end
6
+ def verify_mocks_for_rspec; end
7
+ def teardown_mocks_for_rspec; end
8
8
 
9
9
  end
10
10
  end
@@ -5,16 +5,16 @@ module RSpec
5
5
  module Core
6
6
  module MockFrameworkAdapter
7
7
 
8
- # Mocha::Standalone was deprecated as of Mocha 0.9.7.
8
+ # Mocha::Standalone was deprecated as of Mocha 0.9.7.
9
9
  begin
10
10
  include Mocha::API
11
11
  rescue NameError
12
12
  include Mocha::Standalone
13
13
  end
14
-
15
- alias :_setup_mocks :mocha_setup
16
- alias :_verify_mocks :mocha_verify
17
- alias :_teardown_mocks :mocha_teardown
14
+
15
+ alias :setup_mocks_for_rspec :mocha_setup
16
+ alias :verify_mocks_for_rspec :mocha_verify
17
+ alias :teardown_mocks_for_rspec :mocha_teardown
18
18
 
19
19
  end
20
20
  end
@@ -8,15 +8,15 @@ module RSpec
8
8
 
9
9
  include RR::Extensions::InstanceMethods
10
10
 
11
- def _setup_mocks
11
+ def setup_mocks_for_rspec
12
12
  RR::Space.instance.reset
13
13
  end
14
14
 
15
- def _verify_mocks
15
+ def verify_mocks_for_rspec
16
16
  RR::Space.instance.verify_doubles
17
17
  end
18
18
 
19
- def _teardown_mocks
19
+ def teardown_mocks_for_rspec
20
20
  RR::Space.instance.reset
21
21
  end
22
22
 
@@ -4,15 +4,15 @@ module RSpec
4
4
  module Core
5
5
  module MockFrameworkAdapter
6
6
 
7
- def _setup_mocks
7
+ def setup_mocks_for_rspec
8
8
  RSpec::Mocks::setup(self)
9
9
  end
10
10
 
11
- def _verify_mocks
11
+ def verify_mocks_for_rspec
12
12
  RSpec::Mocks::verify
13
13
  end
14
14
 
15
- def _teardown_mocks
15
+ def teardown_mocks_for_rspec
16
16
  RSpec::Mocks::teardown
17
17
  end
18
18
 
@@ -31,7 +31,7 @@ module RSpec::Core
31
31
  parser.on('-c', '--[no-]color', '--[no-]colour', 'Enable color in the output') do |o|
32
32
  options[:color_enabled] = o
33
33
  end
34
-
34
+
35
35
  parser.on('-d', '--debug', 'Enable debugging') do |o|
36
36
  options[:debug] = true
37
37
  end
@@ -50,7 +50,7 @@ module RSpec::Core
50
50
  options[:formatter] = o
51
51
  end
52
52
 
53
- parser.on_tail('-h', '--help', "You're looking at it.") do
53
+ parser.on_tail('-h', '--help', "You're looking at it.") do
54
54
  puts parser
55
55
  exit
56
56
  end
@@ -67,7 +67,7 @@ module RSpec::Core
67
67
  parser.on('-o', '--options PATH', 'Read configuration options from a file path. (Defaults to .rspec)') do |o|
68
68
  options[:options_file] = o || local_options_file
69
69
  end
70
-
70
+
71
71
  parser.on('-p', '--profile', 'Enable profiling of examples with output of the top 10 slowest examples') do |o|
72
72
  options[:profile_examples] = o
73
73
  end
@@ -86,10 +86,14 @@ module RSpec::Core
86
86
  options[:drb] = true
87
87
  end
88
88
 
89
+ parser.on('--configure COMMAND', 'Generate configuration files') do |cmd|
90
+ CommandLineConfiguration.new(cmd).run
91
+ exit
92
+ end
93
+
89
94
  parser.on('--drb-port [PORT]', 'Port to connect to on the DRb server') do |o|
90
95
  options[:drb_port] = o.to_i
91
96
  end
92
-
93
97
  end
94
98
  end
95
99
  end
@@ -18,6 +18,9 @@ module RSpec
18
18
  # Glob pattern to match files. (default is 'spec/**/*_spec.rb')
19
19
  attr_accessor :pattern
20
20
 
21
+ # Array of commandline options to pass to RSpec. Defaults to [].
22
+ attr_accessor :spec_opts
23
+
21
24
  # The options to pass to ruby. Defaults to blank
22
25
  attr_accessor :ruby_opts
23
26
 
@@ -46,6 +49,7 @@ module RSpec
46
49
  @pattern, @rcov_path, @rcov_opts, @ruby_opts = nil, nil, nil, nil
47
50
  @warning, @rcov = false, false
48
51
  @fail_on_error = true
52
+ @spec_opts = []
49
53
 
50
54
  yield self if block_given?
51
55
  @rcov_path ||= 'rcov'
@@ -88,6 +92,7 @@ module RSpec
88
92
  cmd_parts.unshift runner
89
93
  cmd_parts.unshift bundler
90
94
  cmd_parts += files_to_run.map { |fn| %["#{fn}"] }
95
+ cmd_parts << spec_opts.join(" ")
91
96
  cmd_parts.join(" ")
92
97
  end
93
98
  end
@@ -32,7 +32,7 @@ module RSpec
32
32
  return path if block.call(path)
33
33
  end
34
34
  end
35
-
35
+
36
36
  module_function :add_to_load_path
37
37
  module_function :add_dir_to_load_path
38
38
  module_function :root
@@ -1,7 +1,7 @@
1
1
  module RSpec
2
2
  module Core
3
3
  module SharedExampleGroup
4
-
4
+
5
5
  def share_examples_for(name, &block)
6
6
  ensure_shared_example_group_name_not_taken(name)
7
7
  RSpec.world.shared_example_groups[name] = block
@@ -12,7 +12,7 @@ module RSpec
12
12
  mod = Object.const_get(name)
13
13
  raise_name_error unless mod.created_from_caller(caller)
14
14
  end
15
-
15
+
16
16
  mod = Module.new do
17
17
  @shared_block = block
18
18
  @caller_line = caller.last
@@ -3,9 +3,11 @@ module RSpec
3
3
  module Subject
4
4
 
5
5
  def self.included(kls)
6
- kls.extend ClassMethods
7
- kls.__send__ :alias_method, :__should_for_example_group__, :should
8
- kls.__send__ :alias_method, :__should_not_for_example_group__, :should_not
6
+ kls.class_eval do
7
+ extend ClassMethods
8
+ alias_method :__should_for_example_group__, :should
9
+ alias_method :__should_not_for_example_group__, :should_not
10
+ end
9
11
  end
10
12
 
11
13
  def subject
@@ -80,7 +82,11 @@ module RSpec
80
82
  end
81
83
 
82
84
  def attribute_of_subject
83
- original_subject.send(example.description) if using_attribute?
85
+ if using_attribute?
86
+ example.description.split('.').inject(original_subject) do |target, method|
87
+ target.send(method)
88
+ end
89
+ end
84
90
  end
85
91
 
86
92
  def using_attribute?