rspec-core 3.5.0.beta1 → 3.5.0.beta2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|