rspec 1.2.6 → 1.2.7
Sign up to get free protection for your applications and to get access to all the features.
- data/History.rdoc +22 -0
- data/Manifest.txt +9 -4
- data/Rakefile +13 -12
- data/Upgrade.rdoc +1 -1
- data/features/command_line/line_number_option.feature +56 -0
- data/features/command_line/line_number_option_with_example_with_no_name.feature +22 -0
- data/features/mocks/stub_implementation.feature +26 -0
- data/lib/autotest/rspec.rb +7 -7
- data/lib/spec/autorun.rb +1 -1
- data/lib/spec/deprecation.rb +3 -3
- data/lib/spec/dsl.rb +0 -1
- data/lib/spec/dsl/main.rb +6 -6
- data/lib/spec/example.rb +28 -29
- data/lib/spec/example/args_and_options.rb +1 -1
- data/lib/spec/example/before_and_after_hooks.rb +10 -10
- data/lib/spec/example/errors.rb +8 -3
- data/lib/spec/example/example_group.rb +0 -1
- data/lib/spec/example/example_group_factory.rb +3 -3
- data/lib/spec/example/example_group_hierarchy.rb +10 -10
- data/lib/spec/example/example_group_methods.rb +37 -29
- data/lib/spec/example/example_group_proxy.rb +9 -10
- data/lib/spec/example/example_matcher.rb +3 -3
- data/lib/spec/example/example_methods.rb +11 -11
- data/lib/spec/example/example_proxy.rb +5 -5
- data/lib/spec/example/module_reopening_fix.rb +7 -7
- data/lib/spec/example/pending.rb +1 -1
- data/lib/spec/example/predicate_matchers.rb +0 -1
- data/lib/spec/example/shared_example_group.rb +5 -5
- data/lib/spec/example/subject.rb +12 -16
- data/lib/spec/expectations/extensions/kernel.rb +1 -1
- data/lib/spec/expectations/fail_with.rb +4 -0
- data/lib/spec/matchers/generated_descriptions.rb +4 -16
- data/lib/spec/matchers/match.rb +5 -4
- data/lib/spec/matchers/matcher.rb +21 -3
- data/lib/spec/matchers/operator_matcher.rb +1 -1
- data/lib/spec/mocks/errors.rb +1 -1
- data/lib/spec/mocks/message_expectation.rb +3 -2
- data/lib/spec/mocks/methods.rb +8 -5
- data/lib/spec/mocks/proxy.rb +2 -2
- data/lib/spec/rake/spectask.rb +9 -3
- data/lib/spec/runner.rb +1 -1
- data/lib/spec/runner/{spec_parser.rb → line_number_query.rb} +20 -9
- data/lib/spec/runner/options.rb +10 -2
- data/lib/spec/version.rb +3 -2
- data/spec/autotest/failed_results_re_spec.rb +7 -0
- data/spec/spec/example/example_group_methods_spec.rb +61 -0
- data/spec/spec/example/example_matcher_spec.rb +7 -0
- data/spec/spec/example/example_methods_spec.rb +35 -7
- data/spec/spec/expectations/fail_with_spec.rb +18 -1
- data/spec/spec/matchers/match_spec.rb +20 -0
- data/spec/spec/matchers/matcher_spec.rb +27 -28
- data/spec/spec/matchers/operator_matcher_spec.rb +1 -1
- data/spec/spec/mocks/bug_report_10263_spec.rb +4 -1
- data/spec/spec/mocks/bug_report_830_spec.rb +21 -0
- data/spec/spec/mocks/options_hash_spec.rb +1 -1
- data/spec/spec/mocks/stub_chain_spec.rb +7 -0
- data/spec/spec/mocks/stub_implementation_spec.rb +31 -0
- data/spec/spec/rake/spectask_spec.rb +150 -0
- data/spec/spec/runner/{spec_parser/spec_parser_fixture.rb → line_number_query/line_number_query_fixture.rb} +4 -4
- data/spec/spec/runner/{spec_parser_spec.rb → line_number_query_spec.rb} +31 -10
- data/spec/spec/runner/option_parser_spec.rb +1 -1
- data/spec/spec/runner/options_spec.rb +33 -25
- metadata +15 -10
- data/.autotest +0 -5
@@ -5,12 +5,12 @@ module Spec
|
|
5
5
|
def before_suite_parts # :nodoc:
|
6
6
|
@before_suite_parts ||= []
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
9
|
def after_suite_parts # :nodoc:
|
10
10
|
@after_suite_parts ||= []
|
11
11
|
end
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
# Registers a block to be executed before examples. <tt>scope</tt> can be
|
15
15
|
# <tt>:each</tt> (default), <tt>:all</tt>, or <tt>:suite</tt>. When
|
16
16
|
# <tt>:each</tt>, the block is executed before each example. When
|
@@ -23,7 +23,7 @@ module Spec
|
|
23
23
|
|
24
24
|
# Registers a block to be executed before each example.
|
25
25
|
# This method prepends +block+ to existing before blocks.
|
26
|
-
#
|
26
|
+
#
|
27
27
|
# See <tt>append_before</tt> for scoping semantics.
|
28
28
|
def prepend_before(scope = :each, &block)
|
29
29
|
before_parts(scope).unshift(block)
|
@@ -31,7 +31,7 @@ module Spec
|
|
31
31
|
|
32
32
|
# Registers a block to be executed after each example.
|
33
33
|
# This method prepends +block+ to existing after blocks.
|
34
|
-
#
|
34
|
+
#
|
35
35
|
# See <tt>append_before</tt> for scoping semantics.
|
36
36
|
def prepend_after(scope = :each, &block)
|
37
37
|
after_parts(scope).unshift(block)
|
@@ -40,7 +40,7 @@ module Spec
|
|
40
40
|
|
41
41
|
# Registers a block to be executed after each example.
|
42
42
|
# This method appends +block+ to existing after blocks.
|
43
|
-
#
|
43
|
+
#
|
44
44
|
# See <tt>append_before</tt> for scoping semantics.
|
45
45
|
def append_after(scope = :each, &block)
|
46
46
|
after_parts(scope) << block
|
@@ -53,7 +53,7 @@ module Spec
|
|
53
53
|
def after_each_parts # :nodoc:
|
54
54
|
@after_each_parts ||= []
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
def before_all_parts # :nodoc:
|
58
58
|
@before_all_parts ||= []
|
59
59
|
end
|
@@ -65,13 +65,13 @@ module Spec
|
|
65
65
|
def before_suite_parts # :nodoc:
|
66
66
|
BeforeAndAfterHooks.before_suite_parts
|
67
67
|
end
|
68
|
-
|
68
|
+
|
69
69
|
def after_suite_parts # :nodoc:
|
70
70
|
BeforeAndAfterHooks.after_suite_parts
|
71
71
|
end
|
72
|
-
|
72
|
+
|
73
73
|
private
|
74
|
-
|
74
|
+
|
75
75
|
def before_parts(scope)
|
76
76
|
case scope
|
77
77
|
when :each; before_each_parts
|
@@ -90,4 +90,4 @@ module Spec
|
|
90
90
|
|
91
91
|
end
|
92
92
|
end
|
93
|
-
end
|
93
|
+
end
|
data/lib/spec/example/errors.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Spec
|
2
2
|
module Example
|
3
3
|
class ExamplePendingError < StandardError; end
|
4
|
-
|
4
|
+
|
5
5
|
class NotYetImplementedError < ExamplePendingError
|
6
6
|
MESSAGE = "Not Yet Implemented"
|
7
7
|
def initialize
|
@@ -10,10 +10,15 @@ module Spec
|
|
10
10
|
end
|
11
11
|
|
12
12
|
class PendingExampleFixedError < StandardError; end
|
13
|
-
|
13
|
+
|
14
14
|
class NoDescriptionError < ArgumentError
|
15
|
+
class << self
|
16
|
+
def message(kind, location)
|
17
|
+
"No description supplied for #{kind} declared on #{location}"
|
18
|
+
end
|
19
|
+
end
|
15
20
|
def initialize(kind, location)
|
16
|
-
super(
|
21
|
+
super(self.class.message(kind, location))
|
17
22
|
end
|
18
23
|
end
|
19
24
|
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module Spec
|
2
2
|
module Example
|
3
|
-
|
3
|
+
|
4
4
|
class ExampleGroupFactory
|
5
5
|
module ClassMethods
|
6
6
|
include Spec::Example::ArgsAndOptions
|
7
|
-
|
7
|
+
|
8
8
|
def reset
|
9
9
|
@example_group_types = nil
|
10
10
|
default(ExampleGroup)
|
@@ -23,7 +23,7 @@ module Spec
|
|
23
23
|
def create_shared_example_group(*args, &example_group_block) # :nodoc:
|
24
24
|
::Spec::Example::SharedExampleGroup.register(*args, &example_group_block)
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
def create_example_group(*args, &block)
|
28
28
|
raise ArgumentError if args.empty? || block.nil?
|
29
29
|
add_options(args)
|
@@ -8,43 +8,43 @@ module Spec
|
|
8
8
|
flatten!
|
9
9
|
end
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
def run_before_all(example)
|
13
13
|
example.eval_each_fail_fast(before_all_parts)
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
def run_before_each(example)
|
17
17
|
example.eval_each_fail_fast(before_each_parts)
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
def run_after_each(example)
|
21
21
|
example.eval_each_fail_slow(after_each_parts)
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
def run_after_all(example)
|
25
25
|
example.eval_each_fail_slow(after_all_parts)
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
def before_all_parts
|
29
29
|
@before_all_parts ||= collect {|klass| klass.before_all_parts}.flatten
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
def before_each_parts
|
33
33
|
@before_each_parts ||= collect {|klass| klass.before_each_parts}.flatten
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
def after_each_parts
|
37
37
|
@after_each_parts ||= reverse.collect {|klass| klass.after_each_parts}.flatten
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
def after_all_parts
|
41
41
|
@after_all_parts ||= reverse.collect {|klass| klass.after_all_parts}.flatten
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
def nested_descriptions
|
45
45
|
@nested_descriptions ||= collect {|eg| nested_description_from(eg) == "" ? nil : nested_description_from(eg) }.compact
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
def nested_description_from(example_group)
|
49
49
|
example_group.description_args.join
|
50
50
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Spec
|
2
2
|
module Example
|
3
3
|
|
4
|
-
module ExampleGroupMethods
|
4
|
+
module ExampleGroupMethods
|
5
5
|
class << self
|
6
6
|
attr_accessor :matcher_class
|
7
7
|
|
@@ -20,16 +20,16 @@ module Spec
|
|
20
20
|
include Spec::Example::ArgsAndOptions
|
21
21
|
|
22
22
|
attr_reader :location
|
23
|
-
|
23
|
+
|
24
24
|
def options # :nodoc:
|
25
25
|
@options ||= {}
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
def inherited(klass) # :nodoc:
|
29
29
|
super
|
30
30
|
ExampleGroupFactory.register_example_group(klass)
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
# Makes the describe/it syntax available from a class. For example:
|
34
34
|
#
|
35
35
|
# class StackSpec < Spec::ExampleGroup
|
@@ -59,14 +59,14 @@ module Spec
|
|
59
59
|
end
|
60
60
|
end
|
61
61
|
alias :context :describe
|
62
|
-
|
62
|
+
|
63
63
|
# Use this to pull in examples from shared example groups.
|
64
64
|
def it_should_behave_like(*shared_example_groups)
|
65
65
|
shared_example_groups.each do |group|
|
66
66
|
include_shared_example_group(group)
|
67
67
|
end
|
68
68
|
end
|
69
|
-
|
69
|
+
|
70
70
|
# Creates an instance of the current example group class and adds it to
|
71
71
|
# a collection of examples of the current example group.
|
72
72
|
def example(description=nil, options={}, backtrace=nil, &implementation)
|
@@ -75,7 +75,7 @@ module Spec
|
|
75
75
|
example_implementations[example_proxy] = implementation || pending_implementation
|
76
76
|
example_proxy
|
77
77
|
end
|
78
|
-
|
78
|
+
|
79
79
|
def pending_implementation
|
80
80
|
lambda { raise(Spec::Example::NotYetImplementedError) }
|
81
81
|
end
|
@@ -87,10 +87,10 @@ module Spec
|
|
87
87
|
def xexample(description=nil, opts={}, &block)
|
88
88
|
Kernel.warn("Example disabled: #{description}")
|
89
89
|
end
|
90
|
-
|
90
|
+
|
91
91
|
alias_method :xit, :xexample
|
92
92
|
alias_method :xspecify, :xexample
|
93
|
-
|
93
|
+
|
94
94
|
def run(run_options)
|
95
95
|
examples = examples_to_run(run_options)
|
96
96
|
notify(run_options.reporter) unless examples.empty?
|
@@ -110,7 +110,7 @@ module Spec
|
|
110
110
|
@location = File.expand_path(options[:location]) if options[:location]
|
111
111
|
self
|
112
112
|
end
|
113
|
-
|
113
|
+
|
114
114
|
def notify(reporter) # :nodoc:
|
115
115
|
reporter.example_group_started(ExampleGroupProxy.new(self))
|
116
116
|
end
|
@@ -118,33 +118,33 @@ module Spec
|
|
118
118
|
def description
|
119
119
|
@description ||= ExampleGroupMethods.build_description_from(*description_parts) || to_s
|
120
120
|
end
|
121
|
-
|
121
|
+
|
122
122
|
def described_type
|
123
123
|
@described_type ||= description_parts.reverse.find {|part| part.is_a?(Module)}
|
124
124
|
end
|
125
|
-
|
125
|
+
|
126
126
|
def described_class
|
127
127
|
@described_class ||= Class === described_type ? described_type : nil
|
128
128
|
end
|
129
|
-
|
129
|
+
|
130
130
|
def description_args
|
131
131
|
@description_args ||= []
|
132
132
|
end
|
133
|
-
|
133
|
+
|
134
134
|
def description_parts #:nodoc:
|
135
135
|
@description_parts ||= example_group_hierarchy.inject([]) do |parts, example_group_class|
|
136
136
|
[parts << example_group_class.description_args].flatten
|
137
137
|
end
|
138
138
|
end
|
139
|
-
|
139
|
+
|
140
140
|
def example_proxies # :nodoc:
|
141
141
|
@example_proxies ||= []
|
142
142
|
end
|
143
|
-
|
143
|
+
|
144
144
|
def example_implementations # :nodoc:
|
145
145
|
@example_implementations ||= {}
|
146
146
|
end
|
147
|
-
|
147
|
+
|
148
148
|
def examples(run_options=nil) #:nodoc:
|
149
149
|
(run_options && run_options.reverse) ? example_proxies.reverse : example_proxies
|
150
150
|
end
|
@@ -156,15 +156,15 @@ module Spec
|
|
156
156
|
def example_group_hierarchy
|
157
157
|
@example_group_hierarchy ||= ExampleGroupHierarchy.new(self)
|
158
158
|
end
|
159
|
-
|
159
|
+
|
160
160
|
def nested_descriptions
|
161
161
|
example_group_hierarchy.nested_descriptions
|
162
162
|
end
|
163
|
-
|
163
|
+
|
164
164
|
def include_constants_in(mod)
|
165
165
|
include mod if (Spec::Ruby.version.to_f >= 1.9) & (Module === mod) & !(Class === mod)
|
166
166
|
end
|
167
|
-
|
167
|
+
|
168
168
|
private
|
169
169
|
|
170
170
|
def subclass(*args, &example_group_block)
|
@@ -201,16 +201,16 @@ module Spec
|
|
201
201
|
return [success, instance_variables] unless success
|
202
202
|
|
203
203
|
after_all_instance_variables = instance_variables
|
204
|
-
|
204
|
+
|
205
205
|
examples.each do |example|
|
206
206
|
example_group_instance = new(example, &example_implementations[example])
|
207
207
|
success &= example_group_instance.execute(run_options, instance_variables)
|
208
208
|
after_all_instance_variables = example_group_instance.instance_variable_hash
|
209
209
|
end
|
210
|
-
|
210
|
+
|
211
211
|
return [success, after_all_instance_variables]
|
212
212
|
end
|
213
|
-
|
213
|
+
|
214
214
|
def run_after_all(success, instance_variables, run_options)
|
215
215
|
return success if example_group_hierarchy.after_all_parts.empty?
|
216
216
|
example_proxy = ExampleProxy.new("after(:all)")
|
@@ -222,13 +222,21 @@ module Spec
|
|
222
222
|
run_options.reporter.example_failed(example_proxy, e)
|
223
223
|
false
|
224
224
|
end
|
225
|
-
|
225
|
+
|
226
226
|
def examples_to_run(run_options)
|
227
227
|
return example_proxies unless examples_were_specified?(run_options)
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
228
|
+
if run_options.line_number_requested?
|
229
|
+
if location =~ /:#{run_options.example_line}$/
|
230
|
+
example_proxies
|
231
|
+
else
|
232
|
+
example_proxies.select {|proxy| proxy.location =~ /:#{run_options.example_line}$/}
|
233
|
+
end
|
234
|
+
else
|
235
|
+
example_proxies.reject do |proxy|
|
236
|
+
matcher = ExampleGroupMethods.matcher_class.
|
237
|
+
new(description.to_s, proxy.description)
|
238
|
+
!matcher.matches?(run_options.examples)
|
239
|
+
end
|
232
240
|
end
|
233
241
|
end
|
234
242
|
|
@@ -239,7 +247,7 @@ module Spec
|
|
239
247
|
def method_added(name) # :nodoc:
|
240
248
|
example(name.to_s, {}, caller(0)[1]) {__send__ name.to_s} if example_method?(name.to_s)
|
241
249
|
end
|
242
|
-
|
250
|
+
|
243
251
|
def example_method?(method_name)
|
244
252
|
should_method?(method_name)
|
245
253
|
end
|
@@ -3,7 +3,7 @@ module Spec
|
|
3
3
|
# Lightweight proxy for an example group. This is the object that is passed
|
4
4
|
# to Spec::Runner::Formatter::BaseFormatter#example_group_started
|
5
5
|
class ExampleGroupProxy
|
6
|
-
|
6
|
+
|
7
7
|
def initialize(example_group) # :nodoc:
|
8
8
|
@description = example_group.description
|
9
9
|
@nested_descriptions = example_group.nested_descriptions
|
@@ -14,35 +14,35 @@ module Spec
|
|
14
14
|
@options.delete(:location)
|
15
15
|
@options.delete(:scope)
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
# Optional hash passed to the example group declaration. Note that RSpec uses
|
19
19
|
# this hash internally and reserves the keys :location and :scope for its own
|
20
20
|
# use (and removes them from this hash)
|
21
21
|
attr_reader :options
|
22
|
-
|
22
|
+
|
23
23
|
# This is the description passed to the <tt>describe()</tt> method or any
|
24
24
|
# of its aliases
|
25
25
|
attr_reader :description
|
26
|
-
|
26
|
+
|
27
27
|
# Used by Spec::Runner::Formatter::NestedTextFormatter to access the
|
28
28
|
# description of each example group in a nested group separately.
|
29
29
|
attr_reader :nested_descriptions
|
30
|
-
|
30
|
+
|
31
31
|
# A collection of ExampleGroupProxy objects, one for each example
|
32
32
|
# declared in this group.
|
33
33
|
attr_reader :examples
|
34
|
-
|
34
|
+
|
35
35
|
# The file and line number at which the proxied example group
|
36
36
|
# was declared. This is extracted from <tt>caller</tt>, and is therefore
|
37
37
|
# formatted as an individual line in a backtrace.
|
38
38
|
attr_reader :location
|
39
|
-
|
39
|
+
|
40
40
|
# Deprecated - use location() instead
|
41
41
|
def backtrace
|
42
42
|
Spec::deprecate("ExampleGroupProxy#backtrace","ExampleGroupProxy#location")
|
43
43
|
@backtrace
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
# Deprecated - just use gsub on the description instead.
|
47
47
|
def filtered_description(regexp)
|
48
48
|
Spec::deprecate("ExampleGroupProxy#filtered_description","gsub (or similar) to modify ExampleGroupProxy#description")
|
@@ -52,11 +52,10 @@ module Spec
|
|
52
52
|
end
|
53
53
|
)
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
def ==(other) # :nodoc:
|
57
57
|
other.description == description
|
58
58
|
end
|
59
59
|
end
|
60
60
|
end
|
61
61
|
end
|
62
|
-
|
@@ -5,13 +5,13 @@ module Spec
|
|
5
5
|
@example_group_description = example_group_description
|
6
6
|
@example_name = example_name
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
9
|
def matches?(specified_examples)
|
10
10
|
specified_examples.any? do |specified_example|
|
11
11
|
matches_literal_example?(specified_example) || matches_example_not_considering_modules?(specified_example)
|
12
12
|
end
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
protected
|
16
16
|
def matches_literal_example?(specified_example)
|
17
17
|
specified_example =~ /(^#{example_group_regex} #{example_regexp}$|^#{example_group_regex}$|^#{example_group_with_before_all_regexp}$|^#{example_regexp}$)/
|
@@ -34,7 +34,7 @@ module Spec
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def example_regexp
|
37
|
-
Regexp.escape(@example_name)
|
37
|
+
Regexp.escape(@example_name) if @example_name
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|