dchelimsky-rspec 1.1.11 → 1.1.11.1
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/.autotest +4 -0
- data/History.txt +19 -3
- data/Manifest.txt +6 -1
- data/examples/failing/README.txt +7 -0
- data/examples/failing/diffing_spec.rb +36 -0
- data/examples/failing/failing_autogenerated_docstrings_example.rb +19 -0
- data/examples/failing/failure_in_setup.rb +10 -0
- data/examples/failing/failure_in_teardown.rb +10 -0
- data/examples/failing/mocking_example.rb +40 -0
- data/examples/failing/mocking_with_flexmock.rb +26 -0
- data/examples/failing/mocking_with_mocha.rb +25 -0
- data/examples/failing/mocking_with_rr.rb +27 -0
- data/examples/failing/partial_mock_example.rb +20 -0
- data/examples/failing/predicate_example.rb +34 -0
- data/examples/failing/raising_example.rb +47 -0
- data/examples/failing/spec_helper.rb +3 -0
- data/examples/failing/syntax_error_example.rb +7 -0
- data/examples/failing/team_spec.rb +44 -0
- data/examples/failing/timeout_behaviour.rb +7 -0
- data/examples/passing/custom_formatter.rb +1 -1
- data/examples/passing/simple_matcher_example.rb +31 -0
- data/lib/autotest/rspec.rb +1 -1
- data/lib/spec/dsl/main.rb +82 -0
- data/lib/spec/dsl.rb +1 -0
- data/lib/spec/example/before_and_after_hooks.rb +2 -1
- data/lib/spec/example/configuration.rb +1 -1
- data/lib/spec/example/example_group.rb +1 -0
- data/lib/spec/example/example_group_factory.rb +2 -1
- data/lib/spec/example/example_group_methods.rb +40 -25
- data/lib/spec/example/example_methods.rb +19 -8
- data/lib/spec/example.rb +15 -17
- data/lib/spec/expectations/handler.rb +23 -28
- data/lib/spec/expectations/wrap_expectation.rb +56 -0
- data/lib/spec/expectations.rb +22 -18
- data/lib/spec/extensions.rb +0 -1
- data/lib/spec/interop/test/unit/testcase.rb +19 -17
- data/lib/spec/matchers/be_close.rb +6 -22
- data/lib/spec/matchers/eql.rb +7 -25
- data/lib/spec/matchers/equal.rb +6 -24
- data/lib/spec/matchers/errors.rb +5 -0
- data/lib/spec/matchers/exist.rb +8 -14
- data/lib/spec/matchers/generated_descriptions.rb +48 -0
- data/lib/spec/matchers/has.rb +12 -28
- data/lib/spec/matchers/include.rb +12 -9
- data/lib/spec/matchers/match.rb +8 -27
- data/lib/spec/matchers/method_missing.rb +9 -0
- data/lib/spec/matchers/operator_matcher.rb +23 -46
- data/lib/spec/matchers/raise_error.rb +4 -8
- data/lib/spec/matchers/respond_to.rb +2 -1
- data/lib/spec/matchers/throw_symbol.rb +9 -3
- data/lib/spec/mocks/message_expectation.rb +0 -5
- data/lib/spec/mocks/proxy.rb +12 -10
- data/lib/spec/rake/spectask.rb +4 -6
- data/lib/spec/runner/class_and_arguments_parser.rb +7 -9
- data/lib/spec/runner/command_line.rb +6 -8
- data/lib/spec/runner/formatter/base_text_formatter.rb +3 -2
- data/lib/spec/runner/option_parser.rb +4 -6
- data/lib/spec/runner/spec_parser.rb +5 -5
- data/lib/spec/runner.rb +37 -39
- data/lib/spec/story/runner/story_runner.rb +10 -6
- data/lib/spec/story/runner.rb +40 -42
- data/lib/spec/story/world.rb +66 -70
- data/lib/spec/version.rb +3 -1
- data/lib/spec.rb +21 -19
- data/rspec.gemspec +15 -6
- data/spec/autotest/autotest_helper.rb +2 -2
- data/spec/autotest/discover_spec.rb +4 -15
- data/spec/autotest/failed_results_re_spec.rb +24 -0
- data/spec/autotest/rspec_spec.rb +0 -37
- data/spec/spec/dsl/main_spec.rb +65 -0
- data/spec/spec/example/example_group_class_definition_spec.rb +6 -2
- data/spec/spec/example/example_group_factory_spec.rb +2 -1
- data/spec/spec/example/example_group_methods_spec.rb +138 -141
- data/spec/spec/example/example_group_spec.rb +3 -5
- data/spec/spec/example/example_methods_spec.rb +60 -23
- data/spec/spec/expectations/wrap_expectation_spec.rb +30 -0
- data/spec/spec/interop/test/unit/spec_spec.rb +1 -5
- data/spec/spec/interop/test/unit/test_unit_spec_helper.rb +4 -0
- data/spec/spec/matchers/be_close_spec.rb +12 -10
- data/spec/spec/matchers/description_generation_spec.rb +1 -1
- data/spec/spec/matchers/eql_spec.rb +7 -6
- data/spec/spec/matchers/equal_spec.rb +7 -6
- data/spec/spec/matchers/has_spec.rb +1 -1
- data/spec/spec/matchers/have_spec.rb +23 -18
- data/spec/spec/matchers/include_spec.rb +24 -0
- data/spec/spec/matchers/matcher_methods_spec.rb +1 -13
- data/spec/spec/matchers/throw_symbol_spec.rb +3 -3
- data/spec/spec/mocks/bug_report_11545_spec.rb +4 -5
- data/spec/spec/mocks/bug_report_496.rb +11 -9
- data/spec/spec/mocks/bug_report_600_spec.rb +22 -0
- data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +1 -1
- data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +4 -14
- data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +1 -1
- data/spec/spec/runner/options_spec.rb +1 -1
- data/spec/spec/runner/spec_parser_spec.rb +76 -80
- data/spec/spec_helper.rb +4 -0
- data/stories/example_groups/autogenerated_docstrings +4 -4
- data/stories/interop/test_but_not_test_unit +14 -0
- data/stories/resources/helpers/story_helper.rb +1 -1
- data/stories/resources/test/spec_including_test_but_not_unit.rb +11 -0
- data/story_server/prototype/javascripts/prototype.js +1 -1
- metadata +34 -53
- data/lib/spec/extensions/metaclass.rb +0 -7
@@ -0,0 +1,48 @@
|
|
1
|
+
module Spec
|
2
|
+
module Matchers
|
3
|
+
def self.last_matcher
|
4
|
+
@last_matcher
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.last_matcher=(last_matcher)
|
8
|
+
@last_matcher = last_matcher
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.last_should
|
12
|
+
@last_should
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.last_should=(last_should)
|
16
|
+
@last_should = last_should
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.clear_generated_description
|
20
|
+
self.last_matcher = nil
|
21
|
+
self.last_should = nil
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.generated_description
|
25
|
+
return nil if last_should.nil?
|
26
|
+
"#{last_should} #{last_description}"
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def self.last_description
|
32
|
+
last_matcher.respond_to?(:description) ? last_matcher.description : <<-MESSAGE
|
33
|
+
When you call a matcher in an example without a String, like this:
|
34
|
+
|
35
|
+
specify { object.should matcher }
|
36
|
+
|
37
|
+
or this:
|
38
|
+
|
39
|
+
it { should matcher }
|
40
|
+
|
41
|
+
the runner expects the matcher to have a #describe method. You should either
|
42
|
+
add a String to the example this matcher is being used in, or give it a
|
43
|
+
description method. Then you won't have to suffer this lengthy warning again.
|
44
|
+
MESSAGE
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
data/lib/spec/matchers/has.rb
CHANGED
@@ -1,34 +1,18 @@
|
|
1
1
|
module Spec
|
2
2
|
module Matchers
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
def matches?(given)
|
11
|
-
given.__send__(predicate, *@args)
|
12
|
-
end
|
13
|
-
|
14
|
-
def failure_message
|
15
|
-
"expected ##{predicate}(#{@args[0].inspect}) to return true, got false"
|
16
|
-
end
|
17
|
-
|
18
|
-
def negative_failure_message
|
19
|
-
"expected ##{predicate}(#{@args[0].inspect}) to return false, got true"
|
3
|
+
def has(sym, *args) # :nodoc:
|
4
|
+
simple_matcher do |actual, matcher|
|
5
|
+
matcher.failure_message = "expected ##{predicate(sym)}(#{args[0].inspect}) to return true, got false"
|
6
|
+
matcher.negative_failure_message = "expected ##{predicate(sym)}(#{args[0].inspect}) to return false, got true"
|
7
|
+
matcher.description = "have key #{args[0].inspect}"
|
8
|
+
actual.__send__(predicate(sym), *args)
|
20
9
|
end
|
21
|
-
|
22
|
-
def description
|
23
|
-
"have key #{@args[0].inspect}"
|
24
|
-
end
|
25
|
-
|
26
|
-
private
|
27
|
-
def predicate
|
28
|
-
"#{@sym.to_s.sub("have_","has_")}?".to_sym
|
29
|
-
end
|
30
|
-
|
31
10
|
end
|
32
|
-
|
11
|
+
|
12
|
+
private
|
13
|
+
def predicate(sym)
|
14
|
+
"#{sym.to_s.sub("have_","has_")}?".to_sym
|
15
|
+
end
|
16
|
+
|
33
17
|
end
|
34
18
|
end
|
@@ -7,16 +7,19 @@ module Spec
|
|
7
7
|
@expecteds = expecteds
|
8
8
|
end
|
9
9
|
|
10
|
-
def matches?(
|
11
|
-
@
|
10
|
+
def matches?(actual)
|
11
|
+
@actual = actual
|
12
12
|
@expecteds.each do |expected|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
if actual.is_a?(Hash)
|
14
|
+
if expected.is_a?(Hash)
|
15
|
+
expected.each_pair do |k,v|
|
16
|
+
return false unless actual[k] == v
|
17
|
+
end
|
18
|
+
else
|
19
|
+
return false unless actual.has_key?(expected)
|
17
20
|
end
|
18
21
|
else
|
19
|
-
return false unless
|
22
|
+
return false unless actual.include?(expected)
|
20
23
|
end
|
21
24
|
end
|
22
25
|
true
|
@@ -36,7 +39,7 @@ module Spec
|
|
36
39
|
|
37
40
|
private
|
38
41
|
def _message(maybe_not="")
|
39
|
-
"expected #{@
|
42
|
+
"expected #{@actual.inspect} #{maybe_not}to include #{_pretty_print(@expecteds)}"
|
40
43
|
end
|
41
44
|
|
42
45
|
def _pretty_print(array)
|
@@ -58,7 +61,7 @@ module Spec
|
|
58
61
|
# should include(expected)
|
59
62
|
# should_not include(expected)
|
60
63
|
#
|
61
|
-
# Passes if
|
64
|
+
# Passes if actual includes expected. This works for
|
62
65
|
# collections and Strings. You can also pass in multiple args
|
63
66
|
# and it will only pass if all args are found in collection.
|
64
67
|
#
|
data/lib/spec/matchers/match.rb
CHANGED
@@ -1,41 +1,22 @@
|
|
1
1
|
module Spec
|
2
2
|
module Matchers
|
3
3
|
|
4
|
-
class Match #:nodoc:
|
5
|
-
def initialize(regexp)
|
6
|
-
@regexp = regexp
|
7
|
-
end
|
8
|
-
|
9
|
-
def matches?(given)
|
10
|
-
@given = given
|
11
|
-
return true if given =~ @regexp
|
12
|
-
return false
|
13
|
-
end
|
14
|
-
|
15
|
-
def failure_message
|
16
|
-
return "expected #{@given.inspect} to match #{@regexp.inspect}", @regexp, @given
|
17
|
-
end
|
18
|
-
|
19
|
-
def negative_failure_message
|
20
|
-
return "expected #{@given.inspect} not to match #{@regexp.inspect}", @regexp, @given
|
21
|
-
end
|
22
|
-
|
23
|
-
def description
|
24
|
-
"match #{@regexp.inspect}"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
4
|
# :call-seq:
|
29
5
|
# should match(regexp)
|
30
6
|
# should_not match(regexp)
|
31
7
|
#
|
32
|
-
# Given a Regexp, passes if
|
8
|
+
# Given a Regexp, passes if actual =~ regexp
|
33
9
|
#
|
34
10
|
# == Examples
|
35
11
|
#
|
36
|
-
# email.should match(/^([
|
12
|
+
# email.should match(/^([^\s]+)((?:[-a-z0-9]+\.)+[a-z]{2,})$/i)
|
37
13
|
def match(regexp)
|
38
|
-
|
14
|
+
simple_matcher do |actual, matcher|
|
15
|
+
matcher.failure_message = "expected #{actual.inspect} to match #{regexp.inspect}", regexp, actual
|
16
|
+
matcher.negative_failure_message = "expected #{actual.inspect} not to match #{regexp.inspect}", regexp, actual
|
17
|
+
matcher.description = "match #{regexp.inspect}"
|
18
|
+
actual =~ regexp
|
19
|
+
end
|
39
20
|
end
|
40
21
|
end
|
41
22
|
end
|
@@ -1,40 +1,20 @@
|
|
1
1
|
module Spec
|
2
2
|
module Matchers
|
3
|
-
class
|
4
|
-
def initialize(
|
5
|
-
@
|
3
|
+
class OperatorMatcher
|
4
|
+
def initialize(actual)
|
5
|
+
@actual = actual
|
6
6
|
end
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
15
|
-
|
16
|
-
def =~(expected)
|
17
|
-
__delegate_method_missing_to_given("=~", expected)
|
18
|
-
end
|
19
|
-
|
20
|
-
def >(expected)
|
21
|
-
__delegate_method_missing_to_given(">", expected)
|
22
|
-
end
|
23
|
-
|
24
|
-
def >=(expected)
|
25
|
-
__delegate_method_missing_to_given(">=", expected)
|
26
|
-
end
|
27
|
-
|
28
|
-
def <(expected)
|
29
|
-
__delegate_method_missing_to_given("<", expected)
|
30
|
-
end
|
31
|
-
|
32
|
-
def <=(expected)
|
33
|
-
__delegate_method_missing_to_given("<=", expected)
|
7
|
+
|
8
|
+
['==','===','<','<=','>=','>','=~'].each do |operator|
|
9
|
+
define_method operator do |expected|
|
10
|
+
::Spec::Matchers.last_matcher = self
|
11
|
+
@operator, @expected = operator, expected
|
12
|
+
__delegate_operator(@actual, operator, expected)
|
13
|
+
end
|
34
14
|
end
|
35
15
|
|
36
16
|
def fail_with_message(message)
|
37
|
-
Spec::Expectations.fail_with(message, @expected, @
|
17
|
+
Spec::Expectations.fail_with(message, @expected, @actual)
|
38
18
|
end
|
39
19
|
|
40
20
|
def description
|
@@ -43,27 +23,24 @@ module Spec
|
|
43
23
|
|
44
24
|
end
|
45
25
|
|
46
|
-
class PositiveOperatorMatcher <
|
26
|
+
class PositiveOperatorMatcher < OperatorMatcher #:nodoc:
|
47
27
|
|
48
|
-
def
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
28
|
+
def __delegate_operator(actual, operator, expected)
|
29
|
+
return true if actual.__send__(operator, expected)
|
30
|
+
if ['==','===', '=~'].include?(operator)
|
31
|
+
fail_with_message("expected: #{expected.inspect},\n got: #{actual.inspect} (using #{operator})")
|
32
|
+
else
|
33
|
+
fail_with_message("expected: #{operator} #{expected.inspect},\n got: #{operator.gsub(/./, ' ')} #{actual.inspect}")
|
34
|
+
end
|
55
35
|
end
|
56
36
|
|
57
37
|
end
|
58
38
|
|
59
|
-
class NegativeOperatorMatcher <
|
39
|
+
class NegativeOperatorMatcher < OperatorMatcher #:nodoc:
|
60
40
|
|
61
|
-
def
|
62
|
-
|
63
|
-
|
64
|
-
::Spec::Matchers.last_matcher = self
|
65
|
-
return true unless @given.__send__(operator, expected)
|
66
|
-
return fail_with_message("expected not: #{operator} #{expected.inspect},\n got: #{operator.gsub(/./, ' ')} #{@given.inspect}")
|
41
|
+
def __delegate_operator(actual, operator, expected)
|
42
|
+
return true unless actual.__send__(operator, expected)
|
43
|
+
return fail_with_message("expected not: #{operator} #{expected.inspect},\n got: #{operator.gsub(/./, ' ')} #{actual.inspect}")
|
67
44
|
end
|
68
45
|
|
69
46
|
end
|
@@ -47,20 +47,16 @@ module Spec
|
|
47
47
|
def verify_message
|
48
48
|
case @expected_message
|
49
49
|
when nil
|
50
|
-
|
50
|
+
true
|
51
51
|
when Regexp
|
52
|
-
|
52
|
+
@expected_message =~ @given_error.message
|
53
53
|
else
|
54
|
-
|
54
|
+
@expected_message == @given_error.message
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
58
|
def failure_message
|
59
|
-
|
60
|
-
return @given_error.message
|
61
|
-
else
|
62
|
-
return "expected #{expected_error}#{given_error}"
|
63
|
-
end
|
59
|
+
@eval_block ? @given_error.message : "expected #{expected_error}#{given_error}"
|
64
60
|
end
|
65
61
|
|
66
62
|
def negative_failure_message
|
@@ -21,9 +21,13 @@ module Spec
|
|
21
21
|
end
|
22
22
|
@caught_symbol = @expected_symbol unless @caught_arg == :nothing_thrown
|
23
23
|
end
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
|
25
|
+
# Ruby 1.8 uses NameError with `symbol'
|
26
|
+
# Ruby 1.9 uses ArgumentError with :symbol
|
27
|
+
rescue NameError, ArgumentError => e
|
28
|
+
raise e unless e.message =~ /uncaught throw (`|\:)([a-zA-Z0-9_]*)(')?/
|
29
|
+
@caught_symbol = $2.to_sym
|
30
|
+
|
27
31
|
ensure
|
28
32
|
if @expected_symbol.nil?
|
29
33
|
return !@caught_symbol.nil?
|
@@ -31,6 +35,8 @@ module Spec
|
|
31
35
|
if @expected_arg.nil?
|
32
36
|
return @caught_symbol == @expected_symbol
|
33
37
|
else
|
38
|
+
# puts [@caught_symbol, @expected_symbol].inspect
|
39
|
+
# puts [@caught_arg, @expected_arg].inspect
|
34
40
|
return @caught_symbol == @expected_symbol && @caught_arg == @expected_arg
|
35
41
|
end
|
36
42
|
end
|
data/lib/spec/mocks/proxy.rb
CHANGED
@@ -98,7 +98,7 @@ module Spec
|
|
98
98
|
expectation.advise(args, block) if null_object? unless expectation.expected_messages_received?
|
99
99
|
raise_unexpected_message_args_error(expectation, *args) unless (has_negative_expectation?(sym) or null_object?)
|
100
100
|
else
|
101
|
-
@target.
|
101
|
+
@target.__send__ :method_missing, sym, *args, &block
|
102
102
|
end
|
103
103
|
end
|
104
104
|
|
@@ -125,14 +125,16 @@ module Spec
|
|
125
125
|
|
126
126
|
def define_expected_method(sym)
|
127
127
|
visibility_string = "#{visibility(sym)} :#{sym}"
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
128
|
+
unless @proxied_methods.include?(sym)
|
129
|
+
if target_responds_to?(sym)
|
130
|
+
munged_sym = munge(sym)
|
131
|
+
target_metaclass.instance_eval do
|
132
|
+
alias_method munged_sym, sym if method_defined?(sym.to_s)
|
133
|
+
end
|
134
|
+
@proxied_methods << sym
|
132
135
|
end
|
133
|
-
@proxied_methods << sym
|
134
136
|
end
|
135
|
-
|
137
|
+
|
136
138
|
target_metaclass.class_eval(<<-EOF, __FILE__, __LINE__)
|
137
139
|
def #{sym}(*args, &block)
|
138
140
|
__mock_proxy.message_received :#{sym}, *args, &block
|
@@ -142,9 +144,9 @@ module Spec
|
|
142
144
|
end
|
143
145
|
|
144
146
|
def target_responds_to?(sym)
|
145
|
-
return @target.
|
147
|
+
return @target.__send__(munge(:respond_to?),sym) if @already_proxied_respond_to
|
146
148
|
return @already_proxied_respond_to = true if sym == :respond_to?
|
147
|
-
return @target.respond_to?(sym)
|
149
|
+
return @target.respond_to?(sym, true)
|
148
150
|
end
|
149
151
|
|
150
152
|
def visibility(sym)
|
@@ -193,7 +195,7 @@ module Spec
|
|
193
195
|
alias_method sym, munged_sym
|
194
196
|
undef_method munged_sym
|
195
197
|
else
|
196
|
-
|
198
|
+
remove_method sym
|
197
199
|
end
|
198
200
|
end
|
199
201
|
end
|
data/lib/spec/rake/spectask.rb
CHANGED
@@ -56,12 +56,10 @@ module Spec
|
|
56
56
|
# end
|
57
57
|
#
|
58
58
|
class SpecTask < ::Rake::TaskLib
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
module_eval "def #{name}() evaluate(@#{name}) end" # Allows use of procs
|
64
|
-
end
|
59
|
+
def self.attr_accessor(*names)
|
60
|
+
super(*names)
|
61
|
+
names.each do |name|
|
62
|
+
module_eval "def #{name}() evaluate(@#{name}) end" # Allows use of procs
|
65
63
|
end
|
66
64
|
end
|
67
65
|
|
@@ -1,16 +1,14 @@
|
|
1
1
|
module Spec
|
2
2
|
module Runner
|
3
3
|
class ClassAndArgumentsParser
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
raise "Couldn't parse #{s.inspect}"
|
11
|
-
end
|
4
|
+
def self.parse(s)
|
5
|
+
if s =~ /([a-zA-Z_]+(?:::[a-zA-Z_]+)*):?(.*)/
|
6
|
+
arg = $2 == "" ? nil : $2
|
7
|
+
[$1, arg]
|
8
|
+
else
|
9
|
+
raise "Couldn't parse #{s.inspect}"
|
12
10
|
end
|
13
11
|
end
|
14
12
|
end
|
15
13
|
end
|
16
|
-
end
|
14
|
+
end
|
@@ -3,14 +3,12 @@ require 'spec/runner/option_parser'
|
|
3
3
|
module Spec
|
4
4
|
module Runner
|
5
5
|
class CommandLine
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
Spec::Runner.use orig_options
|
13
|
-
end
|
6
|
+
def self.run(tmp_options=Spec::Runner.options)
|
7
|
+
orig_options = Spec::Runner.options
|
8
|
+
Spec::Runner.use tmp_options
|
9
|
+
tmp_options.run_examples
|
10
|
+
ensure
|
11
|
+
Spec::Runner.use orig_options
|
14
12
|
end
|
15
13
|
end
|
16
14
|
end
|
@@ -14,6 +14,7 @@ module Spec
|
|
14
14
|
def initialize(options, where)
|
15
15
|
super
|
16
16
|
if where.is_a?(String)
|
17
|
+
FileUtils.mkdir_p(File.dirname(where))
|
17
18
|
@output = File.open(where, 'w')
|
18
19
|
else
|
19
20
|
@output = where
|
@@ -69,8 +70,8 @@ module Spec
|
|
69
70
|
@output.puts
|
70
71
|
@output.puts "Pending:"
|
71
72
|
@pending_examples.each do |pending_example|
|
72
|
-
@output.puts "#{pending_example[0]} (#{pending_example[1]})"
|
73
|
-
@output.puts "
|
73
|
+
@output.puts "\n#{pending_example[0]} (#{pending_example[1]})"
|
74
|
+
@output.puts "#{pending_example[2]}\n"
|
74
75
|
end
|
75
76
|
end
|
76
77
|
@output.flush
|
@@ -4,12 +4,10 @@ require 'stringio'
|
|
4
4
|
module Spec
|
5
5
|
module Runner
|
6
6
|
class OptionParser < ::OptionParser
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
parser.options
|
12
|
-
end
|
7
|
+
def self.parse(args, err, out)
|
8
|
+
parser = new(err, out)
|
9
|
+
parser.parse(args)
|
10
|
+
parser.options
|
13
11
|
end
|
14
12
|
|
15
13
|
attr_reader :options
|
@@ -12,7 +12,7 @@ module Spec
|
|
12
12
|
best_match.clear
|
13
13
|
file = File.expand_path(file)
|
14
14
|
Spec::Runner.options.example_groups.each do |example_group|
|
15
|
-
|
15
|
+
consider_example_group_for_best_match example_group, file, line_number
|
16
16
|
|
17
17
|
example_group.examples.each do |example|
|
18
18
|
consider_example_for_best_match example, example_group, file, line_number
|
@@ -31,8 +31,8 @@ module Spec
|
|
31
31
|
|
32
32
|
protected
|
33
33
|
|
34
|
-
def
|
35
|
-
parsed_backtrace = parse_backtrace(example_group.
|
34
|
+
def consider_example_group_for_best_match(example_group, file, line_number)
|
35
|
+
parsed_backtrace = parse_backtrace(example_group.backtrace)
|
36
36
|
parsed_backtrace.each do |example_file, example_line|
|
37
37
|
if is_best_match?(file, line_number, example_file, example_line)
|
38
38
|
best_match.clear
|
@@ -43,7 +43,7 @@ module Spec
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def consider_example_for_best_match(example, example_group, file, line_number)
|
46
|
-
parsed_backtrace = parse_backtrace(example.
|
46
|
+
parsed_backtrace = parse_backtrace(example.backtrace)
|
47
47
|
parsed_backtrace.each do |example_file, example_line|
|
48
48
|
if is_best_match?(file, line_number, example_file, example_line)
|
49
49
|
best_match.clear
|
@@ -61,7 +61,7 @@ module Spec
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def parse_backtrace(backtrace)
|
64
|
-
backtrace.collect do |trace_line|
|
64
|
+
Array(backtrace).collect do |trace_line|
|
65
65
|
split_line = trace_line.split(':')
|
66
66
|
[split_line[0], Integer(split_line[1])]
|
67
67
|
end
|
data/lib/spec/runner.rb
CHANGED
@@ -164,50 +164,48 @@ module Spec
|
|
164
164
|
# end
|
165
165
|
# end
|
166
166
|
module Runner
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
exit success if Spec.exit?
|
193
|
-
end
|
167
|
+
def self.configuration # :nodoc:
|
168
|
+
@configuration ||= Spec::Example::Configuration.new
|
169
|
+
end
|
170
|
+
|
171
|
+
# Use this to configure various configurable aspects of
|
172
|
+
# RSpec:
|
173
|
+
#
|
174
|
+
# Spec::Runner.configure do |configuration|
|
175
|
+
# # Configure RSpec here
|
176
|
+
# end
|
177
|
+
#
|
178
|
+
# The yielded <tt>configuration</tt> object is a
|
179
|
+
# Spec::Example::Configuration instance. See its RDoc
|
180
|
+
# for details about what you can do with it.
|
181
|
+
#
|
182
|
+
def self.configure
|
183
|
+
yield configuration
|
184
|
+
end
|
185
|
+
|
186
|
+
def self.register_at_exit_hook # :nodoc:
|
187
|
+
unless @already_registered_at_exit_hook
|
188
|
+
at_exit do
|
189
|
+
unless $! || Spec.run? || Spec::Example::ExampleGroupFactory.registered_or_ancestor_of_registered?(options.example_groups)
|
190
|
+
success = Spec.run
|
191
|
+
exit success if Spec.exit?
|
194
192
|
end
|
195
|
-
@already_registered_at_exit_hook = true
|
196
193
|
end
|
194
|
+
@already_registered_at_exit_hook = true
|
197
195
|
end
|
196
|
+
end
|
198
197
|
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
end
|
205
|
-
end
|
206
|
-
|
207
|
-
def use options
|
208
|
-
@options = options
|
198
|
+
def self.options # :nodoc:
|
199
|
+
@options ||= begin
|
200
|
+
parser = ::Spec::Runner::OptionParser.new($stderr, $stdout)
|
201
|
+
parser.order!(ARGV)
|
202
|
+
parser.options
|
209
203
|
end
|
210
|
-
|
211
204
|
end
|
205
|
+
|
206
|
+
def self.use options
|
207
|
+
@options = options
|
208
|
+
end
|
209
|
+
|
212
210
|
end
|
213
211
|
end
|