rspec-core 2.13.1 → 2.14.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/Changelog.md +80 -0
- data/exe/autospec +1 -1
- data/features/README.md +2 -2
- data/features/command_line/format_option.feature +8 -14
- data/features/command_line/line_number_appended_to_path.feature +4 -4
- data/features/command_line/line_number_option.feature +1 -1
- data/features/command_line/rake_task.feature +2 -2
- data/features/command_line/require_option.feature +43 -0
- data/features/command_line/ruby.feature +2 -2
- data/features/command_line/warnings_option.feature +27 -0
- data/features/configuration/backtrace_clean_patterns.feature +2 -2
- data/features/configuration/deprecation_stream.feature +58 -0
- data/features/configuration/pattern.feature +8 -0
- data/features/configuration/profile.feature +59 -2
- data/features/configuration/read_options_from_file.feature +8 -5
- data/features/configuration/run_all_when_everything_filtered.feature +20 -4
- data/features/example_groups/basic_structure.feature +1 -1
- data/features/example_groups/shared_context.feature +1 -1
- data/features/example_groups/shared_examples.feature +72 -0
- data/features/filtering/exclusion_filters.feature +10 -10
- data/features/formatters/custom_formatter.feature +1 -1
- data/features/hooks/before_and_after_hooks.feature +19 -19
- data/features/mock_framework_integration/use_any_framework.feature +6 -6
- data/features/mock_framework_integration/use_flexmock.feature +3 -3
- data/features/mock_framework_integration/use_mocha.feature +3 -3
- data/features/mock_framework_integration/use_rr.feature +3 -3
- data/features/mock_framework_integration/use_rspec.feature +3 -3
- data/features/subject/implicit_subject.feature +1 -1
- data/lib/rspec/core.rb +20 -3
- data/lib/rspec/core/backtrace_cleaner.rb +46 -0
- data/lib/rspec/core/backward_compatibility.rb +3 -13
- data/lib/rspec/core/configuration.rb +136 -49
- data/lib/rspec/core/configuration_options.rb +19 -8
- data/lib/rspec/core/deprecation.rb +18 -30
- data/lib/rspec/core/example.rb +3 -3
- data/lib/rspec/core/example_group.rb +4 -3
- data/lib/rspec/core/extensions/kernel.rb +1 -1
- data/lib/rspec/core/filter_manager.rb +1 -1
- data/lib/rspec/core/formatters.rb +1 -1
- data/lib/rspec/core/formatters/base_formatter.rb +10 -1
- data/lib/rspec/core/formatters/base_text_formatter.rb +47 -10
- data/lib/rspec/core/formatters/deprecation_formatter.rb +35 -0
- data/lib/rspec/core/formatters/helpers.rb +12 -5
- data/lib/rspec/core/formatters/html_formatter.rb +7 -6
- data/lib/rspec/core/formatters/html_printer.rb +13 -12
- data/lib/rspec/core/formatters/json_formatter.rb +1 -2
- data/lib/rspec/core/formatters/text_mate_formatter.rb +1 -1
- data/lib/rspec/core/hooks.rb +9 -0
- data/lib/rspec/core/memoized_helpers.rb +19 -8
- data/lib/rspec/core/metadata.rb +3 -1
- data/lib/rspec/core/mocking/with_flexmock.rb +1 -1
- data/lib/rspec/core/mocking/with_rr.rb +1 -1
- data/lib/rspec/core/option_parser.rb +6 -2
- data/lib/rspec/core/pending.rb +1 -0
- data/lib/rspec/core/rake_task.rb +11 -19
- data/lib/rspec/core/reporter.rb +33 -4
- data/lib/rspec/core/shared_example_group.rb +56 -16
- data/lib/rspec/core/shared_example_group/collection.rb +42 -0
- data/lib/rspec/core/version.rb +1 -1
- data/lib/rspec/core/world.rb +2 -3
- data/spec/autotest/rspec_spec.rb +2 -2
- data/spec/rspec/core/backtrace_cleaner_spec.rb +68 -0
- data/spec/rspec/core/configuration_options_spec.rb +15 -4
- data/spec/rspec/core/configuration_spec.rb +202 -19
- data/spec/rspec/core/deprecation_spec.rb +41 -0
- data/spec/rspec/core/deprecations_spec.rb +10 -12
- data/spec/rspec/core/drb_command_line_spec.rb +1 -1
- data/spec/rspec/core/example_group_spec.rb +37 -36
- data/spec/rspec/core/example_spec.rb +25 -4
- data/spec/rspec/core/filter_manager_spec.rb +6 -6
- data/spec/rspec/core/formatters/base_text_formatter_spec.rb +101 -36
- data/spec/rspec/core/formatters/deprecation_formatter_spec.rb +78 -0
- data/spec/rspec/core/formatters/documentation_formatter_spec.rb +2 -2
- data/spec/rspec/core/formatters/helpers_spec.rb +23 -7
- data/spec/rspec/core/formatters/html_formatted-1.8.7-jruby.html +20 -14
- data/spec/rspec/core/formatters/html_formatted-1.8.7-rbx.html +69 -169
- data/spec/rspec/core/formatters/html_formatted-1.8.7.html +28 -23
- data/spec/rspec/core/formatters/html_formatted-1.9.2.html +42 -33
- data/spec/rspec/core/formatters/html_formatted-1.9.3-jruby.html +17 -23
- data/spec/rspec/core/formatters/html_formatted-1.9.3-rbx.html +57 -157
- data/spec/rspec/core/formatters/html_formatted-1.9.3.html +42 -33
- data/spec/rspec/core/formatters/html_formatted-2.0.0.html +42 -33
- data/spec/rspec/core/formatters/html_formatter_spec.rb +1 -0
- data/spec/rspec/core/formatters/progress_formatter_spec.rb +3 -3
- data/spec/rspec/core/formatters/text_mate_formatted-1.8.7-jruby.html +11 -14
- data/spec/rspec/core/formatters/text_mate_formatted-1.8.7-rbx.html +103 -203
- data/spec/rspec/core/formatters/text_mate_formatted-1.8.7.html +30 -25
- data/spec/rspec/core/formatters/text_mate_formatted-1.9.2.html +42 -33
- data/spec/rspec/core/formatters/text_mate_formatted-1.9.3-jruby.html +20 -14
- data/spec/rspec/core/formatters/text_mate_formatted-1.9.3-rbx.html +103 -203
- data/spec/rspec/core/formatters/text_mate_formatted-1.9.3.html +42 -33
- data/spec/rspec/core/formatters/text_mate_formatted-2.0.0.html +42 -33
- data/spec/rspec/core/formatters/text_mate_formatter_spec.rb +1 -0
- data/spec/rspec/core/memoized_helpers_spec.rb +28 -0
- data/spec/rspec/core/metadata_spec.rb +8 -3
- data/spec/rspec/core/option_parser_spec.rb +8 -0
- data/spec/rspec/core/project_initializer_spec.rb +2 -2
- data/spec/rspec/core/rake_task_spec.rb +8 -8
- data/spec/rspec/core/reporter_spec.rb +26 -6
- data/spec/rspec/core/resources/formatter_specs.rb +3 -3
- data/spec/rspec/core/shared_context_spec.rb +20 -0
- data/spec/rspec/core/shared_example_group/collection_spec.rb +70 -0
- data/spec/rspec/core/shared_example_group_spec.rb +4 -4
- data/spec/rspec/core/world_spec.rb +1 -3
- data/spec/rspec/core_spec.rb +20 -0
- data/spec/spec_helper.rb +29 -29
- data/spec/support/helper_methods.rb +9 -1
- data/spec/support/isolate_load_path_mutation.rb +6 -0
- data/spec/support/sandboxed_mock_space.rb +100 -0
- metadata +28 -13
- data/features/filtering/run_all_when_everything_filtered.feature +0 -46
- data/lib/rspec/core/load_path.rb +0 -3
@@ -30,7 +30,7 @@ module RSpec
|
|
30
30
|
@output.puts " <dd class=\"example passed\"><span class=\"passed_spec_name\">#{h(description)}</span><span class='duration'>#{formatted_run_time}s</span></dd>"
|
31
31
|
end
|
32
32
|
|
33
|
-
def print_example_failed( pending_fixed, description, run_time, failure_id, exception, extra_content )
|
33
|
+
def print_example_failed( pending_fixed, description, run_time, failure_id, exception, extra_content, escape_backtrace = false )
|
34
34
|
formatted_run_time = sprintf("%.5f", run_time)
|
35
35
|
|
36
36
|
@output.puts " <dd class=\"example #{pending_fixed ? 'pending_fixed' : 'failed'}\">"
|
@@ -39,7 +39,11 @@ module RSpec
|
|
39
39
|
@output.puts " <div class=\"failure\" id=\"failure_#{failure_id}\">"
|
40
40
|
if exception
|
41
41
|
@output.puts " <div class=\"message\"><pre>#{h(exception[:message])}</pre></div>"
|
42
|
-
|
42
|
+
if escape_backtrace
|
43
|
+
@output.puts " <div class=\"backtrace\"><pre>#{h exception[:backtrace]}</pre></div>"
|
44
|
+
else
|
45
|
+
@output.puts " <div class=\"backtrace\"><pre>#{exception[:backtrace]}</pre></div>"
|
46
|
+
end
|
43
47
|
end
|
44
48
|
@output.puts extra_content if extra_content
|
45
49
|
@output.puts " </div>"
|
@@ -114,14 +118,14 @@ module RSpec
|
|
114
118
|
</div>
|
115
119
|
|
116
120
|
<div id="display-filters">
|
117
|
-
<input id="passed_checkbox"
|
118
|
-
<input id="failed_checkbox"
|
119
|
-
<input id="pending_checkbox" name="pending_checkbox" type="checkbox" checked onchange="apply_filters()" value="3"
|
121
|
+
<input id="passed_checkbox" name="passed_checkbox" type="checkbox" checked="checked" onchange="apply_filters()" value="1" /> <label for="passed_checkbox">Passed</label>
|
122
|
+
<input id="failed_checkbox" name="failed_checkbox" type="checkbox" checked="checked" onchange="apply_filters()" value="2" /> <label for="failed_checkbox">Failed</label>
|
123
|
+
<input id="pending_checkbox" name="pending_checkbox" type="checkbox" checked="checked" onchange="apply_filters()" value="3" /> <label for="pending_checkbox">Pending</label>
|
120
124
|
</div>
|
121
125
|
|
122
126
|
<div id="summary">
|
123
|
-
<p id="totals"
|
124
|
-
<p id="duration"
|
127
|
+
<p id="totals"> </p>
|
128
|
+
<p id="duration"> </p>
|
125
129
|
</div>
|
126
130
|
</div>
|
127
131
|
|
@@ -371,11 +375,8 @@ a {
|
|
371
375
|
EOF
|
372
376
|
|
373
377
|
HTML_HEADER = <<-EOF
|
374
|
-
|
375
|
-
|
376
|
-
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
377
|
-
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
378
|
-
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
378
|
+
<!DOCTYPE html>
|
379
|
+
<html lang='en'>
|
379
380
|
<head>
|
380
381
|
<title>RSpec results</title>
|
381
382
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
@@ -28,8 +28,7 @@ module RSpec
|
|
28
28
|
}
|
29
29
|
@output_hash[:summary_line] = summary_line(example_count, failure_count, pending_count)
|
30
30
|
|
31
|
-
|
32
|
-
dump_profile if profile_examples? && failure_count == 0
|
31
|
+
dump_profile unless mute_profile_output?(failure_count)
|
33
32
|
end
|
34
33
|
|
35
34
|
def summary_line(example_count, failure_count, pending_count)
|
@@ -17,7 +17,7 @@ module RSpec
|
|
17
17
|
def format_backtrace_line_for_textmate(line)
|
18
18
|
return nil unless line
|
19
19
|
CGI.escapeHTML(line).sub(/([^:]*\.e?rb):(\d*)/) do
|
20
|
-
"<a href=\"txmt://open?url=file://#{File.expand_path($1)}&line=#{$2}\">#{$1}:#{$2}</a> "
|
20
|
+
"<a href=\"txmt://open?url=file://#{File.expand_path($1)}&line=#{$2}\">#{$1}:#{$2}</a> "
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
data/lib/rspec/core/hooks.rb
CHANGED
@@ -242,6 +242,15 @@ module RSpec
|
|
242
242
|
# state of a shared object, resulting in an ordering dependency that can
|
243
243
|
# make it difficult to reason about failures.
|
244
244
|
#
|
245
|
+
# #### unsupported rspec constructs
|
246
|
+
#
|
247
|
+
# RSpec has several constructs that reset state between each example
|
248
|
+
# automatically. These are not intended for use from within `before(:all)`:
|
249
|
+
#
|
250
|
+
# * `let` declarations
|
251
|
+
# * `subject` declarations
|
252
|
+
# * Any mocking, stubbing or test double declaration
|
253
|
+
#
|
245
254
|
# ### other frameworks
|
246
255
|
#
|
247
256
|
# Mock object frameworks and database transaction managers (like
|
@@ -36,6 +36,13 @@ module RSpec
|
|
36
36
|
# it { should be_eligible_to_vote }
|
37
37
|
# end
|
38
38
|
#
|
39
|
+
# @note Because `subject` is designed to create state that is reset between
|
40
|
+
# each example, and `before(:all)` is designed to setup state that is
|
41
|
+
# shared across _all_ examples in an example group, `subject` is _not_
|
42
|
+
# intended to be used in a `before(:all)` hook. RSpec 2.13.1 prints
|
43
|
+
# a warning when you reference a `subject` from `before(:all)` and we plan
|
44
|
+
# to have it raise an error in RSpec 3.
|
45
|
+
#
|
39
46
|
# @see #should
|
40
47
|
def subject
|
41
48
|
raise NotImplementedError, 'This definition is here for documentation purposes only'
|
@@ -132,6 +139,7 @@ EOS
|
|
132
139
|
|
133
140
|
@example_group_instance.class.class_eval do
|
134
141
|
hash.each do |key, value|
|
142
|
+
undef_method(key) if method_defined?(key)
|
135
143
|
define_method(key) { value }
|
136
144
|
end
|
137
145
|
end
|
@@ -161,6 +169,13 @@ EOS
|
|
161
169
|
# behave in surprising ways in examples that spawn separate threads,
|
162
170
|
# though we have yet to see this in practice. You've been warned.
|
163
171
|
#
|
172
|
+
# @note Because `let` is designed to create state that is reset between
|
173
|
+
# each example, and `before(:all)` is designed to setup state that is
|
174
|
+
# shared across _all_ examples in an example group, `let` is _not_
|
175
|
+
# intended to be used in a `before(:all)` hook. RSpec 2.13.1 prints
|
176
|
+
# a warning when you reference a `let` from `before(:all)` and we plan
|
177
|
+
# to have it raise an error in RSpec 3.
|
178
|
+
#
|
164
179
|
# @example
|
165
180
|
#
|
166
181
|
# describe Thing do
|
@@ -177,7 +192,8 @@ EOS
|
|
177
192
|
def let(name, &block)
|
178
193
|
# We have to pass the block directly to `define_method` to
|
179
194
|
# allow it to use method constructs like `super` and `return`.
|
180
|
-
|
195
|
+
raise "#let or #subject called without a block" if block.nil?
|
196
|
+
MemoizedHelpers.module_for(self).send(:define_method, name, &block)
|
181
197
|
|
182
198
|
# Apply the memoization. The method has been defined in an ancestor
|
183
199
|
# module so we can use `super` here to get the value.
|
@@ -276,9 +292,9 @@ EOS
|
|
276
292
|
def subject(name=nil, &block)
|
277
293
|
if name
|
278
294
|
let(name, &block)
|
279
|
-
subject
|
295
|
+
alias_method :subject, name
|
280
296
|
|
281
|
-
self::NamedSubjectPreventSuper.define_method
|
297
|
+
self::NamedSubjectPreventSuper.send(:define_method, name) do
|
282
298
|
raise NotImplementedError, "`super` in named subjects is not supported"
|
283
299
|
end
|
284
300
|
else
|
@@ -451,13 +467,8 @@ EOS
|
|
451
467
|
get_constant_or_yield(example_group, :LetDefinitions) do
|
452
468
|
mod = Module.new do
|
453
469
|
include Module.new {
|
454
|
-
public_class_method :define_method
|
455
470
|
example_group.const_set(:NamedSubjectPreventSuper, self)
|
456
471
|
}
|
457
|
-
|
458
|
-
# Expose `define_method` as a public method, so we can
|
459
|
-
# easily use it below.
|
460
|
-
public_class_method :define_method
|
461
472
|
end
|
462
473
|
|
463
474
|
example_group.__send__(:include, mod)
|
data/lib/rspec/core/metadata.rb
CHANGED
@@ -73,6 +73,8 @@ module RSpec
|
|
73
73
|
store(:full_description, full_description)
|
74
74
|
when :description
|
75
75
|
store(:description, build_description_from(*self[:description_args]))
|
76
|
+
when :description_args
|
77
|
+
store(:description_args, [])
|
76
78
|
end
|
77
79
|
end
|
78
80
|
|
@@ -244,7 +246,7 @@ module RSpec
|
|
244
246
|
protected
|
245
247
|
|
246
248
|
def configure_for_example(description, user_metadata)
|
247
|
-
store(:description_args, [description])
|
249
|
+
store(:description_args, [description]) if description
|
248
250
|
store(:caller, user_metadata.delete(:caller) || caller)
|
249
251
|
update(user_metadata)
|
250
252
|
end
|
@@ -30,7 +30,7 @@ module RSpec::Core
|
|
30
30
|
args.map! { |arg|
|
31
31
|
case arg
|
32
32
|
when "--formatter"
|
33
|
-
RSpec.deprecate("the --formatter option", "-f or --format")
|
33
|
+
RSpec.deprecate("the --formatter option", :replacement => "-f or --format")
|
34
34
|
"--format"
|
35
35
|
when "--default_path"
|
36
36
|
"--default-path"
|
@@ -119,7 +119,7 @@ module RSpec::Core
|
|
119
119
|
end
|
120
120
|
|
121
121
|
parser.on('-o', '--out FILE',
|
122
|
-
'Write output to a file instead of
|
122
|
+
'Write output to a file instead of $stdout. This option applies',
|
123
123
|
' to the previously specified --format, or the default format',
|
124
124
|
' if no format is specified.'
|
125
125
|
) do |o|
|
@@ -145,6 +145,10 @@ module RSpec::Core
|
|
145
145
|
end
|
146
146
|
end
|
147
147
|
|
148
|
+
parser.on('-w', '--warnings', 'Enable ruby warnings') do
|
149
|
+
options[:warnings] = true
|
150
|
+
end
|
151
|
+
|
148
152
|
parser.separator <<-FILTERING
|
149
153
|
|
150
154
|
**** Filtering/tags ****
|
data/lib/rspec/core/pending.rb
CHANGED
data/lib/rspec/core/rake_task.rb
CHANGED
@@ -30,7 +30,7 @@ module RSpec
|
|
30
30
|
# @deprecated
|
31
31
|
# Has no effect. The rake task now checks ENV['BUNDLE_GEMFILE'] instead.
|
32
32
|
def gemfile=(*)
|
33
|
-
RSpec.deprecate("RSpec::Core::RakeTask#gemfile=", 'ENV["BUNDLE_GEMFILE"]')
|
33
|
+
RSpec.deprecate("RSpec::Core::RakeTask#gemfile=", :replacement => 'ENV["BUNDLE_GEMFILE"]')
|
34
34
|
end
|
35
35
|
|
36
36
|
# @deprecated
|
@@ -42,7 +42,7 @@ module RSpec
|
|
42
42
|
# default:
|
43
43
|
# false
|
44
44
|
def warning=(true_or_false)
|
45
|
-
RSpec.deprecate("RSpec::Core::RakeTask#warning=", 'ruby_opts="-w"')
|
45
|
+
RSpec.deprecate("RSpec::Core::RakeTask#warning=", :replacement => 'ruby_opts="-w"')
|
46
46
|
@warning = true_or_false
|
47
47
|
end
|
48
48
|
|
@@ -109,7 +109,7 @@ module RSpec
|
|
109
109
|
# default:
|
110
110
|
# nil
|
111
111
|
def spec_opts=(opts)
|
112
|
-
RSpec.deprecate('RSpec::Core::RakeTask#spec_opts=', 'rspec_opts=')
|
112
|
+
RSpec.deprecate('RSpec::Core::RakeTask#spec_opts=', :replacement => 'rspec_opts=')
|
113
113
|
@rspec_opts = opts
|
114
114
|
end
|
115
115
|
|
@@ -137,24 +137,16 @@ module RSpec
|
|
137
137
|
@pattern = './spec{,/*/**}/*_spec.rb'
|
138
138
|
end
|
139
139
|
|
140
|
-
def has_files?
|
141
|
-
empty = files_to_run.empty?
|
142
|
-
puts "No examples matching #{pattern} could be found" if empty
|
143
|
-
not empty
|
144
|
-
end
|
145
|
-
|
146
140
|
def run_task(verbose)
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
puts failure_message if failure_message
|
155
|
-
end
|
156
|
-
raise("#{command} failed") if fail_on_error unless success
|
141
|
+
command = spec_command
|
142
|
+
|
143
|
+
begin
|
144
|
+
puts command if verbose
|
145
|
+
success = system(command)
|
146
|
+
rescue
|
147
|
+
puts failure_message if failure_message
|
157
148
|
end
|
149
|
+
abort("#{command} failed") if fail_on_error unless success
|
158
150
|
end
|
159
151
|
|
160
152
|
private
|
data/lib/rspec/core/reporter.rb
CHANGED
@@ -1,11 +1,35 @@
|
|
1
1
|
module RSpec::Core
|
2
2
|
class Reporter
|
3
|
+
NOTIFICATIONS = %W[start message example_group_started example_group_finished example_started
|
4
|
+
example_passed example_failed example_pending start_dump dump_pending
|
5
|
+
dump_failures dump_summary seed close stop deprecation deprecation_summary].map(&:to_sym)
|
6
|
+
|
3
7
|
def initialize(*formatters)
|
4
|
-
@
|
8
|
+
@listeners = Hash.new { |h,k| h[k] = [] }
|
9
|
+
formatters.each do |formatter|
|
10
|
+
register_listener(formatter, *NOTIFICATIONS)
|
11
|
+
end
|
5
12
|
@example_count = @failure_count = @pending_count = 0
|
6
13
|
@duration = @start = nil
|
7
14
|
end
|
8
15
|
|
16
|
+
# @api
|
17
|
+
# @param [Object] An obect that wishes to be notified of reporter events
|
18
|
+
# @param [Array] Array of symbols represents the events a listener wishes to subscribe too
|
19
|
+
#
|
20
|
+
# Registers a listener to a list of notifications. The reporter will send notification of
|
21
|
+
# events to all registered listeners
|
22
|
+
def register_listener(listener, *notifications)
|
23
|
+
notifications.each do |notification|
|
24
|
+
@listeners[notification.to_sym] << listener if listener.respond_to?(notification)
|
25
|
+
end
|
26
|
+
true
|
27
|
+
end
|
28
|
+
|
29
|
+
def registered_listeners(notification)
|
30
|
+
@listeners[notification]
|
31
|
+
end
|
32
|
+
|
9
33
|
# @api
|
10
34
|
# @overload report(count, &block)
|
11
35
|
# @overload report(count, seed, &block)
|
@@ -73,6 +97,10 @@ module RSpec::Core
|
|
73
97
|
notify :example_pending, example
|
74
98
|
end
|
75
99
|
|
100
|
+
def deprecation(message)
|
101
|
+
notify :deprecation, message
|
102
|
+
end
|
103
|
+
|
76
104
|
def finish(seed)
|
77
105
|
begin
|
78
106
|
stop
|
@@ -80,6 +108,7 @@ module RSpec::Core
|
|
80
108
|
notify :dump_pending
|
81
109
|
notify :dump_failures
|
82
110
|
notify :dump_summary, @duration, @example_count, @failure_count, @pending_count
|
111
|
+
notify :deprecation_summary
|
83
112
|
notify :seed, seed if seed
|
84
113
|
ensure
|
85
114
|
notify :close
|
@@ -93,9 +122,9 @@ module RSpec::Core
|
|
93
122
|
notify :stop
|
94
123
|
end
|
95
124
|
|
96
|
-
def notify(
|
97
|
-
|
98
|
-
formatter.send
|
125
|
+
def notify(event, *args, &block)
|
126
|
+
registered_listeners(event).each do |formatter|
|
127
|
+
formatter.send(event, *args, &block)
|
99
128
|
end
|
100
129
|
end
|
101
130
|
end
|
@@ -28,8 +28,8 @@ module RSpec
|
|
28
28
|
# @see ExampleGroup.it_behaves_like
|
29
29
|
# @see ExampleGroup.include_examples
|
30
30
|
# @see ExampleGroup.include_context
|
31
|
-
def shared_examples
|
32
|
-
Registry.add_group(*args, &block)
|
31
|
+
def shared_examples(*args, &block)
|
32
|
+
Registry.add_group(self, *args, &block)
|
33
33
|
end
|
34
34
|
|
35
35
|
alias_method :shared_context, :shared_examples
|
@@ -39,8 +39,32 @@ module RSpec
|
|
39
39
|
# @deprecated
|
40
40
|
def share_as(name, &block)
|
41
41
|
RSpec.deprecate("Rspec::Core::SharedExampleGroup#share_as",
|
42
|
-
"RSpec::SharedContext or shared_examples")
|
43
|
-
Registry.add_const(name, &block)
|
42
|
+
:replacement => "RSpec::SharedContext or shared_examples")
|
43
|
+
Registry.add_const(self, name, &block)
|
44
|
+
end
|
45
|
+
|
46
|
+
def shared_example_groups
|
47
|
+
Registry.shared_example_groups_for('main', *ancestors[0..-1])
|
48
|
+
end
|
49
|
+
|
50
|
+
module TopLevelDSL
|
51
|
+
def shared_examples(*args, &block)
|
52
|
+
Registry.add_group('main', *args, &block)
|
53
|
+
end
|
54
|
+
|
55
|
+
alias_method :shared_context, :shared_examples
|
56
|
+
alias_method :share_examples_for, :shared_examples
|
57
|
+
alias_method :shared_examples_for, :shared_examples
|
58
|
+
|
59
|
+
def share_as(name, &block)
|
60
|
+
RSpec.deprecate("Rspec::Core::SharedExampleGroup#share_as",
|
61
|
+
:replacement => "RSpec::SharedContext or shared_examples")
|
62
|
+
Registry.add_const('main', name, &block)
|
63
|
+
end
|
64
|
+
|
65
|
+
def shared_example_groups
|
66
|
+
Registry.shared_example_groups_for('main')
|
67
|
+
end
|
44
68
|
end
|
45
69
|
|
46
70
|
# @private
|
@@ -53,13 +77,13 @@ module RSpec
|
|
53
77
|
module Registry
|
54
78
|
extend self
|
55
79
|
|
56
|
-
def add_group(*args, &block)
|
80
|
+
def add_group(source, *args, &block)
|
57
81
|
ensure_block_has_source_location(block, caller[1])
|
58
82
|
|
59
83
|
if key? args.first
|
60
84
|
key = args.shift
|
61
|
-
warn_if_key_taken key, block
|
62
|
-
|
85
|
+
warn_if_key_taken source, key, block
|
86
|
+
add_shared_example_group source, key, block
|
63
87
|
end
|
64
88
|
|
65
89
|
unless args.empty?
|
@@ -71,7 +95,7 @@ module RSpec
|
|
71
95
|
end
|
72
96
|
end
|
73
97
|
|
74
|
-
def add_const(name, &block)
|
98
|
+
def add_const(source, name, &block)
|
75
99
|
if Object.const_defined?(name)
|
76
100
|
mod = Object.const_get(name)
|
77
101
|
raise_name_error unless mod.created_from_caller(caller)
|
@@ -92,12 +116,28 @@ module RSpec
|
|
92
116
|
end
|
93
117
|
|
94
118
|
shared_const = Object.const_set(name, mod)
|
95
|
-
|
119
|
+
add_shared_example_group source, shared_const, block
|
120
|
+
end
|
121
|
+
|
122
|
+
def shared_example_groups_for(*sources)
|
123
|
+
Collection.new(sources, shared_example_groups)
|
124
|
+
end
|
125
|
+
|
126
|
+
def shared_example_groups
|
127
|
+
@shared_example_groups ||= Hash.new { |hash,key| hash[key] = Hash.new }
|
128
|
+
end
|
129
|
+
|
130
|
+
def clear
|
131
|
+
@shared_example_groups.clear
|
96
132
|
end
|
97
133
|
|
98
134
|
private
|
99
135
|
|
100
|
-
def key
|
136
|
+
def add_shared_example_group(source, key, block)
|
137
|
+
shared_example_groups[source][key] = block
|
138
|
+
end
|
139
|
+
|
140
|
+
def key?(candidate)
|
101
141
|
[String, Symbol, Module].any? { |cls| cls === candidate }
|
102
142
|
end
|
103
143
|
|
@@ -105,8 +145,8 @@ module RSpec
|
|
105
145
|
raise NameError, "The first argument (#{name}) to share_as must be a legal name for a constant not already in use."
|
106
146
|
end
|
107
147
|
|
108
|
-
def warn_if_key_taken key, new_block
|
109
|
-
return unless existing_block = example_block_for(key)
|
148
|
+
def warn_if_key_taken(source, key, new_block)
|
149
|
+
return unless existing_block = example_block_for(source, key)
|
110
150
|
|
111
151
|
Kernel.warn <<-WARNING.gsub(/^ +\|/, '')
|
112
152
|
|WARNING: Shared example group '#{key}' has been previously defined at:
|
@@ -117,12 +157,12 @@ module RSpec
|
|
117
157
|
WARNING
|
118
158
|
end
|
119
159
|
|
120
|
-
def formatted_location
|
160
|
+
def formatted_location(block)
|
121
161
|
block.source_location.join ":"
|
122
162
|
end
|
123
163
|
|
124
|
-
def example_block_for key
|
125
|
-
|
164
|
+
def example_block_for(source, key)
|
165
|
+
shared_example_groups[source][key]
|
126
166
|
end
|
127
167
|
|
128
168
|
def ensure_block_has_source_location(block, caller_line)
|
@@ -139,6 +179,6 @@ module RSpec
|
|
139
179
|
end
|
140
180
|
end
|
141
181
|
|
142
|
-
extend RSpec::Core::SharedExampleGroup
|
182
|
+
extend RSpec::Core::SharedExampleGroup::TopLevelDSL
|
143
183
|
Module.send(:include, RSpec::Core::SharedExampleGroup)
|
144
184
|
|