rspec 1.0.5 → 1.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +78 -1
- data/EXAMPLES.rd +8 -5
- data/README +1 -0
- data/Rakefile +1 -1
- data/examples/pending_example.rb +20 -0
- data/lib/autotest/rspec.rb +46 -18
- data/lib/spec/dsl.rb +1 -0
- data/lib/spec/dsl/behaviour.rb +37 -27
- data/lib/spec/dsl/behaviour_callbacks.rb +4 -0
- data/lib/spec/dsl/behaviour_eval.rb +27 -16
- data/lib/spec/dsl/behaviour_factory.rb +2 -2
- data/lib/spec/dsl/composite_proc_builder.rb +9 -4
- data/lib/spec/dsl/configuration.rb +20 -4
- data/lib/spec/dsl/description.rb +7 -0
- data/lib/spec/dsl/errors.rb +9 -0
- data/lib/spec/dsl/example.rb +18 -10
- data/lib/spec/matchers/have.rb +10 -13
- data/lib/spec/matchers/operator_matcher.rb +3 -3
- data/lib/spec/matchers/raise_error.rb +8 -3
- data/lib/spec/mocks/error_generator.rb +1 -1
- data/lib/spec/mocks/message_expectation.rb +11 -0
- data/lib/spec/mocks/methods.rb +9 -5
- data/lib/spec/mocks/proxy.rb +13 -9
- data/lib/spec/rake/spectask.rb +80 -38
- data/lib/spec/runner/backtrace_tweaker.rb +2 -1
- data/lib/spec/runner/behaviour_runner.rb +37 -16
- data/lib/spec/runner/formatter/base_formatter.rb +23 -15
- data/lib/spec/runner/formatter/base_text_formatter.rb +39 -11
- data/lib/spec/runner/formatter/failing_behaviours_formatter.rb +7 -3
- data/lib/spec/runner/formatter/failing_examples_formatter.rb +3 -3
- data/lib/spec/runner/formatter/html_formatter.rb +32 -25
- data/lib/spec/runner/formatter/progress_bar_formatter.rb +6 -5
- data/lib/spec/runner/formatter/rdoc_formatter.rb +6 -6
- data/lib/spec/runner/formatter/specdoc_formatter.rb +7 -6
- data/lib/spec/runner/option_parser.rb +6 -5
- data/lib/spec/runner/options.rb +60 -43
- data/lib/spec/runner/reporter.rb +17 -6
- data/lib/spec/runner/spec_parser.rb +1 -1
- data/lib/spec/translator.rb +8 -0
- data/lib/spec/version.rb +3 -3
- data/plugins/mock_frameworks/flexmock.rb +14 -18
- data/plugins/mock_frameworks/mocha.rb +0 -2
- data/plugins/mock_frameworks/rr.rb +21 -0
- data/spec/autotest/discover_spec.rb +19 -0
- data/spec/autotest/rspec_spec.rb +257 -0
- data/spec/autotest_helper.rb +4 -0
- data/spec/spec/dsl/behaviour_eval_spec.rb +30 -0
- data/spec/spec/dsl/behaviour_factory_spec.rb +18 -0
- data/spec/spec/dsl/behaviour_spec.rb +95 -58
- data/spec/spec/dsl/composite_proc_builder_spec.rb +0 -13
- data/spec/spec/dsl/configuration_spec.rb +6 -1
- data/spec/spec/dsl/description_spec.rb +9 -1
- data/spec/spec/dsl/example_class_spec.rb +3 -3
- data/spec/spec/dsl/example_instance_spec.rb +26 -28
- data/spec/spec/dsl/example_matcher_spec.rb +91 -0
- data/spec/spec/dsl/shared_behaviour_spec.rb +24 -0
- data/spec/spec/expectations/extensions/object_spec.rb +2 -2
- data/spec/spec/expectations/fail_with_spec.rb +2 -2
- data/spec/spec/matchers/have_spec.rb +1 -1
- data/spec/spec/matchers/operator_matcher_spec.rb +10 -10
- data/spec/spec/matchers/raise_error_spec.rb +38 -0
- data/spec/spec/mocks/argument_expectation_spec.rb +18 -14
- data/spec/spec/mocks/at_most_spec.rb +1 -1
- data/spec/spec/mocks/bug_report_11545_spec.rb +31 -0
- data/spec/spec/mocks/partial_mock_spec.rb +33 -1
- data/spec/spec/runner/behaviour_runner_spec.rb +72 -49
- data/spec/spec/runner/command_line_spec.rb +1 -1
- data/spec/spec/runner/context_matching_spec.rb +10 -10
- data/spec/spec/runner/drb_command_line_spec.rb +62 -59
- data/spec/spec/runner/extensions/bug_report_10577_spec.rb +35 -0
- data/spec/spec/runner/formatter/failing_behaviours_formatter_spec.rb +15 -2
- data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +3 -3
- data/spec/spec/runner/formatter/html_formatter_spec.rb +1 -1
- data/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb +14 -15
- data/spec/spec/runner/formatter/progress_bar_formatter_failure_dump_spec.rb +1 -1
- data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +42 -9
- data/spec/spec/runner/formatter/rdoc_formatter_spec.rb +40 -40
- data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +55 -49
- data/spec/spec/runner/option_parser_spec.rb +16 -15
- data/spec/spec/runner/options_spec.rb +64 -31
- data/spec/spec/runner/reporter_spec.rb +67 -15
- data/spec/spec/spec_classes.rb +9 -1
- data/spec/spec/translator_spec.rb +48 -0
- data/spec/spec_helper.rb +5 -2
- metadata +13 -6
- data/examples/not_yet_implemented_spec.rb +0 -12
- data/spec/spec/runner/example_matcher_spec.rb +0 -127
@@ -28,8 +28,8 @@ module Spec
|
|
28
28
|
behaviour_type = :default
|
29
29
|
elsif opts[:behaviour_type]
|
30
30
|
behaviour_type = opts[:behaviour_type]
|
31
|
-
elsif opts[:spec_path] =~ /spec
|
32
|
-
behaviour_type = $
|
31
|
+
elsif opts[:spec_path] =~ /spec(\\|\/)(#{BEHAVIOUR_CLASSES.keys.join('|')})/
|
32
|
+
behaviour_type = $2.to_sym
|
33
33
|
else
|
34
34
|
behaviour_type = :default
|
35
35
|
end
|
@@ -7,8 +7,9 @@ module Spec
|
|
7
7
|
|
8
8
|
def proc(&error_handler)
|
9
9
|
parts = self
|
10
|
+
errors = []
|
10
11
|
Proc.new do
|
11
|
-
parts.collect do |part|
|
12
|
+
result = parts.collect do |part|
|
12
13
|
begin
|
13
14
|
if part.is_a?(UnboundMethod)
|
14
15
|
part.bind(self).call
|
@@ -16,11 +17,15 @@ module Spec
|
|
16
17
|
instance_eval(&part)
|
17
18
|
end
|
18
19
|
rescue Exception => e
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
if error_handler
|
21
|
+
error_handler.call(e)
|
22
|
+
else
|
23
|
+
errors << e
|
24
|
+
end
|
22
25
|
end
|
23
26
|
end
|
27
|
+
raise errors.first unless errors.empty?
|
28
|
+
result
|
24
29
|
end
|
25
30
|
end
|
26
31
|
end
|
@@ -5,7 +5,7 @@ module Spec
|
|
5
5
|
# Chooses what mock framework to use. Example:
|
6
6
|
#
|
7
7
|
# Spec::Runner.configure do |config|
|
8
|
-
# config.mock_with :rspec
|
8
|
+
# config.mock_with :rspec, :mocha, :flexmock, or :rr
|
9
9
|
# end
|
10
10
|
#
|
11
11
|
# To use any other mock framework, you'll have to provide
|
@@ -56,11 +56,27 @@ module Spec
|
|
56
56
|
# end
|
57
57
|
#
|
58
58
|
def include(*args)
|
59
|
-
|
59
|
+
args << {} unless Hash === args.last
|
60
|
+
modules, options = args_and_options(*args)
|
61
|
+
required_behaviour_type = options[:behaviour_type]
|
62
|
+
required_behaviour_type = required_behaviour_type.to_sym unless required_behaviour_type.nil?
|
63
|
+
@modules ||= {}
|
64
|
+
@modules[required_behaviour_type] ||= []
|
65
|
+
@modules[required_behaviour_type] += modules
|
66
|
+
end
|
67
|
+
|
68
|
+
def modules_for(required_behaviour_type) #:nodoc:
|
69
|
+
@modules ||= {}
|
70
|
+
modules = @modules[nil] || [] # general ones
|
71
|
+
modules << @modules[required_behaviour_type.to_sym] unless required_behaviour_type.nil?
|
72
|
+
modules.uniq.compact
|
60
73
|
end
|
61
74
|
|
62
|
-
|
63
|
-
|
75
|
+
# This is just for cleanup in RSpec's own examples
|
76
|
+
def exclude(*modules) #:nodoc:
|
77
|
+
@modules.each do |behaviour_type, mods|
|
78
|
+
modules.each{|m| mods.delete(m)}
|
79
|
+
end
|
64
80
|
end
|
65
81
|
|
66
82
|
# Defines global predicate matchers. Example:
|
data/lib/spec/dsl/description.rb
CHANGED
@@ -19,6 +19,7 @@ module Spec
|
|
19
19
|
def initialize(*args)
|
20
20
|
args, @options = args_and_options(*args)
|
21
21
|
init_behaviour_type(@options)
|
22
|
+
init_spec_path(@options)
|
22
23
|
init_described_type(args)
|
23
24
|
init_description(*args)
|
24
25
|
end
|
@@ -52,6 +53,12 @@ module Spec
|
|
52
53
|
end
|
53
54
|
end
|
54
55
|
|
56
|
+
def init_spec_path(options)
|
57
|
+
if options.has_key?(:spec_path)
|
58
|
+
options[:spec_path] = File.expand_path(@options[:spec_path])
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
55
62
|
def init_description(*args)
|
56
63
|
@description = self.class.generate_description(*args)
|
57
64
|
end
|
data/lib/spec/dsl/example.rb
CHANGED
@@ -3,6 +3,9 @@ require 'timeout'
|
|
3
3
|
module Spec
|
4
4
|
module DSL
|
5
5
|
class Example
|
6
|
+
# The global sequence number of this example
|
7
|
+
attr_accessor :number
|
8
|
+
|
6
9
|
def initialize(description, options={}, &example_block)
|
7
10
|
@from = caller(0)[3]
|
8
11
|
@options = options
|
@@ -13,20 +16,20 @@ module Spec
|
|
13
16
|
|
14
17
|
def run(reporter, before_each_block, after_each_block, dry_run, execution_context, timeout=nil)
|
15
18
|
@dry_run = dry_run
|
16
|
-
reporter.example_started(
|
17
|
-
return reporter.example_finished(
|
19
|
+
reporter.example_started(self)
|
20
|
+
return reporter.example_finished(self) if dry_run
|
18
21
|
|
19
22
|
errors = []
|
20
23
|
location = nil
|
21
24
|
Timeout.timeout(timeout) do
|
22
|
-
before_each_ok =
|
25
|
+
before_each_ok = before_example(execution_context, errors, &before_each_block)
|
23
26
|
example_ok = run_example(execution_context, errors) if before_each_ok
|
24
|
-
after_each_ok =
|
27
|
+
after_each_ok = after_example(execution_context, errors, &after_each_block)
|
25
28
|
location = failure_location(before_each_ok, example_ok, after_each_ok)
|
26
29
|
end
|
27
30
|
|
28
31
|
ExampleShouldRaiseHandler.new(@from, @options).handle(errors)
|
29
|
-
reporter.example_finished(
|
32
|
+
reporter.example_finished(self, errors.first, location, @example_block.nil?) if reporter
|
30
33
|
end
|
31
34
|
|
32
35
|
def matches?(matcher, specified_examples)
|
@@ -34,11 +37,16 @@ module Spec
|
|
34
37
|
matcher.matches?(specified_examples)
|
35
38
|
end
|
36
39
|
|
37
|
-
private
|
38
40
|
def description
|
39
41
|
@description == :__generate_description ? generated_description : @description
|
40
42
|
end
|
41
43
|
|
44
|
+
def to_s
|
45
|
+
description
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
42
50
|
def generated_description
|
43
51
|
return @generated_description if @generated_description
|
44
52
|
if @dry_run
|
@@ -52,7 +60,7 @@ module Spec
|
|
52
60
|
end
|
53
61
|
end
|
54
62
|
|
55
|
-
def
|
63
|
+
def before_example(execution_context, errors, &behaviour_before_block)
|
56
64
|
setup_mocks(execution_context)
|
57
65
|
Spec::Matchers.description_generated(@description_generated_proc)
|
58
66
|
|
@@ -62,7 +70,7 @@ module Spec
|
|
62
70
|
|
63
71
|
execution_context.instance_eval(&behaviour_before_block) if behaviour_before_block
|
64
72
|
return errors.empty?
|
65
|
-
rescue => e
|
73
|
+
rescue Exception => e
|
66
74
|
@failed = true
|
67
75
|
errors << e
|
68
76
|
return false
|
@@ -79,7 +87,7 @@ module Spec
|
|
79
87
|
end
|
80
88
|
end
|
81
89
|
|
82
|
-
def
|
90
|
+
def after_example(execution_context, errors, &behaviour_after_each)
|
83
91
|
execution_context.instance_eval(&behaviour_after_each) if behaviour_after_each
|
84
92
|
|
85
93
|
begin
|
@@ -95,7 +103,7 @@ module Spec
|
|
95
103
|
execution_context.instance_eval(&after_proc)
|
96
104
|
|
97
105
|
return errors.empty?
|
98
|
-
rescue => e
|
106
|
+
rescue Exception => e
|
99
107
|
@failed = true
|
100
108
|
errors << e
|
101
109
|
return false
|
data/lib/spec/matchers/have.rb
CHANGED
@@ -23,12 +23,12 @@ module Spec
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def matches?(collection_owner)
|
26
|
-
if collection_owner.respond_to?(collection_name)
|
27
|
-
collection = collection_owner.send(collection_name, *@args, &@block)
|
26
|
+
if collection_owner.respond_to?(@collection_name)
|
27
|
+
collection = collection_owner.send(@collection_name, *@args, &@block)
|
28
28
|
elsif (collection_owner.respond_to?(:length) || collection_owner.respond_to?(:size))
|
29
29
|
collection = collection_owner
|
30
30
|
else
|
31
|
-
collection_owner.send(collection_name, *@args, &@block)
|
31
|
+
collection_owner.send(@collection_name, *@args, &@block)
|
32
32
|
end
|
33
33
|
@actual = collection.size if collection.respond_to?(:size)
|
34
34
|
@actual = collection.length if collection.respond_to?(:length)
|
@@ -43,39 +43,36 @@ module Spec
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def failure_message
|
46
|
-
"expected #{relative_expectation} #{collection_name}, got #{@actual}"
|
46
|
+
"expected #{relative_expectation} #{@collection_name}, got #{@actual}"
|
47
47
|
end
|
48
48
|
|
49
49
|
def negative_failure_message
|
50
50
|
if @relativity == :exactly
|
51
|
-
return "expected target not to have #{@expected} #{collection_name}, got #{@actual}"
|
51
|
+
return "expected target not to have #{@expected} #{@collection_name}, got #{@actual}"
|
52
52
|
elsif @relativity == :at_most
|
53
53
|
return <<-EOF
|
54
54
|
Isn't life confusing enough?
|
55
55
|
Instead of having to figure out the meaning of this:
|
56
|
-
should_not have_at_most(#{@expected}).#{collection_name}
|
56
|
+
should_not have_at_most(#{@expected}).#{@collection_name}
|
57
57
|
We recommend that you use this instead:
|
58
|
-
should have_at_least(#{@expected + 1}).#{collection_name}
|
58
|
+
should have_at_least(#{@expected + 1}).#{@collection_name}
|
59
59
|
EOF
|
60
60
|
elsif @relativity == :at_least
|
61
61
|
return <<-EOF
|
62
62
|
Isn't life confusing enough?
|
63
63
|
Instead of having to figure out the meaning of this:
|
64
|
-
should_not have_at_least(#{@expected}).#{collection_name}
|
64
|
+
should_not have_at_least(#{@expected}).#{@collection_name}
|
65
65
|
We recommend that you use this instead:
|
66
|
-
should have_at_most(#{@expected - 1}).#{collection_name}
|
66
|
+
should have_at_most(#{@expected - 1}).#{@collection_name}
|
67
67
|
EOF
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
71
|
def description
|
72
|
-
"have #{relative_expectation} #{collection_name}"
|
72
|
+
"have #{relative_expectation} #{@collection_name}"
|
73
73
|
end
|
74
74
|
|
75
75
|
private
|
76
|
-
def collection_name
|
77
|
-
@collection_name
|
78
|
-
end
|
79
76
|
|
80
77
|
def relative_expectation
|
81
78
|
"#{relativities[@relativity]}#{@expected}"
|
@@ -52,8 +52,8 @@ module Spec
|
|
52
52
|
def __delegate_method_missing_to_target(operator, expected)
|
53
53
|
::Spec::Matchers.generated_description = "should #{operator} #{expected.inspect}"
|
54
54
|
return if @target.send(operator, expected)
|
55
|
-
return fail_with_message("expected #{expected.inspect}
|
56
|
-
return fail_with_message("expected #{operator} #{expected.inspect}
|
55
|
+
return fail_with_message("expected: #{expected.inspect},\n got: #{@target.inspect} (using #{operator})") if ['==','===', '=~'].include?(operator)
|
56
|
+
return fail_with_message("expected: #{operator} #{expected.inspect},\n got: #{operator.gsub(/./, ' ')} #{@target.inspect}")
|
57
57
|
end
|
58
58
|
|
59
59
|
end
|
@@ -63,7 +63,7 @@ module Spec
|
|
63
63
|
def __delegate_method_missing_to_target(operator, expected)
|
64
64
|
::Spec::Matchers.generated_description = "should not #{operator} #{expected.inspect}"
|
65
65
|
return unless @target.send(operator, expected)
|
66
|
-
return fail_with_message("expected not #{operator} #{expected.inspect}
|
66
|
+
return fail_with_message("expected not: #{operator} #{expected.inspect},\n got: #{operator.gsub(/./, ' ')} #{@target.inspect}")
|
67
67
|
end
|
68
68
|
|
69
69
|
end
|
@@ -2,9 +2,14 @@ module Spec
|
|
2
2
|
module Matchers
|
3
3
|
|
4
4
|
class RaiseError #:nodoc:
|
5
|
-
def initialize(
|
6
|
-
|
7
|
-
|
5
|
+
def initialize(error_or_message=Exception, message=nil)
|
6
|
+
if String === error_or_message
|
7
|
+
@expected_error = Exception
|
8
|
+
@expected_message = error_or_message
|
9
|
+
else
|
10
|
+
@expected_error = error_or_message
|
11
|
+
@expected_message = message
|
12
|
+
end
|
8
13
|
end
|
9
14
|
|
10
15
|
def matches?(proc)
|
@@ -42,6 +42,17 @@ module Spec
|
|
42
42
|
@return_block = block_given? ? return_block : lambda { value }
|
43
43
|
end
|
44
44
|
|
45
|
+
# :call-seq:
|
46
|
+
# and_raise()
|
47
|
+
# and_raise(Exception) #any exception class
|
48
|
+
# and_raise(exception) #any exception object
|
49
|
+
#
|
50
|
+
# == Warning
|
51
|
+
#
|
52
|
+
# When you pass an exception class, the MessageExpectation will
|
53
|
+
# raise an instance of it, creating it with +new+. If the exception
|
54
|
+
# class initializer requires any parameters, you must pass in an
|
55
|
+
# instance and not the class.
|
45
56
|
def and_raise(exception=Exception)
|
46
57
|
@exception_to_raise = exception
|
47
58
|
end
|
data/lib/spec/mocks/methods.rb
CHANGED
@@ -2,19 +2,19 @@ module Spec
|
|
2
2
|
module Mocks
|
3
3
|
module Methods
|
4
4
|
def should_receive(sym, opts={}, &block)
|
5
|
-
__mock_proxy.add_message_expectation(opts[:expected_from] || caller(1)[0], sym, opts, &block)
|
5
|
+
__mock_proxy.add_message_expectation(opts[:expected_from] || caller(1)[0], sym.to_sym, opts, &block)
|
6
6
|
end
|
7
7
|
|
8
8
|
def should_not_receive(sym, &block)
|
9
|
-
__mock_proxy.add_negative_message_expectation(caller(1)[0], sym, &block)
|
9
|
+
__mock_proxy.add_negative_message_expectation(caller(1)[0], sym.to_sym, &block)
|
10
10
|
end
|
11
11
|
|
12
12
|
def stub!(sym)
|
13
|
-
__mock_proxy.add_stub(caller(1)[0], sym)
|
13
|
+
__mock_proxy.add_stub(caller(1)[0], sym.to_sym)
|
14
14
|
end
|
15
15
|
|
16
16
|
def received_message?(sym, *args, &block) #:nodoc:
|
17
|
-
__mock_proxy.received_message?(sym, *args, &block)
|
17
|
+
__mock_proxy.received_message?(sym.to_sym, *args, &block)
|
18
18
|
end
|
19
19
|
|
20
20
|
def rspec_verify #:nodoc:
|
@@ -28,7 +28,11 @@ module Spec
|
|
28
28
|
private
|
29
29
|
|
30
30
|
def __mock_proxy
|
31
|
-
|
31
|
+
if Mock === self
|
32
|
+
@mock_proxy ||= Proxy.new(self, @name, @options)
|
33
|
+
else
|
34
|
+
@mock_proxy ||= Proxy.new(self, self.class.name)
|
35
|
+
end
|
32
36
|
end
|
33
37
|
end
|
34
38
|
end
|
data/lib/spec/mocks/proxy.rb
CHANGED
@@ -22,19 +22,19 @@ module Spec
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def add_message_expectation(expected_from, sym, opts={}, &block)
|
25
|
-
__add
|
25
|
+
__add sym, block
|
26
26
|
@expectations << MessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, block_given? ? block : nil, 1, opts)
|
27
27
|
@expectations.last
|
28
28
|
end
|
29
29
|
|
30
30
|
def add_negative_message_expectation(expected_from, sym, &block)
|
31
|
-
__add
|
31
|
+
__add sym, block
|
32
32
|
@expectations << NegativeMessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, block_given? ? block : nil)
|
33
33
|
@expectations.last
|
34
34
|
end
|
35
35
|
|
36
36
|
def add_stub(expected_from, sym)
|
37
|
-
__add
|
37
|
+
__add sym, nil
|
38
38
|
@stubs.unshift MethodStub.new(@error_generator, @expectation_ordering, expected_from, sym, nil)
|
39
39
|
@stubs.first
|
40
40
|
end
|
@@ -85,17 +85,17 @@ module Spec
|
|
85
85
|
|
86
86
|
private
|
87
87
|
|
88
|
-
def __add(
|
89
|
-
$rspec_mocks.add(@target)
|
88
|
+
def __add(sym, block)
|
89
|
+
$rspec_mocks.add(@target) unless $rspec_mocks.nil?
|
90
90
|
define_expected_method(sym)
|
91
91
|
end
|
92
92
|
|
93
93
|
def define_expected_method(sym)
|
94
94
|
if target_responds_to?(sym) && !@proxied_methods.include?(sym)
|
95
|
+
metaclass.__send__(:alias_method, munge(sym), sym) if metaclass.instance_methods.include?(sym.to_s)
|
95
96
|
@proxied_methods << sym
|
96
|
-
metaclass.__send__(:alias_method, munge(sym), sym)
|
97
97
|
end
|
98
|
-
|
98
|
+
|
99
99
|
metaclass_eval(<<-EOF, __FILE__, __LINE__)
|
100
100
|
def #{sym}(*args, &block)
|
101
101
|
__mock_proxy.message_received :#{sym}, *args, &block
|
@@ -141,8 +141,12 @@ module Spec
|
|
141
141
|
|
142
142
|
def reset_proxied_methods
|
143
143
|
@proxied_methods.each do |sym|
|
144
|
-
metaclass.
|
145
|
-
|
144
|
+
if metaclass.instance_methods.include?(munge(sym).to_s)
|
145
|
+
metaclass.__send__(:alias_method, sym, munge(sym))
|
146
|
+
metaclass.__send__(:undef_method, munge(sym))
|
147
|
+
else
|
148
|
+
metaclass.__send__(:undef_method, sym)
|
149
|
+
end
|
146
150
|
end
|
147
151
|
end
|
148
152
|
|
data/lib/spec/rake/spectask.rb
CHANGED
@@ -21,7 +21,38 @@ module Spec
|
|
21
21
|
#
|
22
22
|
# rake spec
|
23
23
|
#
|
24
|
+
# If rake is invoked with a "SPEC=filename" command line option,
|
25
|
+
# then the list of spec files will be overridden to include only the
|
26
|
+
# filename specified on the command line. This provides an easy way
|
27
|
+
# to run just one spec.
|
28
|
+
#
|
29
|
+
# If rake is invoked with a "SPEC_OPTS=options" command line option,
|
30
|
+
# then the given options will override the value of the +spec_opts+
|
31
|
+
# attribute.
|
32
|
+
#
|
33
|
+
# If rake is invoked with a "RCOV_OPTS=options" command line option,
|
34
|
+
# then the given options will override the value of the +rcov_opts+
|
35
|
+
# attribute.
|
36
|
+
#
|
37
|
+
# Examples:
|
38
|
+
#
|
39
|
+
# rake spec # run specs normally
|
40
|
+
# rake spec SPEC=just_one_file.rb # run just one spec file.
|
41
|
+
# rake spec SPEC_OPTS="--diff" # enable diffing
|
42
|
+
# rake spec RCOV_OPTS="--aggregate myfile.txt" # see rcov --help for details
|
43
|
+
#
|
44
|
+
# Each attribute of this task may be a proc. This allows for lazy evaluation,
|
45
|
+
# which is sometimes handy if you want to defer the evaluation of an attribute value
|
46
|
+
# until the task is run (as opposed to when it is defined).
|
24
47
|
class SpecTask < ::Rake::TaskLib
|
48
|
+
class << self
|
49
|
+
def attr_accessor(*names)
|
50
|
+
super(*names)
|
51
|
+
names.each do |name|
|
52
|
+
module_eval "def #{name}() evaluate(@#{name}) end" # Allows use of procs
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
25
56
|
|
26
57
|
# Name of spec task. (default is :spec)
|
27
58
|
attr_accessor :name
|
@@ -35,21 +66,20 @@ module Spec
|
|
35
66
|
attr_accessor :warning
|
36
67
|
|
37
68
|
# Glob pattern to match spec files. (default is 'spec/**/*_spec.rb')
|
69
|
+
# Setting the SPEC environment variable overrides this.
|
38
70
|
attr_accessor :pattern
|
39
71
|
|
40
72
|
# Array of commandline options to pass to RSpec. Defaults to [].
|
73
|
+
# Setting the SPEC_OPTS environment variable overrides this.
|
41
74
|
attr_accessor :spec_opts
|
42
75
|
|
43
|
-
# Where RSpec's output is written. Defaults to STDOUT.
|
44
|
-
# DEPRECATED. Use --format FORMAT:WHERE in spec_opts.
|
45
|
-
attr_accessor :out
|
46
|
-
|
47
76
|
# Whether or not to use RCov (default is false)
|
48
77
|
# See http://eigenclass.org/hiki.rb?rcov
|
49
78
|
attr_accessor :rcov
|
50
79
|
|
51
80
|
# Array of commandline options to pass to RCov. Defaults to ['--exclude', 'lib\/spec,bin\/spec'].
|
52
81
|
# Ignored if rcov=false
|
82
|
+
# Setting the RCOV_OPTS environment variable overrides this.
|
53
83
|
attr_accessor :rcov_opts
|
54
84
|
|
55
85
|
# Directory where the RCov report is written. Defaults to "coverage"
|
@@ -63,18 +93,21 @@ module Spec
|
|
63
93
|
# Defaults to true.
|
64
94
|
attr_accessor :fail_on_error
|
65
95
|
|
66
|
-
# A message to print to
|
96
|
+
# A message to print to stderr when there are failures.
|
67
97
|
attr_accessor :failure_message
|
68
98
|
|
99
|
+
# Where RSpec's output is written. Defaults to STDOUT.
|
100
|
+
# DEPRECATED. Use --format FORMAT:WHERE in spec_opts.
|
101
|
+
attr_accessor :out
|
102
|
+
|
69
103
|
# Explicitly define the list of spec files to be included in a
|
70
|
-
# spec. +
|
104
|
+
# spec. +spec_files+ is expected to be an array of file names (a
|
71
105
|
# FileList is acceptable). If both +pattern+ and +spec_files+ are
|
72
106
|
# used, then the list of spec files is the union of the two.
|
73
|
-
|
74
|
-
|
75
|
-
end
|
107
|
+
# Setting the SPEC environment variable overrides this.
|
108
|
+
attr_accessor :spec_files
|
76
109
|
|
77
|
-
#
|
110
|
+
# Defines a new task, using the name +name+.
|
78
111
|
def initialize(name=:spec)
|
79
112
|
@name = name
|
80
113
|
@libs = [File.expand_path(File.dirname(__FILE__) + '/../../../lib')]
|
@@ -83,62 +116,63 @@ module Spec
|
|
83
116
|
@spec_opts = []
|
84
117
|
@warning = false
|
85
118
|
@ruby_opts = []
|
86
|
-
@out = nil
|
87
119
|
@fail_on_error = true
|
88
120
|
@rcov = false
|
89
121
|
@rcov_opts = ['--exclude', 'lib\/spec,bin\/spec,config\/boot.rb']
|
90
122
|
@rcov_dir = "coverage"
|
91
123
|
|
92
124
|
yield self if block_given?
|
93
|
-
@pattern = 'spec/**/*_spec.rb' if
|
125
|
+
@pattern = 'spec/**/*_spec.rb' if pattern.nil? && spec_files.nil?
|
94
126
|
define
|
95
127
|
end
|
96
128
|
|
97
|
-
def define
|
129
|
+
def define # :nodoc:
|
98
130
|
spec_script = File.expand_path(File.dirname(__FILE__) + '/../../../bin/spec')
|
99
131
|
|
100
|
-
lib_path =
|
132
|
+
lib_path = libs.join(File::PATH_SEPARATOR)
|
101
133
|
actual_name = Hash === name ? name.keys.first : name
|
102
134
|
unless ::Rake.application.last_comment
|
103
|
-
desc "Run
|
135
|
+
desc "Run specs" + (rcov ? " using RCov" : "")
|
104
136
|
end
|
105
|
-
task
|
106
|
-
RakeFileUtils.verbose(
|
137
|
+
task name do
|
138
|
+
RakeFileUtils.verbose(verbose) do
|
107
139
|
unless spec_file_list.empty?
|
108
|
-
# ruby [ruby_opts] -Ilib -S rcov [rcov_opts] bin/spec -- [spec_opts]
|
140
|
+
# ruby [ruby_opts] -Ilib -S rcov [rcov_opts] bin/spec -- examples [spec_opts]
|
109
141
|
# or
|
110
|
-
# ruby [ruby_opts] -Ilib bin/spec [spec_opts]
|
142
|
+
# ruby [ruby_opts] -Ilib bin/spec examples [spec_opts]
|
111
143
|
cmd = "ruby "
|
112
144
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
cmd <<
|
145
|
+
rb_opts = ruby_opts.clone
|
146
|
+
rb_opts << "-I\"#{lib_path}\""
|
147
|
+
rb_opts << "-S rcov" if rcov
|
148
|
+
rb_opts << "-w" if warning
|
149
|
+
cmd << rb_opts.join(" ")
|
118
150
|
cmd << " "
|
119
151
|
cmd << rcov_option_list
|
120
|
-
cmd << %[ -o "#{
|
152
|
+
cmd << %[ -o "#{rcov_dir}" ] if rcov
|
121
153
|
cmd << %Q|"#{spec_script}"|
|
122
154
|
cmd << " "
|
123
|
-
cmd << "-- " if
|
155
|
+
cmd << "-- " if rcov
|
124
156
|
cmd << spec_file_list.collect { |fn| %["#{fn}"] }.join(' ')
|
125
157
|
cmd << " "
|
126
158
|
cmd << spec_option_list
|
127
|
-
|
128
|
-
|
129
|
-
|
159
|
+
if out
|
160
|
+
cmd << " "
|
161
|
+
cmd << %Q| > "#{out}"|
|
162
|
+
STDERR.puts "The Spec::Rake::SpecTask#out attribute is DEPRECATED and will be removed in a future version. Use --format FORMAT:WHERE instead."
|
163
|
+
end
|
130
164
|
unless system(cmd)
|
131
|
-
|
132
|
-
|
165
|
+
STDERR.puts failure_message if failure_message
|
166
|
+
raise("Command #{cmd} failed") if fail_on_error
|
133
167
|
end
|
134
168
|
end
|
135
169
|
end
|
136
170
|
end
|
137
171
|
|
138
|
-
if
|
172
|
+
if rcov
|
139
173
|
desc "Remove rcov products for #{actual_name}"
|
140
174
|
task paste("clobber_", actual_name) do
|
141
|
-
rm_r
|
175
|
+
rm_r rcov_dir rescue nil
|
142
176
|
end
|
143
177
|
|
144
178
|
clobber_task = paste("clobber_", actual_name)
|
@@ -150,12 +184,20 @@ module Spec
|
|
150
184
|
end
|
151
185
|
|
152
186
|
def rcov_option_list # :nodoc:
|
153
|
-
return "" unless
|
154
|
-
ENV['
|
187
|
+
return "" unless rcov
|
188
|
+
ENV['RCOV_OPTS'] || rcov_opts.join(" ") || ""
|
155
189
|
end
|
156
190
|
|
157
191
|
def spec_option_list # :nodoc:
|
158
|
-
|
192
|
+
STDERR.puts "RSPECOPTS is DEPRECATED and will be removed in a future version. Use SPEC_OPTS instead." if ENV['RSPECOPTS']
|
193
|
+
ENV['SPEC_OPTS'] || ENV['RSPECOPTS'] || spec_opts.join(" ") || ""
|
194
|
+
end
|
195
|
+
|
196
|
+
def evaluate(o) # :nodoc:
|
197
|
+
case o
|
198
|
+
when Proc then o.call
|
199
|
+
else o
|
200
|
+
end
|
159
201
|
end
|
160
202
|
|
161
203
|
def spec_file_list # :nodoc:
|
@@ -163,8 +205,8 @@ module Spec
|
|
163
205
|
FileList[ ENV['SPEC'] ]
|
164
206
|
else
|
165
207
|
result = []
|
166
|
-
result +=
|
167
|
-
result += FileList[
|
208
|
+
result += spec_files.to_a if spec_files
|
209
|
+
result += FileList[ pattern ].to_a if pattern
|
168
210
|
FileList[result]
|
169
211
|
end
|
170
212
|
end
|