rspec 1.2.2 → 1.2.3
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.
- data/History.rdoc +31 -1
- data/Manifest.txt +14 -12
- data/Rakefile +1 -1
- data/Upgrade.rdoc +43 -3
- data/examples/failing/failing_implicit_docstrings_example.rb +5 -5
- data/examples/passing/implicit_docstrings_example.rb +3 -3
- data/features/before_and_after_blocks/before_and_after_blocks.feature +20 -21
- data/features/example_groups/example_group_with_should_methods.feature +20 -8
- data/features/example_groups/implicit_docstrings.feature +36 -20
- data/features/example_groups/nested_groups.feature +25 -10
- data/features/extensions/custom_example_group.feature +19 -0
- data/features/formatters/custom_formatter.feature +30 -0
- data/features/heckle/heckle.feature +7 -7
- data/features/interop/examples_and_tests_together.feature +63 -14
- data/features/interop/rspec_output.feature +25 -0
- data/features/interop/test_but_not_test_unit.feature +19 -7
- data/features/interop/test_case_with_should_methods.feature +37 -8
- data/features/matchers/{create_matcher.feature → define_matcher.feature} +54 -30
- data/features/matchers/{create_matcher_outside_rspec.feature → define_matcher_outside_rspec.feature} +7 -7
- data/features/mock_framework_integration/use_flexmock.feature +3 -3
- data/features/mock_framework_integration/use_mocha.feature +3 -3
- data/features/mock_framework_integration/use_rr.feature +3 -3
- data/features/mocks/mix_stubs_and_mocks.feature +4 -4
- data/features/pending/pending_examples.feature +18 -18
- data/features/runner/specify_line_number.feature +32 -0
- data/features/step_definitions/running_rspec_steps.rb +41 -0
- data/features/subject/explicit_subject.feature +4 -4
- data/features/subject/implicit_subject.feature +4 -4
- data/features/support/env.rb +64 -11
- data/features/support/matchers/smart_match.rb +10 -35
- data/lib/spec.rb +1 -0
- data/lib/spec/deprecation.rb +40 -0
- data/lib/spec/dsl/main.rb +10 -5
- data/lib/spec/example.rb +1 -27
- data/lib/spec/example/args_and_options.rb +27 -0
- data/lib/spec/example/before_and_after_hooks.rb +30 -21
- data/lib/spec/example/errors.rb +8 -18
- data/lib/spec/example/example_group_factory.rb +0 -4
- data/lib/spec/example/example_group_methods.rb +27 -41
- data/lib/spec/example/example_group_proxy.rb +12 -22
- data/lib/spec/example/example_methods.rb +8 -18
- data/lib/spec/example/example_proxy.rb +4 -4
- data/lib/spec/example/pending.rb +3 -4
- data/lib/spec/example/predicate_matchers.rb +1 -1
- data/lib/spec/example/subject.rb +2 -0
- data/lib/spec/expectations.rb +1 -26
- data/lib/spec/expectations/extensions.rb +1 -1
- data/lib/spec/expectations/extensions/kernel.rb +52 -0
- data/lib/spec/expectations/handler.rb +21 -10
- data/lib/spec/matchers/be.rb +3 -3
- data/lib/spec/matchers/be_close.rb +17 -21
- data/lib/spec/matchers/be_instance_of.rb +7 -26
- data/lib/spec/matchers/be_kind_of.rb +7 -26
- data/lib/spec/matchers/dsl.rb +9 -4
- data/lib/spec/matchers/eql.rb +24 -25
- data/lib/spec/matchers/equal.rb +25 -25
- data/lib/spec/matchers/exist.rb +5 -21
- data/lib/spec/matchers/include.rb +22 -44
- data/lib/spec/matchers/match.rb +5 -25
- data/lib/spec/matchers/match_array.rb +8 -4
- data/lib/spec/matchers/matcher.rb +13 -2
- data/lib/spec/matchers/pretty.rb +1 -0
- data/lib/spec/matchers/simple_matcher.rb +2 -2
- data/lib/spec/mocks/mock.rb +10 -10
- data/lib/spec/mocks/spec_methods.rb +1 -1
- data/lib/spec/runner/configuration.rb +53 -42
- data/lib/spec/{expectations → runner}/differs/default.rb +0 -0
- data/lib/spec/{expectations → runner}/differs/load-diff-lcs.rb +0 -0
- data/lib/spec/runner/drb_command_line.rb +1 -1
- data/lib/spec/runner/example_group_runner.rb +0 -12
- data/lib/spec/runner/formatter/base_formatter.rb +77 -30
- data/lib/spec/runner/formatter/base_text_formatter.rb +19 -24
- data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +1 -1
- data/lib/spec/runner/formatter/html_formatter.rb +4 -6
- data/lib/spec/runner/formatter/nested_text_formatter.rb +2 -2
- data/lib/spec/runner/formatter/no_op_method_missing.rb +21 -0
- data/lib/spec/runner/formatter/profile_formatter.rb +0 -4
- data/lib/spec/runner/formatter/progress_bar_formatter.rb +4 -5
- data/lib/spec/runner/formatter/silent_formatter.rb +10 -0
- data/lib/spec/runner/formatter/specdoc_formatter.rb +2 -2
- data/lib/spec/runner/option_parser.rb +14 -7
- data/lib/spec/runner/options.rb +17 -7
- data/lib/spec/runner/reporter.rb +69 -64
- data/lib/spec/version.rb +1 -1
- data/spec/spec/dsl/main_spec.rb +7 -0
- data/spec/spec/example/example_group_methods_spec.rb +16 -32
- data/spec/spec/example/example_group_proxy_spec.rb +25 -5
- data/spec/spec/example/example_group_spec.rb +2 -2
- data/spec/spec/example/example_methods_spec.rb +19 -24
- data/spec/spec/example/example_proxy_spec.rb +11 -1
- data/spec/spec/example/pending_module_spec.rb +2 -108
- data/spec/spec/example/predicate_matcher_spec.rb +23 -3
- data/spec/spec/expectations/extensions/object_spec.rb +9 -9
- data/spec/spec/expectations/fail_with_spec.rb +13 -13
- data/spec/spec/expectations/handler_spec.rb +44 -15
- data/spec/spec/matchers/be_close_spec.rb +9 -0
- data/spec/spec/matchers/be_instance_of_spec.rb +6 -4
- data/spec/spec/matchers/be_kind_of_spec.rb +5 -3
- data/spec/spec/matchers/be_spec.rb +1 -5
- data/spec/spec/matchers/compatibility_spec.rb +1 -1
- data/spec/spec/matchers/dsl_spec.rb +10 -1
- data/spec/spec/matchers/eql_spec.rb +8 -4
- data/spec/spec/matchers/equal_spec.rb +8 -4
- data/spec/spec/matchers/exist_spec.rb +1 -1
- data/spec/spec/matchers/include_spec.rb +1 -1
- data/spec/spec/matchers/match_array_spec.rb +26 -1
- data/spec/spec/matchers/match_spec.rb +2 -2
- data/spec/spec/matchers/matcher_methods_spec.rb +0 -3
- data/spec/spec/matchers/matcher_spec.rb +53 -0
- data/spec/spec/matchers/operator_matcher_spec.rb +1 -1
- data/spec/spec/mocks/mock_spec.rb +6 -0
- data/spec/spec/runner/configuration_spec.rb +11 -1
- data/spec/spec/runner/drb_command_line_spec.rb +13 -1
- data/spec/spec/runner/example_group_runner_spec.rb +0 -7
- data/spec/spec/runner/formatter/base_formatter_spec.rb +19 -12
- data/spec/spec/runner/formatter/base_text_formatter_spec.rb +2 -2
- data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +4 -4
- data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +2 -2
- data/spec/spec/runner/formatter/html_formatted-1.8.6.html +31 -34
- data/spec/spec/runner/formatter/html_formatter_spec.rb +20 -0
- data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +20 -20
- data/spec/spec/runner/formatter/profile_formatter_spec.rb +22 -3
- data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +24 -3
- data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +6 -6
- data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +25 -28
- data/spec/spec/runner/formatter/text_mate_formatter_spec.rb +2 -2
- data/spec/spec/runner/option_parser_spec.rb +108 -40
- data/spec/spec/runner/reporter_spec.rb +16 -17
- data/spec/spec_helper.rb +4 -1
- metadata +20 -18
- data/features/example_groups/output.feature +0 -20
- data/features/step_definitions/running_rspec.rb +0 -69
- data/lib/spec/expectations/extensions/object.rb +0 -63
- data/resources/spec/example_group_with_should_methods.rb +0 -12
- data/resources/spec/simple_spec.rb +0 -8
- data/resources/test/spec_and_test_together.rb +0 -56
- data/resources/test/spec_including_test_but_not_unit.rb +0 -11
- data/resources/test/test_case_with_should_methods.rb +0 -29
| @@ -9,7 +9,7 @@ module Spec | |
| 9 9 | 
             
                      @last_nested_descriptions = []
         | 
| 10 10 | 
             
                    end
         | 
| 11 11 |  | 
| 12 | 
            -
                    def  | 
| 12 | 
            +
                    def example_group_started(example_group)
         | 
| 13 13 | 
             
                      super
         | 
| 14 14 |  | 
| 15 15 | 
             
                      example_group.nested_descriptions.each_with_index do |nested_description, i|
         | 
| @@ -32,7 +32,7 @@ module Spec | |
| 32 32 | 
             
                      output.flush
         | 
| 33 33 | 
             
                    end
         | 
| 34 34 |  | 
| 35 | 
            -
                    def example_pending(example, message,  | 
| 35 | 
            +
                    def example_pending(example, message, deprecated_pending_location=nil)
         | 
| 36 36 | 
             
                      super
         | 
| 37 37 | 
             
                      output.puts yellow("#{current_indentation}#{example.description} (PENDING: #{message})")
         | 
| 38 38 | 
             
                      output.flush
         | 
| @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            module Spec
         | 
| 2 | 
            +
              module Runner
         | 
| 3 | 
            +
                module Formatter
         | 
| 4 | 
            +
                  module NOOPMethodMissing
         | 
| 5 | 
            +
                    def respond_to?(message, include_private = false)
         | 
| 6 | 
            +
                      if include_private
         | 
| 7 | 
            +
                        true
         | 
| 8 | 
            +
                      else
         | 
| 9 | 
            +
                        !private_methods.include?(message.to_s)
         | 
| 10 | 
            +
                      end
         | 
| 11 | 
            +
                    end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  private
         | 
| 14 | 
            +
                    
         | 
| 15 | 
            +
                    def method_missing(sym, *args)
         | 
| 16 | 
            +
                      # a no-op
         | 
| 17 | 
            +
                    end
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
            end
         | 
| @@ -1,9 +1,12 @@ | |
| 1 1 | 
             
            require 'spec/runner/formatter/base_text_formatter'
         | 
| 2 | 
            +
            require 'spec/runner/formatter/no_op_method_missing'
         | 
| 2 3 |  | 
| 3 4 | 
             
            module Spec
         | 
| 4 5 | 
             
              module Runner
         | 
| 5 6 | 
             
                module Formatter
         | 
| 6 7 | 
             
                  class ProgressBarFormatter < BaseTextFormatter
         | 
| 8 | 
            +
                    include NOOPMethodMissing
         | 
| 9 | 
            +
             | 
| 7 10 | 
             
                    def example_failed(example, counter, failure)
         | 
| 8 11 | 
             
                      @output.print colorize_failure('F', failure)
         | 
| 9 12 | 
             
                      @output.flush
         | 
| @@ -14,7 +17,7 @@ module Spec | |
| 14 17 | 
             
                      @output.flush
         | 
| 15 18 | 
             
                    end
         | 
| 16 19 |  | 
| 17 | 
            -
                    def example_pending(example, message,  | 
| 20 | 
            +
                    def example_pending(example, message, deprecated_pending_location=nil)
         | 
| 18 21 | 
             
                      super
         | 
| 19 22 | 
             
                      @output.print yellow('*')
         | 
| 20 23 | 
             
                      @output.flush
         | 
| @@ -24,10 +27,6 @@ module Spec | |
| 24 27 | 
             
                      @output.puts
         | 
| 25 28 | 
             
                      @output.flush
         | 
| 26 29 | 
             
                    end
         | 
| 27 | 
            -
                    
         | 
| 28 | 
            -
                    def method_missing(sym, *args)
         | 
| 29 | 
            -
                      # ignore
         | 
| 30 | 
            -
                    end
         | 
| 31 30 | 
             
                  end
         | 
| 32 31 | 
             
                end
         | 
| 33 32 | 
             
              end
         | 
| @@ -4,7 +4,7 @@ module Spec | |
| 4 4 | 
             
              module Runner
         | 
| 5 5 | 
             
                module Formatter
         | 
| 6 6 | 
             
                  class SpecdocFormatter < BaseTextFormatter
         | 
| 7 | 
            -
                    def  | 
| 7 | 
            +
                    def example_group_started(example_group)
         | 
| 8 8 | 
             
                      super
         | 
| 9 9 | 
             
                      output.puts
         | 
| 10 10 | 
             
                      output.puts example_group.description
         | 
| @@ -22,7 +22,7 @@ module Spec | |
| 22 22 | 
             
                      output.flush
         | 
| 23 23 | 
             
                    end
         | 
| 24 24 |  | 
| 25 | 
            -
                    def example_pending(example, message,  | 
| 25 | 
            +
                    def example_pending(example, message, deprecated_pending_location=nil)
         | 
| 26 26 | 
             
                      super
         | 
| 27 27 | 
             
                      output.puts yellow("- #{example.description} (PENDING: #{message})")
         | 
| 28 28 | 
             
                      output.flush
         | 
| @@ -31,7 +31,7 @@ module Spec | |
| 31 31 | 
             
                    :example => ["-e", "--example [NAME|FILE_NAME]",  "Execute example(s) with matching name(s). If the argument is",
         | 
| 32 32 | 
             
                                                                      "the path to an existing file (typically generated by a previous",
         | 
| 33 33 | 
             
                                                                      "run using --format failing_examples:file.txt), then the examples",
         | 
| 34 | 
            -
                                                                      "on each line of  | 
| 34 | 
            +
                                                                      "on each line of that file will be executed. If the file is empty,",
         | 
| 35 35 | 
             
                                                                      "all examples will be run (as if --example was not specified).",
         | 
| 36 36 | 
             
                                                                      " ",
         | 
| 37 37 | 
             
                                                                      "If the argument is not an existing file, then it is treated as",
         | 
| @@ -92,7 +92,7 @@ module Spec | |
| 92 92 |  | 
| 93 93 | 
             
                    @file_factory = File
         | 
| 94 94 |  | 
| 95 | 
            -
                    self.banner = "Usage: spec (FILE | 
| 95 | 
            +
                    self.banner = "Usage: spec (FILE(:LINE)?|DIRECTORY|GLOB)+ [options]"
         | 
| 96 96 | 
             
                    self.separator ""
         | 
| 97 97 | 
             
                    on(*OPTIONS[:pattern])          {|pattern| @options.filename_pattern = pattern}
         | 
| 98 98 | 
             
                    on(*OPTIONS[:diff])             {|diff| @options.parse_diff(diff)}
         | 
| @@ -130,6 +130,11 @@ module Spec | |
| 130 130 | 
             
                    return if parse_drb
         | 
| 131 131 |  | 
| 132 132 | 
             
                    super(@argv) do |file|
         | 
| 133 | 
            +
                      if file =~ /^(.+):(\d+)$/
         | 
| 134 | 
            +
                        file = $1
         | 
| 135 | 
            +
                        @options.line_number = $2.to_i
         | 
| 136 | 
            +
                      end
         | 
| 137 | 
            +
             | 
| 133 138 | 
             
                      @options.files << file
         | 
| 134 139 | 
             
                      blk.call(file) if blk
         | 
| 135 140 | 
             
                    end
         | 
| @@ -185,11 +190,13 @@ module Spec | |
| 185 190 | 
             
                    is_drb ||= argv.delete(OPTIONS[:drb][0])
         | 
| 186 191 | 
             
                    is_drb ||= argv.delete(OPTIONS[:drb][1])
         | 
| 187 192 | 
             
                    return false unless is_drb
         | 
| 188 | 
            -
                    @ | 
| 189 | 
            -
             | 
| 190 | 
            -
                       | 
| 191 | 
            -
                     | 
| 192 | 
            -
             | 
| 193 | 
            +
                    if DrbCommandLine.run(self.class.parse(argv, @error_stream, @out_stream))
         | 
| 194 | 
            +
                      @options.examples_should_not_be_run
         | 
| 195 | 
            +
                      true
         | 
| 196 | 
            +
                    else
         | 
| 197 | 
            +
                      @error_stream.puts "Running specs locally:"
         | 
| 198 | 
            +
                      false
         | 
| 199 | 
            +
                    end
         | 
| 193 200 | 
             
                  end
         | 
| 194 201 |  | 
| 195 202 | 
             
                  def parse_version
         | 
    
        data/lib/spec/runner/options.rb
    CHANGED
    
    | @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            require 'ostruct'
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module Spec
         | 
| 2 4 | 
             
              module Runner
         | 
| 3 5 | 
             
                class Options
         | 
| @@ -6,8 +8,8 @@ module Spec | |
| 6 8 | 
             
                  }
         | 
| 7 9 |  | 
| 8 10 | 
             
                  EXAMPLE_FORMATTERS = { # Load these lazily for better speed
         | 
| 9 | 
            -
                            'silent' => ['spec/runner/formatter/ | 
| 10 | 
            -
                                 'l' => ['spec/runner/formatter/ | 
| 11 | 
            +
                            'silent' => ['spec/runner/formatter/silent_formatter',                 'Formatter::SilentFormatter'],
         | 
| 12 | 
            +
                                 'l' => ['spec/runner/formatter/silent_formatter',                 'Formatter::SilentFormatter'],
         | 
| 11 13 | 
             
                           'specdoc' => ['spec/runner/formatter/specdoc_formatter',                'Formatter::SpecdocFormatter'],
         | 
| 12 14 | 
             
                                 's' => ['spec/runner/formatter/specdoc_formatter',                'Formatter::SpecdocFormatter'],
         | 
| 13 15 | 
             
                            'nested' => ['spec/runner/formatter/nested_text_formatter',            'Formatter::NestedTextFormatter'],
         | 
| @@ -208,9 +210,17 @@ module Spec | |
| 208 210 | 
             
                      else
         | 
| 209 211 | 
             
                        load_class(format, 'formatter', '--format')
         | 
| 210 212 | 
             
                      end
         | 
| 211 | 
            -
                      formatter_type.new( | 
| 213 | 
            +
                      formatter_type.new(formatter_options, where)
         | 
| 212 214 | 
             
                    end
         | 
| 213 215 | 
             
                  end
         | 
| 216 | 
            +
                  
         | 
| 217 | 
            +
                  def formatter_options
         | 
| 218 | 
            +
                    @formatter_options ||= OpenStruct.new(
         | 
| 219 | 
            +
                      :colour   => colour,
         | 
| 220 | 
            +
                      :autospec => autospec,
         | 
| 221 | 
            +
                      :dry_run  => dry_run
         | 
| 222 | 
            +
                    )
         | 
| 223 | 
            +
                  end
         | 
| 214 224 |  | 
| 215 225 | 
             
                  def load_heckle_runner(heckle)
         | 
| 216 226 | 
             
                    @format_options ||= [['silent', @output_stream]]
         | 
| @@ -319,7 +329,7 @@ module Spec | |
| 319 329 | 
             
                  end
         | 
| 320 330 |  | 
| 321 331 | 
             
                  def default_differ
         | 
| 322 | 
            -
                    require 'spec/ | 
| 332 | 
            +
                    require 'spec/runner/differs/default'
         | 
| 323 333 | 
             
                    self.differ_class = ::Spec::Expectations::Differs::Default
         | 
| 324 334 | 
             
                  end
         | 
| 325 335 |  | 
| @@ -327,18 +337,18 @@ module Spec | |
| 327 337 | 
             
                    if examples.empty?
         | 
| 328 338 | 
             
                      if files.length == 1
         | 
| 329 339 | 
             
                        if File.directory?(files[0])
         | 
| 330 | 
            -
                          error_stream.puts "You must specify one file, not a directory when  | 
| 340 | 
            +
                          error_stream.puts "You must specify one file, not a directory when providing a line number"
         | 
| 331 341 | 
             
                          exit(1) if stderr?
         | 
| 332 342 | 
             
                        else
         | 
| 333 343 | 
             
                          example = SpecParser.new(self).spec_name_for(files[0], line_number)
         | 
| 334 344 | 
             
                          @examples = [example]
         | 
| 335 345 | 
             
                        end
         | 
| 336 346 | 
             
                      else
         | 
| 337 | 
            -
                        error_stream.puts "Only one file can be specified when  | 
| 347 | 
            +
                        error_stream.puts "Only one file can be specified when providing a line number: #{files.inspect}"
         | 
| 338 348 | 
             
                        exit(3) if stderr?
         | 
| 339 349 | 
             
                      end
         | 
| 340 350 | 
             
                    else
         | 
| 341 | 
            -
                      error_stream.puts "You cannot use  | 
| 351 | 
            +
                      error_stream.puts "You cannot use --example and specify a line number"
         | 
| 342 352 | 
             
                      exit(4) if stderr?
         | 
| 343 353 | 
             
                    end
         | 
| 344 354 | 
             
                  end
         | 
    
        data/lib/spec/runner/reporter.rb
    CHANGED
    
    | @@ -1,19 +1,23 @@ | |
| 1 1 | 
             
            module Spec
         | 
| 2 2 | 
             
              module Runner
         | 
| 3 3 | 
             
                class Reporter
         | 
| 4 | 
            -
                  attr_reader :options | 
| 4 | 
            +
                  attr_reader :options
         | 
| 5 5 |  | 
| 6 6 | 
             
                  def initialize(options)
         | 
| 7 7 | 
             
                    @options = options
         | 
| 8 8 | 
             
                    @options.reporter = self
         | 
| 9 | 
            -
                     | 
| 9 | 
            +
                    @failures = []
         | 
| 10 | 
            +
                    @pending_count = 0
         | 
| 11 | 
            +
                    @example_count = 0
         | 
| 12 | 
            +
                    @start_time = nil
         | 
| 13 | 
            +
                    @end_time = nil
         | 
| 10 14 | 
             
                  end
         | 
| 11 15 |  | 
| 12 | 
            -
                  def  | 
| 16 | 
            +
                  def example_group_started(example_group)
         | 
| 17 | 
            +
                    @example_group = example_group
         | 
| 13 18 | 
             
                    formatters.each do |f|
         | 
| 14 | 
            -
                      f. | 
| 19 | 
            +
                      f.example_group_started(example_group)
         | 
| 15 20 | 
             
                    end
         | 
| 16 | 
            -
                    example_groups << example_group
         | 
| 17 21 | 
             
                  end
         | 
| 18 22 |  | 
| 19 23 | 
             
                  def example_started(example)
         | 
| @@ -21,12 +25,12 @@ module Spec | |
| 21 25 | 
             
                  end
         | 
| 22 26 |  | 
| 23 27 | 
             
                  def example_finished(example, error=nil)
         | 
| 24 | 
            -
                    @ | 
| 28 | 
            +
                    @example_count += 1
         | 
| 25 29 |  | 
| 26 30 | 
             
                    if error.nil?
         | 
| 27 31 | 
             
                      example_passed(example)
         | 
| 28 32 | 
             
                    elsif Spec::Example::ExamplePendingError === error
         | 
| 29 | 
            -
                      example_pending(example,  | 
| 33 | 
            +
                      example_pending(example, example.location, error.message)
         | 
| 30 34 | 
             
                    else
         | 
| 31 35 | 
             
                      example_failed(example, error)
         | 
| 32 36 | 
             
                    end
         | 
| @@ -34,7 +38,7 @@ module Spec | |
| 34 38 |  | 
| 35 39 | 
             
                  def example_failed(example, error)
         | 
| 36 40 | 
             
                    backtrace_tweaker.tweak_backtrace(error)
         | 
| 37 | 
            -
                    failure = Failure.new( | 
| 41 | 
            +
                    failure = Failure.new(@example_group.description, example.description, error)
         | 
| 38 42 | 
             
                    @failures << failure
         | 
| 39 43 | 
             
                    formatters.each do |f|
         | 
| 40 44 | 
             
                      f.example_failed(example, @failures.length, failure)
         | 
| @@ -42,7 +46,6 @@ module Spec | |
| 42 46 | 
             
                  end
         | 
| 43 47 |  | 
| 44 48 | 
             
                  def start(number_of_examples)
         | 
| 45 | 
            -
                    clear
         | 
| 46 49 | 
             
                    @start_time = Time.new
         | 
| 47 50 | 
             
                    formatters.each{|f| f.start(number_of_examples)}
         | 
| 48 51 | 
             
                  end
         | 
| @@ -57,12 +60,51 @@ module Spec | |
| 57 60 | 
             
                    dump_pending
         | 
| 58 61 | 
             
                    dump_failures
         | 
| 59 62 | 
             
                    formatters.each do |f|
         | 
| 60 | 
            -
                      f.dump_summary(duration, @ | 
| 63 | 
            +
                      f.dump_summary(duration, @example_count, @failures.length, @pending_count)
         | 
| 61 64 | 
             
                      f.close
         | 
| 62 65 | 
             
                    end
         | 
| 63 66 | 
             
                    @failures.length
         | 
| 64 67 | 
             
                  end
         | 
| 65 68 |  | 
| 69 | 
            +
                  class Failure
         | 
| 70 | 
            +
                    def initialize(group_description, example_description, exception)  # :nodoc:
         | 
| 71 | 
            +
                      @example_name = "#{group_description} #{example_description}"
         | 
| 72 | 
            +
                      @exception = exception
         | 
| 73 | 
            +
                    end
         | 
| 74 | 
            +
                    
         | 
| 75 | 
            +
                    # The Exception object raised
         | 
| 76 | 
            +
                    attr_reader :exception
         | 
| 77 | 
            +
                    
         | 
| 78 | 
            +
                    # Header messsage for reporting this failure, including the name of the
         | 
| 79 | 
            +
                    # example and an indicator of the type of failure. FAILED indicates a
         | 
| 80 | 
            +
                    # failed expectation. FIXED indicates a pending example that passes, and
         | 
| 81 | 
            +
                    # no longer needs to be pending. RuntimeError indicates that a
         | 
| 82 | 
            +
                    # RuntimeError occured.
         | 
| 83 | 
            +
                    # 
         | 
| 84 | 
            +
                    # == Examples
         | 
| 85 | 
            +
                    #
         | 
| 86 | 
            +
                    #   'A new account should have a zero balance' FAILED
         | 
| 87 | 
            +
                    #   'A new account should have a zero balance' FIXED
         | 
| 88 | 
            +
                    #   RuntimeError in 'A new account should have a zero balance'
         | 
| 89 | 
            +
                    def header
         | 
| 90 | 
            +
                      if expectation_not_met?
         | 
| 91 | 
            +
                        "'#{@example_name}' FAILED"
         | 
| 92 | 
            +
                      elsif pending_fixed?
         | 
| 93 | 
            +
                        "'#{@example_name}' FIXED"
         | 
| 94 | 
            +
                      else
         | 
| 95 | 
            +
                        "#{@exception.class.name} in '#{@example_name}'"
         | 
| 96 | 
            +
                      end
         | 
| 97 | 
            +
                    end
         | 
| 98 | 
            +
                    
         | 
| 99 | 
            +
                    def pending_fixed? # :nodoc:
         | 
| 100 | 
            +
                      @exception.is_a?(Spec::Example::PendingExampleFixedError)
         | 
| 101 | 
            +
                    end
         | 
| 102 | 
            +
             | 
| 103 | 
            +
                    def expectation_not_met?  # :nodoc:
         | 
| 104 | 
            +
                      @exception.is_a?(Spec::Expectations::ExpectationNotMetError)
         | 
| 105 | 
            +
                    end
         | 
| 106 | 
            +
                  end
         | 
| 107 | 
            +
             | 
| 66 108 | 
             
                private
         | 
| 67 109 |  | 
| 68 110 | 
             
                  def formatters
         | 
| @@ -73,15 +115,6 @@ module Spec | |
| 73 115 | 
             
                    @options.backtrace_tweaker
         | 
| 74 116 | 
             
                  end
         | 
| 75 117 |  | 
| 76 | 
            -
                  def clear
         | 
| 77 | 
            -
                    @example_groups = []
         | 
| 78 | 
            -
                    @failures = []
         | 
| 79 | 
            -
                    @pending_count = 0
         | 
| 80 | 
            -
                    @examples = []
         | 
| 81 | 
            -
                    @start_time = nil
         | 
| 82 | 
            -
                    @end_time = nil
         | 
| 83 | 
            -
                  end
         | 
| 84 | 
            -
              
         | 
| 85 118 | 
             
                  def dump_failures
         | 
| 86 119 | 
             
                    return if @failures.empty?
         | 
| 87 120 | 
             
                    @failures.inject(1) do |index, failure|
         | 
| @@ -104,63 +137,35 @@ module Spec | |
| 104 137 | 
             
                  end
         | 
| 105 138 |  | 
| 106 139 | 
             
                  EXAMPLE_PENDING_DEPRECATION_WARNING = <<-WARNING
         | 
| 107 | 
            -
             | 
| 108 | 
            -
             | 
| 109 | 
            -
             | 
| 110 | 
            -
             | 
| 111 | 
            -
             | 
| 112 | 
            -
             | 
| 113 | 
            -
             | 
| 114 | 
            -
             | 
| 115 | 
            -
             | 
| 140 | 
            +
             | 
| 141 | 
            +
            *********************************************************************
         | 
| 142 | 
            +
            DEPRECATION WARNING: RSpec's formatters have changed example_pending
         | 
| 143 | 
            +
            to accept two arguments instead of three. Please see the rdoc
         | 
| 144 | 
            +
            for Spec::Runner::Formatter::BaseFormatter#example_pending
         | 
| 145 | 
            +
            for more information.
         | 
| 146 | 
            +
              
         | 
| 147 | 
            +
            Please update any custom formatters to accept only two arguments
         | 
| 148 | 
            +
            to example_pending. Support for example_pending with two arguments
         | 
| 149 | 
            +
            and this warning message will be removed after the RSpec 2.0 release.
         | 
| 150 | 
            +
            *********************************************************************      
         | 
| 151 | 
            +
            WARNING
         | 
| 116 152 |  | 
| 117 | 
            -
                  def example_pending(example,  | 
| 153 | 
            +
                  def example_pending(example, ignore, message="Not Yet Implemented")
         | 
| 118 154 | 
             
                    @pending_count += 1
         | 
| 119 155 | 
             
                    formatters.each do |formatter|
         | 
| 120 156 | 
             
                      if formatter_uses_deprecated_example_pending_method?(formatter)
         | 
| 121 | 
            -
                         | 
| 122 | 
            -
                        formatter.example_pending(example, message)
         | 
| 157 | 
            +
                        Spec.warn EXAMPLE_PENDING_DEPRECATION_WARNING
         | 
| 158 | 
            +
                        formatter.example_pending(example, message, example.location)
         | 
| 123 159 | 
             
                      else
         | 
| 124 | 
            -
                        formatter.example_pending(example, message | 
| 160 | 
            +
                        formatter.example_pending(example, message)
         | 
| 125 161 | 
             
                      end
         | 
| 126 162 | 
             
                    end
         | 
| 127 163 | 
             
                  end
         | 
| 128 164 |  | 
| 129 165 | 
             
                  def formatter_uses_deprecated_example_pending_method?(formatter)
         | 
| 130 | 
            -
                    formatter.method(:example_pending).arity ==  | 
| 166 | 
            +
                    formatter.method(:example_pending).arity == 3
         | 
| 131 167 | 
             
                  end
         | 
| 132 168 |  | 
| 133 | 
            -
                  class Failure
         | 
| 134 | 
            -
                    attr_reader :example, :exception
         | 
| 135 | 
            -
                    
         | 
| 136 | 
            -
                    def initialize(group, example, exception)
         | 
| 137 | 
            -
                      @group, @example, @exception = group, example, exception
         | 
| 138 | 
            -
                    end
         | 
| 139 | 
            -
                    
         | 
| 140 | 
            -
                    def header
         | 
| 141 | 
            -
                      if expectation_not_met?
         | 
| 142 | 
            -
                        "'#{example_name}' FAILED"
         | 
| 143 | 
            -
                      elsif pending_fixed?
         | 
| 144 | 
            -
                        "'#{example_name}' FIXED"
         | 
| 145 | 
            -
                      else
         | 
| 146 | 
            -
                        "#{@exception.class.name} in '#{example_name}'"
         | 
| 147 | 
            -
                      end
         | 
| 148 | 
            -
                    end
         | 
| 149 | 
            -
                    
         | 
| 150 | 
            -
                    def pending_fixed?
         | 
| 151 | 
            -
                      @exception.is_a?(Spec::Example::PendingExampleFixedError)
         | 
| 152 | 
            -
                    end
         | 
| 153 | 
            -
             | 
| 154 | 
            -
                    def expectation_not_met?
         | 
| 155 | 
            -
                      @exception.is_a?(Spec::Expectations::ExpectationNotMetError)
         | 
| 156 | 
            -
                    end
         | 
| 157 | 
            -
             | 
| 158 | 
            -
                  protected
         | 
| 159 | 
            -
             | 
| 160 | 
            -
                    def example_name
         | 
| 161 | 
            -
                      "#{@group} #{@example.description}"
         | 
| 162 | 
            -
                    end
         | 
| 163 | 
            -
                  end
         | 
| 164 169 | 
             
                end
         | 
| 165 170 | 
             
              end
         | 
| 166 171 | 
             
            end
         | 
    
        data/lib/spec/version.rb
    CHANGED
    
    
    
        data/spec/spec/dsl/main_spec.rb
    CHANGED
    
    | @@ -16,6 +16,13 @@ module Spec | |
| 16 16 | 
             
                        )
         | 
| 17 17 | 
             
                        @main.__send__ method, "The ExampleGroup", &block
         | 
| 18 18 | 
             
                      end
         | 
| 19 | 
            +
                      
         | 
| 20 | 
            +
                      it "raises with no description" do
         | 
| 21 | 
            +
                        block = lambda {|a,b|}
         | 
| 22 | 
            +
                        lambda do
         | 
| 23 | 
            +
                          @main.__send__ method, &block
         | 
| 24 | 
            +
                        end.should raise_error(ArgumentError, /No description supplied for example group declared on #{__FILE__}:#{__LINE__ - 1}/)
         | 
| 25 | 
            +
                      end
         | 
| 19 26 | 
             
                    end
         | 
| 20 27 | 
             
                  end
         | 
| 21 28 |  |