rspec-core 2.6.0.rc2 → 2.6.0.rc4
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +4 -3
- data/features/Changelog.md +8 -1
- data/features/Upgrade.md +35 -2
- data/features/command_line/tag.feature +5 -5
- data/features/filtering/run_all_when_everything_filtered.feature +1 -1
- data/lib/rspec/core/configuration.rb +21 -10
- data/lib/rspec/core/extensions/object.rb +0 -1
- data/lib/rspec/core/version.rb +1 -1
- data/lib/rspec/core/world.rb +56 -20
- data/spec/rspec/core/world_spec.rb +101 -3
- metadata +6 -6
data/Gemfile
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
2
|
|
3
3
|
### rspec libs
|
4
|
-
%w[rspec-core rspec-expectations rspec-mocks].each do |lib|
|
4
|
+
%w[rspec rspec-core rspec-expectations rspec-mocks].each do |lib|
|
5
5
|
library_path = File.expand_path("../../#{lib}", __FILE__)
|
6
6
|
if File.exist?(library_path)
|
7
7
|
gem lib, :path => library_path
|
@@ -10,10 +10,11 @@ source "http://rubygems.org"
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
+
|
13
14
|
### dev dependencies
|
14
15
|
gem "rake", "0.8.7"
|
15
|
-
|
16
|
-
|
16
|
+
gem "cucumber", "~> 0.10.2"
|
17
|
+
gem "aruba", "~> 0.3.6"
|
17
18
|
gem "rcov", "0.9.9", :platforms => :mri
|
18
19
|
gem "relish", "0.2.0"
|
19
20
|
gem "guard-rspec", "0.1.9"
|
data/features/Changelog.md
CHANGED
@@ -1,6 +1,13 @@
|
|
1
|
+
### 2.6.0.rc4 / 2011-05-01
|
2
|
+
|
3
|
+
[full changelog](http://github.com/rspec/rspec-core/compare/v2.6.0.rc2...v2.6.0.rc4)
|
4
|
+
|
5
|
+
* Enhancements
|
6
|
+
* Clean up messages for filters/tags.
|
7
|
+
|
1
8
|
### 2.6.0.rc2 / 2011-04-18
|
2
9
|
|
3
|
-
[full changelog](http://github.com/rspec/rspec-core/compare/v2.5.1...v2.6.
|
10
|
+
[full changelog](http://github.com/rspec/rspec-core/compare/v2.5.1...v2.6.0.rc2)
|
4
11
|
|
5
12
|
* Enhancements
|
6
13
|
* `shared_context` (Damian Nurzynski)
|
data/features/Upgrade.md
CHANGED
@@ -1,3 +1,36 @@
|
|
1
|
+
# rspec-core-2.6
|
2
|
+
|
3
|
+
## new APIs for sharing content
|
4
|
+
|
5
|
+
Use `shared_context` together with `include_context` to share before/after
|
6
|
+
hooks, let declarations, and method definitions across example groups.
|
7
|
+
|
8
|
+
Use `shared_examples` together with `include_examples` to share examples
|
9
|
+
across different contexts.
|
10
|
+
|
11
|
+
All of the old APIs are still supported, but these 4 are easy to remember, and
|
12
|
+
serve most use cases.
|
13
|
+
|
14
|
+
See `shared_context` and `shared_examples` under "Example Groups" for more
|
15
|
+
information.
|
16
|
+
|
17
|
+
## `treat_symbols_as_metadata_keys_with_true_values`
|
18
|
+
|
19
|
+
Yes it's a long name, but it's a great feature, and it's going to be the
|
20
|
+
default behavior in rspec-3. This lets you add metadata to a group or example
|
21
|
+
like this:
|
22
|
+
|
23
|
+
describe "something", :awesome do
|
24
|
+
...
|
25
|
+
|
26
|
+
And then you can run that group (or example) using the tags feature:
|
27
|
+
|
28
|
+
rspec spec --tag awesome
|
29
|
+
|
30
|
+
We're making this an opt-in for rspec-2.6 because `describe "string", :symbol`
|
31
|
+
is a perfectly legal construct in pre-2.6 releases and we want to maintain
|
32
|
+
compatibility in minor releases as much as is possible.
|
33
|
+
|
1
34
|
# rspec-core-2.3
|
2
35
|
|
3
36
|
## `config.expect_with`
|
@@ -106,7 +139,7 @@ The most obvious use is for filtering the run. For example:
|
|
106
139
|
end
|
107
140
|
|
108
141
|
When you run the `rspec` command, rspec will run only the examples that have
|
109
|
-
`:focus => true` in the hash.
|
142
|
+
`:focus => true` in the hash.
|
110
143
|
|
111
144
|
You can also add `run_all_when_everything_filtered` to the config:
|
112
145
|
|
@@ -207,7 +240,7 @@ A few things changed in the Rake task used to run specs:
|
|
207
240
|
the `rspec` command no longer supports the `--options` command line option
|
208
241
|
so the options must be embedded directly in the Rakefile, or stored in the
|
209
242
|
`.rspec` files mentioned above.
|
210
|
-
|
243
|
+
|
211
244
|
3. In RSpec-1, the rake task would read in rcov options from an `rcov.opts`
|
212
245
|
file. This is ignored by RSpec-2. RCov options are now set directly on the Rake
|
213
246
|
task:
|
@@ -33,19 +33,19 @@ Feature: --tag option
|
|
33
33
|
|
34
34
|
Scenario: filter examples with a simple tag
|
35
35
|
When I run `rspec . --tag focus`
|
36
|
-
Then the output should contain "Run filtered
|
36
|
+
Then the output should contain "Run filtered including {:focus=>true}"
|
37
37
|
And the examples should all pass
|
38
38
|
|
39
39
|
Scenario: filter examples with a simple tag and @
|
40
40
|
When I run `rspec . --tag @focus`
|
41
|
-
Then the output should contain "Run filtered
|
41
|
+
Then the output should contain "Run filtered including {:focus=>true}"
|
42
42
|
Then the examples should all pass
|
43
43
|
|
44
44
|
Scenario: filter examples with a name:value tag
|
45
45
|
When I run `rspec . --tag type:special`
|
46
46
|
Then the output should contain:
|
47
47
|
"""
|
48
|
-
Run filtered
|
48
|
+
Run filtered including {:type=>"special"}
|
49
49
|
"""
|
50
50
|
And the output should contain "2 examples"
|
51
51
|
And the examples should all pass
|
@@ -54,7 +54,7 @@ Feature: --tag option
|
|
54
54
|
When I run `rspec . --tag @type:special`
|
55
55
|
Then the output should contain:
|
56
56
|
"""
|
57
|
-
Run filtered
|
57
|
+
Run filtered including {:type=>"special"}
|
58
58
|
"""
|
59
59
|
And the examples should all pass
|
60
60
|
|
@@ -86,5 +86,5 @@ Feature: --tag option
|
|
86
86
|
|
87
87
|
Scenario: filter examples with a simple tag, exclude examples with another tag
|
88
88
|
When I run `rspec . --tag focus --tag ~skip`
|
89
|
-
Then the output should contain "Run filtered
|
89
|
+
Then the output should contain "Run filtered including {:focus=>true}, excluding {:skip=>true}"
|
90
90
|
And the examples should all pass
|
@@ -32,7 +32,7 @@ Feature: run all when everything filtered
|
|
32
32
|
end
|
33
33
|
"""
|
34
34
|
When I run `rspec spec/sample_spec.rb --format doc`
|
35
|
-
Then the output should contain "No examples
|
35
|
+
Then the output should contain "No examples matched {:focus=>true}"
|
36
36
|
And the examples should all pass
|
37
37
|
And the output should contain:
|
38
38
|
"""
|
@@ -26,8 +26,9 @@ module RSpec
|
|
26
26
|
add_setting :profile_examples
|
27
27
|
add_setting :fail_fast
|
28
28
|
add_setting :run_all_when_everything_filtered
|
29
|
-
add_setting :filter
|
30
29
|
add_setting :exclusion_filter
|
30
|
+
add_setting :inclusion_filter
|
31
|
+
add_setting :filter, :alias => :inclusion_filter
|
31
32
|
add_setting :filename_pattern, :default => '**/*_spec.rb'
|
32
33
|
add_setting :files_to_run
|
33
34
|
add_setting :include_or_extend_modules
|
@@ -36,6 +37,11 @@ module RSpec
|
|
36
37
|
add_setting :treat_symbols_as_metadata_keys_with_true_values, :default => false
|
37
38
|
add_setting :expecting_with_rspec
|
38
39
|
|
40
|
+
CONDITIONAL_FILTERS = {
|
41
|
+
:if => lambda { |value, metadata| metadata.has_key?(:if) && !value },
|
42
|
+
:unless => lambda { |value| value }
|
43
|
+
}
|
44
|
+
|
39
45
|
def initialize
|
40
46
|
@color_enabled = false
|
41
47
|
self.include_or_extend_modules = []
|
@@ -48,10 +54,7 @@ module RSpec
|
|
48
54
|
/lib\/rspec\/(core|expectations|matchers|mocks)/
|
49
55
|
]
|
50
56
|
|
51
|
-
self.exclusion_filter =
|
52
|
-
:if => lambda { |value, metadata| metadata.has_key?(:if) && !value },
|
53
|
-
:unless => lambda { |value| value }
|
54
|
-
}
|
57
|
+
self.exclusion_filter = CONDITIONAL_FILTERS.dup
|
55
58
|
end
|
56
59
|
|
57
60
|
# :call-seq:
|
@@ -105,7 +108,7 @@ module RSpec
|
|
105
108
|
end
|
106
109
|
|
107
110
|
def clear_inclusion_filter # :nodoc:
|
108
|
-
self.
|
111
|
+
self.inclusion_filter = nil
|
109
112
|
end
|
110
113
|
|
111
114
|
def cleaned_from_backtrace?(line)
|
@@ -335,6 +338,14 @@ EOM
|
|
335
338
|
RSpec::Core::ExampleGroup.alias_it_should_behave_like_to(new_name, report_label)
|
336
339
|
end
|
337
340
|
|
341
|
+
def exclusion_filter=(filter)
|
342
|
+
settings[:exclusion_filter] = filter
|
343
|
+
end
|
344
|
+
|
345
|
+
def inclusion_filter=(filter)
|
346
|
+
settings[:inclusion_filter] = filter
|
347
|
+
end
|
348
|
+
|
338
349
|
def filter_run_including(*args)
|
339
350
|
force_overwrite = if args.last.is_a?(Hash) || args.last.is_a?(Symbol)
|
340
351
|
false
|
@@ -344,14 +355,14 @@ EOM
|
|
344
355
|
|
345
356
|
options = build_metadata_hash_from(args)
|
346
357
|
|
347
|
-
if
|
358
|
+
if inclusion_filter and inclusion_filter[:line_number] || inclusion_filter[:full_description]
|
348
359
|
warn "Filtering by #{options.inspect} is not possible since " \
|
349
|
-
"you are already filtering by #{
|
360
|
+
"you are already filtering by #{inclusion_filter.inspect}"
|
350
361
|
else
|
351
362
|
if force_overwrite
|
352
|
-
self.
|
363
|
+
self.inclusion_filter = options
|
353
364
|
else
|
354
|
-
self.
|
365
|
+
self.inclusion_filter = (inclusion_filter || {}).merge(options)
|
355
366
|
end
|
356
367
|
end
|
357
368
|
end
|
data/lib/rspec/core/version.rb
CHANGED
data/lib/rspec/core/world.rb
CHANGED
@@ -2,6 +2,29 @@ module RSpec
|
|
2
2
|
module Core
|
3
3
|
class World
|
4
4
|
|
5
|
+
module Describable
|
6
|
+
PROC_HEX_NUMBER = /0x[0-9a-f]+@/
|
7
|
+
PROJECT_DIR = File.expand_path('.')
|
8
|
+
|
9
|
+
def description
|
10
|
+
reject { |k, v| RSpec::Core::Configuration::CONDITIONAL_FILTERS[k] == v }.inspect.gsub(PROC_HEX_NUMBER, '').gsub(PROJECT_DIR, '.').gsub(' (lambda)','')
|
11
|
+
end
|
12
|
+
|
13
|
+
def empty_without_conditional_filters?
|
14
|
+
reject { |k, v| RSpec::Core::Configuration::CONDITIONAL_FILTERS[k] == v }.empty?
|
15
|
+
end
|
16
|
+
|
17
|
+
def reject
|
18
|
+
super rescue {}
|
19
|
+
end
|
20
|
+
|
21
|
+
def empty?
|
22
|
+
super rescue false
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
include RSpec::Core::Hooks
|
27
|
+
|
5
28
|
attr_reader :example_groups, :filtered_examples, :wants_to_quit
|
6
29
|
attr_writer :wants_to_quit
|
7
30
|
|
@@ -24,11 +47,11 @@ module RSpec
|
|
24
47
|
end
|
25
48
|
|
26
49
|
def inclusion_filter
|
27
|
-
@configuration.
|
50
|
+
@configuration.inclusion_filter.extend(Describable)
|
28
51
|
end
|
29
52
|
|
30
53
|
def exclusion_filter
|
31
|
-
@configuration.exclusion_filter
|
54
|
+
@configuration.exclusion_filter.extend(Describable)
|
32
55
|
end
|
33
56
|
|
34
57
|
def configure_group(group)
|
@@ -59,40 +82,53 @@ module RSpec
|
|
59
82
|
end
|
60
83
|
end
|
61
84
|
|
85
|
+
def reporter
|
86
|
+
@configuration.reporter
|
87
|
+
end
|
88
|
+
|
62
89
|
def announce_filters
|
63
90
|
filter_announcements = []
|
91
|
+
|
92
|
+
if @configuration.run_all_when_everything_filtered? && example_count.zero?
|
93
|
+
reporter.message( "No examples matched #{inclusion_filter.description}. Running all.")
|
94
|
+
filtered_examples.clear
|
95
|
+
@configuration.clear_inclusion_filter
|
96
|
+
end
|
97
|
+
|
64
98
|
announce_inclusion_filter filter_announcements
|
65
99
|
announce_exclusion_filter filter_announcements
|
66
100
|
|
67
|
-
|
68
|
-
|
101
|
+
if example_count.zero?
|
102
|
+
example_groups.clear
|
103
|
+
if filter_announcements.empty?
|
104
|
+
reporter.message("No examples found.")
|
105
|
+
elsif inclusion_filter
|
106
|
+
message = "No examples matched #{inclusion_filter.description}."
|
107
|
+
if @configuration.run_all_when_everything_filtered?
|
108
|
+
message << " Running all."
|
109
|
+
end
|
110
|
+
reporter.message(message)
|
111
|
+
elsif exclusion_filter
|
112
|
+
reporter.message(
|
113
|
+
"No examples were matched. Perhaps #{exclusion_filter.description} is excluding everything?")
|
114
|
+
end
|
115
|
+
else
|
116
|
+
reporter.message("Run filtered #{filter_announcements.join(', ')}")
|
69
117
|
end
|
70
118
|
end
|
71
119
|
|
72
120
|
def announce_inclusion_filter(announcements)
|
73
121
|
if inclusion_filter
|
74
|
-
|
75
|
-
@configuration.reporter.message "No examples were matched by #{inclusion_filter.inspect}, running all"
|
76
|
-
@configuration.clear_inclusion_filter
|
77
|
-
filtered_examples.clear
|
78
|
-
else
|
79
|
-
announcements << "using #{inclusion_filter.inspect}"
|
80
|
-
end
|
122
|
+
announcements << "including #{inclusion_filter.description}"
|
81
123
|
end
|
82
124
|
end
|
83
|
-
|
125
|
+
|
84
126
|
def announce_exclusion_filter(announcements)
|
85
|
-
|
86
|
-
|
87
|
-
"No examples were matched. Perhaps #{exclusion_filter.inspect} is excluding everything?")
|
88
|
-
example_groups.clear
|
89
|
-
else
|
90
|
-
announcements << "excluding #{exclusion_filter.inspect}"
|
127
|
+
unless exclusion_filter.empty_without_conditional_filters?
|
128
|
+
announcements << "excluding #{exclusion_filter.description}"
|
91
129
|
end
|
92
130
|
end
|
93
131
|
|
94
|
-
include RSpec::Core::Hooks
|
95
|
-
|
96
132
|
def find_hook(hook, scope, group, example = nil)
|
97
133
|
@configuration.find_hook(hook, scope, group, example)
|
98
134
|
end
|
@@ -5,8 +5,9 @@ class Foo; end
|
|
5
5
|
|
6
6
|
module RSpec::Core
|
7
7
|
|
8
|
-
describe World do
|
9
|
-
let(:
|
8
|
+
describe RSpec::Core::World do
|
9
|
+
let(:configuration) { RSpec::Core::Configuration.new }
|
10
|
+
let(:world) { RSpec::Core::World.new(configuration) }
|
10
11
|
|
11
12
|
describe "#example_groups" do
|
12
13
|
it "contains all registered example groups" do
|
@@ -192,6 +193,103 @@ module RSpec::Core
|
|
192
193
|
end
|
193
194
|
end
|
194
195
|
|
195
|
-
|
196
|
+
describe "#announce_filters" do
|
197
|
+
let(:reporter) { double('reporter').as_null_object }
|
198
|
+
before { world.stub(:reporter) { reporter } }
|
199
|
+
|
200
|
+
context "with no examples" do
|
201
|
+
before { world.stub(:example_count) { 0 } }
|
202
|
+
|
203
|
+
context "with no filters" do
|
204
|
+
it "announces" do
|
205
|
+
reporter.should_receive(:message).
|
206
|
+
with("No examples found.")
|
207
|
+
world.announce_filters
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
context "with an inclusion filter" do
|
212
|
+
it "announces" do
|
213
|
+
configuration.inclusion_filter = { :foo => 'bar' }
|
214
|
+
reporter.should_receive(:message).
|
215
|
+
with("No examples matched #{{ :foo => 'bar' }.inspect}.")
|
216
|
+
world.announce_filters
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
context "with an inclusion filter and run_all_when_everything_filtered" do
|
221
|
+
it "announces" do
|
222
|
+
configuration.stub(:run_all_when_everything_filtered?) { true }
|
223
|
+
configuration.inclusion_filter = { :foo => 'bar' }
|
224
|
+
reporter.should_receive(:message).
|
225
|
+
with("No examples matched #{{ :foo => 'bar' }.inspect}. Running all.")
|
226
|
+
world.announce_filters
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
context "with an exclusion filter" do
|
231
|
+
it "announces" do
|
232
|
+
configuration.exclusion_filter = { :foo => 'bar' }
|
233
|
+
reporter.should_receive(:message).
|
234
|
+
with("No examples were matched. Perhaps #{{ :foo => 'bar' }.inspect} is excluding everything?")
|
235
|
+
world.announce_filters
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
describe "#inclusion_filter" do
|
242
|
+
describe "#description" do
|
243
|
+
it 'cleans up the description' do
|
244
|
+
# check the assumptions of this example
|
245
|
+
project_dir = File.expand_path('.')
|
246
|
+
lambda { }.inspect.should include(project_dir)
|
247
|
+
lambda { }.inspect.should include('0x')
|
248
|
+
lambda { }.inspect.should include(' (lambda)') if RUBY_VERSION > '1.9'
|
249
|
+
|
250
|
+
configuration.filter_run :foo => lambda { }
|
251
|
+
world.inclusion_filter.description.should_not include('0x')
|
252
|
+
world.inclusion_filter.description.should_not include(project_dir)
|
253
|
+
world.inclusion_filter.description.should_not include(' (lambda)')
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
describe "#exclusion_filter" do
|
259
|
+
describe "#description" do
|
260
|
+
it 'returns `{}` when it only contains the default filters' do
|
261
|
+
world.exclusion_filter.description.should == {}.inspect
|
262
|
+
end
|
263
|
+
|
264
|
+
it 'includes other filters' do
|
265
|
+
configuration.exclusion_filter[:foo] = :bar
|
266
|
+
world.exclusion_filter.description.should == { :foo => :bar }.inspect
|
267
|
+
end
|
268
|
+
|
269
|
+
it 'includes an overriden :if filter' do
|
270
|
+
configuration.exclusion_filter[:if] = :custom_filter
|
271
|
+
world.exclusion_filter.description.should == { :if => :custom_filter }.inspect
|
272
|
+
end
|
273
|
+
|
274
|
+
it 'includes an overriden :unless filter' do
|
275
|
+
configuration.exclusion_filter[:unless] = :custom_filter
|
276
|
+
world.exclusion_filter.description.should == { :unless => :custom_filter }.inspect
|
277
|
+
end
|
196
278
|
|
279
|
+
it 'cleans up the description' do
|
280
|
+
# check the assumptions of this example
|
281
|
+
project_dir = File.expand_path('.')
|
282
|
+
lambda { }.inspect.should include(project_dir)
|
283
|
+
lambda { }.inspect.should include('0x')
|
284
|
+
lambda { }.inspect.should include(' (lambda)') if RUBY_VERSION > '1.9'
|
285
|
+
|
286
|
+
configuration.exclusion_filter[:foo] = lambda { }
|
287
|
+
configuration.filter_run_excluding :bar => lambda { }
|
288
|
+
world.exclusion_filter.description.should_not include('0x')
|
289
|
+
world.exclusion_filter.description.should_not include(project_dir)
|
290
|
+
world.exclusion_filter.description.should_not include(' (lambda)')
|
291
|
+
end
|
292
|
+
end
|
293
|
+
end
|
294
|
+
end
|
197
295
|
end
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15424061
|
5
5
|
prerelease: 6
|
6
6
|
segments:
|
7
7
|
- 2
|
8
8
|
- 6
|
9
9
|
- 0
|
10
10
|
- rc
|
11
|
-
-
|
12
|
-
version: 2.6.0.
|
11
|
+
- 4
|
12
|
+
version: 2.6.0.rc4
|
13
13
|
platform: ruby
|
14
14
|
authors:
|
15
15
|
- Chad Humphries
|
@@ -18,7 +18,7 @@ autorequire:
|
|
18
18
|
bindir: bin
|
19
19
|
cert_chain: []
|
20
20
|
|
21
|
-
date: 2011-
|
21
|
+
date: 2011-05-01 00:00:00 -04:00
|
22
22
|
default_executable:
|
23
23
|
dependencies: []
|
24
24
|
|
@@ -242,10 +242,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
242
242
|
requirements: []
|
243
243
|
|
244
244
|
rubyforge_project: rspec
|
245
|
-
rubygems_version: 1.
|
245
|
+
rubygems_version: 1.6.2
|
246
246
|
signing_key:
|
247
247
|
specification_version: 3
|
248
|
-
summary: rspec-core-2.6.0.
|
248
|
+
summary: rspec-core-2.6.0.rc4
|
249
249
|
test_files:
|
250
250
|
- features/Autotest.md
|
251
251
|
- features/Changelog.md
|