rspec-core 2.0.0.beta.19 → 2.0.0.beta.20
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/.gitignore +1 -0
- data/Upgrade.markdown +6 -0
- data/VERSION +1 -1
- data/features/example_groups/shared_example_group.feature +44 -7
- data/features/filtering/exclusion_filters.feature +79 -0
- data/features/filtering/inclusion_filters.feature +1 -1
- data/features/hooks/around_hooks.feature +28 -1
- data/features/pending/pending_examples.feature +2 -4
- data/features/spec_files/arbitrary_file_suffix.feature +13 -0
- data/lib/autotest/rspec2.rb +17 -17
- data/lib/rspec/core.rb +2 -2
- data/lib/rspec/core/command_line.rb +2 -1
- data/lib/rspec/core/configuration.rb +23 -9
- data/lib/rspec/core/deprecation.rb +1 -1
- data/lib/rspec/core/example_group.rb +11 -28
- data/lib/rspec/core/extensions.rb +4 -0
- data/lib/rspec/core/extensions/instance_eval_with_args.rb +39 -0
- data/lib/rspec/core/{kernel_extensions.rb → extensions/kernel.rb} +0 -0
- data/lib/rspec/core/extensions/module_eval_with_args.rb +54 -0
- data/lib/rspec/core/{object_extensions.rb → extensions/object.rb} +3 -1
- data/lib/rspec/core/formatters/base_formatter.rb +20 -43
- data/lib/rspec/core/formatters/base_text_formatter.rb +13 -10
- data/lib/rspec/core/formatters/documentation_formatter.rb +4 -4
- data/lib/rspec/core/formatters/html_formatter.rb +4 -4
- data/lib/rspec/core/formatters/progress_formatter.rb +4 -4
- data/lib/rspec/core/rake_task.rb +1 -1
- data/lib/rspec/core/reporter.rb +65 -0
- data/lib/rspec/core/subject.rb +1 -1
- data/lib/rspec/core/world.rb +11 -3
- data/rspec-core.gemspec +26 -14
- data/spec/autotest/failed_results_re_spec.rb +14 -23
- data/spec/autotest/rspec_spec.rb +1 -1
- data/spec/rspec/core/configuration_spec.rb +74 -9
- data/spec/rspec/core/drb_command_line_spec.rb +2 -2
- data/spec/rspec/core/example_group_spec.rb +13 -7
- data/spec/rspec/core/example_spec.rb +4 -4
- data/spec/rspec/core/formatters/html_formatted-1.8.6.html +280 -0
- data/spec/rspec/core/formatters/html_formatter_spec.rb +5 -3
- data/spec/rspec/core/formatters/progress_formatter_spec.rb +3 -3
- data/spec/rspec/core/formatters/snippet_extractor_spec.rb +2 -2
- data/spec/rspec/core/formatters/text_mate_formatted-1.8.6.html +280 -0
- data/spec/rspec/core/formatters/text_mate_formatter_spec.rb +5 -3
- data/spec/rspec/core/hooks_filtering_spec.rb +104 -0
- data/spec/rspec/core/reporter_spec.rb +34 -0
- data/spec/rspec/core/shared_example_group_spec.rb +22 -2
- data/spec/rspec/core/world_spec.rb +10 -8
- data/spec/rspec/{core/core_spec.rb → core_spec.rb} +0 -0
- data/spec/ruby_forker.rb +1 -1
- data/spec/spec_helper.rb +2 -2
- metadata +39 -33
data/.gitignore
CHANGED
data/Upgrade.markdown
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.0.0.beta.
|
1
|
+
2.0.0.beta.20
|
@@ -20,9 +20,11 @@ Feature: Shared example group
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
describe "#
|
24
|
-
|
25
|
-
|
23
|
+
describe "#include?" do
|
24
|
+
context "with an an item in the collection" do
|
25
|
+
it "returns true" do
|
26
|
+
@instance.include?(7).should be_true
|
27
|
+
end
|
26
28
|
end
|
27
29
|
end
|
28
30
|
end
|
@@ -43,15 +45,17 @@ Feature: Shared example group
|
|
43
45
|
it should behave like a collection object
|
44
46
|
initialized with 3 items
|
45
47
|
has three items
|
46
|
-
#
|
47
|
-
|
48
|
+
#include?
|
49
|
+
with an an item in the collection
|
50
|
+
returns true
|
48
51
|
|
49
52
|
Set
|
50
53
|
it should behave like a collection object
|
51
54
|
initialized with 3 items
|
52
55
|
has three items
|
53
|
-
#
|
54
|
-
|
56
|
+
#include?
|
57
|
+
with an an item in the collection
|
58
|
+
returns true
|
55
59
|
"""
|
56
60
|
|
57
61
|
Scenario: Using a shared example group with a block
|
@@ -96,6 +100,39 @@ Feature: Shared example group
|
|
96
100
|
adds objects to the end of the collection
|
97
101
|
"""
|
98
102
|
|
103
|
+
@wip
|
104
|
+
Scenario: Passing parameters to a shared example group
|
105
|
+
Given a file named "shared_example_group_params_spec.rb" with:
|
106
|
+
"""
|
107
|
+
shared_examples_for "a measurable object" do |measurement_method, measurement|
|
108
|
+
it "should return #{measurement} from ##{measurement_method}" do
|
109
|
+
subject.send(measurement_method).should == measurement
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
describe Array, "with 3 items" do
|
114
|
+
subject { [1, 2, 3] }
|
115
|
+
it_should_behave_like "a measurable object", :size, 3
|
116
|
+
end
|
117
|
+
|
118
|
+
describe String, "of 6 characters" do
|
119
|
+
subject { "FooBar" }
|
120
|
+
it_should_behave_like "a measurable object", :length, 6
|
121
|
+
end
|
122
|
+
"""
|
123
|
+
When I run "rspec shared_example_group_params_spec.rb --format documentation"
|
124
|
+
Then the output should contain "2 examples, 0 failures"
|
125
|
+
And the output should contain:
|
126
|
+
"""
|
127
|
+
Array with 3 items
|
128
|
+
it should behave like a measurable object
|
129
|
+
should return 3 from #size
|
130
|
+
|
131
|
+
String of 6 characters
|
132
|
+
it should behave like a measurable object
|
133
|
+
should return 6 from #length
|
134
|
+
"""
|
135
|
+
|
99
136
|
Scenario: Aliasing "it_should_behave_like" to "it_has_behavior"
|
100
137
|
Given a file named "shared_example_group_spec.rb" with:
|
101
138
|
"""
|
@@ -0,0 +1,79 @@
|
|
1
|
+
Feature: exclusion filters
|
2
|
+
|
3
|
+
Scenario: exclude one example
|
4
|
+
Given a file named "spec/sample_spec.rb" with:
|
5
|
+
"""
|
6
|
+
RSpec.configure do |c|
|
7
|
+
c.filter_run_excluding :broken => true
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "something" do
|
11
|
+
it "does one thing" do
|
12
|
+
end
|
13
|
+
|
14
|
+
it "does another thing", :broken => true do
|
15
|
+
end
|
16
|
+
end
|
17
|
+
"""
|
18
|
+
When I run "rspec ./spec/sample_spec.rb --format doc"
|
19
|
+
Then the output should contain "does one thing"
|
20
|
+
And the output should not contain "does another thing"
|
21
|
+
|
22
|
+
Scenario: exclude one group
|
23
|
+
Given a file named "spec/sample_spec.rb" with:
|
24
|
+
"""
|
25
|
+
RSpec.configure do |c|
|
26
|
+
c.filter_run_excluding :broken => true
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "group 1", :broken => true do
|
30
|
+
it "group 1 example 1" do
|
31
|
+
end
|
32
|
+
|
33
|
+
it "group 1 example 2" do
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "group 2" do
|
38
|
+
it "group 2 example 1" do
|
39
|
+
end
|
40
|
+
end
|
41
|
+
"""
|
42
|
+
When I run "rspec ./spec/sample_spec.rb --format doc"
|
43
|
+
Then the output should contain "group 2 example 1"
|
44
|
+
And the output should not contain "group 1 example 1"
|
45
|
+
And the output should not contain "group 1 example 2"
|
46
|
+
|
47
|
+
Scenario: exclude all groups
|
48
|
+
Given a file named "spec/sample_spec.rb" with:
|
49
|
+
"""
|
50
|
+
RSpec.configure do |c|
|
51
|
+
c.filter_run_excluding :broken => true
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "group 1", :broken => true do
|
55
|
+
before(:all) do
|
56
|
+
raise "you should not see me"
|
57
|
+
end
|
58
|
+
|
59
|
+
it "group 1 example 1" do
|
60
|
+
end
|
61
|
+
|
62
|
+
it "group 1 example 2" do
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "group 2", :broken => true do
|
67
|
+
before(:each) do
|
68
|
+
raise "you should not see me"
|
69
|
+
end
|
70
|
+
|
71
|
+
it "group 2 example 1" do
|
72
|
+
end
|
73
|
+
end
|
74
|
+
"""
|
75
|
+
When I run "rspec ./spec/sample_spec.rb --format doc"
|
76
|
+
Then the output should contain "No examples were matched. Perhaps {:broken=>true} is excluding everything?"
|
77
|
+
And the output should contain "0 examples, 0 failures"
|
78
|
+
And the output should not contain "group 1"
|
79
|
+
And the output should not contain "group 2"
|
@@ -27,6 +27,33 @@ Feature: around hooks
|
|
27
27
|
around each after
|
28
28
|
"""
|
29
29
|
|
30
|
+
Scenario: argument passed to around hook can be treated as a proc
|
31
|
+
Given a file named "treat_around_hook_arg_as_a_proc.rb" with:
|
32
|
+
"""
|
33
|
+
describe "around filter" do
|
34
|
+
def perform_around
|
35
|
+
puts "around each before"
|
36
|
+
yield
|
37
|
+
puts "around each after"
|
38
|
+
end
|
39
|
+
|
40
|
+
around(:each) do |example|
|
41
|
+
perform_around(&example)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "gets run in order" do
|
45
|
+
puts "in the example"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
"""
|
49
|
+
When I run "rspec ./treat_around_hook_arg_as_a_proc.rb"
|
50
|
+
Then the output should contain:
|
51
|
+
"""
|
52
|
+
around each before
|
53
|
+
in the example
|
54
|
+
around each after
|
55
|
+
"""
|
56
|
+
|
30
57
|
Scenario: around hooks defined globally are run
|
31
58
|
Given a file named "ensure_around_blocks_are_run.rb" with:
|
32
59
|
"""
|
@@ -85,7 +112,7 @@ Feature: around hooks
|
|
85
112
|
around each after
|
86
113
|
"""
|
87
114
|
|
88
|
-
Scenario: before/after(:
|
115
|
+
Scenario: before/after(:all) hooks are NOT wrapped by the around hook
|
89
116
|
Given a file named "ensure_around_blocks_are_run.rb" with:
|
90
117
|
"""
|
91
118
|
describe "around filter" do
|
@@ -28,10 +28,9 @@ Feature: pending examples
|
|
28
28
|
"""
|
29
29
|
When I run "rspec ./pending_without_block_spec.rb"
|
30
30
|
Then the exit status should be 0
|
31
|
+
And the output should contain "1 example, 0 failures, 1 pending"
|
31
32
|
And the output should contain:
|
32
33
|
"""
|
33
|
-
1 example, 0 failures, 1 pending
|
34
|
-
|
35
34
|
Pending:
|
36
35
|
an example is implemented but waiting
|
37
36
|
# something else getting finished
|
@@ -51,10 +50,9 @@ Feature: pending examples
|
|
51
50
|
"""
|
52
51
|
When I run "rspec ./pending_with_failing_block_spec.rb"
|
53
52
|
Then the exit status should be 0
|
53
|
+
And the output should contain "1 example, 0 failures, 1 pending"
|
54
54
|
And the output should contain:
|
55
55
|
"""
|
56
|
-
1 example, 0 failures, 1 pending
|
57
|
-
|
58
56
|
Pending:
|
59
57
|
an example is implemented but waiting
|
60
58
|
# something else getting finished
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Feature: arbitrary file suffix
|
2
|
+
|
3
|
+
Scenario: .spec
|
4
|
+
Given a file named "a.spec" with:
|
5
|
+
"""
|
6
|
+
describe "something" do
|
7
|
+
it "does something" do
|
8
|
+
3.should eq(3)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
"""
|
12
|
+
When I run "rspec a.spec"
|
13
|
+
Then the output should contain "1 example, 0 failures"
|
data/lib/autotest/rspec2.rb
CHANGED
@@ -1,19 +1,5 @@
|
|
1
1
|
require 'autotest'
|
2
2
|
|
3
|
-
Autotest.add_hook :initialize do |at|
|
4
|
-
at.clear_mappings
|
5
|
-
# watch out for Ruby bug (1.8.6): %r(/) != /\//
|
6
|
-
at.add_mapping(%r%^spec/.*_spec\.rb$%) { |filename, _|
|
7
|
-
filename
|
8
|
-
}
|
9
|
-
at.add_mapping(%r%^lib/(.*)\.rb$%) { |_, m|
|
10
|
-
["spec/#{m[1]}_spec.rb"]
|
11
|
-
}
|
12
|
-
at.add_mapping(%r%^spec/(spec_helper|shared/.*)\.rb$%) {
|
13
|
-
at.files_matching %r%^spec/.*_spec\.rb$%
|
14
|
-
}
|
15
|
-
end
|
16
|
-
|
17
3
|
class RSpecCommandError < StandardError; end
|
18
4
|
|
19
5
|
class Autotest::Rspec2 < Autotest
|
@@ -22,15 +8,29 @@ class Autotest::Rspec2 < Autotest
|
|
22
8
|
|
23
9
|
def initialize
|
24
10
|
super
|
25
|
-
|
11
|
+
clear_mappings
|
12
|
+
setup_rspec_project_mappings
|
13
|
+
self.failed_results_re = /^\s*\d\)\s(.*?$\n.*?$).*?#\s(.*?):/m
|
26
14
|
self.completed_re = /\n(?:\e\[\d*m)?\d* examples?/m
|
27
15
|
end
|
28
16
|
|
17
|
+
def setup_rspec_project_mappings
|
18
|
+
add_mapping(%r%^spec/.*_spec\.rb$%) { |filename, _|
|
19
|
+
filename
|
20
|
+
}
|
21
|
+
add_mapping(%r%^lib/(.*)\.rb$%) { |_, m|
|
22
|
+
["spec/#{m[1]}_spec.rb"]
|
23
|
+
}
|
24
|
+
add_mapping(%r%^spec/(spec_helper|shared/.*)\.rb$%) {
|
25
|
+
files_matching %r%^spec/.*_spec\.rb$%
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
29
|
def consolidate_failures(failed)
|
30
30
|
filters = new_hash_of_arrays
|
31
31
|
failed.each do |spec, trace|
|
32
|
-
if trace =~
|
33
|
-
filters[$
|
32
|
+
if trace =~ /(.*spec\.rb)/
|
33
|
+
filters[$1] << spec
|
34
34
|
end
|
35
35
|
end
|
36
36
|
return filters
|
data/lib/rspec/core.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require 'rspec/core/
|
2
|
-
require 'rspec/core/object_extensions'
|
1
|
+
require 'rspec/core/extensions'
|
3
2
|
require 'rspec/core/load_path'
|
4
3
|
require 'rspec/core/deprecation'
|
4
|
+
require 'rspec/core/reporter'
|
5
5
|
require 'rspec/core/formatters'
|
6
6
|
|
7
7
|
require 'rspec/core/hooks'
|
@@ -15,9 +15,10 @@ module RSpec
|
|
15
15
|
@options.configure(@configuration)
|
16
16
|
@configuration.error_stream = err
|
17
17
|
@configuration.output_stream ||= out
|
18
|
-
@configuration.
|
18
|
+
@configuration.load_spec_files
|
19
19
|
@configuration.configure_mock_framework
|
20
20
|
@world.announce_inclusion_filter
|
21
|
+
@world.announce_exclusion_filter
|
21
22
|
|
22
23
|
@configuration.reporter.report(example_count) do |reporter|
|
23
24
|
begin
|
@@ -127,7 +127,7 @@ module RSpec
|
|
127
127
|
def color_enabled=(bool)
|
128
128
|
return unless bool
|
129
129
|
settings[:color_enabled] = true
|
130
|
-
if bool && ::
|
130
|
+
if bool && ::RbConfig::CONFIG['host_os'] =~ /mswin|mingw/
|
131
131
|
orig_output_stream = settings[:output_stream]
|
132
132
|
begin
|
133
133
|
require 'Win32/Console/ANSI'
|
@@ -204,7 +204,9 @@ EOM
|
|
204
204
|
@formatter ||= formatter_class.new(output)
|
205
205
|
end
|
206
206
|
|
207
|
-
|
207
|
+
def reporter
|
208
|
+
@reporter ||= Reporter.new(formatter)
|
209
|
+
end
|
208
210
|
|
209
211
|
def files_or_directories_to_run=(*files)
|
210
212
|
self.files_to_run = files.flatten.collect do |file|
|
@@ -255,8 +257,12 @@ EOM
|
|
255
257
|
end
|
256
258
|
|
257
259
|
def filter_run_including(options={})
|
258
|
-
|
259
|
-
|
260
|
+
if filter and filter[:line_number] || filter[:full_description]
|
261
|
+
warn "Filtering by #{options.inspect} is not possible since " \
|
262
|
+
"you are already filtering by #{filter.inspect}"
|
263
|
+
else
|
264
|
+
self.filter = options
|
265
|
+
end
|
260
266
|
end
|
261
267
|
|
262
268
|
alias_method :filter_run, :filter_run_including
|
@@ -273,9 +279,17 @@ EOM
|
|
273
279
|
include_or_extend_modules << [:extend, mod, filters]
|
274
280
|
end
|
275
281
|
|
276
|
-
def
|
277
|
-
|
278
|
-
group.
|
282
|
+
def configure_group(group)
|
283
|
+
modules = {
|
284
|
+
:include => [] + group.included_modules,
|
285
|
+
:extend => [] + group.ancestors
|
286
|
+
}
|
287
|
+
|
288
|
+
include_or_extend_modules.each do |include_or_extend, mod, filters|
|
289
|
+
next unless group.all_apply?(filters)
|
290
|
+
next if modules[include_or_extend].include?(mod)
|
291
|
+
modules[include_or_extend] << mod
|
292
|
+
group.send(include_or_extend, mod)
|
279
293
|
end
|
280
294
|
end
|
281
295
|
|
@@ -284,8 +298,8 @@ EOM
|
|
284
298
|
RSpec::Core::ExampleGroup.send(:include, RSpec::Core::MockFrameworkAdapter)
|
285
299
|
end
|
286
300
|
|
287
|
-
def
|
288
|
-
files_to_run.map {|f|
|
301
|
+
def load_spec_files
|
302
|
+
files_to_run.map {|f| load File.expand_path(f) }
|
289
303
|
end
|
290
304
|
end
|
291
305
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module RSpec
|
2
2
|
module Core
|
3
3
|
class ExampleGroup
|
4
|
+
extend Extensions::ModuleEvalWithArgs
|
5
|
+
include Extensions::InstanceEvalWithArgs
|
4
6
|
extend Hooks
|
5
7
|
include Subject
|
6
8
|
include Let
|
@@ -33,6 +35,7 @@ module RSpec
|
|
33
35
|
|
34
36
|
delegate_to_metadata :description, :describes, :file_path
|
35
37
|
alias_method :display_name, :description
|
38
|
+
alias_method :described_class, :describes
|
36
39
|
end
|
37
40
|
|
38
41
|
def self.define_example_method(name, extra_options={})
|
@@ -59,15 +62,15 @@ module RSpec
|
|
59
62
|
alias_example_to :pending, :pending => true
|
60
63
|
|
61
64
|
def self.define_shared_group_method(new_name, report_label=nil)
|
62
|
-
report_label = "it should behave like" unless report_label
|
63
65
|
module_eval(<<-END_RUBY, __FILE__, __LINE__)
|
64
|
-
def self.#{new_name}(name, &customization_block)
|
66
|
+
def self.#{new_name}(name, *args, &customization_block)
|
65
67
|
shared_block = world.shared_example_groups[name]
|
66
68
|
raise "Could not find shared example group named \#{name.inspect}" unless shared_block
|
67
69
|
|
68
|
-
|
69
|
-
|
70
|
-
|
70
|
+
describe("#{report_label || "it should behave like"} \#{name}") do
|
71
|
+
module_eval_with_args *args, &shared_block
|
72
|
+
module_eval &customization_block if customization_block
|
73
|
+
end
|
71
74
|
end
|
72
75
|
END_RUBY
|
73
76
|
end
|
@@ -145,10 +148,7 @@ module RSpec
|
|
145
148
|
|
146
149
|
def self.set_it_up(*args)
|
147
150
|
@metadata = RSpec::Core::Metadata.new(superclass_metadata).process(*args)
|
148
|
-
|
149
|
-
world.find_modules(self).each do |include_or_extend, mod, opts|
|
150
|
-
send(include_or_extend, mod) unless mixins[include_or_extend].include?(mod)
|
151
|
-
end
|
151
|
+
world.configure_group(self)
|
152
152
|
end
|
153
153
|
|
154
154
|
def self.before_all_ivars
|
@@ -176,7 +176,7 @@ module RSpec
|
|
176
176
|
def self.eval_around_eachs(example_group_instance, wrapped_example)
|
177
177
|
around_hooks.reverse.inject(wrapped_example) do |wrapper, hook|
|
178
178
|
def wrapper.run; call; end
|
179
|
-
lambda { example_group_instance.
|
179
|
+
lambda { example_group_instance.instance_eval_with_args(wrapper, &hook) }
|
180
180
|
end
|
181
181
|
end
|
182
182
|
|
@@ -227,10 +227,6 @@ module RSpec
|
|
227
227
|
end.all?
|
228
228
|
end
|
229
229
|
|
230
|
-
def self.to_s
|
231
|
-
self == RSpec::Core::ExampleGroup ? 'RSpec::Core::ExampleGroup' : name
|
232
|
-
end
|
233
|
-
|
234
230
|
def self.all_apply?(filters)
|
235
231
|
metadata.all_apply?(filters)
|
236
232
|
end
|
@@ -258,7 +254,7 @@ module RSpec
|
|
258
254
|
end
|
259
255
|
|
260
256
|
def described_class
|
261
|
-
self.class.
|
257
|
+
self.class.described_class
|
262
258
|
end
|
263
259
|
|
264
260
|
def instance_eval_with_rescue(&hook)
|
@@ -268,19 +264,6 @@ module RSpec
|
|
268
264
|
example.set_exception(e)
|
269
265
|
end
|
270
266
|
end
|
271
|
-
|
272
|
-
private
|
273
|
-
|
274
|
-
def self.extended_modules #:nodoc:
|
275
|
-
@extended_modules ||= ancestors.select { |mod| mod.class == Module } - [ Object, Kernel ]
|
276
|
-
end
|
277
|
-
|
278
|
-
def self.mixins
|
279
|
-
@mixins ||= {
|
280
|
-
:include => included_modules,
|
281
|
-
:extend => extended_modules
|
282
|
-
}
|
283
|
-
end
|
284
267
|
end
|
285
268
|
end
|
286
269
|
end
|