@@ -1161,7 +1161,7 @@ def exclusion_filter
1161
1161
def include ( mod , *filters )
1162
1162
meta = Metadata . build_hash_from ( filters , :warn_about_example_group_filtering )
1163
1163
@include_modules . append ( mod , meta )
1164
- configure_existing_groups ( mod , meta , : safe_include)
1164
+ on_existing_matching_groups ( meta ) { | group | safe_include ( mod , group ) }
1165
1165
end
1166
1166
1167
1167
# Tells RSpec to extend example groups with `mod`. Methods defined in
@@ -1197,7 +1197,7 @@ def include(mod, *filters)
1197
1197
def extend ( mod , *filters )
1198
1198
meta = Metadata . build_hash_from ( filters , :warn_about_example_group_filtering )
1199
1199
@extend_modules . append ( mod , meta )
1200
- configure_existing_groups ( mod , meta , : safe_extend)
1200
+ on_existing_matching_groups ( meta ) { | group | safe_extend ( mod , group ) }
1201
1201
end
1202
1202
1203
1203
if RSpec ::Support ::RubyFeatures . module_prepends_supported?
@@ -1236,7 +1236,7 @@ def extend(mod, *filters)
1236
1236
def prepend ( mod , *filters )
1237
1237
meta = Metadata . build_hash_from ( filters , :warn_about_example_group_filtering )
1238
1238
@prepend_modules . append ( mod , meta )
1239
- configure_existing_groups ( mod , meta , : safe_prepend)
1239
+ on_existing_matching_groups ( meta ) { | group | safe_prepend ( mod , group ) }
1240
1240
end
1241
1241
end
1242
1242
@@ -1250,21 +1250,6 @@ def configure_group(group)
1250
1250
configure_group_with group , @prepend_modules , :safe_prepend
1251
1251
end
1252
1252
1253
- # @private
1254
- def configure_group_with ( group , module_list , application_method )
1255
- module_list . items_for ( group . metadata ) . each do |mod |
1256
- __send__ ( application_method , mod , group )
1257
- end
1258
- end
1259
-
1260
- # @private
1261
- def configure_existing_groups ( mod , meta , application_method )
1262
- world . all_example_groups . each do |group |
1263
- next unless meta . empty? || MetadataFilter . apply? ( :any? , meta , group . metadata )
1264
- __send__ ( application_method , mod , group )
1265
- end
1266
- end
1267
-
1268
1253
# @private
1269
1254
#
1270
1255
# Used internally to extend the singleton class of a single example's
@@ -1284,13 +1269,6 @@ def configure_example(example)
1284
1269
end
1285
1270
end
1286
1271
1287
- if RSpec ::Support ::RubyFeatures . module_prepends_supported?
1288
- # @private
1289
- def safe_prepend ( mod , host )
1290
- host . __send__ ( :prepend , mod ) unless host < mod
1291
- end
1292
- end
1293
-
1294
1272
# @private
1295
1273
def requires = ( paths )
1296
1274
directories = [ 'lib' , default_path ] . select { |p | File . directory? p }
@@ -1308,31 +1286,6 @@ def in_project_source_dir_regex
1308
1286
Regexp . union ( regexes )
1309
1287
end
1310
1288
1311
- # @private
1312
- if RUBY_VERSION . to_f >= 1.9
1313
- # @private
1314
- def safe_include ( mod , host )
1315
- host . __send__ ( :include , mod ) unless host < mod
1316
- end
1317
-
1318
- # @private
1319
- def safe_extend ( mod , host )
1320
- host . extend ( mod ) unless host . singleton_class < mod
1321
- end
1322
- else # for 1.8.7
1323
- # :nocov:
1324
- # @private
1325
- def safe_include ( mod , host )
1326
- host . __send__ ( :include , mod ) unless host . included_modules . include? ( mod )
1327
- end
1328
-
1329
- # @private
1330
- def safe_extend ( mod , host )
1331
- host . extend ( mod ) unless ( class << host ; self ; end ) . included_modules . include? ( mod )
1332
- end
1333
- # :nocov:
1334
- end
1335
-
1336
1289
# @private
1337
1290
def configure_mock_framework
1338
1291
RSpec ::Core ::ExampleGroup . __send__ ( :include , mock_framework )
@@ -1616,9 +1569,10 @@ def apply_derived_metadata_to(metadata)
1616
1569
# @see #prepend_before
1617
1570
# @see #after
1618
1571
# @see #append_after
1619
- def before ( *args , &block )
1620
- handle_suite_hook ( args , @before_suite_hooks , :push ,
1621
- Hooks ::BeforeHook , block ) || super ( *args , &block )
1572
+ def before ( scope = nil , *meta , &block )
1573
+ handle_suite_hook ( scope , meta ) do
1574
+ @before_suite_hooks << Hooks ::BeforeHook . new ( block , { } )
1575
+ end || super ( scope , *meta , &block )
1622
1576
end
1623
1577
alias_method :append_before , :before
1624
1578
@@ -1635,9 +1589,10 @@ def before(*args, &block)
1635
1589
# @see #before
1636
1590
# @see #after
1637
1591
# @see #append_after
1638
- def prepend_before ( *args , &block )
1639
- handle_suite_hook ( args , @before_suite_hooks , :unshift ,
1640
- Hooks ::BeforeHook , block ) || super ( *args , &block )
1592
+ def prepend_before ( scope = nil , *meta , &block )
1593
+ handle_suite_hook ( scope , meta ) do
1594
+ @before_suite_hooks . unshift Hooks ::BeforeHook . new ( block , { } )
1595
+ end || super ( scope , *meta , &block )
1641
1596
end
1642
1597
1643
1598
# Defines a `after` hook. See {Hooks#after} for full docs.
@@ -1649,9 +1604,10 @@ def prepend_before(*args, &block)
1649
1604
# @see #append_after
1650
1605
# @see #before
1651
1606
# @see #prepend_before
1652
- def after ( *args , &block )
1653
- handle_suite_hook ( args , @after_suite_hooks , :unshift ,
1654
- Hooks ::AfterHook , block ) || super ( *args , &block )
1607
+ def after ( scope = nil , *meta , &block )
1608
+ handle_suite_hook ( scope , meta ) do
1609
+ @after_suite_hooks . unshift Hooks ::AfterHook . new ( block , { } )
1610
+ end || super ( scope , *meta , &block )
1655
1611
end
1656
1612
alias_method :prepend_after , :after
1657
1613
@@ -1668,9 +1624,10 @@ def after(*args, &block)
1668
1624
# @see #append_after
1669
1625
# @see #before
1670
1626
# @see #prepend_before
1671
- def append_after ( *args , &block )
1672
- handle_suite_hook ( args , @after_suite_hooks , :push ,
1673
- Hooks ::AfterHook , block ) || super ( *args , &block )
1627
+ def append_after ( scope = nil , *meta , &block )
1628
+ handle_suite_hook ( scope , meta ) do
1629
+ @after_suite_hooks << Hooks ::AfterHook . new ( block , { } )
1630
+ end || super ( scope , *meta , &block )
1674
1631
end
1675
1632
1676
1633
# @private
@@ -1707,11 +1664,10 @@ def on_example_group_definition_callbacks
1707
1664
1708
1665
private
1709
1666
1710
- def handle_suite_hook ( args , collection , append_or_prepend , hook_type , block )
1711
- scope , meta = *args
1667
+ def handle_suite_hook ( scope , meta )
1712
1668
return nil unless scope == :suite
1713
1669
1714
- if meta
1670
+ unless meta . empty?
1715
1671
# TODO: in RSpec 4, consider raising an error here.
1716
1672
# We warn only for backwards compatibility.
1717
1673
RSpec . warn_with "WARNING: `:suite` hooks do not support metadata since " \
@@ -1720,7 +1676,7 @@ def handle_suite_hook(args, collection, append_or_prepend, hook_type, block)
1720
1676
"The metadata you have provided (#{ meta . inspect } ) will be ignored."
1721
1677
end
1722
1678
1723
- collection . __send__ ( append_or_prepend , hook_type . new ( block , { } ) )
1679
+ yield
1724
1680
end
1725
1681
1726
1682
def run_hooks_with ( hooks , hook_context )
@@ -1866,6 +1822,44 @@ def clear_values_derived_from_example_status_persistence_file_path
1866
1822
@last_run_statuses = nil
1867
1823
@spec_files_with_failures = nil
1868
1824
end
1825
+
1826
+ def configure_group_with ( group , module_list , application_method )
1827
+ module_list . items_for ( group . metadata ) . each do |mod |
1828
+ __send__ ( application_method , mod , group )
1829
+ end
1830
+ end
1831
+
1832
+ def on_existing_matching_groups ( meta )
1833
+ world . all_example_groups . each do |group |
1834
+ yield group if meta . empty? || MetadataFilter . apply? ( :any? , meta , group . metadata )
1835
+ end
1836
+ end
1837
+
1838
+ if RSpec ::Support ::RubyFeatures . module_prepends_supported?
1839
+ def safe_prepend ( mod , host )
1840
+ host . __send__ ( :prepend , mod ) unless host < mod
1841
+ end
1842
+ end
1843
+
1844
+ if RUBY_VERSION . to_f >= 1.9
1845
+ def safe_include ( mod , host )
1846
+ host . __send__ ( :include , mod ) unless host < mod
1847
+ end
1848
+
1849
+ def safe_extend ( mod , host )
1850
+ host . extend ( mod ) unless host . singleton_class < mod
1851
+ end
1852
+ else # for 1.8.7
1853
+ # :nocov:
1854
+ def safe_include ( mod , host )
1855
+ host . __send__ ( :include , mod ) unless host . included_modules . include? ( mod )
1856
+ end
1857
+
1858
+ def safe_extend ( mod , host )
1859
+ host . extend ( mod ) unless ( class << host ; self ; end ) . included_modules . include? ( mod )
1860
+ end
1861
+ # :nocov:
1862
+ end
1869
1863
end
1870
1864
# rubocop:enable Metrics/ClassLength
1871
1865
end
0 commit comments