rspec-support 3.1.2 → 3.2.0
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 +13 -0
- data/README.md +9 -0
- data/lib/rspec/support/caller_filter.rb +32 -14
- data/lib/rspec/support/differ.rb +13 -12
- data/lib/rspec/support/directory_maker.rb +1 -1
- data/lib/rspec/support/encoded_string.rb +59 -6
- data/lib/rspec/support/fuzzy_matcher.rb +5 -5
- data/lib/rspec/support/matcher_definition.rb +11 -0
- data/lib/rspec/support/method_signature_verifier.rb +4 -3
- data/lib/rspec/support/ruby_features.rb +83 -16
- data/lib/rspec/support/spec.rb +4 -0
- data/lib/rspec/support/spec/in_sub_process.rb +7 -3
- data/lib/rspec/support/spec/prevent_load_time_warnings.rb +18 -6
- data/lib/rspec/support/spec/stderr_splitter.rb +13 -2
- data/lib/rspec/support/version.rb +1 -1
- metadata +35 -24
- metadata.gz.sig +0 -0
- data/lib/rspec/support/os.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 04039acbffa124e0356893dfd6b37ad6793fff39
|
4
|
+
data.tar.gz: d0e082625d0329b2e918a77aa06f71c41e4672bf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 97526b21209f907da6435684583005b57d16a4208772f2986ee83ce9b3e08e17fbc63b8f20865c30ff91c177fef627e0cb5c431f2a6e2e81b9fd1d3dde1eadbd
|
7
|
+
data.tar.gz: 6a65cd43926b771a5483b2a2acabbb9cb81377c19a58570d7a9ce3780a88ce8f5a30e9a2e8feaedb26573f0c02ed8752f3d4cc24e5d77b26c0ddc073621de214
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/Changelog.md
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
+
### 3.2.0 / 2015-02-03
|
2
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.1.2...v3.2.0)
|
3
|
+
|
4
|
+
Enhancements:
|
5
|
+
|
6
|
+
* Add extra Ruby type detection. (Jon Rowe, #133)
|
7
|
+
* Make differ instance re-usable. (Alexey Fedorov, #160)
|
8
|
+
|
9
|
+
Bug Fixes:
|
10
|
+
|
11
|
+
* Do not consider `[]` and `{}` to match when performing fuzzy matching.
|
12
|
+
(Myron Marston, #157)
|
13
|
+
|
1
14
|
### 3.1.2 / 2014-10-08
|
2
15
|
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.1.1...v3.1.2)
|
3
16
|
|
data/README.md
CHANGED
@@ -8,6 +8,15 @@ suitable for internal use only at this time.
|
|
8
8
|
|
9
9
|
Install one or more of the `RSpec` gems.
|
10
10
|
|
11
|
+
Want to run against the `master` branch? You'll need to include the dependent
|
12
|
+
RSpec repos as well. Add the following to your `Gemfile`:
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
%w[rspec-core rspec-expectations rspec-mocks rspec-support].each do |lib|
|
16
|
+
gem lib, :git => "git://github.com/rspec/#{lib}.git", :branch => 'master'
|
17
|
+
end
|
18
|
+
```
|
19
|
+
|
11
20
|
## Contributing
|
12
21
|
|
13
22
|
1. Fork it
|
@@ -26,7 +26,29 @@ module RSpec
|
|
26
26
|
IGNORE_REGEX = Regexp.union(LIB_REGEX, "rubygems/core_ext/kernel_require.rb")
|
27
27
|
|
28
28
|
if RUBY_VERSION >= '2.0.0'
|
29
|
-
|
29
|
+
# This supports args because it's more efficient when the caller specifies
|
30
|
+
# these. It allows us to skip frames the caller knows are part of RSpec,
|
31
|
+
# and to decrease the increment size if the caller is confident the line will
|
32
|
+
# be found in a small number of stack frames from `skip_frames`.
|
33
|
+
#
|
34
|
+
# Note that there is a risk to passing a `skip_frames` value that is too high:
|
35
|
+
# If it skippped the first non-rspec line, then this method would return the
|
36
|
+
# 2nd or 3rd (or whatever) non-rspec line. Thus, you generally shouldn't pass
|
37
|
+
# values for these parameters, particularly since most places that use this are
|
38
|
+
# not hot spots (generally it gets used for deprecation warnings). However,
|
39
|
+
# if you do have a hot spot that calls this, passing `skip_frames` can make
|
40
|
+
# a significant difference. Just make sure that that particular use is tested
|
41
|
+
# so that if the provided `skip_frames` changes to no longer be accurate in
|
42
|
+
# such a way that would return the wrong stack frame, a test will fail to tell you.
|
43
|
+
#
|
44
|
+
# See benchmarks/skip_frames_for_caller_filter.rb for measurements.
|
45
|
+
def self.first_non_rspec_line(skip_frames=3, increment=5)
|
46
|
+
# Why a default `skip_frames` of 3?
|
47
|
+
# By the time `caller_locations` is called below, the first 3 frames are:
|
48
|
+
# lib/rspec/support/caller_filter.rb:63:in `block in first_non_rspec_line'
|
49
|
+
# lib/rspec/support/caller_filter.rb:62:in `loop'
|
50
|
+
# lib/rspec/support/caller_filter.rb:62:in `first_non_rspec_line'
|
51
|
+
|
30
52
|
# `caller` is an expensive method that scales linearly with the size of
|
31
53
|
# the stack. The performance hit for fetching it in chunks is small,
|
32
54
|
# and since the target line is probably near the top of the stack, the
|
@@ -34,28 +56,24 @@ module RSpec
|
|
34
56
|
#
|
35
57
|
# See benchmarks/caller.rb for measurements.
|
36
58
|
|
37
|
-
#
|
38
|
-
# performance on the common case of creating a double.
|
39
|
-
increment = 5
|
40
|
-
i = 1
|
41
|
-
line = nil
|
59
|
+
# The default increment of 5 for this method are mostly arbitrary, but
|
60
|
+
# is chosen to give good performance on the common case of creating a double.
|
42
61
|
|
43
|
-
|
44
|
-
stack =
|
62
|
+
loop do
|
63
|
+
stack = caller_locations(skip_frames, increment)
|
45
64
|
raise "No non-lib lines in stack" unless stack
|
46
65
|
|
47
|
-
line = stack.find { |l| l !~ IGNORE_REGEX }
|
66
|
+
line = stack.find { |l| l.path !~ IGNORE_REGEX }
|
67
|
+
return line.to_s if line
|
48
68
|
|
49
|
-
|
50
|
-
increment
|
69
|
+
skip_frames += increment
|
70
|
+
increment *= 2 # The choice of two here is arbitrary.
|
51
71
|
end
|
52
|
-
|
53
|
-
line
|
54
72
|
end
|
55
73
|
else
|
56
74
|
# Earlier rubies do not support the two argument form of `caller`. This
|
57
75
|
# fallback is logically the same, but slower.
|
58
|
-
def self.first_non_rspec_line
|
76
|
+
def self.first_non_rspec_line(*)
|
59
77
|
caller.find { |line| line !~ IGNORE_REGEX }
|
60
78
|
end
|
61
79
|
end
|
data/lib/rspec/support/differ.rb
CHANGED
@@ -25,12 +25,13 @@ module RSpec
|
|
25
25
|
|
26
26
|
# rubocop:disable MethodLength
|
27
27
|
def diff_as_string(actual, expected)
|
28
|
-
|
28
|
+
encoding = pick_encoding(actual, expected)
|
29
29
|
|
30
|
-
|
31
|
-
|
30
|
+
actual = EncodedString.new(actual, encoding)
|
31
|
+
expected = EncodedString.new(expected, encoding)
|
32
32
|
|
33
|
-
output = EncodedString.new("\n",
|
33
|
+
output = EncodedString.new("\n", encoding)
|
34
|
+
hunks = build_hunks(actual, expected)
|
34
35
|
|
35
36
|
hunks.each_cons(2) do |prev_hunk, current_hunk|
|
36
37
|
begin
|
@@ -48,7 +49,7 @@ module RSpec
|
|
48
49
|
|
49
50
|
color_diff output
|
50
51
|
rescue Encoding::CompatibilityError
|
51
|
-
handle_encoding_errors
|
52
|
+
handle_encoding_errors(actual, expected)
|
52
53
|
end
|
53
54
|
# rubocop:enable MethodLength
|
54
55
|
|
@@ -109,8 +110,8 @@ module RSpec
|
|
109
110
|
end
|
110
111
|
end
|
111
112
|
|
112
|
-
def
|
113
|
-
|
113
|
+
def build_hunks(actual, expected)
|
114
|
+
HunkGenerator.new(actual, expected).hunks
|
114
115
|
end
|
115
116
|
|
116
117
|
def finalize_output(output, final_line)
|
@@ -198,14 +199,14 @@ module RSpec
|
|
198
199
|
end
|
199
200
|
end
|
200
201
|
|
201
|
-
def handle_encoding_errors
|
202
|
-
if
|
202
|
+
def handle_encoding_errors(actual, expected)
|
203
|
+
if actual.source_encoding != expected.source_encoding
|
203
204
|
"Could not produce a diff because the encoding of the actual string " \
|
204
|
-
"(#{
|
205
|
-
"string (#{
|
205
|
+
"(#{actual.source_encoding}) differs from the encoding of the expected " \
|
206
|
+
"string (#{expected.source_encoding})"
|
206
207
|
else
|
207
208
|
"Could not produce a diff because of the encoding of the string " \
|
208
|
-
"(#{
|
209
|
+
"(#{expected.source_encoding})"
|
209
210
|
end
|
210
211
|
end
|
211
212
|
end
|
@@ -2,7 +2,18 @@ module RSpec
|
|
2
2
|
module Support
|
3
3
|
# @private
|
4
4
|
class EncodedString
|
5
|
-
|
5
|
+
# Reduce allocations by storing constants.
|
6
|
+
UTF_8 = "UTF-8"
|
7
|
+
US_ASCII = 'US-ASCII'
|
8
|
+
# else: '?' 63.chr ("\x3F")
|
9
|
+
REPLACE = "?"
|
10
|
+
ENCODE_UNCONVERTABLE_BYTES = {
|
11
|
+
:invalid => :replace,
|
12
|
+
:undef => :replace
|
13
|
+
}
|
14
|
+
ENCODE_NO_CONVERTER = {
|
15
|
+
:invalid => :replace,
|
16
|
+
}
|
6
17
|
|
7
18
|
def initialize(string, encoding=nil)
|
8
19
|
@encoding = encoding
|
@@ -33,17 +44,59 @@ module RSpec
|
|
33
44
|
|
34
45
|
private
|
35
46
|
|
47
|
+
# Encoding Exceptions:
|
48
|
+
#
|
49
|
+
# Raised by Encoding and String methods:
|
50
|
+
# Encoding::UndefinedConversionError:
|
51
|
+
# when a transcoding operation fails
|
52
|
+
# if the String contains characters invalid for the target encoding
|
53
|
+
# e.g. "\x80".encode('UTF-8','ASCII-8BIT')
|
54
|
+
# vs "\x80".encode('UTF-8','ASCII-8BIT', undef: :replace, replace: '<undef>')
|
55
|
+
# # => '<undef>'
|
56
|
+
# Encoding::CompatibilityError
|
57
|
+
# when Enconding.compatbile?(str1, str2) is false
|
58
|
+
# e.g. utf_16le_emoji_string.split("\n")
|
59
|
+
# e.g. valid_unicode_string.encode(utf8_encoding) << ascii_string
|
60
|
+
# Encoding::InvalidByteSequenceError:
|
61
|
+
# when the string being transcoded contains a byte invalid for
|
62
|
+
# either the source or target encoding
|
63
|
+
# e.g. "\x80".encode('UTF-8','US-ASCII')
|
64
|
+
# vs "\x80".encode('UTF-8','US-ASCII', invalid: :replace, replace: '<byte>')
|
65
|
+
# # => '<byte>'
|
66
|
+
# ArgumentError
|
67
|
+
# when operating on a string with invalid bytes
|
68
|
+
# e.g."\xEF".split("\n")
|
69
|
+
# TypeError
|
70
|
+
# when a symbol is passed as an encoding
|
71
|
+
# Encoding.find(:"utf-8")
|
72
|
+
# when calling force_encoding on an object
|
73
|
+
# that doesn't respond to #to_str
|
74
|
+
#
|
75
|
+
# Raised by transcoding methods:
|
76
|
+
# Encoding::ConverterNotFoundError:
|
77
|
+
# when a named encoding does not correspond with a known converter
|
78
|
+
# e.g. 'abc'.force_encoding('UTF-8').encode('foo')
|
79
|
+
# or a converter path cannot be found
|
80
|
+
# e.g. "\x80".force_encoding('ASCII-8BIT').encode('Emacs-Mule')
|
81
|
+
#
|
82
|
+
# Raised by byte <-> char conversions
|
83
|
+
# RangeError: out of char range
|
84
|
+
# e.g. the UTF-16LE emoji: 128169.chr
|
36
85
|
def matching_encoding(string)
|
37
86
|
string.encode(@encoding)
|
38
87
|
rescue Encoding::UndefinedConversionError, Encoding::InvalidByteSequenceError
|
39
|
-
normalize_missing(string.encode(@encoding,
|
88
|
+
normalize_missing(string.encode(@encoding, ENCODE_UNCONVERTABLE_BYTES))
|
40
89
|
rescue Encoding::ConverterNotFoundError
|
41
|
-
normalize_missing(string.force_encoding(@encoding).encode(
|
90
|
+
normalize_missing(string.dup.force_encoding(@encoding).encode(ENCODE_NO_CONVERTER))
|
42
91
|
end
|
43
92
|
|
93
|
+
# Ruby's default replacement string is:
|
94
|
+
# for Unicode encoding forms: U+FFFD ("\xEF\xBF\xBD")
|
95
|
+
MRI_UNICODE_UNKOWN_CHARACTER = "\xEF\xBF\xBD".force_encoding(UTF_8)
|
96
|
+
|
44
97
|
def normalize_missing(string)
|
45
|
-
if @encoding.to_s ==
|
46
|
-
string.gsub(MRI_UNICODE_UNKOWN_CHARACTER
|
98
|
+
if @encoding.to_s == UTF_8
|
99
|
+
string.gsub(MRI_UNICODE_UNKOWN_CHARACTER, REPLACE)
|
47
100
|
else
|
48
101
|
string
|
49
102
|
end
|
@@ -61,7 +114,7 @@ module RSpec
|
|
61
114
|
end
|
62
115
|
|
63
116
|
def detect_source_encoding(_string)
|
64
|
-
|
117
|
+
US_ASCII
|
65
118
|
end
|
66
119
|
end
|
67
120
|
end
|
@@ -6,14 +6,14 @@ module RSpec
|
|
6
6
|
module FuzzyMatcher
|
7
7
|
# @api private
|
8
8
|
def self.values_match?(expected, actual)
|
9
|
-
if
|
9
|
+
if Hash === actual
|
10
|
+
return hashes_match?(expected, actual) if Hash === expected
|
11
|
+
elsif Array === expected && Enumerable === actual && !(Struct === actual)
|
10
12
|
return arrays_match?(expected, actual.to_a)
|
11
|
-
elsif Hash === expected && Hash === actual
|
12
|
-
return hashes_match?(expected, actual)
|
13
|
-
elsif actual == expected
|
14
|
-
return true
|
15
13
|
end
|
16
14
|
|
15
|
+
return true if actual == expected
|
16
|
+
|
17
17
|
begin
|
18
18
|
expected === actual
|
19
19
|
rescue ArgumentError
|
@@ -27,5 +27,16 @@ module RSpec
|
|
27
27
|
def self.is_a_matcher?(object)
|
28
28
|
matcher_definitions.any? { |md| md.call(object) }
|
29
29
|
end
|
30
|
+
|
31
|
+
# @api private
|
32
|
+
#
|
33
|
+
# gives a string representation of an object for use in RSpec descriptions
|
34
|
+
def self.rspec_description_for_object(object)
|
35
|
+
if RSpec::Support.is_a_matcher?(object) && object.respond_to?(:description)
|
36
|
+
object.description
|
37
|
+
else
|
38
|
+
object
|
39
|
+
end
|
40
|
+
end
|
30
41
|
end
|
31
42
|
end
|
@@ -9,10 +9,12 @@ module RSpec
|
|
9
9
|
#
|
10
10
|
# @private
|
11
11
|
class MethodSignature
|
12
|
-
attr_reader :min_non_kw_args, :max_non_kw_args
|
12
|
+
attr_reader :min_non_kw_args, :max_non_kw_args, :optional_kw_args, :required_kw_args
|
13
13
|
|
14
14
|
def initialize(method)
|
15
|
-
@method
|
15
|
+
@method = method
|
16
|
+
@optional_kw_args = []
|
17
|
+
@required_kw_args = []
|
16
18
|
classify_parameters
|
17
19
|
end
|
18
20
|
|
@@ -74,7 +76,6 @@ module RSpec
|
|
74
76
|
|
75
77
|
def classify_parameters
|
76
78
|
optional_non_kw_args = @min_non_kw_args = 0
|
77
|
-
@optional_kw_args, @required_kw_args = [], []
|
78
79
|
@allows_any_kw_args = false
|
79
80
|
|
80
81
|
@method.parameters.each do |(type, name)|
|
@@ -1,13 +1,41 @@
|
|
1
1
|
module RSpec
|
2
2
|
module Support
|
3
|
+
# @api private
|
4
|
+
#
|
5
|
+
# Provides query methods for different OS or OS features.
|
6
|
+
module OS
|
7
|
+
module_function
|
8
|
+
|
9
|
+
def windows?
|
10
|
+
RbConfig::CONFIG['host_os'] =~ /cygwin|mswin|mingw|bccwin|wince|emx/
|
11
|
+
end
|
12
|
+
|
13
|
+
def windows_file_path?
|
14
|
+
::File::ALT_SEPARATOR == '\\'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
3
18
|
# @api private
|
4
19
|
#
|
5
20
|
# Provides query methods for different rubies
|
6
21
|
module Ruby
|
22
|
+
module_function
|
23
|
+
|
7
24
|
def jruby?
|
8
25
|
RUBY_PLATFORM == 'java'
|
9
26
|
end
|
10
|
-
|
27
|
+
|
28
|
+
def rbx?
|
29
|
+
defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
|
30
|
+
end
|
31
|
+
|
32
|
+
def non_mri?
|
33
|
+
!mri?
|
34
|
+
end
|
35
|
+
|
36
|
+
def mri?
|
37
|
+
!defined?(RUBY_ENGINE) || RUBY_ENGINE == 'ruby'
|
38
|
+
end
|
11
39
|
end
|
12
40
|
|
13
41
|
# @api private
|
@@ -15,31 +43,70 @@ module RSpec
|
|
15
43
|
# Provides query methods for ruby features that differ among
|
16
44
|
# implementations.
|
17
45
|
module RubyFeatures
|
46
|
+
module_function
|
47
|
+
|
18
48
|
def optional_and_splat_args_supported?
|
19
49
|
Method.method_defined?(:parameters)
|
20
50
|
end
|
21
|
-
module_function :optional_and_splat_args_supported?
|
22
51
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
52
|
+
if Ruby.mri?
|
53
|
+
def kw_args_supported?
|
54
|
+
RUBY_VERSION >= '2.0.0'
|
55
|
+
end
|
56
|
+
|
57
|
+
def required_kw_args_supported?
|
58
|
+
RUBY_VERSION >= '2.1.0'
|
59
|
+
end
|
60
|
+
|
61
|
+
def supports_rebinding_module_methods?
|
62
|
+
RUBY_VERSION.to_i >= 2
|
63
|
+
end
|
64
|
+
else
|
65
|
+
# RBX / JRuby et al support is unknown for keyword arguments
|
66
|
+
# rubocop:disable Lint/Eval
|
67
|
+
begin
|
68
|
+
eval("o = Object.new; def o.m(a: 1); end;"\
|
69
|
+
" raise SyntaxError unless o.method(:m).parameters.include?([:key, :a])")
|
27
70
|
|
28
|
-
|
29
|
-
|
71
|
+
def kw_args_supported?
|
72
|
+
true
|
73
|
+
end
|
74
|
+
rescue SyntaxError
|
75
|
+
def kw_args_supported?
|
76
|
+
false
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
begin
|
81
|
+
eval("o = Object.new; def o.m(a: ); end;"\
|
82
|
+
"raise SyntaxError unless o.method(:m).parameters.include?([:keyreq, :a])")
|
83
|
+
|
84
|
+
def required_kw_args_supported?
|
85
|
+
true
|
86
|
+
end
|
87
|
+
rescue SyntaxError
|
88
|
+
def required_kw_args_supported?
|
89
|
+
false
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
begin
|
94
|
+
Module.new { def foo; end }.instance_method(:foo).bind(Object.new)
|
95
|
+
|
96
|
+
def supports_rebinding_module_methods?
|
97
|
+
true
|
98
|
+
end
|
99
|
+
rescue TypeError
|
100
|
+
def supports_rebinding_module_methods?
|
101
|
+
false
|
102
|
+
end
|
103
|
+
end
|
104
|
+
# rubocop:enable Lint/Eval
|
30
105
|
end
|
31
|
-
module_function :required_kw_args_supported?
|
32
106
|
|
33
107
|
def module_prepends_supported?
|
34
108
|
Module.method_defined?(:prepend) || Module.private_method_defined?(:prepend)
|
35
109
|
end
|
36
|
-
module_function :module_prepends_supported?
|
37
|
-
|
38
|
-
def supports_rebinding_module_methods?
|
39
|
-
# RBX and JRuby don't yet support this.
|
40
|
-
RUBY_VERSION.to_i >= 2 && RUBY_ENGINE != 'rbx' && RUBY_ENGINE != 'jruby'
|
41
|
-
end
|
42
|
-
module_function :supports_rebinding_module_methods?
|
43
110
|
end
|
44
111
|
end
|
45
112
|
end
|
data/lib/rspec/support/spec.rb
CHANGED
@@ -30,6 +30,10 @@ RSpec.configure do |c|
|
|
30
30
|
|
31
31
|
c.filter_run :focus
|
32
32
|
c.run_all_when_everything_filtered = true
|
33
|
+
|
34
|
+
c.define_derived_metadata :failing_on_appveyor do |meta|
|
35
|
+
meta[:pending] ||= "This spec fails on AppVeyor and needs someone to fix it."
|
36
|
+
end if ENV['APPVEYOR']
|
33
37
|
end
|
34
38
|
|
35
39
|
module RSpec
|
@@ -1,17 +1,21 @@
|
|
1
1
|
module RSpec
|
2
2
|
module Support
|
3
3
|
module InSubProcess
|
4
|
-
if Process.respond_to?(:fork) && !(
|
4
|
+
if Process.respond_to?(:fork) && !(Ruby.jruby? && RUBY_VERSION == '1.8.7')
|
5
|
+
|
5
6
|
# Useful as a way to isolate a global change to a subprocess.
|
6
7
|
|
7
8
|
# rubocop:disable MethodLength
|
8
|
-
def in_sub_process
|
9
|
+
def in_sub_process(prevent_warnings=true)
|
9
10
|
readme, writeme = IO.pipe
|
10
11
|
|
11
12
|
pid = Process.fork do
|
12
13
|
exception = nil
|
14
|
+
warning_preventer = $stderr = RSpec::Support::StdErrSplitter.new($stderr)
|
15
|
+
|
13
16
|
begin
|
14
17
|
yield
|
18
|
+
warning_preventer.verify_example!(self) if prevent_warnings
|
15
19
|
rescue Exception => e
|
16
20
|
exception = e
|
17
21
|
end
|
@@ -32,7 +36,7 @@ module RSpec
|
|
32
36
|
raise exception if exception
|
33
37
|
end
|
34
38
|
else
|
35
|
-
def in_sub_process
|
39
|
+
def in_sub_process(*)
|
36
40
|
skip "This spec requires forking to work properly, " \
|
37
41
|
"and your platform does not support forking"
|
38
42
|
end
|
@@ -3,12 +3,13 @@ require 'rspec/support/spec/shell_out'
|
|
3
3
|
module RSpec
|
4
4
|
module Support
|
5
5
|
module WarningsPrevention
|
6
|
-
def files_to_require_for(lib)
|
6
|
+
def files_to_require_for(lib, sub_dir)
|
7
7
|
slash = File::SEPARATOR
|
8
8
|
lib_path_re = /#{slash + lib}[^#{slash}]*#{slash}lib/
|
9
9
|
load_path = $LOAD_PATH.grep(lib_path_re).first
|
10
|
-
|
11
|
-
|
10
|
+
directory = load_path.sub(/lib$/, sub_dir)
|
11
|
+
files = Dir["#{directory}/**/*.rb"]
|
12
|
+
extract_regex = /#{Regexp.escape(directory) + File::SEPARATOR}(.+)\.rb$/
|
12
13
|
|
13
14
|
# We sort to ensure the files are loaded in a consistent order, regardless
|
14
15
|
# of OS. Otherwise, it could load in a different order on Travis than
|
@@ -24,21 +25,32 @@ RSpec.shared_examples_for "a library that issues no warnings when loaded" do |li
|
|
24
25
|
include RSpec::Support::ShellOut
|
25
26
|
include RSpec::Support::WarningsPrevention
|
26
27
|
|
27
|
-
|
28
|
+
define_method :expect_no_warnings_from_files_in do |sub_dir, *pre_stmnts|
|
28
29
|
# We want to explicitly load every file because each lib has some files that
|
29
30
|
# aren't automatically loaded, instead being delayed based on an autoload
|
30
31
|
# (such as for rspec-expectations' matchers) or based on a config option
|
31
32
|
# (e.g. `config.mock_with :rr` => 'rspec/core/mocking_adapters/rr').
|
32
|
-
|
33
|
+
files_to_require = files_to_require_for(lib, sub_dir)
|
34
|
+
statements = pre_stmnts + files_to_require.map do |file|
|
33
35
|
"require '#{file}'"
|
34
36
|
end
|
35
37
|
|
36
38
|
command = statements.join("; ")
|
37
39
|
|
38
|
-
stdout, stderr, status =
|
40
|
+
stdout, stderr, status = with_env 'NO_COVERAGE' => '1' do
|
41
|
+
run_ruby_with_current_load_path(command, "-w")
|
42
|
+
end
|
39
43
|
|
40
44
|
expect(stdout).to eq("")
|
41
45
|
expect(stderr).to eq("")
|
42
46
|
expect(status.exitstatus).to eq(0)
|
43
47
|
end
|
48
|
+
|
49
|
+
it "issues no warnings when loaded", :slow do
|
50
|
+
expect_no_warnings_from_files_in "lib", *preamble_stmnts
|
51
|
+
end
|
52
|
+
|
53
|
+
it "issues no warnings when the spec files are loaded", :slow do
|
54
|
+
expect_no_warnings_from_files_in "spec", "require 'rspec/core'; require 'spec_helper'"
|
55
|
+
end
|
44
56
|
end
|
@@ -10,11 +10,11 @@ module RSpec
|
|
10
10
|
|
11
11
|
respond_to_name = (::RUBY_VERSION.to_f < 1.9) ? :respond_to? : :respond_to_missing?
|
12
12
|
define_method respond_to_name do |*args|
|
13
|
-
@orig_stderr.respond_to?(*args) || super
|
13
|
+
@orig_stderr.respond_to?(*args) || super(*args)
|
14
14
|
end
|
15
15
|
|
16
16
|
def method_missing(name, *args, &block)
|
17
|
-
@output_tracker.__send__(name, *args, &block)
|
17
|
+
@output_tracker.__send__(name, *args, &block) if @output_tracker.respond_to?(name)
|
18
18
|
@orig_stderr.__send__(name, *args, &block)
|
19
19
|
end
|
20
20
|
|
@@ -22,6 +22,17 @@ module RSpec
|
|
22
22
|
@orig_stderr == other
|
23
23
|
end
|
24
24
|
|
25
|
+
def reopen(*args)
|
26
|
+
reset!
|
27
|
+
@orig_stderr.reopen(*args)
|
28
|
+
end
|
29
|
+
|
30
|
+
# To work around JRuby error:
|
31
|
+
# can't convert RSpec::Support::StdErrSplitter into String
|
32
|
+
def to_io
|
33
|
+
@orig_stderr.to_io
|
34
|
+
end
|
35
|
+
|
25
36
|
# To work around JRuby error:
|
26
37
|
# TypeError: $stderr must have write method, RSpec::StdErrSplitter given
|
27
38
|
def write(line)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-support
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Chelimsky
|
@@ -15,28 +15,40 @@ bindir: bin
|
|
15
15
|
cert_chain:
|
16
16
|
- |
|
17
17
|
-----BEGIN CERTIFICATE-----
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
18
|
+
MIIF1TCCA72gAwIBAgIJAPXjfUbCjdXUMA0GCSqGSIb3DQEBBQUAMIGAMQswCQYD
|
19
|
+
VQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEO
|
20
|
+
MAwGA1UECgwFUlNwZWMxEzARBgNVBAMMCnJzcGVjLmluZm8xJTAjBgkqhkiG9w0B
|
21
|
+
CQEWFnJzcGVjQGdvb2dsZWdyb3Vwcy5jb20wHhcNMTQxMjIzMDkzNTIyWhcNMjQx
|
22
|
+
MjIyMDkzNTIyWjCBgDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24x
|
23
|
+
EDAOBgNVBAcMB1NlYXR0bGUxDjAMBgNVBAoMBVJTcGVjMRMwEQYDVQQDDApyc3Bl
|
24
|
+
Yy5pbmZvMSUwIwYJKoZIhvcNAQkBFhZyc3BlY0Bnb29nbGVncm91cHMuY29tMIIC
|
25
|
+
IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsSmjgcHaKlD0jizRJowi2bGI
|
26
|
+
KMOHnJoExxRNHHxH+3w9kkl95YldvDRVX495b13ZCzwRe0AyqX24wq04tp0G5Z5C
|
27
|
+
e/w2pnNK4ol1eECPwQu+YGpepeODlZICL5gwQspe0cDifbBnHx5QySMiPpvx6bC0
|
28
|
+
tQTox0ppDIaMhch8IPCwyoE4DQK5bpsdwnLSHTsQjUIb7IM8tUMpd/iKrJgNffwc
|
29
|
+
6gC1TmhIlzQoB26nCNh9uK7xZjUM+sGECzvcYuImchUaIgJA/ybrlZS+m/hxzvBo
|
30
|
+
mLnn/xNEC6Vz5HG+3TR0Gb0cSUf6XUu2s51Jk/SJi3MhCZp2gs9OUg4EVZNzQVkZ
|
31
|
+
efLBjAZG2Mxk14JyB4/Omc+Jk0ajprINCBbUNnxzCJrYDM3J9TVWIwyUGNX/U3MO
|
32
|
+
s3tMAT+EVgx/mZMPnBO8EULlyF51MRUp3Wy9Mnw8AYLk30UnMG5AjqgO5JNyFlA7
|
33
|
+
Xeh3EVdWY3vMB1pkhPwlsenpcmj5gOzrd54lELOVbCGHCf48iSqeflY2Lhe0pvzK
|
34
|
+
blXCJBDmtrebvus291rM/dHcbEfK1SVd5Wut/n131iouf6dnNCFskFygDcgBbthC
|
35
|
+
gpEMqf80lEmhX59VUsm0Pv6OEo+ZPHBvXPiJA6DShQh9t3YtpwyA8uVDMbT/i32u
|
36
|
+
2FUsqZbbJcCmkBrGposCAwEAAaNQME4wHQYDVR0OBBYEFPPvQ5XT0Nvuhi6k+hrW
|
37
|
+
Vv35J+TeMB8GA1UdIwQYMBaAFPPvQ5XT0Nvuhi6k+hrWVv35J+TeMAwGA1UdEwQF
|
38
|
+
MAMBAf8wDQYJKoZIhvcNAQEFBQADggIBAIqbQSWH2aAF537DKwAMB8nMFsoe24MD
|
39
|
+
gtuQAyjTtbH+QBE4N2RdQF/sU7Y3PYR7nqdrCsYc3RxyqM5XXi7I3IYdpfe1RuxY
|
40
|
+
+pyPzVQsPPDhMlJlCrwJsADnxlpxZlAgxYSLKOan55ihscaAWA90wqRUrf/ZJM36
|
41
|
+
8LWCPVn5teIt5aaxZWX68RMxa+AXvpbtJOBwXLkIFk3apD8CX4DhelIdw67DbkUe
|
42
|
+
ghUd/u62qrnqBTVgditt7OoWIZjzh24/Fda5d0MxZyvLILGOrf5bN4cTbe/q9Cid
|
43
|
+
Xrik7Upm+mu3y3yQIfrw85xybHq6iNXyYHvCdSrFfCIKrGpd/0CAdmYnJlx59Fk/
|
44
|
+
UbD3Eyx4psBSkU+WKO0Uf+3zNI7N/nVeNIwU/Ft+l8l7/K+427656c+ZGWDO0Gt/
|
45
|
+
BeEOSTDKP7qQ1T+JvMrBcBQo+i0cnRT10J1aoV90BhxsvWTRizIbugbaqR6Tq3bj
|
46
|
+
Akt00cIlNSplL6DenIAKSh5kF7s0tRD0tC3bNkZmNjNGkdoGEcUODEpTB3RHKKiu
|
47
|
+
e6k2Jg6m00z5vGFQhOnROG/QaUzMA3A3mFBe1RHFo07xd0pFeoeWL3vF69Gx9Jwp
|
48
|
+
ZsVDj6a7lH3cNqtWXZxrb2wO38qV5AkYj8SQK7Hj3/Yui9myUX3crr+PdetazSqQ
|
49
|
+
F3MdtaDehhjC
|
38
50
|
-----END CERTIFICATE-----
|
39
|
-
date:
|
51
|
+
date: 2015-02-03 00:00:00.000000000 Z
|
40
52
|
dependencies:
|
41
53
|
- !ruby/object:Gem::Dependency
|
42
54
|
name: bundler
|
@@ -84,7 +96,6 @@ files:
|
|
84
96
|
- lib/rspec/support/hunk_generator.rb
|
85
97
|
- lib/rspec/support/matcher_definition.rb
|
86
98
|
- lib/rspec/support/method_signature_verifier.rb
|
87
|
-
- lib/rspec/support/os.rb
|
88
99
|
- lib/rspec/support/recursive_const_methods.rb
|
89
100
|
- lib/rspec/support/ruby_features.rb
|
90
101
|
- lib/rspec/support/spec.rb
|
@@ -123,5 +134,5 @@ rubyforge_project: rspec
|
|
123
134
|
rubygems_version: 2.2.2
|
124
135
|
signing_key:
|
125
136
|
specification_version: 4
|
126
|
-
summary: rspec-support-3.
|
137
|
+
summary: rspec-support-3.2.0
|
127
138
|
test_files: []
|
metadata.gz.sig
CHANGED
Binary file
|
data/lib/rspec/support/os.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
module RSpec
|
2
|
-
module Support
|
3
|
-
# @api private
|
4
|
-
#
|
5
|
-
# Provides query methods for different OS or OS features.
|
6
|
-
module OS
|
7
|
-
def windows?
|
8
|
-
RbConfig::CONFIG['host_os'] =~ /cygwin|mswin|mingw|bccwin|wince|emx/
|
9
|
-
end
|
10
|
-
module_function :windows?
|
11
|
-
|
12
|
-
def windows_file_path?
|
13
|
-
::File::ALT_SEPARATOR == '\\'
|
14
|
-
end
|
15
|
-
module_function :windows_file_path?
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|