rspec-core 3.5.0.beta1 → 3.5.0.beta2
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 +4 -4
- data.tar.gz.sig +0 -0
- data/Changelog.md +34 -1
- data/lib/rspec/core.rb +3 -1
- data/lib/rspec/core/configuration.rb +123 -70
- data/lib/rspec/core/dsl.rb +3 -1
- data/lib/rspec/core/example.rb +10 -0
- data/lib/rspec/core/example_group.rb +43 -26
- data/lib/rspec/core/formatters/snippet_extractor.rb +7 -14
- data/lib/rspec/core/hooks.rb +1 -8
- data/lib/rspec/core/metadata.rb +6 -1
- data/lib/rspec/core/metadata_filter.rb +10 -19
- data/lib/rspec/core/rake_task.rb +2 -2
- data/lib/rspec/core/runner.rb +21 -12
- data/lib/rspec/core/source/token.rb +43 -0
- data/lib/rspec/core/version.rb +1 -1
- data/lib/rspec/core/world.rb +42 -9
- metadata +6 -20
- 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: ae10092df64000bc49a31c63ea1e6fb90f8bed34
|
4
|
+
data.tar.gz: 34f6ffdfff90d32dbb96fde2fd9a45e1280bfaeb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d58b487bff47a2a7d54c86a91e50ec8dadd2f4c5a5a842557cdaa6a2a575dd1409f612a41161ef1862eb15a71b8d9c60bfb3acfc5aec471e0a7fec14467b53d9
|
7
|
+
data.tar.gz: 7e6f624e87c70244933bc521d67d6bed2b3b455556a57aaca8bda715d07a738920414ae179bf432054222507323f002fc2e30a344c999125606672c6dbdccd4f
|
checksums.yaml.gz.sig
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
CS+�0������>;���{�t�>զ�Y�`�$Q�h5��-���"�{�C�5�h�:��*�m��L��^���&�����]�fR4�҄��������g�J܊��S�;b�$6�����hu�F
|
2
|
+
9t����6)KR�$l4Ƈ�O(��+���-B�* ���bE���n��;U�پJX�r`�7�j�Y�+z%?ϸ�&��)��^��i؏]F�R��e?�_��~� �ݽ6�^lki��cK�U����
|
3
|
+
s���*Z
|
4
|
+
��0����@�+��uD-�K(-i4N� ,ؚJ�b� �2>���a�d�%%�Mnp�vT�>�"O�o_�ڪ�.'���QP�&^w�p���F/f+�/@��<��DM
|
data.tar.gz.sig
CHANGED
Binary file
|
data/Changelog.md
CHANGED
@@ -1,8 +1,41 @@
|
|
1
1
|
### Development
|
2
2
|
[Full Changelog](http://github.com/rspec/rspec-core/compare/v3.5.0.beta1...master)
|
3
3
|
|
4
|
+
Enhancements:
|
5
|
+
|
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
|
+
|
4
15
|
### 3.5.0.beta1 / 2016-02-06
|
5
|
-
[Full Changelog](http://github.com/rspec/rspec-core/compare/v3.4.
|
16
|
+
[Full Changelog](http://github.com/rspec/rspec-core/compare/v3.4.3...v3.5.0.beta1)
|
17
|
+
|
18
|
+
### 3.4.4 / 2016-03-09
|
19
|
+
[Full Changelog](http://github.com/rspec/rspec-core/compare/v3.4.3...v3.4.4)
|
20
|
+
|
21
|
+
Bug Fixes:
|
22
|
+
|
23
|
+
* Fix `RSpec::Core::RakeTask` so that it works with Rake 11.
|
24
|
+
(Travis Grathwell, #2197)
|
25
|
+
|
26
|
+
### 3.4.3 / 2016-02-19
|
27
|
+
[Full Changelog](http://github.com/rspec/rspec-core/compare/v3.4.2...v3.4.3)
|
28
|
+
|
29
|
+
Bug Fixes:
|
30
|
+
|
31
|
+
* Prevent a `TypeError` from occuring when running via the rake task when
|
32
|
+
Ruby crashes. (Patrik Wenger, #2161)
|
33
|
+
* Only consider example and group declaration lines from a specific file
|
34
|
+
when applying line number filtering, instead of considering all
|
35
|
+
declaration lines from all spec files. (Myron Marston, #2170)
|
36
|
+
* Fix failure snippet extraction so that snippets that contain `do-end` style
|
37
|
+
block and end with `end`-only line can be extracted properly.
|
38
|
+
(Yuji Nakayama, #2173)
|
6
39
|
|
7
40
|
### 3.4.2 / 2016-01-26
|
8
41
|
[Full Changelog](http://github.com/rspec/rspec-core/compare/v3.4.1...v3.4.2)
|
data/lib/rspec/core.rb
CHANGED
@@ -83,7 +83,6 @@ module RSpec
|
|
83
83
|
def self.configuration
|
84
84
|
@configuration ||= RSpec::Core::Configuration.new
|
85
85
|
end
|
86
|
-
configuration.expose_dsl_globally = true
|
87
86
|
|
88
87
|
# Yields the global configuration to a block.
|
89
88
|
# @yield [Configuration] global configuration
|
@@ -178,4 +177,7 @@ module RSpec
|
|
178
177
|
require MODULES_TO_AUTOLOAD.fetch(name) { return super }
|
179
178
|
::RSpec.const_get(name)
|
180
179
|
end
|
180
|
+
|
181
|
+
Core::DSL.expose_globally!
|
182
|
+
Core::SharedExampleGroup::TopLevelDSL.expose_globally!
|
181
183
|
end
|
@@ -343,12 +343,13 @@ module RSpec
|
|
343
343
|
# @private
|
344
344
|
attr_writer :files_to_run
|
345
345
|
# @private
|
346
|
-
attr_accessor :filter_manager
|
346
|
+
attr_accessor :filter_manager, :world
|
347
347
|
# @private
|
348
348
|
attr_accessor :static_config_filter_manager
|
349
349
|
# @private
|
350
350
|
attr_reader :backtrace_formatter, :ordering_manager, :loaded_spec_files
|
351
351
|
|
352
|
+
# rubocop:disable Metrics/AbcSize
|
352
353
|
def initialize
|
353
354
|
# rubocop:disable Style/GlobalVars
|
354
355
|
@start_time = $_rspec_core_load_started_at || ::RSpec::Core::Time.now
|
@@ -394,9 +395,11 @@ module RSpec
|
|
394
395
|
@derived_metadata_blocks = FilterableItemRepository::QueryOptimized.new(:any?)
|
395
396
|
@threadsafe = true
|
396
397
|
@max_displayed_failure_line_count = 10
|
398
|
+
@world = World::Null
|
397
399
|
|
398
400
|
define_built_in_hooks
|
399
401
|
end
|
402
|
+
# rubocop:enable Metrics/AbcSize
|
400
403
|
|
401
404
|
# @private
|
402
405
|
#
|
@@ -822,7 +825,7 @@ module RSpec
|
|
822
825
|
end
|
823
826
|
end
|
824
827
|
|
825
|
-
# @
|
828
|
+
# @return [RSpec::Core::Reporter] the currently configured reporter
|
826
829
|
def reporter
|
827
830
|
# @reporter_buffer should only ever be set in this method to cover
|
828
831
|
# initialization of @reporter.
|
@@ -1158,7 +1161,7 @@ module RSpec
|
|
1158
1161
|
def include(mod, *filters)
|
1159
1162
|
meta = Metadata.build_hash_from(filters, :warn_about_example_group_filtering)
|
1160
1163
|
@include_modules.append(mod, meta)
|
1161
|
-
|
1164
|
+
on_existing_matching_groups(meta) { |group| safe_include(mod, group) }
|
1162
1165
|
end
|
1163
1166
|
|
1164
1167
|
# Tells RSpec to extend example groups with `mod`. Methods defined in
|
@@ -1194,7 +1197,7 @@ module RSpec
|
|
1194
1197
|
def extend(mod, *filters)
|
1195
1198
|
meta = Metadata.build_hash_from(filters, :warn_about_example_group_filtering)
|
1196
1199
|
@extend_modules.append(mod, meta)
|
1197
|
-
|
1200
|
+
on_existing_matching_groups(meta) { |group| safe_extend(mod, group) }
|
1198
1201
|
end
|
1199
1202
|
|
1200
1203
|
if RSpec::Support::RubyFeatures.module_prepends_supported?
|
@@ -1233,7 +1236,7 @@ module RSpec
|
|
1233
1236
|
def prepend(mod, *filters)
|
1234
1237
|
meta = Metadata.build_hash_from(filters, :warn_about_example_group_filtering)
|
1235
1238
|
@prepend_modules.append(mod, meta)
|
1236
|
-
|
1239
|
+
on_existing_matching_groups(meta) { |group| safe_prepend(mod, group) }
|
1237
1240
|
end
|
1238
1241
|
end
|
1239
1242
|
|
@@ -1247,21 +1250,6 @@ module RSpec
|
|
1247
1250
|
configure_group_with group, @prepend_modules, :safe_prepend
|
1248
1251
|
end
|
1249
1252
|
|
1250
|
-
# @private
|
1251
|
-
def configure_group_with(group, module_list, application_method)
|
1252
|
-
module_list.items_for(group.metadata).each do |mod|
|
1253
|
-
__send__(application_method, mod, group)
|
1254
|
-
end
|
1255
|
-
end
|
1256
|
-
|
1257
|
-
# @private
|
1258
|
-
def configure_existing_groups(mod, meta, application_method)
|
1259
|
-
RSpec.world.all_example_groups.each do |group|
|
1260
|
-
next unless meta.empty? || MetadataFilter.apply?(:any?, meta, group.metadata)
|
1261
|
-
__send__(application_method, mod, group)
|
1262
|
-
end
|
1263
|
-
end
|
1264
|
-
|
1265
1253
|
# @private
|
1266
1254
|
#
|
1267
1255
|
# Used internally to extend the singleton class of a single example's
|
@@ -1281,13 +1269,6 @@ module RSpec
|
|
1281
1269
|
end
|
1282
1270
|
end
|
1283
1271
|
|
1284
|
-
if RSpec::Support::RubyFeatures.module_prepends_supported?
|
1285
|
-
# @private
|
1286
|
-
def safe_prepend(mod, host)
|
1287
|
-
host.__send__(:prepend, mod) unless host < mod
|
1288
|
-
end
|
1289
|
-
end
|
1290
|
-
|
1291
1272
|
# @private
|
1292
1273
|
def requires=(paths)
|
1293
1274
|
directories = ['lib', default_path].select { |p| File.directory? p }
|
@@ -1305,31 +1286,6 @@ module RSpec
|
|
1305
1286
|
Regexp.union(regexes)
|
1306
1287
|
end
|
1307
1288
|
|
1308
|
-
# @private
|
1309
|
-
if RUBY_VERSION.to_f >= 1.9
|
1310
|
-
# @private
|
1311
|
-
def safe_include(mod, host)
|
1312
|
-
host.__send__(:include, mod) unless host < mod
|
1313
|
-
end
|
1314
|
-
|
1315
|
-
# @private
|
1316
|
-
def safe_extend(mod, host)
|
1317
|
-
host.extend(mod) unless host.singleton_class < mod
|
1318
|
-
end
|
1319
|
-
else # for 1.8.7
|
1320
|
-
# :nocov:
|
1321
|
-
# @private
|
1322
|
-
def safe_include(mod, host)
|
1323
|
-
host.__send__(:include, mod) unless host.included_modules.include?(mod)
|
1324
|
-
end
|
1325
|
-
|
1326
|
-
# @private
|
1327
|
-
def safe_extend(mod, host)
|
1328
|
-
host.extend(mod) unless (class << host; self; end).included_modules.include?(mod)
|
1329
|
-
end
|
1330
|
-
# :nocov:
|
1331
|
-
end
|
1332
|
-
|
1333
1289
|
# @private
|
1334
1290
|
def configure_mock_framework
|
1335
1291
|
RSpec::Core::ExampleGroup.__send__(:include, mock_framework)
|
@@ -1352,7 +1308,7 @@ module RSpec
|
|
1352
1308
|
# in that case, the spec file was loaded by `ruby` and
|
1353
1309
|
# isn't loaded by us here so we only know about it because
|
1354
1310
|
# of an example group being registered in it.
|
1355
|
-
|
1311
|
+
world.registered_example_group_files.each do |f|
|
1356
1312
|
loaded_spec_files << f # the registered files are already expended absolute paths
|
1357
1313
|
end
|
1358
1314
|
|
@@ -1597,6 +1553,41 @@ module RSpec
|
|
1597
1553
|
@derived_metadata_blocks.append(block, meta)
|
1598
1554
|
end
|
1599
1555
|
|
1556
|
+
# Defines a callback that runs after the first example with matching
|
1557
|
+
# metadata is defined. If no examples are defined with matching metadata,
|
1558
|
+
# it will not get called at all.
|
1559
|
+
#
|
1560
|
+
# This can be used to ensure some setup is performed (such as bootstrapping
|
1561
|
+
# a DB or loading a specific file that adds significantly to the boot time)
|
1562
|
+
# if needed (as indicated by the presence of an example with matching metadata)
|
1563
|
+
# but avoided otherwise.
|
1564
|
+
#
|
1565
|
+
# @example
|
1566
|
+
# RSpec.configure do |config|
|
1567
|
+
# config.when_first_matching_example_defined(:db) do
|
1568
|
+
# # Load a support file that does some heavyweight setup,
|
1569
|
+
# # including bootstrapping the DB, but only if we have loaded
|
1570
|
+
# # any examples tagged with `:db`.
|
1571
|
+
# require 'support/db'
|
1572
|
+
# end
|
1573
|
+
# end
|
1574
|
+
def when_first_matching_example_defined(*filters, &block)
|
1575
|
+
specified_meta = Metadata.build_hash_from(filters, :warn_about_example_group_filtering)
|
1576
|
+
|
1577
|
+
callback = lambda do |example_or_group_meta|
|
1578
|
+
# Example groups do not have `:example_group` metadata
|
1579
|
+
# (instead they have `:parent_example_group` metadata).
|
1580
|
+
return unless example_or_group_meta.key?(:example_group)
|
1581
|
+
|
1582
|
+
# Ensure the callback only fires once.
|
1583
|
+
@derived_metadata_blocks.items_for(specified_meta).delete(callback)
|
1584
|
+
|
1585
|
+
block.call
|
1586
|
+
end
|
1587
|
+
|
1588
|
+
@derived_metadata_blocks.append(callback, specified_meta)
|
1589
|
+
end
|
1590
|
+
|
1600
1591
|
# @private
|
1601
1592
|
def apply_derived_metadata_to(metadata)
|
1602
1593
|
@derived_metadata_blocks.items_for(metadata).each do |block|
|
@@ -1613,9 +1604,13 @@ module RSpec
|
|
1613
1604
|
# @see #prepend_before
|
1614
1605
|
# @see #after
|
1615
1606
|
# @see #append_after
|
1616
|
-
def before(*
|
1617
|
-
handle_suite_hook(
|
1618
|
-
|
1607
|
+
def before(scope=nil, *meta, &block)
|
1608
|
+
handle_suite_hook(scope, meta) do
|
1609
|
+
@before_suite_hooks << Hooks::BeforeHook.new(block, {})
|
1610
|
+
end || begin
|
1611
|
+
on_existing_matching_groups({}) { |g| g.before(scope, *meta, &block) }
|
1612
|
+
super(scope, *meta, &block)
|
1613
|
+
end
|
1619
1614
|
end
|
1620
1615
|
alias_method :append_before, :before
|
1621
1616
|
|
@@ -1632,9 +1627,13 @@ module RSpec
|
|
1632
1627
|
# @see #before
|
1633
1628
|
# @see #after
|
1634
1629
|
# @see #append_after
|
1635
|
-
def prepend_before(*
|
1636
|
-
handle_suite_hook(
|
1637
|
-
|
1630
|
+
def prepend_before(scope=nil, *meta, &block)
|
1631
|
+
handle_suite_hook(scope, meta) do
|
1632
|
+
@before_suite_hooks.unshift Hooks::BeforeHook.new(block, {})
|
1633
|
+
end || begin
|
1634
|
+
on_existing_matching_groups({}) { |g| g.prepend_before(scope, *meta, &block) }
|
1635
|
+
super(scope, *meta, &block)
|
1636
|
+
end
|
1638
1637
|
end
|
1639
1638
|
|
1640
1639
|
# Defines a `after` hook. See {Hooks#after} for full docs.
|
@@ -1646,9 +1645,13 @@ module RSpec
|
|
1646
1645
|
# @see #append_after
|
1647
1646
|
# @see #before
|
1648
1647
|
# @see #prepend_before
|
1649
|
-
def after(*
|
1650
|
-
handle_suite_hook(
|
1651
|
-
|
1648
|
+
def after(scope=nil, *meta, &block)
|
1649
|
+
handle_suite_hook(scope, meta) do
|
1650
|
+
@after_suite_hooks.unshift Hooks::AfterHook.new(block, {})
|
1651
|
+
end || begin
|
1652
|
+
on_existing_matching_groups({}) { |g| g.after(scope, *meta, &block) }
|
1653
|
+
super(scope, *meta, &block)
|
1654
|
+
end
|
1652
1655
|
end
|
1653
1656
|
alias_method :prepend_after, :after
|
1654
1657
|
|
@@ -1665,9 +1668,22 @@ module RSpec
|
|
1665
1668
|
# @see #append_after
|
1666
1669
|
# @see #before
|
1667
1670
|
# @see #prepend_before
|
1668
|
-
def append_after(*
|
1669
|
-
handle_suite_hook(
|
1670
|
-
|
1671
|
+
def append_after(scope=nil, *meta, &block)
|
1672
|
+
handle_suite_hook(scope, meta) do
|
1673
|
+
@after_suite_hooks << Hooks::AfterHook.new(block, {})
|
1674
|
+
end || begin
|
1675
|
+
on_existing_matching_groups({}) { |g| g.append_after(scope, *meta, &block) }
|
1676
|
+
super(scope, *meta, &block)
|
1677
|
+
end
|
1678
|
+
end
|
1679
|
+
|
1680
|
+
# Registers `block` as an `around` hook.
|
1681
|
+
#
|
1682
|
+
# See {Hooks#around} for full `around` hook docs.
|
1683
|
+
def around(scope=nil, *meta, &block)
|
1684
|
+
on_existing_matching_groups({}) { |g| g.around(scope, *meta, &block) }
|
1685
|
+
|
1686
|
+
super(scope, *meta, &block)
|
1671
1687
|
end
|
1672
1688
|
|
1673
1689
|
# @private
|
@@ -1704,11 +1720,10 @@ module RSpec
|
|
1704
1720
|
|
1705
1721
|
private
|
1706
1722
|
|
1707
|
-
def handle_suite_hook(
|
1708
|
-
scope, meta = *args
|
1723
|
+
def handle_suite_hook(scope, meta)
|
1709
1724
|
return nil unless scope == :suite
|
1710
1725
|
|
1711
|
-
|
1726
|
+
unless meta.empty?
|
1712
1727
|
# TODO: in RSpec 4, consider raising an error here.
|
1713
1728
|
# We warn only for backwards compatibility.
|
1714
1729
|
RSpec.warn_with "WARNING: `:suite` hooks do not support metadata since " \
|
@@ -1717,7 +1732,7 @@ module RSpec
|
|
1717
1732
|
"The metadata you have provided (#{meta.inspect}) will be ignored."
|
1718
1733
|
end
|
1719
1734
|
|
1720
|
-
|
1735
|
+
yield
|
1721
1736
|
end
|
1722
1737
|
|
1723
1738
|
def run_hooks_with(hooks, hook_context)
|
@@ -1814,7 +1829,7 @@ module RSpec
|
|
1814
1829
|
end
|
1815
1830
|
|
1816
1831
|
def assert_no_example_groups_defined(config_option)
|
1817
|
-
return unless
|
1832
|
+
return unless world.example_groups.any?
|
1818
1833
|
|
1819
1834
|
raise MustBeConfiguredBeforeExampleGroupsError.new(
|
1820
1835
|
"RSpec's #{config_option} configuration option must be configured before " \
|
@@ -1863,6 +1878,44 @@ module RSpec
|
|
1863
1878
|
@last_run_statuses = nil
|
1864
1879
|
@spec_files_with_failures = nil
|
1865
1880
|
end
|
1881
|
+
|
1882
|
+
def configure_group_with(group, module_list, application_method)
|
1883
|
+
module_list.items_for(group.metadata).each do |mod|
|
1884
|
+
__send__(application_method, mod, group)
|
1885
|
+
end
|
1886
|
+
end
|
1887
|
+
|
1888
|
+
def on_existing_matching_groups(meta)
|
1889
|
+
world.all_example_groups.each do |group|
|
1890
|
+
yield group if meta.empty? || MetadataFilter.apply?(:any?, meta, group.metadata)
|
1891
|
+
end
|
1892
|
+
end
|
1893
|
+
|
1894
|
+
if RSpec::Support::RubyFeatures.module_prepends_supported?
|
1895
|
+
def safe_prepend(mod, host)
|
1896
|
+
host.__send__(:prepend, mod) unless host < mod
|
1897
|
+
end
|
1898
|
+
end
|
1899
|
+
|
1900
|
+
if RUBY_VERSION.to_f >= 1.9
|
1901
|
+
def safe_include(mod, host)
|
1902
|
+
host.__send__(:include, mod) unless host < mod
|
1903
|
+
end
|
1904
|
+
|
1905
|
+
def safe_extend(mod, host)
|
1906
|
+
host.extend(mod) unless host.singleton_class < mod
|
1907
|
+
end
|
1908
|
+
else # for 1.8.7
|
1909
|
+
# :nocov:
|
1910
|
+
def safe_include(mod, host)
|
1911
|
+
host.__send__(:include, mod) unless host.included_modules.include?(mod)
|
1912
|
+
end
|
1913
|
+
|
1914
|
+
def safe_extend(mod, host)
|
1915
|
+
host.extend(mod) unless (class << host; self; end).included_modules.include?(mod)
|
1916
|
+
end
|
1917
|
+
# :nocov:
|
1918
|
+
end
|
1866
1919
|
end
|
1867
1920
|
# rubocop:enable Metrics/ClassLength
|
1868
1921
|
end
|
data/lib/rspec/core/dsl.rb
CHANGED
@@ -40,7 +40,9 @@ module RSpec
|
|
40
40
|
example_group_aliases << name
|
41
41
|
|
42
42
|
(class << RSpec; self; end).__send__(:define_method, name) do |*args, &example_group_block|
|
43
|
-
|
43
|
+
group = RSpec::Core::ExampleGroup.__send__(name, *args, &example_group_block)
|
44
|
+
RSpec.world.record(group)
|
45
|
+
group
|
44
46
|
end
|
45
47
|
|
46
48
|
expose_example_group_alias_globally(name) if exposed_globally?
|
data/lib/rspec/core/example.rb
CHANGED
@@ -178,6 +178,16 @@ module RSpec
|
|
178
178
|
@example_group_class = example_group_class
|
179
179
|
@example_block = example_block
|
180
180
|
|
181
|
+
# Register the example with the group before creating the metadata hash.
|
182
|
+
# This is necessary since creating the metadata hash triggers
|
183
|
+
# `when_first_matching_example_defined` callbacks, in which users can
|
184
|
+
# load RSpec support code which defines hooks. For that to work, the
|
185
|
+
# examples and example groups must be registered at the time the
|
186
|
+
# support code is called or be defined afterwards.
|
187
|
+
# Begin defined beforehand but registered afterwards causes hooks to
|
188
|
+
# not be applied where they should.
|
189
|
+
example_group_class.examples << self
|
190
|
+
|
181
191
|
@metadata = Metadata::ExampleHash.create(
|
182
192
|
@example_group_class.metadata, user_metadata,
|
183
193
|
example_group_class.method(:next_runnable_index_for),
|
@@ -143,9 +143,7 @@ module RSpec
|
|
143
143
|
options.update(:skip => RSpec::Core::Pending::NOT_YET_IMPLEMENTED) unless block
|
144
144
|
options.update(extra_options)
|
145
145
|
|
146
|
-
|
147
|
-
examples << example
|
148
|
-
example
|
146
|
+
RSpec::Core::Example.new(self, desc, options, block)
|
149
147
|
end
|
150
148
|
end
|
151
149
|
|
@@ -235,27 +233,27 @@ module RSpec
|
|
235
233
|
thread_data = RSpec::Support.thread_local_data
|
236
234
|
top_level = self == ExampleGroup
|
237
235
|
|
238
|
-
|
239
|
-
if
|
240
|
-
|
241
|
-
|
242
|
-
|
236
|
+
registration_collection =
|
237
|
+
if top_level
|
238
|
+
if thread_data[:in_example_group]
|
239
|
+
raise "Creating an isolated context from within a context is " \
|
240
|
+
"not allowed. Change `RSpec.#{name}` to `#{name}` or " \
|
241
|
+
"move this to a top-level scope."
|
242
|
+
end
|
243
|
+
|
244
|
+
thread_data[:in_example_group] = true
|
245
|
+
RSpec.world.example_groups
|
246
|
+
else
|
247
|
+
children
|
243
248
|
end
|
244
249
|
|
245
|
-
thread_data[:in_example_group] = true
|
246
|
-
end
|
247
|
-
|
248
250
|
begin
|
249
|
-
|
250
251
|
description = args.shift
|
251
252
|
combined_metadata = metadata.dup
|
252
253
|
combined_metadata.merge!(args.pop) if args.last.is_a? Hash
|
253
254
|
args << combined_metadata
|
254
255
|
|
255
|
-
subclass(self, description, args, &example_group_block)
|
256
|
-
children << child
|
257
|
-
end
|
258
|
-
|
256
|
+
subclass(self, description, args, registration_collection, &example_group_block)
|
259
257
|
ensure
|
260
258
|
thread_data.delete(:in_example_group) if top_level
|
261
259
|
end
|
@@ -347,7 +345,7 @@ module RSpec
|
|
347
345
|
@descendant_filtered_examples = nil
|
348
346
|
@_descendants = nil
|
349
347
|
@parent_groups = nil
|
350
|
-
@
|
348
|
+
@declaration_locations = nil
|
351
349
|
end
|
352
350
|
|
353
351
|
# Adds an example to the example group
|
@@ -379,9 +377,9 @@ module RSpec
|
|
379
377
|
# @!endgroup
|
380
378
|
|
381
379
|
# @private
|
382
|
-
def self.subclass(parent, description, args, &example_group_block)
|
380
|
+
def self.subclass(parent, description, args, registration_collection, &example_group_block)
|
383
381
|
subclass = Class.new(parent)
|
384
|
-
subclass.set_it_up(description,
|
382
|
+
subclass.set_it_up(description, args, registration_collection, &example_group_block)
|
385
383
|
subclass.module_exec(&example_group_block) if example_group_block
|
386
384
|
|
387
385
|
# The LetDefinitions module must be included _after_ other modules
|
@@ -394,7 +392,7 @@ module RSpec
|
|
394
392
|
end
|
395
393
|
|
396
394
|
# @private
|
397
|
-
def self.set_it_up(description,
|
395
|
+
def self.set_it_up(description, args, registration_collection, &example_group_block)
|
398
396
|
# Ruby 1.9 has a bug that can lead to infinite recursion and a
|
399
397
|
# SystemStackError if you include a module in a superclass after
|
400
398
|
# including it in a subclass: https://gist.github.com/845896
|
@@ -405,6 +403,16 @@ module RSpec
|
|
405
403
|
# here.
|
406
404
|
ensure_example_groups_are_configured
|
407
405
|
|
406
|
+
# Register the example with the group before creating the metadata hash.
|
407
|
+
# This is necessary since creating the metadata hash triggers
|
408
|
+
# `when_first_matching_example_defined` callbacks, in which users can
|
409
|
+
# load RSpec support code which defines hooks. For that to work, the
|
410
|
+
# examples and example groups must be registered at the time the
|
411
|
+
# support code is called or be defined afterwards.
|
412
|
+
# Begin defined beforehand but registered afterwards causes hooks to
|
413
|
+
# not be applied where they should.
|
414
|
+
registration_collection << self
|
415
|
+
|
408
416
|
user_metadata = Metadata.build_hash_from(args)
|
409
417
|
|
410
418
|
@metadata = Metadata::ExampleGroupHash.create(
|
@@ -444,10 +452,19 @@ module RSpec
|
|
444
452
|
# @private
|
445
453
|
def self.next_runnable_index_for(file)
|
446
454
|
if self == ExampleGroup
|
447
|
-
|
455
|
+
# We add 1 so the ids start at 1 instead of 0. This is
|
456
|
+
# necessary for this branch (but not for the other one)
|
457
|
+
# because we register examples and groups with the
|
458
|
+
# `children` and `examples` collection BEFORE this
|
459
|
+
# method is called as part of metadata hash creation,
|
460
|
+
# but the example group is recorded with
|
461
|
+
# `RSpec.world.example_group_counts_by_spec_file` AFTER
|
462
|
+
# the metadata hash is created and the group is returned
|
463
|
+
# to the caller.
|
464
|
+
RSpec.world.num_example_groups_defined_in(file) + 1
|
448
465
|
else
|
449
466
|
children.count + examples.count
|
450
|
-
end
|
467
|
+
end
|
451
468
|
end
|
452
469
|
|
453
470
|
# @private
|
@@ -613,10 +630,10 @@ module RSpec
|
|
613
630
|
end
|
614
631
|
|
615
632
|
# @private
|
616
|
-
def self.
|
617
|
-
@
|
618
|
-
examples.map { |e| e.metadata
|
619
|
-
FlatMap.flat_map(children, &:
|
633
|
+
def self.declaration_locations
|
634
|
+
@declaration_locations ||= [Metadata.location_tuple_from(metadata)] +
|
635
|
+
examples.map { |e| Metadata.location_tuple_from(e.metadata) } +
|
636
|
+
FlatMap.flat_map(children, &:declaration_locations)
|
620
637
|
end
|
621
638
|
|
622
639
|
# @return [String] the unique id of this example group. Pass
|
@@ -23,13 +23,6 @@ module RSpec
|
|
23
23
|
if RSpec::Support::RubyFeatures.ripper_supported?
|
24
24
|
NoExpressionAtLineError = Class.new(StandardError)
|
25
25
|
|
26
|
-
PAREN_TOKEN_TYPE_PAIRS = {
|
27
|
-
:on_lbracket => :on_rbracket,
|
28
|
-
:on_lparen => :on_rparen,
|
29
|
-
:on_lbrace => :on_rbrace,
|
30
|
-
:on_heredoc_beg => :on_heredoc_end
|
31
|
-
}
|
32
|
-
|
33
26
|
attr_reader :source, :beginning_line_number, :max_line_count
|
34
27
|
|
35
28
|
def self.extract_expression_lines_at(file_path, beginning_line_number, max_line_count=nil)
|
@@ -64,29 +57,29 @@ module RSpec
|
|
64
57
|
def line_range_of_expression
|
65
58
|
@line_range_of_expression ||= begin
|
66
59
|
line_range = line_range_of_location_nodes_in_expression
|
67
|
-
|
68
|
-
|
60
|
+
initial_unclosed_tokens = unclosed_tokens_in_line_range(line_range)
|
61
|
+
unclosed_tokens = initial_unclosed_tokens
|
69
62
|
|
70
|
-
until (
|
63
|
+
until (initial_unclosed_tokens & unclosed_tokens).empty?
|
71
64
|
line_range = (line_range.begin)..(line_range.end + 1)
|
72
|
-
|
65
|
+
unclosed_tokens = unclosed_tokens_in_line_range(line_range)
|
73
66
|
end
|
74
67
|
|
75
68
|
line_range
|
76
69
|
end
|
77
70
|
end
|
78
71
|
|
79
|
-
def
|
72
|
+
def unclosed_tokens_in_line_range(line_range)
|
80
73
|
tokens = FlatMap.flat_map(line_range) do |line_number|
|
81
74
|
source.tokens_by_line_number[line_number]
|
82
75
|
end
|
83
76
|
|
84
77
|
tokens.each_with_object([]) do |token, unclosed_tokens|
|
85
|
-
if
|
78
|
+
if token.opening?
|
86
79
|
unclosed_tokens << token
|
87
80
|
else
|
88
81
|
index = unclosed_tokens.rindex do |unclosed_token|
|
89
|
-
|
82
|
+
unclosed_token.closed_by?(token)
|
90
83
|
end
|
91
84
|
unclosed_tokens.delete_at(index) if index
|
92
85
|
end
|
data/lib/rspec/core/hooks.rb
CHANGED
@@ -342,14 +342,7 @@ module RSpec
|
|
342
342
|
private
|
343
343
|
|
344
344
|
# @private
|
345
|
-
|
346
|
-
attr_reader :block, :options
|
347
|
-
|
348
|
-
def initialize(block, options)
|
349
|
-
@block = block
|
350
|
-
@options = options
|
351
|
-
end
|
352
|
-
end
|
345
|
+
Hook = Struct.new(:block, :options)
|
353
346
|
|
354
347
|
# @private
|
355
348
|
class BeforeHook < Hook
|
data/lib/rspec/core/metadata.rb
CHANGED
@@ -106,6 +106,11 @@ module RSpec
|
|
106
106
|
"#{metadata[:rerun_file_path]}[#{metadata[:scoped_id]}]"
|
107
107
|
end
|
108
108
|
|
109
|
+
# @private
|
110
|
+
def self.location_tuple_from(metadata)
|
111
|
+
[metadata[:absolute_file_path], metadata[:line_number]]
|
112
|
+
end
|
113
|
+
|
109
114
|
# @private
|
110
115
|
# Used internally to populate metadata hashes with computed keys
|
111
116
|
# managed by RSpec.
|
@@ -123,7 +128,6 @@ module RSpec
|
|
123
128
|
def populate
|
124
129
|
ensure_valid_user_keys
|
125
130
|
|
126
|
-
metadata[:execution_result] = Example::ExecutionResult.new
|
127
131
|
metadata[:block] = block
|
128
132
|
metadata[:description_args] = description_args
|
129
133
|
metadata[:description] = build_description_from(*metadata[:description_args])
|
@@ -214,6 +218,7 @@ module RSpec
|
|
214
218
|
end)
|
215
219
|
group_metadata.update(example_metadata)
|
216
220
|
|
221
|
+
example_metadata[:execution_result] = Example::ExecutionResult.new
|
217
222
|
example_metadata[:example_group] = group_metadata
|
218
223
|
example_metadata[:shared_group_inclusion_backtrace] = SharedExampleGroupInclusionStackFrame.current_backtrace
|
219
224
|
example_metadata.delete(:parent_example_group)
|
@@ -15,9 +15,9 @@ module RSpec
|
|
15
15
|
# @private
|
16
16
|
def filter_applies?(key, value, metadata)
|
17
17
|
silence_metadata_example_group_deprecations do
|
18
|
-
return location_filter_applies?(value, metadata)
|
19
|
-
return id_filter_applies?(value, metadata)
|
20
|
-
return filters_apply?(key, value, metadata)
|
18
|
+
return location_filter_applies?(value, metadata) if key == :locations
|
19
|
+
return id_filter_applies?(value, metadata) if key == :ids
|
20
|
+
return filters_apply?(key, value, metadata) if Hash === value
|
21
21
|
|
22
22
|
return false unless metadata.key?(key)
|
23
23
|
return true if TrueClass === value && !!metadata[key]
|
@@ -49,13 +49,14 @@ module RSpec
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def location_filter_applies?(locations, metadata)
|
52
|
-
|
53
|
-
|
54
|
-
|
52
|
+
Metadata.ascend(metadata).any? do |meta|
|
53
|
+
file_path = meta[:absolute_file_path]
|
54
|
+
line_num = meta[:line_number]
|
55
55
|
|
56
|
-
|
57
|
-
|
58
|
-
|
56
|
+
locations[file_path].any? do |filter_line_num|
|
57
|
+
line_num == RSpec.world.preceding_declaration_line(file_path, filter_line_num)
|
58
|
+
end
|
59
|
+
end
|
59
60
|
end
|
60
61
|
|
61
62
|
def proc_filter_applies?(key, proc, metadata)
|
@@ -66,16 +67,6 @@ module RSpec
|
|
66
67
|
end
|
67
68
|
end
|
68
69
|
|
69
|
-
def relevant_line_numbers(metadata)
|
70
|
-
Metadata.ascend(metadata).map { |meta| meta[:line_number] }
|
71
|
-
end
|
72
|
-
|
73
|
-
def example_group_declaration_lines(locations, metadata)
|
74
|
-
FlatMap.flat_map(Metadata.ascend(metadata)) do |meta|
|
75
|
-
locations[meta[:absolute_file_path]]
|
76
|
-
end.uniq
|
77
|
-
end
|
78
|
-
|
79
70
|
def filters_apply?(key, value, metadata)
|
80
71
|
subhash = metadata[key]
|
81
72
|
return false unless Hash === subhash || HashImitatable === subhash
|
data/lib/rspec/core/rake_task.rb
CHANGED
@@ -81,14 +81,14 @@ module RSpec
|
|
81
81
|
|
82
82
|
return unless fail_on_error
|
83
83
|
$stderr.puts "#{command} failed" if verbose
|
84
|
-
exit $?.exitstatus
|
84
|
+
exit $?.exitstatus || 1
|
85
85
|
end
|
86
86
|
|
87
87
|
private
|
88
88
|
|
89
89
|
# @private
|
90
90
|
def define(args, &task_block)
|
91
|
-
desc "Run RSpec code examples" unless ::Rake.application.
|
91
|
+
desc "Run RSpec code examples" unless ::Rake.application.last_description
|
92
92
|
|
93
93
|
task name, *args do |_, task_args|
|
94
94
|
RakeFileUtils.__send__(:verbose, verbose) do
|
data/lib/rspec/core/runner.rb
CHANGED
@@ -150,19 +150,28 @@ module RSpec
|
|
150
150
|
end
|
151
151
|
|
152
152
|
# @private
|
153
|
-
# rubocop:disable Lint/EnsureReturn
|
154
153
|
def self.running_in_drb?
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
return
|
154
|
+
return false unless defined?(DRb)
|
155
|
+
|
156
|
+
server = begin
|
157
|
+
DRb.current_server
|
158
|
+
rescue DRb::DRbServerNotFound
|
159
|
+
return false
|
160
|
+
end
|
161
|
+
|
162
|
+
return false unless server && server.alive?
|
163
|
+
|
164
|
+
require 'socket'
|
165
|
+
require 'uri'
|
166
|
+
|
167
|
+
local_ipv4 = begin
|
168
|
+
IPSocket.getaddress(Socket.gethostname)
|
169
|
+
rescue SocketError
|
170
|
+
return false
|
171
|
+
end
|
172
|
+
|
173
|
+
["127.0.0.1", "localhost", local_ipv4].any? { |addr| addr == URI(DRb.current_server.uri).host }
|
164
174
|
end
|
165
|
-
# rubocop:enable Lint/EnsureReturn
|
166
175
|
|
167
176
|
# @private
|
168
177
|
def self.trap_interrupt
|
@@ -175,7 +184,7 @@ module RSpec
|
|
175
184
|
exit!(1)
|
176
185
|
else
|
177
186
|
RSpec.world.wants_to_quit = true
|
178
|
-
|
187
|
+
$stderr.puts "\nRSpec is shutting down and will print the summary report... Interrupt again to force quit."
|
179
188
|
end
|
180
189
|
end
|
181
190
|
end
|
@@ -6,6 +6,17 @@ module RSpec
|
|
6
6
|
# @private
|
7
7
|
# A wrapper for Ripper token which is generated with `Ripper.lex`.
|
8
8
|
class Token
|
9
|
+
CLOSING_TYPES_BY_OPENING_TYPE = {
|
10
|
+
:on_lbracket => :on_rbracket,
|
11
|
+
:on_lparen => :on_rparen,
|
12
|
+
:on_lbrace => :on_rbrace,
|
13
|
+
:on_heredoc_beg => :on_heredoc_end
|
14
|
+
}.freeze
|
15
|
+
|
16
|
+
CLOSING_KEYWORDS_BY_OPENING_KEYWORD = {
|
17
|
+
'do' => 'end'
|
18
|
+
}.freeze
|
19
|
+
|
9
20
|
attr_reader :token
|
10
21
|
|
11
22
|
def self.tokens_from_ripper_tokens(ripper_tokens)
|
@@ -37,6 +48,38 @@ module RSpec
|
|
37
48
|
def inspect
|
38
49
|
"#<#{self.class} #{type} #{string.inspect}>"
|
39
50
|
end
|
51
|
+
|
52
|
+
def keyword?
|
53
|
+
type == :on_kw
|
54
|
+
end
|
55
|
+
|
56
|
+
def opening?
|
57
|
+
opening_delimiter? || opening_keyword?
|
58
|
+
end
|
59
|
+
|
60
|
+
def closed_by?(other)
|
61
|
+
closed_by_delimiter?(other) || closed_by_keyword?(other)
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def opening_delimiter?
|
67
|
+
CLOSING_TYPES_BY_OPENING_TYPE.key?(type)
|
68
|
+
end
|
69
|
+
|
70
|
+
def opening_keyword?
|
71
|
+
return false unless keyword?
|
72
|
+
CLOSING_KEYWORDS_BY_OPENING_KEYWORD.key?(string)
|
73
|
+
end
|
74
|
+
|
75
|
+
def closed_by_delimiter?(other)
|
76
|
+
other.type == CLOSING_TYPES_BY_OPENING_TYPE[type]
|
77
|
+
end
|
78
|
+
|
79
|
+
def closed_by_keyword?(other)
|
80
|
+
return false unless other.keyword?
|
81
|
+
other.string == CLOSING_KEYWORDS_BY_OPENING_KEYWORD[string]
|
82
|
+
end
|
40
83
|
end
|
41
84
|
end
|
42
85
|
end
|
data/lib/rspec/core/version.rb
CHANGED
data/lib/rspec/core/world.rb
CHANGED
@@ -12,6 +12,7 @@ module RSpec
|
|
12
12
|
|
13
13
|
def initialize(configuration=RSpec.configuration)
|
14
14
|
@configuration = configuration
|
15
|
+
configuration.world = self
|
15
16
|
@example_groups = []
|
16
17
|
@example_group_counts_by_spec_file = Hash.new(0)
|
17
18
|
@filtered_examples = Hash.new do |hash, group|
|
@@ -47,12 +48,10 @@ module RSpec
|
|
47
48
|
|
48
49
|
# @api private
|
49
50
|
#
|
50
|
-
#
|
51
|
-
def
|
51
|
+
# Records an example group.
|
52
|
+
def record(example_group)
|
52
53
|
@configuration.on_example_group_definition_callbacks.each { |block| block.call(example_group) }
|
53
|
-
example_groups << example_group
|
54
54
|
@example_group_counts_by_spec_file[example_group.metadata[:absolute_file_path]] += 1
|
55
|
-
example_group
|
56
55
|
end
|
57
56
|
|
58
57
|
# @private
|
@@ -96,10 +95,12 @@ module RSpec
|
|
96
95
|
# @api private
|
97
96
|
#
|
98
97
|
# Find line number of previous declaration.
|
99
|
-
def preceding_declaration_line(filter_line)
|
100
|
-
|
101
|
-
|
98
|
+
def preceding_declaration_line(absolute_file_name, filter_line)
|
99
|
+
line_numbers = descending_declaration_line_numbers_by_file.fetch(absolute_file_name) do
|
100
|
+
return nil
|
102
101
|
end
|
102
|
+
|
103
|
+
line_numbers.find { |num| num <= filter_line }
|
103
104
|
end
|
104
105
|
|
105
106
|
# @private
|
@@ -179,8 +180,22 @@ module RSpec
|
|
179
180
|
|
180
181
|
private
|
181
182
|
|
182
|
-
def
|
183
|
-
@
|
183
|
+
def descending_declaration_line_numbers_by_file
|
184
|
+
@descending_declaration_line_numbers_by_file ||= begin
|
185
|
+
declaration_locations = FlatMap.flat_map(example_groups, &:declaration_locations)
|
186
|
+
hash_of_arrays = Hash.new { |h, k| h[k] = [] }
|
187
|
+
|
188
|
+
# TODO: change `inject` to `each_with_object` when we drop 1.8.7 support.
|
189
|
+
line_nums_by_file = declaration_locations.inject(hash_of_arrays) do |hash, (file_name, line_number)|
|
190
|
+
hash[file_name] << line_number
|
191
|
+
hash
|
192
|
+
end
|
193
|
+
|
194
|
+
line_nums_by_file.each_value do |list|
|
195
|
+
list.sort!
|
196
|
+
list.reverse!
|
197
|
+
end
|
198
|
+
end
|
184
199
|
end
|
185
200
|
|
186
201
|
def fail_if_config_and_cli_options_invalid
|
@@ -192,6 +207,24 @@ module RSpec
|
|
192
207
|
1 # exit code
|
193
208
|
)
|
194
209
|
end
|
210
|
+
|
211
|
+
# @private
|
212
|
+
# Provides a null implementation for initial use by configuration.
|
213
|
+
module Null
|
214
|
+
def self.registered_example_group_files
|
215
|
+
[]
|
216
|
+
end
|
217
|
+
|
218
|
+
# :nocov:
|
219
|
+
def self.example_groups
|
220
|
+
[]
|
221
|
+
end
|
222
|
+
|
223
|
+
def self.all_example_groups
|
224
|
+
[]
|
225
|
+
end
|
226
|
+
# :nocov:
|
227
|
+
end
|
195
228
|
end
|
196
229
|
end
|
197
230
|
end
|
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.beta2
|
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-03-10 00:00:00.000000000 Z
|
50
50
|
dependencies:
|
51
51
|
- !ruby/object:Gem::Dependency
|
52
52
|
name: rspec-support
|
@@ -54,28 +54,14 @@ dependencies:
|
|
54
54
|
requirements:
|
55
55
|
- - '='
|
56
56
|
- !ruby/object:Gem::Version
|
57
|
-
version: 3.5.0.
|
57
|
+
version: 3.5.0.beta2
|
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.
|
65
|
-
- !ruby/object:Gem::Dependency
|
66
|
-
name: rake
|
67
|
-
requirement: !ruby/object:Gem::Requirement
|
68
|
-
requirements:
|
69
|
-
- - "~>"
|
70
|
-
- !ruby/object:Gem::Version
|
71
|
-
version: 10.0.0
|
72
|
-
type: :development
|
73
|
-
prerelease: false
|
74
|
-
version_requirements: !ruby/object:Gem::Requirement
|
75
|
-
requirements:
|
76
|
-
- - "~>"
|
77
|
-
- !ruby/object:Gem::Version
|
78
|
-
version: 10.0.0
|
64
|
+
version: 3.5.0.beta2
|
79
65
|
- !ruby/object:Gem::Dependency
|
80
66
|
name: cucumber
|
81
67
|
requirement: !ruby/object:Gem::Requirement
|
@@ -293,9 +279,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
293
279
|
version: 1.3.1
|
294
280
|
requirements: []
|
295
281
|
rubyforge_project:
|
296
|
-
rubygems_version: 2.
|
282
|
+
rubygems_version: 2.5.1
|
297
283
|
signing_key:
|
298
284
|
specification_version: 4
|
299
|
-
summary: rspec-core-3.5.0.
|
285
|
+
summary: rspec-core-3.5.0.beta2
|
300
286
|
test_files: []
|
301
287
|
has_rdoc:
|
metadata.gz.sig
CHANGED
Binary file
|