rspec-core 3.5.0.beta3 → 3.5.0.beta4
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/Changelog.md +65 -12
- data/lib/rspec/core/backtrace_formatter.rb +1 -1
- data/lib/rspec/core/bisect/runner.rb +3 -2
- data/lib/rspec/core/bisect/server.rb +5 -1
- data/lib/rspec/core/configuration.rb +154 -18
- data/lib/rspec/core/example.rb +8 -2
- data/lib/rspec/core/example_group.rb +19 -7
- data/lib/rspec/core/formatters/bisect_formatter.rb +5 -4
- data/lib/rspec/core/formatters/documentation_formatter.rb +2 -3
- data/lib/rspec/core/formatters/exception_presenter.rb +7 -1
- data/lib/rspec/core/formatters/html_formatter.rb +1 -1
- data/lib/rspec/core/metadata_filter.rb +22 -10
- data/lib/rspec/core/project_initializer/spec/spec_helper.rb +7 -0
- data/lib/rspec/core/shared_example_group.rb +48 -13
- data/lib/rspec/core/version.rb +1 -1
- metadata +6 -6
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 869c418b1e6c72f2af99494959561aad32116de1
|
4
|
+
data.tar.gz: 112822b696a2ad0b8679a0a59d5fd411d528acaf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1fbe6dc5949d8a192d76ee6f27ad90f1166e557c70a2d3ac9c898e4b700f60778234cd672a2de14bdb0304a11c5918527bd21935a315ba94c84916bb2b418445
|
7
|
+
data.tar.gz: 4354f81e094d54d517a46c738001c5f7f77f8d55e1e4f2a2d229a5f260aece474720f6f9a07fdc1015f57fbd89ca93e0ceef2d5d88e34d7d86afc33a94b2f1cf
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/Changelog.md
CHANGED
@@ -1,16 +1,43 @@
|
|
1
|
-
### Development
|
2
|
-
[Full Changelog](http://github.com/rspec/rspec-core/compare/v3.5.0.
|
1
|
+
### 3.5 Development
|
2
|
+
[Full Changelog](http://github.com/rspec/rspec-core/compare/v3.5.0.beta4...master)
|
3
|
+
|
4
|
+
### 3.5.0.beta4 / 2016-06-05
|
5
|
+
[Full Changelog](http://github.com/rspec/rspec-core/compare/v3.5.0.beta3...v3.5.0.beta4)
|
6
|
+
|
7
|
+
Enhancements:
|
8
|
+
|
9
|
+
* Filter out bundler stackframes from backtraces by default, since
|
10
|
+
Bundler 1.12 now includes its own frames in stack traces produced
|
11
|
+
by using `bundle exec`. (Myron Marston, #2240)
|
12
|
+
* HTML Formatter uses exception presenter to get failure message
|
13
|
+
for consistency with other formatters. (@mrageh, #2222)
|
14
|
+
* Load spec files in the order of the directories or files passed
|
15
|
+
at the command line, making it easy to make some specs run before
|
16
|
+
others in a one-off manner. For example, `rspec spec/unit
|
17
|
+
spec/acceptance --order defined` will run unit specs before acceptance
|
18
|
+
specs. (Myron Marston, #2253)
|
19
|
+
* Add new `config.include_context` API for configuring global or
|
20
|
+
filtered inclusion of shared contexts in example groups.
|
21
|
+
(Myron Marston, #2256)
|
22
|
+
* Add new `config.shared_context_metadata_behavior = :apply_to_host_groups`
|
23
|
+
option, which causes shared context metadata to be inherited by the
|
24
|
+
metadata hash of all host groups and examples instead of configuring
|
25
|
+
implicit auto-inclusion based on the passed metadata. (Myron Marston, #2256)
|
26
|
+
|
27
|
+
Bug Fixes:
|
28
|
+
|
29
|
+
* Fix `--bisect` so it works on large spec suites that were previously triggering
|
30
|
+
"Argument list too long errors" due to all the spec locations being passed as
|
31
|
+
CLI args. (Matt Jones, #2223).
|
32
|
+
* Fix deprecated `:example_group`-based filtering so that it properly
|
33
|
+
applies to matching example groups. (Myron Marston, #2234)
|
34
|
+
* Fix `NoMethodError` caused by Java backtraces on JRuby. (Michele Piccirillo, #2244)
|
35
|
+
|
36
|
+
### 3.5.0.beta3 / 2016-04-02
|
37
|
+
[Full Changelog](http://github.com/rspec/rspec-core/compare/v3.5.0.beta2...v3.5.0.beta3)
|
3
38
|
|
4
39
|
Enhancements:
|
5
40
|
|
6
|
-
* Remove unneeded `:execution_result` example groups metadata, saving a
|
7
|
-
bit of memory. (Myron Marston, #2172)
|
8
|
-
* Apply hooks registered with `config` to previously defined groups.
|
9
|
-
(Myron Marston, #2189)
|
10
|
-
* `RSpec::Core::Configuration#reporter` is now public API under semver.
|
11
|
-
(Jon Rowe, #2193)
|
12
|
-
* Add new `config.when_first_matching_example_defined` hook. (Myron
|
13
|
-
Marston, #2175)
|
14
41
|
* Add new `config.filter_run_when_matching` API, intended to replace
|
15
42
|
the combination of `config.filter_run` and
|
16
43
|
`config.run_all_when_everything_filtered` (Myron Marston, #2206)
|
@@ -23,8 +50,32 @@ Bug Fixes:
|
|
23
50
|
ending with `end`-only line can be extracted properly.
|
24
51
|
(Yuji Nakayama, #2215)
|
25
52
|
|
53
|
+
### 3.5.0.beta2 / 2016-03-10
|
54
|
+
[Full Changelog](http://github.com/rspec/rspec-core/compare/v3.5.0.beta1...v3.5.0.beta2)
|
55
|
+
|
56
|
+
Enhancements:
|
57
|
+
|
58
|
+
* Remove unneeded `:execution_result` example group metadata, saving a
|
59
|
+
bit of memory. (Myron Marston, #2172)
|
60
|
+
* Apply hooks registered with `config` to previously defined groups.
|
61
|
+
(Myron Marston, #2189)
|
62
|
+
* `RSpec::Core::Configuration#reporter` is now public API under SemVer.
|
63
|
+
(Jon Rowe, #2193)
|
64
|
+
* Add new `config.when_first_matching_example_defined` hook. (Myron
|
65
|
+
Marston, #2175)
|
66
|
+
|
26
67
|
### 3.5.0.beta1 / 2016-02-06
|
27
|
-
[Full Changelog](http://github.com/rspec/rspec-core/compare/v3.4.
|
68
|
+
[Full Changelog](http://github.com/rspec/rspec-core/compare/v3.4.4...v3.5.0.beta1)
|
69
|
+
|
70
|
+
Enhancements:
|
71
|
+
|
72
|
+
* Add `RSpec::Core::ExampleGroup.currently_executing_a_context_hook?`,
|
73
|
+
primarily for use by rspec-rails. (Sam Phippen, #2131)
|
74
|
+
|
75
|
+
Bug Fixes:
|
76
|
+
|
77
|
+
* Ensure `MultipleExceptionError` does not contain a recursive reference
|
78
|
+
to itself. (Sam Phippen, #2133)
|
28
79
|
|
29
80
|
### 3.4.4 / 2016-03-09
|
30
81
|
[Full Changelog](http://github.com/rspec/rspec-core/compare/v3.4.3...v3.4.4)
|
@@ -39,7 +90,7 @@ Bug Fixes:
|
|
39
90
|
|
40
91
|
Bug Fixes:
|
41
92
|
|
42
|
-
* Prevent a `TypeError` from
|
93
|
+
* Prevent a `TypeError` from occurring when running via the rake task when
|
43
94
|
Ruby crashes. (Patrik Wenger, #2161)
|
44
95
|
* Only consider example and group declaration lines from a specific file
|
45
96
|
when applying line number filtering, instead of considering all
|
@@ -47,6 +98,8 @@ Bug Fixes:
|
|
47
98
|
* Fix failure snippet extraction so that snippets that contain `do-end` style
|
48
99
|
block and end with `end`-only line can be extracted properly.
|
49
100
|
(Yuji Nakayama, #2173)
|
101
|
+
* Prevent infinite recursion when an exception is caused by itself.
|
102
|
+
(Jon Rowe, #2128)
|
50
103
|
|
51
104
|
### 3.4.2 / 2016-01-26
|
52
105
|
[Full Changelog](http://github.com/rspec/rspec-core/compare/v3.4.1...v3.4.2)
|
@@ -8,7 +8,7 @@ module RSpec
|
|
8
8
|
def initialize
|
9
9
|
@full_backtrace = false
|
10
10
|
|
11
|
-
patterns = %w[ /lib\d*/ruby/ bin/ exe/rspec ]
|
11
|
+
patterns = %w[ /lib\d*/ruby/ bin/ exe/rspec /lib/bundler/ /exe/bundle: ]
|
12
12
|
patterns << "org/jruby/" if RUBY_PLATFORM == 'java'
|
13
13
|
patterns.map! { |s| Regexp.new(s.gsub("/", File::SEPARATOR)) }
|
14
14
|
|
@@ -27,6 +27,7 @@ module RSpec
|
|
27
27
|
|
28
28
|
parts << "--format" << "bisect"
|
29
29
|
parts << "--drb-port" << @server.drb_port
|
30
|
+
|
30
31
|
parts.concat reusable_cli_options
|
31
32
|
parts.concat locations.map { |l| open3_safe_escape(l) }
|
32
33
|
|
@@ -60,9 +61,9 @@ module RSpec
|
|
60
61
|
alias open3_safe_escape escape
|
61
62
|
end
|
62
63
|
|
63
|
-
def run_locations(
|
64
|
+
def run_locations(*capture_args)
|
64
65
|
@server.capture_run_results(*capture_args) do
|
65
|
-
run_command command_for(
|
66
|
+
run_command command_for([])
|
66
67
|
end
|
67
68
|
end
|
68
69
|
|
@@ -20,8 +20,9 @@ module RSpec
|
|
20
20
|
server.stop
|
21
21
|
end
|
22
22
|
|
23
|
-
def capture_run_results(expected_failures=[])
|
23
|
+
def capture_run_results(files_or_directories_to_run=[], expected_failures=[])
|
24
24
|
self.expected_failures = expected_failures
|
25
|
+
self.files_or_directories_to_run = files_or_directories_to_run
|
25
26
|
self.latest_run_results = nil
|
26
27
|
run_output = yield
|
27
28
|
latest_run_results || raise_bisect_failed(run_output)
|
@@ -49,6 +50,9 @@ module RSpec
|
|
49
50
|
# Set via DRb by the BisectFormatter with the results of the run.
|
50
51
|
attr_accessor :latest_run_results
|
51
52
|
|
53
|
+
# Fetched via DRb to tell clients which files to run
|
54
|
+
attr_accessor :files_or_directories_to_run
|
55
|
+
|
52
56
|
private
|
53
57
|
|
54
58
|
def raise_bisect_failed(run_output)
|
@@ -327,6 +327,59 @@ module RSpec
|
|
327
327
|
)
|
328
328
|
end
|
329
329
|
|
330
|
+
# @macro define_reader
|
331
|
+
# Configures how RSpec treats metadata passed as part of a shared example
|
332
|
+
# group definition. For example, given this shared example group definition:
|
333
|
+
#
|
334
|
+
# RSpec.shared_context "uses DB", :db => true do
|
335
|
+
# around(:example) do |ex|
|
336
|
+
# MyORM.transaction(:rollback => true, &ex)
|
337
|
+
# end
|
338
|
+
# end
|
339
|
+
#
|
340
|
+
# ...there are two ways RSpec can treat the `:db => true` metadata, each
|
341
|
+
# of which has a corresponding config option:
|
342
|
+
#
|
343
|
+
# 1. `:trigger_inclusion`: this shared context will be implicitly included
|
344
|
+
# in any groups (or examples) that have `:db => true` metadata.
|
345
|
+
# 2. `:apply_to_host_groups`: the metadata will be inherited by the metadata
|
346
|
+
# hash of all host groups and examples.
|
347
|
+
#
|
348
|
+
# `:trigger_inclusion` is the legacy behavior from before RSpec 3.5 but should
|
349
|
+
# be considered deprecated. Instead, you can explicitly include a group with
|
350
|
+
# `include_context`:
|
351
|
+
#
|
352
|
+
# RSpec.describe "My model" do
|
353
|
+
# include_context "uses DB"
|
354
|
+
# end
|
355
|
+
#
|
356
|
+
# ...or you can configure RSpec to include the context based on matching metadata
|
357
|
+
# using an API that mirrors configured module inclusion:
|
358
|
+
#
|
359
|
+
# RSpec.configure do |rspec|
|
360
|
+
# rspec.include_context "uses DB", :db => true
|
361
|
+
# end
|
362
|
+
#
|
363
|
+
# `:apply_to_host_groups` is a new feature of RSpec 3.5 and will be the only
|
364
|
+
# supported behavior in RSpec 4.
|
365
|
+
#
|
366
|
+
# @overload shared_context_metadata_behavior
|
367
|
+
# @return [:trigger_inclusion, :apply_to_host_groups] the configured behavior
|
368
|
+
# @overload shared_context_metadata_behavior=(value)
|
369
|
+
# @param value [:trigger_inclusion, :apply_to_host_groups] sets the configured behavior
|
370
|
+
define_reader :shared_context_metadata_behavior
|
371
|
+
# @see shared_context_metadata_behavior
|
372
|
+
def shared_context_metadata_behavior=(value)
|
373
|
+
case value
|
374
|
+
when :trigger_inclusion, :apply_to_host_groups
|
375
|
+
@shared_context_metadata_behavior = value
|
376
|
+
else
|
377
|
+
raise ArgumentError, "Cannot set `RSpec.configuration." \
|
378
|
+
"shared_context_metadata_behavior` to `#{value.inspect}`. Only " \
|
379
|
+
"`:trigger_inclusion` and `:apply_to_host_groups` are valid values."
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
330
383
|
# Record the start time of the spec suite to measure load time.
|
331
384
|
add_setting :start_time
|
332
385
|
|
@@ -352,6 +405,7 @@ module RSpec
|
|
352
405
|
attr_reader :backtrace_formatter, :ordering_manager, :loaded_spec_files
|
353
406
|
|
354
407
|
# rubocop:disable Metrics/AbcSize
|
408
|
+
# rubocop:disable Metrics/MethodLength
|
355
409
|
def initialize
|
356
410
|
# rubocop:disable Style/GlobalVars
|
357
411
|
@start_time = $_rspec_core_load_started_at || ::RSpec::Core::Time.now
|
@@ -398,9 +452,11 @@ module RSpec
|
|
398
452
|
@threadsafe = true
|
399
453
|
@max_displayed_failure_line_count = 10
|
400
454
|
@world = World::Null
|
455
|
+
@shared_context_metadata_behavior = :trigger_inclusion
|
401
456
|
|
402
457
|
define_built_in_hooks
|
403
458
|
end
|
459
|
+
# rubocop:enable Metrics/MethodLength
|
404
460
|
# rubocop:enable Metrics/AbcSize
|
405
461
|
|
406
462
|
# @private
|
@@ -1153,7 +1209,7 @@ module RSpec
|
|
1153
1209
|
# end
|
1154
1210
|
#
|
1155
1211
|
# RSpec.configure do |config|
|
1156
|
-
# config.include(UserHelpers) # included in all
|
1212
|
+
# config.include(UserHelpers) # included in all groups
|
1157
1213
|
# config.include(AuthenticationHelpers, :type => :request)
|
1158
1214
|
# end
|
1159
1215
|
#
|
@@ -1172,12 +1228,55 @@ module RSpec
|
|
1172
1228
|
# example has a singleton example group containing just the one
|
1173
1229
|
# example.
|
1174
1230
|
#
|
1231
|
+
# @see #include_context
|
1175
1232
|
# @see #extend
|
1176
1233
|
# @see #prepend
|
1177
1234
|
def include(mod, *filters)
|
1178
|
-
|
1179
|
-
|
1180
|
-
|
1235
|
+
define_mixed_in_module(mod, filters, @include_modules, :include) do |group|
|
1236
|
+
safe_include(mod, group)
|
1237
|
+
end
|
1238
|
+
end
|
1239
|
+
|
1240
|
+
# Tells RSpec to include the named shared example group in example groups.
|
1241
|
+
# Use `filters` to constrain the groups or examples in which to include
|
1242
|
+
# the example group.
|
1243
|
+
#
|
1244
|
+
# @example
|
1245
|
+
#
|
1246
|
+
# RSpec.shared_context "example users" do
|
1247
|
+
# let(:admin_user) { create_user(:admin) }
|
1248
|
+
# let(:guest_user) { create_user(:guest) }
|
1249
|
+
# end
|
1250
|
+
#
|
1251
|
+
# RSpec.configure do |config|
|
1252
|
+
# config.include_context "example users", :type => :request
|
1253
|
+
# end
|
1254
|
+
#
|
1255
|
+
# RSpec.describe "The admin page", :type => :request do
|
1256
|
+
# it "can be viewed by admins" do
|
1257
|
+
# login_with admin_user
|
1258
|
+
# get "/admin"
|
1259
|
+
# expect(response).to be_ok
|
1260
|
+
# end
|
1261
|
+
#
|
1262
|
+
# it "cannot be viewed by guests" do
|
1263
|
+
# login_with guest_user
|
1264
|
+
# get "/admin"
|
1265
|
+
# expect(response).to be_forbidden
|
1266
|
+
# end
|
1267
|
+
# end
|
1268
|
+
#
|
1269
|
+
# @note Filtered context inclusions can also be applied to
|
1270
|
+
# individual examples that have matching metadata. Just like
|
1271
|
+
# Ruby's object model is that every object has a singleton class
|
1272
|
+
# which has only a single instance, RSpec's model is that every
|
1273
|
+
# example has a singleton example group containing just the one
|
1274
|
+
# example.
|
1275
|
+
#
|
1276
|
+
# @see #include
|
1277
|
+
def include_context(shared_group_name, *filters)
|
1278
|
+
shared_module = world.shared_example_group_registry.find([:main], shared_group_name)
|
1279
|
+
include shared_module, *filters
|
1181
1280
|
end
|
1182
1281
|
|
1183
1282
|
# Tells RSpec to extend example groups with `mod`. Methods defined in
|
@@ -1211,9 +1310,9 @@ module RSpec
|
|
1211
1310
|
# @see #include
|
1212
1311
|
# @see #prepend
|
1213
1312
|
def extend(mod, *filters)
|
1214
|
-
|
1215
|
-
|
1216
|
-
|
1313
|
+
define_mixed_in_module(mod, filters, @extend_modules, :extend) do |group|
|
1314
|
+
safe_extend(mod, group)
|
1315
|
+
end
|
1217
1316
|
end
|
1218
1317
|
|
1219
1318
|
if RSpec::Support::RubyFeatures.module_prepends_supported?
|
@@ -1250,9 +1349,9 @@ module RSpec
|
|
1250
1349
|
# @see #include
|
1251
1350
|
# @see #extend
|
1252
1351
|
def prepend(mod, *filters)
|
1253
|
-
|
1254
|
-
|
1255
|
-
|
1352
|
+
define_mixed_in_module(mod, filters, @prepend_modules, :prepend) do |group|
|
1353
|
+
safe_prepend(mod, group)
|
1354
|
+
end
|
1256
1355
|
end
|
1257
1356
|
end
|
1258
1357
|
|
@@ -1261,6 +1360,8 @@ module RSpec
|
|
1261
1360
|
# Used internally to extend a group with modules using `include`, `prepend` and/or
|
1262
1361
|
# `extend`.
|
1263
1362
|
def configure_group(group)
|
1363
|
+
group.hooks.register_globals(group, hooks)
|
1364
|
+
|
1264
1365
|
configure_group_with group, @include_modules, :safe_include
|
1265
1366
|
configure_group_with group, @extend_modules, :safe_extend
|
1266
1367
|
configure_group_with group, @prepend_modules, :safe_prepend
|
@@ -1270,7 +1371,8 @@ module RSpec
|
|
1270
1371
|
#
|
1271
1372
|
# Used internally to extend the singleton class of a single example's
|
1272
1373
|
# example group instance with modules using `include` and/or `extend`.
|
1273
|
-
def configure_example(example)
|
1374
|
+
def configure_example(example, example_hooks)
|
1375
|
+
example_hooks.register_global_singleton_context_hooks(example, hooks)
|
1274
1376
|
singleton_group = example.example_group_instance.singleton_class
|
1275
1377
|
|
1276
1378
|
# We replace the metadata so that SharedExampleGroupModule#included
|
@@ -1389,8 +1491,12 @@ module RSpec
|
|
1389
1491
|
|
1390
1492
|
# @macro delegate_to_ordering_manager
|
1391
1493
|
#
|
1392
|
-
# Sets the default global
|
1393
|
-
#
|
1494
|
+
# Sets the default global ordering strategy. By default this can be one
|
1495
|
+
# of `:defined`, `:random`, but is customizable through the
|
1496
|
+
# `register_ordering` API. If order is set to `'rand:<seed>'`,
|
1497
|
+
# the seed will also be set.
|
1498
|
+
#
|
1499
|
+
# @see #register_ordering
|
1394
1500
|
delegate_to_ordering_manager :order=
|
1395
1501
|
|
1396
1502
|
# @macro delegate_to_ordering_manager
|
@@ -1412,13 +1518,32 @@ module RSpec
|
|
1412
1518
|
# end
|
1413
1519
|
# end
|
1414
1520
|
#
|
1415
|
-
# describe MyClass, :order => :reverse do
|
1521
|
+
# RSpec.describe 'MyClass', :order => :reverse do
|
1416
1522
|
# # ...
|
1417
1523
|
# end
|
1418
1524
|
#
|
1419
1525
|
# @note Pass the symbol `:global` to set the ordering strategy that
|
1420
1526
|
# will be used to order the top-level example groups and any example
|
1421
1527
|
# groups that do not have declared `:order` metadata.
|
1528
|
+
#
|
1529
|
+
# @example
|
1530
|
+
# RSpec.configure do |rspec|
|
1531
|
+
# rspec.register_ordering :global do |examples|
|
1532
|
+
# acceptance, other = examples.partition do |example|
|
1533
|
+
# example.metadata[:type] == :acceptance
|
1534
|
+
# end
|
1535
|
+
# other + acceptance
|
1536
|
+
# end
|
1537
|
+
# end
|
1538
|
+
#
|
1539
|
+
# RSpec.describe 'MyClass', :type => :acceptance do
|
1540
|
+
# # will run last
|
1541
|
+
# end
|
1542
|
+
#
|
1543
|
+
# RSpec.describe 'MyClass' do
|
1544
|
+
# # will run first
|
1545
|
+
# end
|
1546
|
+
#
|
1422
1547
|
delegate_to_ordering_manager :register_ordering
|
1423
1548
|
|
1424
1549
|
# @private
|
@@ -1759,7 +1884,7 @@ module RSpec
|
|
1759
1884
|
files = FlatMap.flat_map(paths_to_check(paths)) do |path|
|
1760
1885
|
path = path.gsub(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR
|
1761
1886
|
File.directory?(path) ? gather_directories(path) : extract_location(path)
|
1762
|
-
end.
|
1887
|
+
end.uniq
|
1763
1888
|
|
1764
1889
|
return files unless only_failures?
|
1765
1890
|
relative_files = files.map { |f| Metadata.relative_path(File.expand_path f) }
|
@@ -1779,11 +1904,12 @@ module RSpec
|
|
1779
1904
|
def gather_directories(path)
|
1780
1905
|
include_files = get_matching_files(path, pattern)
|
1781
1906
|
exclude_files = get_matching_files(path, exclude_pattern)
|
1782
|
-
(include_files - exclude_files).
|
1907
|
+
(include_files - exclude_files).uniq
|
1783
1908
|
end
|
1784
1909
|
|
1785
1910
|
def get_matching_files(path, pattern)
|
1786
|
-
Dir[file_glob_from(path, pattern)]
|
1911
|
+
raw_files = Dir[file_glob_from(path, pattern)]
|
1912
|
+
raw_files.map { |file| File.expand_path(file) }.sort
|
1787
1913
|
end
|
1788
1914
|
|
1789
1915
|
def file_glob_from(path, pattern)
|
@@ -1823,7 +1949,7 @@ module RSpec
|
|
1823
1949
|
end
|
1824
1950
|
|
1825
1951
|
return [] if path == default_path
|
1826
|
-
path
|
1952
|
+
File.expand_path(path)
|
1827
1953
|
end
|
1828
1954
|
|
1829
1955
|
def command
|
@@ -1932,6 +2058,16 @@ module RSpec
|
|
1932
2058
|
end
|
1933
2059
|
# :nocov:
|
1934
2060
|
end
|
2061
|
+
|
2062
|
+
def define_mixed_in_module(mod, filters, mod_list, config_method, &block)
|
2063
|
+
unless Module === mod
|
2064
|
+
raise TypeError, "`RSpec.configuration.#{config_method}` expects a module but got: #{mod.inspect}"
|
2065
|
+
end
|
2066
|
+
|
2067
|
+
meta = Metadata.build_hash_from(filters, :warn_about_example_group_filtering)
|
2068
|
+
mod_list.append(mod, meta)
|
2069
|
+
on_existing_matching_groups(meta, &block)
|
2070
|
+
end
|
1935
2071
|
end
|
1936
2072
|
# rubocop:enable Metrics/ClassLength
|
1937
2073
|
end
|
data/lib/rspec/core/example.rb
CHANGED
@@ -142,6 +142,13 @@ module RSpec
|
|
142
142
|
new_metadata, new_metadata[:block])
|
143
143
|
end
|
144
144
|
|
145
|
+
# @private
|
146
|
+
def update_inherited_metadata(updates)
|
147
|
+
metadata.update(updates) do |_key, existing_example_value, _new_inherited_value|
|
148
|
+
existing_example_value
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
145
152
|
# @attr_reader
|
146
153
|
#
|
147
154
|
# Returns the first exception raised in the context of running this
|
@@ -229,8 +236,7 @@ module RSpec
|
|
229
236
|
def run(example_group_instance, reporter)
|
230
237
|
@example_group_instance = example_group_instance
|
231
238
|
@reporter = reporter
|
232
|
-
|
233
|
-
RSpec.configuration.configure_example(self)
|
239
|
+
RSpec.configuration.configure_example(self, hooks)
|
234
240
|
RSpec.current_example = self
|
235
241
|
|
236
242
|
start(reporter)
|
@@ -33,6 +33,8 @@ module RSpec
|
|
33
33
|
include Pending
|
34
34
|
extend SharedExampleGroup
|
35
35
|
|
36
|
+
# Define a singleton method for the singleton class (remove the method if
|
37
|
+
# it's already been defined).
|
36
38
|
# @private
|
37
39
|
def self.idempotently_define_singleton_method(name, &definition)
|
38
40
|
(class << self; self; end).module_exec do
|
@@ -362,16 +364,16 @@ module RSpec
|
|
362
364
|
|
363
365
|
# @private
|
364
366
|
def self.find_and_eval_shared(label, name, inclusion_location, *args, &customization_block)
|
365
|
-
|
367
|
+
shared_module = RSpec.world.shared_example_group_registry.find(parent_groups, name)
|
366
368
|
|
367
|
-
unless
|
369
|
+
unless shared_module
|
368
370
|
raise ArgumentError, "Could not find shared #{label} #{name.inspect}"
|
369
371
|
end
|
370
372
|
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
373
|
+
shared_module.include_in(
|
374
|
+
self, Metadata.relative_path(inclusion_location),
|
375
|
+
args, customization_block
|
376
|
+
)
|
375
377
|
end
|
376
378
|
|
377
379
|
# @!endgroup
|
@@ -424,7 +426,6 @@ module RSpec
|
|
424
426
|
|
425
427
|
@currently_executing_a_context_hook = false
|
426
428
|
|
427
|
-
hooks.register_globals(self, RSpec.configuration.hooks)
|
428
429
|
RSpec.configuration.configure_group(self)
|
429
430
|
end
|
430
431
|
|
@@ -688,6 +689,17 @@ module RSpec
|
|
688
689
|
# :nocov:
|
689
690
|
end
|
690
691
|
|
692
|
+
# @private
|
693
|
+
def self.update_inherited_metadata(updates)
|
694
|
+
metadata.update(updates) do |_key, existing_group_value, _new_inherited_value|
|
695
|
+
existing_group_value
|
696
|
+
end
|
697
|
+
|
698
|
+
RSpec.configuration.configure_group(self)
|
699
|
+
examples.each { |ex| ex.update_inherited_metadata(updates) }
|
700
|
+
children.each { |group| group.update_inherited_metadata(updates) }
|
701
|
+
end
|
702
|
+
|
691
703
|
# Raised when an RSpec API is called in the wrong scope, such as `before`
|
692
704
|
# being called from within an example rather than from within an example
|
693
705
|
# group block.
|
@@ -16,12 +16,13 @@ module RSpec
|
|
16
16
|
:example_failed, :example_passed, :example_pending
|
17
17
|
|
18
18
|
def initialize(_output)
|
19
|
-
port
|
20
|
-
drb_uri
|
21
|
-
@all_example_ids
|
19
|
+
port = RSpec.configuration.drb_port
|
20
|
+
drb_uri = "druby://localhost:#{port}"
|
21
|
+
@all_example_ids = []
|
22
22
|
@failed_example_ids = []
|
23
|
-
@bisect_server
|
23
|
+
@bisect_server = DRbObject.new_with_uri(drb_uri)
|
24
24
|
@remaining_failures = []
|
25
|
+
RSpec.configuration.files_or_directories_to_run = @bisect_server.files_or_directories_to_run
|
25
26
|
end
|
26
27
|
|
27
28
|
def start(_notification)
|
@@ -34,8 +34,7 @@ module RSpec
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def example_failed(failure)
|
37
|
-
output.puts failure_output(failure.example
|
38
|
-
failure.example.execution_result.exception)
|
37
|
+
output.puts failure_output(failure.example)
|
39
38
|
end
|
40
39
|
|
41
40
|
private
|
@@ -50,7 +49,7 @@ module RSpec
|
|
50
49
|
:pending)
|
51
50
|
end
|
52
51
|
|
53
|
-
def failure_output(example
|
52
|
+
def failure_output(example)
|
54
53
|
ConsoleCodes.wrap("#{current_indentation}#{example.description.strip} " \
|
55
54
|
"(FAILED - #{next_failure_index})",
|
56
55
|
:failure)
|
@@ -204,7 +204,13 @@ module RSpec
|
|
204
204
|
return ["Unable to find matching line from backtrace"]
|
205
205
|
end
|
206
206
|
|
207
|
-
|
207
|
+
file_and_line_number = matching_line.match(/(.+?):(\d+)(|:\d+)/)
|
208
|
+
|
209
|
+
unless file_and_line_number
|
210
|
+
return ["Unable to infer file and line number from backtrace"]
|
211
|
+
end
|
212
|
+
|
213
|
+
file_path, line_number = file_and_line_number[1..2]
|
208
214
|
max_line_count = RSpec.configuration.max_displayed_failure_line_count
|
209
215
|
lines = SnippetExtractor.extract_expression_lines_at(file_path, line_number.to_i, max_line_count)
|
210
216
|
RSpec.world.source_cache.syntax_highlighter.highlight(lines)
|
@@ -34,6 +34,14 @@ module RSpec
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
+
# @private
|
38
|
+
def silence_metadata_example_group_deprecations
|
39
|
+
RSpec::Support.thread_local_data[:silence_metadata_example_group_deprecations] = true
|
40
|
+
yield
|
41
|
+
ensure
|
42
|
+
RSpec::Support.thread_local_data.delete(:silence_metadata_example_group_deprecations)
|
43
|
+
end
|
44
|
+
|
37
45
|
private
|
38
46
|
|
39
47
|
def filter_applies_to_any_value?(key, value, metadata)
|
@@ -72,13 +80,6 @@ module RSpec
|
|
72
80
|
return false unless Hash === subhash || HashImitatable === subhash
|
73
81
|
value.all? { |k, v| filter_applies?(k, v, subhash) }
|
74
82
|
end
|
75
|
-
|
76
|
-
def silence_metadata_example_group_deprecations
|
77
|
-
RSpec::Support.thread_local_data[:silence_metadata_example_group_deprecations] = true
|
78
|
-
yield
|
79
|
-
ensure
|
80
|
-
RSpec::Support.thread_local_data.delete(:silence_metadata_example_group_deprecations)
|
81
|
-
end
|
82
83
|
end
|
83
84
|
end
|
84
85
|
|
@@ -202,9 +203,20 @@ module RSpec
|
|
202
203
|
end
|
203
204
|
|
204
205
|
def applicable_metadata_from(metadata)
|
205
|
-
|
206
|
-
|
207
|
-
|
206
|
+
MetadataFilter.silence_metadata_example_group_deprecations do
|
207
|
+
@applicable_keys.inject({}) do |hash, key|
|
208
|
+
# :example_group is treated special here because...
|
209
|
+
# - In RSpec 2, example groups had an `:example_group` key
|
210
|
+
# - In RSpec 3, that key is deprecated (it was confusing!).
|
211
|
+
# - The key is not technically present in an example group metadata hash
|
212
|
+
# (and thus would fail the `metadata.key?(key)` check) but a value
|
213
|
+
# is provided when accessed via the hash's `default_proc`
|
214
|
+
# - Thus, for backwards compatibility, we have to explicitly check
|
215
|
+
# for `:example_group` here if it is one of the keys being used to
|
216
|
+
# filter.
|
217
|
+
hash[key] = metadata[key] if metadata.key?(key) || key == :example_group
|
218
|
+
hash
|
219
|
+
end
|
208
220
|
end
|
209
221
|
end
|
210
222
|
|
@@ -40,6 +40,13 @@ RSpec.configure do |config|
|
|
40
40
|
mocks.verify_partial_doubles = true
|
41
41
|
end
|
42
42
|
|
43
|
+
# This option will default to `:apply_to_host_groups` in RSpec 4 (and will
|
44
|
+
# have no way to turn it off -- the option exists only for backwards
|
45
|
+
# compatibility in RSpec 3). It causes shared context metadata to be
|
46
|
+
# inherited by the metadata hash of host groups and examples, rather than
|
47
|
+
# triggering implicit auto-inclusion in groups with matching metadata.
|
48
|
+
config.shared_context_metadata_behavior = :apply_to_host_groups
|
49
|
+
|
43
50
|
# The settings below are suggested to provide a good initial experience
|
44
51
|
# with RSpec, but feel free to customize to your heart's content.
|
45
52
|
=begin
|
@@ -5,9 +5,13 @@ module RSpec
|
|
5
5
|
# eval'd when the `SharedExampleGroupModule` instance is included in an example
|
6
6
|
# group.
|
7
7
|
class SharedExampleGroupModule < Module
|
8
|
-
|
8
|
+
# @private
|
9
|
+
attr_reader :definition
|
10
|
+
|
11
|
+
def initialize(description, definition, metadata)
|
9
12
|
@description = description
|
10
13
|
@definition = definition
|
14
|
+
@metadata = metadata
|
11
15
|
end
|
12
16
|
|
13
17
|
# Provides a human-readable representation of this module.
|
@@ -21,8 +25,16 @@ module RSpec
|
|
21
25
|
# including example group.
|
22
26
|
def included(klass)
|
23
27
|
inclusion_line = klass.metadata[:location]
|
28
|
+
include_in klass, inclusion_line, [], nil
|
29
|
+
end
|
30
|
+
|
31
|
+
# @private
|
32
|
+
def include_in(klass, inclusion_line, args, customization_block)
|
33
|
+
klass.update_inherited_metadata(@metadata) unless @metadata.empty?
|
34
|
+
|
24
35
|
SharedExampleGroupInclusionStackFrame.with_frame(@description, inclusion_line) do
|
25
|
-
klass.class_exec(&@definition)
|
36
|
+
klass.class_exec(*args, &@definition)
|
37
|
+
klass.class_exec(&customization_block) if customization_block
|
26
38
|
end
|
27
39
|
end
|
28
40
|
end
|
@@ -141,17 +153,21 @@ module RSpec
|
|
141
153
|
# @private
|
142
154
|
class Registry
|
143
155
|
def add(context, name, *metadata_args, &block)
|
144
|
-
|
156
|
+
if RSpec.configuration.shared_context_metadata_behavior == :trigger_inclusion
|
157
|
+
return legacy_add(context, name, *metadata_args, &block)
|
158
|
+
end
|
145
159
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
else
|
150
|
-
metadata_args.unshift name
|
160
|
+
unless valid_name?(name)
|
161
|
+
raise ArgumentError, "Shared example group names can only be a string, " \
|
162
|
+
"symbol or module but got: #{name.inspect}"
|
151
163
|
end
|
152
164
|
|
153
|
-
|
154
|
-
|
165
|
+
ensure_block_has_source_location(block) { CallerFilter.first_non_rspec_line }
|
166
|
+
warn_if_key_taken context, name, block
|
167
|
+
|
168
|
+
metadata = Metadata.build_hash_from(metadata_args)
|
169
|
+
shared_module = SharedExampleGroupModule.new(name, block, metadata)
|
170
|
+
shared_example_groups[context][name] = shared_module
|
155
171
|
end
|
156
172
|
|
157
173
|
def find(lookup_contexts, name)
|
@@ -165,6 +181,25 @@ module RSpec
|
|
165
181
|
|
166
182
|
private
|
167
183
|
|
184
|
+
# TODO: remove this in RSpec 4. This exists only to support
|
185
|
+
# `config.shared_context_metadata_behavior == :trigger_inclusion`,
|
186
|
+
# the legacy behavior of shared context metadata, which we do
|
187
|
+
# not want to support in RSpec 4.
|
188
|
+
def legacy_add(context, name, *metadata_args, &block)
|
189
|
+
ensure_block_has_source_location(block) { CallerFilter.first_non_rspec_line }
|
190
|
+
shared_module = SharedExampleGroupModule.new(name, block, {})
|
191
|
+
|
192
|
+
if valid_name?(name)
|
193
|
+
warn_if_key_taken context, name, block
|
194
|
+
shared_example_groups[context][name] = shared_module
|
195
|
+
else
|
196
|
+
metadata_args.unshift name
|
197
|
+
end
|
198
|
+
|
199
|
+
return if metadata_args.empty?
|
200
|
+
RSpec.configuration.include shared_module, *metadata_args
|
201
|
+
end
|
202
|
+
|
168
203
|
def shared_example_groups
|
169
204
|
@shared_example_groups ||= Hash.new { |hash, context| hash[context] = {} }
|
170
205
|
end
|
@@ -177,13 +212,13 @@ module RSpec
|
|
177
212
|
end
|
178
213
|
|
179
214
|
def warn_if_key_taken(context, key, new_block)
|
180
|
-
|
215
|
+
existing_module = shared_example_groups[context][key]
|
181
216
|
|
182
|
-
return unless
|
217
|
+
return unless existing_module
|
183
218
|
|
184
219
|
RSpec.warn_with <<-WARNING.gsub(/^ +\|/, ''), :call_site => nil
|
185
220
|
|WARNING: Shared example group '#{key}' has been previously defined at:
|
186
|
-
| #{formatted_location
|
221
|
+
| #{formatted_location existing_module.definition}
|
187
222
|
|...and you are now defining it at:
|
188
223
|
| #{formatted_location new_block}
|
189
224
|
|The new definition will overwrite the original one.
|
data/lib/rspec/core/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.5.0.
|
4
|
+
version: 3.5.0.beta4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steven Baker
|
@@ -46,7 +46,7 @@ cert_chain:
|
|
46
46
|
ZsVDj6a7lH3cNqtWXZxrb2wO38qV5AkYj8SQK7Hj3/Yui9myUX3crr+PdetazSqQ
|
47
47
|
F3MdtaDehhjC
|
48
48
|
-----END CERTIFICATE-----
|
49
|
-
date: 2016-
|
49
|
+
date: 2016-06-05 00:00:00.000000000 Z
|
50
50
|
dependencies:
|
51
51
|
- !ruby/object:Gem::Dependency
|
52
52
|
name: rspec-support
|
@@ -54,14 +54,14 @@ dependencies:
|
|
54
54
|
requirements:
|
55
55
|
- - '='
|
56
56
|
- !ruby/object:Gem::Version
|
57
|
-
version: 3.5.0.
|
57
|
+
version: 3.5.0.beta4
|
58
58
|
type: :runtime
|
59
59
|
prerelease: false
|
60
60
|
version_requirements: !ruby/object:Gem::Requirement
|
61
61
|
requirements:
|
62
62
|
- - '='
|
63
63
|
- !ruby/object:Gem::Version
|
64
|
-
version: 3.5.0.
|
64
|
+
version: 3.5.0.beta4
|
65
65
|
- !ruby/object:Gem::Dependency
|
66
66
|
name: cucumber
|
67
67
|
requirement: !ruby/object:Gem::Requirement
|
@@ -279,9 +279,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
279
279
|
version: 1.3.1
|
280
280
|
requirements: []
|
281
281
|
rubyforge_project:
|
282
|
-
rubygems_version: 2.
|
282
|
+
rubygems_version: 2.5.1
|
283
283
|
signing_key:
|
284
284
|
specification_version: 4
|
285
|
-
summary: rspec-core-3.5.0.
|
285
|
+
summary: rspec-core-3.5.0.beta4
|
286
286
|
test_files: []
|
287
287
|
has_rdoc:
|
metadata.gz.sig
CHANGED
Binary file
|