rspec 0.6.3 → 0.6.4
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/CHANGES +28 -3
- data/EXAMPLES.rd +2 -16
- data/README +5 -2
- data/Rakefile +8 -4
- data/bin/spec +1 -0
- data/examples/custom_formatter.rb +2 -1
- data/examples/helper_method_spec.rb +12 -0
- data/examples/{mocking_spec.rb → mocking_example.rb} +0 -0
- data/examples/{bdd_framework_spec.rb → predicate_example.rb} +0 -0
- data/examples/stubbing_example.rb +28 -0
- data/lib/spec.rb +2 -1
- data/lib/spec/expectations.rb +7 -0
- data/lib/spec/expectations/diff.rb +56 -0
- data/lib/spec/expectations/exceptions.rb +6 -0
- data/lib/spec/expectations/expectations.rb +19 -0
- data/lib/spec/expectations/have_helper.rb +41 -0
- data/lib/spec/expectations/helper.rb +4 -0
- data/lib/spec/expectations/should_base.rb +52 -0
- data/lib/spec/expectations/should_helper.rb +93 -0
- data/lib/spec/expectations/should_negator.rb +71 -0
- data/lib/spec/{api → expectations}/sugar.rb +8 -8
- data/lib/spec/mocks.rb +5 -0
- data/lib/spec/{api/mocks → mocks}/argument_expectation.rb +1 -1
- data/lib/spec/{api → mocks}/exceptions.rb +3 -5
- data/lib/spec/{api/mocks → mocks}/message_expectation.rb +15 -9
- data/lib/spec/{api/mocks → mocks}/mock.rb +44 -26
- data/lib/spec/{api/mocks → mocks}/order_group.rb +1 -1
- data/lib/spec/runner/backtrace_tweaker.rb +4 -1
- data/lib/spec/runner/execution_context.rb +13 -4
- data/lib/spec/runner/formatter/base_text_formatter.rb +26 -13
- data/lib/spec/runner/formatter/html_formatter.rb +1 -1
- data/lib/spec/runner/option_parser.rb +6 -2
- data/lib/spec/runner/specification.rb +2 -2
- data/lib/spec/test_to_spec/ruby2ruby.rb +1 -1
- data/lib/spec/version.rb +1 -1
- data/test/spec/expectations/arbitrary_operator_test.rb +55 -0
- data/test/spec/expectations/arbitrary_predicate_test.rb +163 -0
- data/test/spec/{api/helper → expectations}/containment_test.rb +2 -2
- data/test/spec/expectations/diff_test.rb +62 -0
- data/test/spec/{api/helper → expectations}/identity_test.rb +2 -2
- data/test/spec/{api/helper → expectations}/object_equality_test.rb +2 -2
- data/test/spec/{api/helper → expectations}/raising_test.rb +5 -5
- data/test/spec/{api/helper → expectations}/regex_matching_test.rb +6 -6
- data/test/spec/{api/helper → expectations}/should_have_test.rb +11 -2
- data/test/spec/{api/helper → expectations}/should_satisfy_test.rb +2 -4
- data/test/spec/{api → expectations}/sugar_test.rb +8 -8
- data/test/spec/expectations/supported_symbols_test.rb +33 -0
- data/test/spec/{api/helper → expectations}/throwing_test.rb +2 -2
- data/test/spec/{api/helper → expectations}/true_false_special_case_test.rb +2 -2
- data/test/spec/{api/helper → expectations}/typing_test.rb +2 -2
- data/test/spec/{api/mocks → mocks}/mock_arg_constraints_test.rb +4 -4
- data/test/spec/{api/mocks → mocks}/mock_counts_test.rb +2 -2
- data/test/spec/{api/mocks → mocks}/mock_ordering_test.rb +2 -2
- data/test/spec/{api/mocks → mocks}/mock_test.rb +22 -7
- data/test/spec/{api/mocks → mocks}/null_object_test.rb +8 -2
- data/test/spec/runner/backtrace_tweaker_test.rb +21 -19
- data/test/spec/runner/context_matching_test.rb +2 -2
- data/test/spec/runner/context_runner_test.rb +6 -6
- data/test/spec/runner/context_test.rb +1 -1
- data/test/spec/runner/execution_context_test.rb +22 -5
- data/test/spec/runner/formatter/failure_dump_test.rb +7 -7
- data/test/spec/runner/option_parser_test.rb +20 -0
- data/test/spec/runner/reporter_test.rb +3 -3
- data/test/spec/runner/specification_test.rb +3 -3
- data/test/spec/test_to_spec/sexp_transformer_assertion_test.rb +4 -4
- data/test/spec/test_to_spec/sexp_transformer_test.rb +1 -1
- data/test/spec/test_to_spec/testfiles/test_unit_api_test.rb +2 -2
- data/test/test_classes.rb +21 -1
- data/test/test_helper.rb +1 -1
- data/vendor/selenium/README.txt +23 -0
- data/vendor/selenium/find_rspecs_home_page.rb +23 -0
- data/vendor/selenium/rspec_selenium.rb +33 -0
- data/vendor/watir/README.txt +32 -0
- data/vendor/watir/find_rspecs_home_page.rb +21 -0
- data/vendor/watir/find_rspecs_home_page.txt +15 -0
- data/vendor/watir/rspec_watir.rb +45 -0
- metadata +52 -41
- data/examples/airport_spec.rb +0 -33
- data/examples/custom_method_spec.rb +0 -24
- data/examples/sugar_spec.rb +0 -14
- data/lib/spec/api.rb +0 -8
- data/lib/spec/api/expectations.rb +0 -17
- data/lib/spec/api/helper.rb +0 -4
- data/lib/spec/api/helper/diff.rb +0 -54
- data/lib/spec/api/helper/have_helper.rb +0 -40
- data/lib/spec/api/helper/should_base.rb +0 -31
- data/lib/spec/api/helper/should_helper.rb +0 -93
- data/lib/spec/api/helper/should_negator.rb +0 -72
- data/test/spec/api/helper/arbitrary_predicate_test.rb +0 -112
- data/test/spec/api/helper/diff_test.rb +0 -60
@@ -0,0 +1,71 @@
|
|
1
|
+
module Spec
|
2
|
+
module Expectations
|
3
|
+
class ShouldNegator < ShouldBase
|
4
|
+
|
5
|
+
def initialize(target)
|
6
|
+
@target = target
|
7
|
+
@be_seen = false
|
8
|
+
end
|
9
|
+
|
10
|
+
def satisfy
|
11
|
+
fail_with_message "Supplied expectation was satisfied, but should not have been" if (yield @target)
|
12
|
+
end
|
13
|
+
|
14
|
+
def equal(expected)
|
15
|
+
fail_with_message(default_message("should not equal", expected)) if (@target == expected)
|
16
|
+
end
|
17
|
+
|
18
|
+
def be(expected = :no_arg)
|
19
|
+
@be_seen = true
|
20
|
+
return self if (expected == :no_arg)
|
21
|
+
fail_with_message(default_message("should not be", expected)) if (@target.equal?(expected))
|
22
|
+
end
|
23
|
+
|
24
|
+
def an_instance_of expected_class
|
25
|
+
fail_with_message(default_message("should not be an instance of", expected_class)) if @target.instance_of? expected_class
|
26
|
+
end
|
27
|
+
|
28
|
+
def a_kind_of expected_class
|
29
|
+
fail_with_message(default_message("should not be a kind of", expected_class)) if @target.kind_of? expected_class
|
30
|
+
end
|
31
|
+
|
32
|
+
def respond_to message
|
33
|
+
fail_with_message(default_message("should not respond to", message)) if @target.respond_to? message
|
34
|
+
end
|
35
|
+
|
36
|
+
def match(expected)
|
37
|
+
fail_with_message(default_message("should not match", expected)) if (@target =~ expected)
|
38
|
+
end
|
39
|
+
|
40
|
+
def raise(exception=Exception, message=nil)
|
41
|
+
begin
|
42
|
+
@target.call
|
43
|
+
rescue exception => e
|
44
|
+
return unless message.nil? || e.message == message
|
45
|
+
fail_with_message("#{default_message("should not raise", exception)}") if e.instance_of? exception
|
46
|
+
fail_with_message("#{default_message("should not raise", exception)} but raised #{e.inspect}") unless e.instance_of? exception
|
47
|
+
rescue
|
48
|
+
true
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def throw(symbol=:___this_is_a_symbol_that_will_likely_never_occur___)
|
53
|
+
begin
|
54
|
+
catch symbol do
|
55
|
+
@target.call
|
56
|
+
return true
|
57
|
+
end
|
58
|
+
fail_with_message(default_message("should not throw", symbol.inspect))
|
59
|
+
rescue NameError
|
60
|
+
true
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def method_missing(original_sym, *args)
|
65
|
+
actual_sym = find_supported_sym(original_sym)
|
66
|
+
return unless @target.__send__(actual_sym, *args)
|
67
|
+
fail_with_message(default_message("should not#{@be_seen ? ' be' : ''} #{original_sym}" + (args.empty? ? '' : (' ' + args.join(', ')))))
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -1,19 +1,19 @@
|
|
1
1
|
module Spec
|
2
|
-
module
|
2
|
+
module Expectations
|
3
3
|
# This module adds syntactic sugar that allows usage of should_* instead of should.*
|
4
4
|
module UnderscoreSugar
|
5
|
-
module
|
5
|
+
module SweetTooth; end
|
6
6
|
|
7
|
-
def
|
7
|
+
def handle_underscores_for_rspec!
|
8
8
|
original_method_missing = instance_method(:method_missing)
|
9
9
|
class_eval do
|
10
|
-
include
|
10
|
+
include SweetTooth # This is meant to add a signature to the object that sugarization occurred.
|
11
11
|
def method_missing(sym, *args, &block)
|
12
12
|
_method_missing(sym, args, block)
|
13
13
|
end
|
14
14
|
|
15
15
|
define_method :_method_missing do |sym, args, block|
|
16
|
-
return original_method_missing.bind(self).call(sym, *args, &block) unless
|
16
|
+
return original_method_missing.bind(self).call(sym, *args, &block) unless __sweetened?(sym)
|
17
17
|
|
18
18
|
object = self
|
19
19
|
calls = sym.to_s.split("_")
|
@@ -27,7 +27,7 @@ module Spec
|
|
27
27
|
return object.__send__(calls.join("_"), *args, &block)
|
28
28
|
end
|
29
29
|
|
30
|
-
def
|
30
|
+
def __sweetened?(sym) #:nodoc:
|
31
31
|
return true if sym.to_s =~ /^should_/
|
32
32
|
end
|
33
33
|
end
|
@@ -37,7 +37,7 @@ module Spec
|
|
37
37
|
end
|
38
38
|
|
39
39
|
class Module
|
40
|
-
include Spec::
|
40
|
+
include Spec::Expectations::UnderscoreSugar
|
41
41
|
end
|
42
42
|
|
43
|
-
Object.
|
43
|
+
Object.handle_underscores_for_rspec!
|
data/lib/spec/mocks.rb
ADDED
@@ -1,17 +1,17 @@
|
|
1
1
|
module Spec
|
2
|
-
module
|
2
|
+
module Mocks
|
3
3
|
|
4
4
|
# Represents the expection of the reception of a message
|
5
5
|
class MessageExpectation
|
6
6
|
|
7
|
-
def initialize(mock_name, expectation_ordering, expected_from, sym, method_block)
|
7
|
+
def initialize(mock_name, expectation_ordering, expected_from, sym, method_block, expected_received_count=1)
|
8
8
|
@mock_name = mock_name
|
9
9
|
@expected_from = expected_from
|
10
10
|
@sym = sym
|
11
11
|
@method_block = method_block
|
12
12
|
@return_block = lambda {}
|
13
13
|
@received_count = 0
|
14
|
-
@expected_received_count =
|
14
|
+
@expected_received_count = expected_received_count
|
15
15
|
@args_expectation = ArgumentExpectation.new([:any_args])
|
16
16
|
@consecutive = false
|
17
17
|
@exception_to_raise = nil
|
@@ -53,7 +53,7 @@ module Spec
|
|
53
53
|
|
54
54
|
message = "Mock '#{@mock_name}' expected '#{@sym}' #{count_message}, but received it #{@received_count} times"
|
55
55
|
begin
|
56
|
-
Kernel::raise(Spec::
|
56
|
+
Kernel::raise(Spec::Mocks::MockExpectationError, message)
|
57
57
|
rescue => error
|
58
58
|
error.backtrace.insert(0, @expected_from)
|
59
59
|
Kernel::raise error
|
@@ -64,7 +64,7 @@ module Spec
|
|
64
64
|
return unless @ordered
|
65
65
|
return @ordering.consume(self) if @ordering.ready_for?(self)
|
66
66
|
message = "Mock '#{@mock_name}' received '#{@sym}' out of order"
|
67
|
-
Kernel::raise(Spec::
|
67
|
+
Kernel::raise(Spec::Mocks::MockExpectationError, message)
|
68
68
|
end
|
69
69
|
|
70
70
|
# This method is called when a method is invoked on a mock
|
@@ -91,17 +91,17 @@ module Spec
|
|
91
91
|
def invoke_method_block(args)
|
92
92
|
begin
|
93
93
|
@method_block.call(*args)
|
94
|
-
rescue Spec::
|
95
|
-
Kernel::raise Spec::
|
94
|
+
rescue Spec::Expectations::ExpectationNotMetError => detail
|
95
|
+
Kernel::raise Spec::Mocks::MockExpectationError, "Call expectation violated with: " + detail
|
96
96
|
end
|
97
97
|
end
|
98
98
|
|
99
99
|
def invoke_with_yield(block)
|
100
100
|
if block.nil?
|
101
|
-
Kernel::raise Spec::
|
101
|
+
Kernel::raise Spec::Mocks::MockExpectationError, "Expected block to be passed"
|
102
102
|
end
|
103
103
|
if @args_to_yield.length != block.arity
|
104
|
-
Kernel::raise Spec::
|
104
|
+
Kernel::raise Spec::Mocks::MockExpectationError, "Wrong arity of passed block. Expected #{@args_to_yield.size}"
|
105
105
|
end
|
106
106
|
block.call(*@args_to_yield)
|
107
107
|
end
|
@@ -196,5 +196,11 @@ module Spec
|
|
196
196
|
self
|
197
197
|
end
|
198
198
|
end
|
199
|
+
|
200
|
+
class NegativeMessageExpectation < MessageExpectation
|
201
|
+
def initialize(mock_name, expectation_ordering, expected_from, sym, method_block)
|
202
|
+
super mock_name, expectation_ordering, expected_from, sym, method_block, 0
|
203
|
+
end
|
204
|
+
end
|
199
205
|
end
|
200
206
|
end
|
@@ -1,11 +1,6 @@
|
|
1
1
|
module Spec
|
2
|
-
module
|
3
|
-
|
4
|
-
# Remove all methods so they can be mocked too
|
5
|
-
(public_instance_methods - ['__id__', '__send__', 'nil?']).each do |m|
|
6
|
-
undef_method m
|
7
|
-
end
|
8
|
-
|
2
|
+
module Mocks
|
3
|
+
module MockInstanceMethods
|
9
4
|
# Creates a new mock with a +name+ (that will be used in error messages only)
|
10
5
|
# Options:
|
11
6
|
# * <tt>:null_object</tt> - if true, the mock object acts as a forgiving null object allowing any message to be sent to it.
|
@@ -15,17 +10,15 @@ module Spec
|
|
15
10
|
@expectations = []
|
16
11
|
@expectation_ordering = OrderGroup.new
|
17
12
|
end
|
18
|
-
|
13
|
+
|
19
14
|
def should_receive(sym, &block)
|
20
|
-
|
21
|
-
expectation = MessageExpectation.new(@name, @expectation_ordering, expected_from, sym, block_given? ? block : nil)
|
22
|
-
@expectations << expectation
|
23
|
-
expectation
|
15
|
+
add MessageExpectation, caller(1)[0], sym, &block
|
24
16
|
end
|
25
17
|
|
26
18
|
def should_not_receive(sym, &block)
|
19
|
+
add NegativeMessageExpectation, caller(1)[0], sym, &block
|
27
20
|
end
|
28
|
-
|
21
|
+
|
29
22
|
def __verify #:nodoc:
|
30
23
|
@expectations.each do |expectation|
|
31
24
|
expectation.verify_messages_received
|
@@ -33,30 +26,55 @@ module Spec
|
|
33
26
|
end
|
34
27
|
|
35
28
|
def method_missing(sym, *args, &block)
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
rescue NoMethodError
|
43
|
-
arg_message = args.collect{|arg| "<#{arg}:#{arg.class.name}>"}.join(", ")
|
44
|
-
Kernel::raise Spec::Api::MockExpectationError, "Mock '#{@name}' received unexpected message '#{sym}' with [#{arg_message}]"
|
45
|
-
end
|
29
|
+
begin
|
30
|
+
return self if @options[:null_object]
|
31
|
+
super(sym, *args, &block)
|
32
|
+
rescue NoMethodError
|
33
|
+
arg_message = args.collect{|arg| "<#{arg}:#{arg.class.name}>"}.join(", ")
|
34
|
+
Kernel::raise Spec::Mocks::MockExpectationError, "Mock '#{@name}' received unexpected message '#{sym}' with [#{arg_message}]"
|
46
35
|
end
|
47
36
|
end
|
48
|
-
|
37
|
+
|
49
38
|
private
|
50
39
|
|
51
40
|
DEFAULT_OPTIONS = {
|
52
41
|
:null_object => false
|
53
42
|
}
|
43
|
+
|
44
|
+
def add(expectation_class, expected_from, sym, &block)
|
45
|
+
define_expected_method(sym)
|
46
|
+
expectation = expectation_class.send(:new, @name, @expectation_ordering, expected_from, sym, block_given? ? block : nil)
|
47
|
+
@expectations << expectation
|
48
|
+
expectation
|
49
|
+
end
|
50
|
+
|
51
|
+
def metaclass
|
52
|
+
class << self; self; end
|
53
|
+
end
|
54
|
+
|
55
|
+
def define_expected_method(sym)
|
56
|
+
metaclass.__send__ :class_eval, %{
|
57
|
+
def #{sym}(*args, &block)
|
58
|
+
message_received :#{sym}, *args, &block # ?
|
59
|
+
end
|
60
|
+
}
|
61
|
+
end
|
62
|
+
|
63
|
+
def message_received(sym, *args, &block)
|
64
|
+
if expectation = find_matching_expectation(sym, *args)
|
65
|
+
expectation.invoke(args, block)
|
66
|
+
else
|
67
|
+
method_missing(sym, *args, &block)
|
68
|
+
end
|
69
|
+
end
|
54
70
|
|
55
71
|
def find_matching_expectation(sym, *args)
|
56
72
|
expectation = @expectations.find {|expectation| expectation.matches(sym, args)}
|
57
73
|
end
|
58
|
-
|
59
74
|
end
|
60
|
-
|
75
|
+
|
76
|
+
class Mock
|
77
|
+
include MockInstanceMethods
|
78
|
+
end
|
61
79
|
end
|
62
80
|
end
|
@@ -25,8 +25,11 @@ module Spec
|
|
25
25
|
error.backtrace.collect! do |line|
|
26
26
|
line = tweak_instance_exec_line line, spec_name
|
27
27
|
line = nil if line =~ /\/lib\/ruby\//
|
28
|
-
line = nil if line =~ /\/lib\/spec\/
|
28
|
+
line = nil if line =~ /\/lib\/spec\/expectations\//
|
29
|
+
line = nil if line =~ /\/lib\/spec\/mocks\//
|
30
|
+
line = nil if line =~ /\/lib\/spec\/rake\//
|
29
31
|
line = nil if line =~ /\/lib\/spec\/runner\//
|
32
|
+
line = nil if line =~ /\/lib\/spec\/stubs\//
|
30
33
|
line = nil if line =~ /bin\/spec:/
|
31
34
|
line = nil if line =~ /lib\/rspec_on_rails/
|
32
35
|
line = nil if line =~ /script\/rails_spec/
|
@@ -5,19 +5,28 @@ module Spec
|
|
5
5
|
def initialize(spec)
|
6
6
|
@spec = spec
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
9
|
def mock(name, options={})
|
10
|
-
mock =
|
10
|
+
mock = Spec::Mocks::Mock.new(name, options)
|
11
11
|
@spec.add_mock(mock)
|
12
12
|
mock
|
13
13
|
end
|
14
14
|
|
15
|
+
def stub(object, name="")
|
16
|
+
stub_space.create_stub(object, name)
|
17
|
+
end
|
18
|
+
|
15
19
|
def duck_type(*args)
|
16
|
-
return
|
20
|
+
return Spec::Mocks::DuckTypeArgConstraint.new(*args)
|
17
21
|
end
|
18
22
|
|
19
23
|
def violated(message="")
|
20
|
-
raise Spec::
|
24
|
+
raise Spec::Expectations::ExpectationNotMetError.new(message)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
def stub_space
|
29
|
+
@spec.stub_space
|
21
30
|
end
|
22
31
|
end
|
23
32
|
include InstanceMethods
|
@@ -5,10 +5,16 @@ module Spec
|
|
5
5
|
# non-text based ones too - just ignore the +output+ constructor
|
6
6
|
# argument.
|
7
7
|
class BaseTextFormatter
|
8
|
-
def initialize(output, dry_run=false)
|
9
|
-
@dry_run = dry_run
|
8
|
+
def initialize(output, dry_run=false, colour=false)
|
10
9
|
@output = output
|
11
|
-
|
10
|
+
@dry_run = dry_run
|
11
|
+
@colour = colour
|
12
|
+
begin
|
13
|
+
require 'Win32/Console/ANSI' if @colour && PLATFORM =~ /win32/
|
14
|
+
rescue LoadError
|
15
|
+
raise "You must gem install win32console to use --color on Windows"
|
16
|
+
end
|
17
|
+
end
|
12
18
|
|
13
19
|
# This method is invoked before any specs are run, right after
|
14
20
|
# they have all been collected. This can be useful for special
|
@@ -55,22 +61,29 @@ module Spec
|
|
55
61
|
# of the associated spec. +failure+ is a Failure object, which contains detailed
|
56
62
|
# information about the failure.
|
57
63
|
def dump_failure(counter, failure)
|
58
|
-
@output
|
59
|
-
@output
|
60
|
-
@output
|
61
|
-
@output
|
62
|
-
@output
|
64
|
+
@output.puts
|
65
|
+
@output.puts "#{counter.to_s})"
|
66
|
+
@output.puts failure.header
|
67
|
+
@output.puts failure.message
|
68
|
+
@output.puts failure.backtrace
|
63
69
|
@output.flush
|
64
70
|
end
|
65
71
|
|
66
72
|
# This method is invoked at the very end.
|
67
73
|
def dump_summary(duration, spec_count, failure_count)
|
68
74
|
return if @dry_run
|
69
|
-
@output
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
75
|
+
if @colour && @output == STDOUT
|
76
|
+
colour_prefix = (failure_count == 0 ? "\e[32m" : "\e[31m")
|
77
|
+
colour_postfix = "\e[0m"
|
78
|
+
summary_output = Kernel
|
79
|
+
else
|
80
|
+
colour_prefix = colour_postfix = ""
|
81
|
+
summary_output = @output
|
82
|
+
end
|
83
|
+
@output.puts
|
84
|
+
@output.puts "Finished in #{duration} seconds"
|
85
|
+
@output.puts
|
86
|
+
summary_output.puts "#{colour_prefix}#{spec_count} specification#{'s' unless spec_count == 1}, #{failure_count} failure#{'s' unless failure_count == 1}#{colour_postfix}"
|
74
87
|
@output.flush
|
75
88
|
end
|
76
89
|
end
|
@@ -8,7 +8,7 @@ module Spec
|
|
8
8
|
def self.create_context_runner(args, standalone, err, out=STDOUT)
|
9
9
|
options = parse(args, standalone, err, out)
|
10
10
|
|
11
|
-
formatter = options.formatter_type.new(options.out, options.dry_run)
|
11
|
+
formatter = options.formatter_type.new(options.out, options.dry_run, options.colour)
|
12
12
|
reporter = Reporter.new(formatter, options.backtrace_tweaker)
|
13
13
|
ContextRunner.new(reporter, standalone, options.dry_run, options.spec_name)
|
14
14
|
end
|
@@ -25,7 +25,11 @@ module Spec
|
|
25
25
|
opts.separator ""
|
26
26
|
|
27
27
|
opts.on("--diff", "Show unified diff of Strings that are expected to be equal when they are not") do
|
28
|
-
require 'spec/
|
28
|
+
require 'spec/expectations/diff'
|
29
|
+
end
|
30
|
+
|
31
|
+
opts.on("-c", "--colour", "--color", "Show coloured (red/green) output") do
|
32
|
+
options.colour = true
|
29
33
|
end
|
30
34
|
|
31
35
|
opts.on("-s", "--spec SPECIFICATION_NAME", "Execute a single specification") do |spec_name|
|