rspec-support 3.7.0 → 3.9.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 +5 -5
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/Changelog.md +49 -3
- data/README.md +1 -1
- data/lib/rspec/support.rb +1 -1
- data/lib/rspec/support/differ.rb +2 -2
- data/lib/rspec/support/method_signature_verifier.rb +71 -25
- data/lib/rspec/support/object_formatter.rb +14 -6
- data/lib/rspec/support/ruby_features.rb +16 -2
- data/lib/rspec/support/source/node.rb +7 -4
- data/lib/rspec/support/spec/shell_out.rb +6 -1
- data/lib/rspec/support/version.rb +1 -1
- metadata +10 -20
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 27ddd84c490aacfced87a3d772c93cf8391484030d28f78789ff5e9263811d42
|
4
|
+
data.tar.gz: 515eecb4064c04ac636b6171ad1308532596a13d9b132ac4689893ab76f43bfe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3755a83a18dcd1326ac122e8250b0abbe0c50af2e630748478c8dfbf0c0f64f65d59725db3ae5370e382f49409b8f7d1639aa09a75c143d4186a8bfeda36a9e3
|
7
|
+
data.tar.gz: 6a41a8e6f905e1c2a37a776a2438d461859aab8434b1cd20c0aa4ca50fb17d898465535710018c8c01c199fde6e179ffef35feb1cd118dc4b71894a0a12d960b
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/Changelog.md
CHANGED
@@ -1,7 +1,53 @@
|
|
1
|
-
###
|
2
|
-
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.7.0...master)
|
1
|
+
### 3.9.0 / 2019-10-07
|
3
2
|
|
4
|
-
|
3
|
+
*NO CHANGES*
|
4
|
+
|
5
|
+
Version 3.9.0 was released to allow other RSpec gems to release 3.9.0.
|
6
|
+
|
7
|
+
### 3.8.3 / 2019-10-02
|
8
|
+
|
9
|
+
Bug Fixes:
|
10
|
+
|
11
|
+
* Escape \r when outputting strings inside arrays.
|
12
|
+
(Tomita Masahiro, Jon Rowe, #378)
|
13
|
+
* Ensure that optional hash arguments are recognised correctly vs keyword
|
14
|
+
arguments. (Evgeni Dzhelyov, #366)
|
15
|
+
|
16
|
+
### 3.8.2 / 2019-06-10
|
17
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.8.1...v3.8.2)
|
18
|
+
|
19
|
+
Bug Fixes:
|
20
|
+
|
21
|
+
* Ensure that an empty hash is recognised as empty keyword arguments when
|
22
|
+
applicable. (Thomas Walpole, #375)
|
23
|
+
* Ensure that diffing truthy values produce diffs consistently.
|
24
|
+
(Lucas Nestor, #377)
|
25
|
+
|
26
|
+
### 3.8.1 / 2019-03-03
|
27
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.8.0...v3.8.1)
|
28
|
+
|
29
|
+
Bug Fixes:
|
30
|
+
|
31
|
+
* Ensure that inspecting a `SimpleDelegator` based object works regardless of
|
32
|
+
visibilty of the `__getobj__` method. (Jon Rowe, #369)
|
33
|
+
|
34
|
+
### 3.8.0 / 2018-08-04
|
35
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.7.1...v3.8.0)
|
36
|
+
|
37
|
+
Bug Fixes:
|
38
|
+
|
39
|
+
* Order hash keys before diffing to improve diff accuracy when using mocked calls.
|
40
|
+
(James Crisp, #334)
|
41
|
+
|
42
|
+
### 3.7.1 / 2018-01-29
|
43
|
+
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.7.0...v3.7.1)
|
44
|
+
|
45
|
+
Bug Fixes:
|
46
|
+
|
47
|
+
* Fix source extraction logic so that it does not trigger a `SystemStackError`
|
48
|
+
when processing deeply nested example groups. (Craig Bass, #343)
|
49
|
+
|
50
|
+
### 3.7.0 / 2017-10-17
|
5
51
|
[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.6.0...v3.7.0)
|
6
52
|
|
7
53
|
Enhancements:
|
data/README.md
CHANGED
@@ -13,7 +13,7 @@ RSpec repos as well. Add the following to your `Gemfile`:
|
|
13
13
|
|
14
14
|
```ruby
|
15
15
|
%w[rspec-core rspec-expectations rspec-mocks rspec-support].each do |lib|
|
16
|
-
gem lib, :git => "
|
16
|
+
gem lib, :git => "https://github.com/rspec/#{lib}.git", :branch => 'master'
|
17
17
|
end
|
18
18
|
```
|
19
19
|
|
data/lib/rspec/support.rb
CHANGED
@@ -139,7 +139,7 @@ module RSpec
|
|
139
139
|
end
|
140
140
|
end
|
141
141
|
|
142
|
-
# The Differ is only needed when a
|
142
|
+
# The Differ is only needed when a spec fails with a diffable failure.
|
143
143
|
# In the more common case of all specs passing or the only failures being
|
144
144
|
# non-diffable, we can avoid the extra cost of loading the differ, diff-lcs,
|
145
145
|
# pp, etc by avoiding an unnecessary require. Instead, autoload will take
|
data/lib/rspec/support/differ.rb
CHANGED
@@ -11,7 +11,7 @@ module RSpec
|
|
11
11
|
def diff(actual, expected)
|
12
12
|
diff = ""
|
13
13
|
|
14
|
-
|
14
|
+
unless actual.nil? || expected.nil?
|
15
15
|
if all_strings?(actual, expected)
|
16
16
|
if any_multiline_strings?(actual, expected)
|
17
17
|
diff = diff_as_string(coerce_to_string(actual), coerce_to_string(expected))
|
@@ -97,7 +97,7 @@ module RSpec
|
|
97
97
|
if Array === entry
|
98
98
|
entry.inspect
|
99
99
|
else
|
100
|
-
entry.to_s.gsub("\n", "\\n")
|
100
|
+
entry.to_s.gsub("\n", "\\n").gsub("\r", "\\r")
|
101
101
|
end
|
102
102
|
end
|
103
103
|
end
|
@@ -33,6 +33,18 @@ module RSpec
|
|
33
33
|
optional_max_arg_count <= max_non_kw_args
|
34
34
|
end
|
35
35
|
|
36
|
+
def classify_arity(arity=@method.arity)
|
37
|
+
if arity < 0
|
38
|
+
# `~` inverts the one's complement and gives us the
|
39
|
+
# number of required args
|
40
|
+
@min_non_kw_args = ~arity
|
41
|
+
@max_non_kw_args = INFINITY
|
42
|
+
else
|
43
|
+
@min_non_kw_args = arity
|
44
|
+
@max_non_kw_args = arity
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
36
48
|
if RubyFeatures.optional_and_splat_args_supported?
|
37
49
|
def description
|
38
50
|
@description ||= begin
|
@@ -65,14 +77,19 @@ module RSpec
|
|
65
77
|
given_kw_args - @allowed_kw_args
|
66
78
|
end
|
67
79
|
|
80
|
+
# If the last argument is Hash, Ruby will treat only symbol keys as keyword arguments
|
81
|
+
# the rest will be grouped in another Hash and passed as positional argument.
|
68
82
|
def has_kw_args_in?(args)
|
69
|
-
Hash === args.last &&
|
83
|
+
Hash === args.last &&
|
84
|
+
could_contain_kw_args?(args) &&
|
85
|
+
(args.last.empty? || args.last.keys.any? { |x| x.is_a?(Symbol) })
|
70
86
|
end
|
71
87
|
|
72
88
|
# Without considering what the last arg is, could it
|
73
89
|
# contain keyword arguments?
|
74
90
|
def could_contain_kw_args?(args)
|
75
91
|
return false if args.count <= min_non_kw_args
|
92
|
+
|
76
93
|
@allows_any_kw_args || @allowed_kw_args.any?
|
77
94
|
end
|
78
95
|
|
@@ -137,36 +154,58 @@ module RSpec
|
|
137
154
|
false
|
138
155
|
end
|
139
156
|
|
140
|
-
|
141
|
-
arity = @method.arity
|
142
|
-
if arity < 0
|
143
|
-
# `~` inverts the one's complement and gives us the
|
144
|
-
# number of required args
|
145
|
-
@min_non_kw_args = ~arity
|
146
|
-
@max_non_kw_args = INFINITY
|
147
|
-
else
|
148
|
-
@min_non_kw_args = arity
|
149
|
-
@max_non_kw_args = arity
|
150
|
-
end
|
151
|
-
end
|
157
|
+
alias_method :classify_parameters, :classify_arity
|
152
158
|
end
|
153
159
|
|
154
160
|
INFINITY = 1 / 0.0
|
155
161
|
end
|
156
162
|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
163
|
+
if RSpec::Support::Ruby.jruby?
|
164
|
+
# JRuby has only partial support for UnboundMethod#parameters, so we fall back on using #arity
|
165
|
+
# https://github.com/jruby/jruby/issues/2816 and https://github.com/jruby/jruby/issues/2817
|
166
|
+
if RubyFeatures.optional_and_splat_args_supported? &&
|
167
|
+
Java::JavaLang::String.instance_method(:char_at).parameters == []
|
162
168
|
|
163
|
-
|
164
|
-
|
169
|
+
class MethodSignature < remove_const(:MethodSignature)
|
170
|
+
private
|
165
171
|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
172
|
+
def classify_parameters
|
173
|
+
super
|
174
|
+
if (arity = @method.arity) != 0 && @method.parameters.empty?
|
175
|
+
classify_arity(arity)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
# JRuby used to always report -1 arity for Java proxy methods.
|
182
|
+
# The workaround essentially makes use of Java's introspection to figure
|
183
|
+
# out matching methods (which could be more than one partly because Java
|
184
|
+
# supports multiple overloads, and partly because JRuby introduces
|
185
|
+
# aliases to make method names look more Rubyesque). If there is only a
|
186
|
+
# single match, we can use that methods arity directly instead of the
|
187
|
+
# default -1 arity.
|
188
|
+
#
|
189
|
+
# This workaround only works for Java proxy methods, and in order to
|
190
|
+
# support regular methods and blocks, we need to be careful about calling
|
191
|
+
# owner and java_class as they might not be available
|
192
|
+
if Java::JavaLang::String.instance_method(:char_at).arity == -1
|
193
|
+
class MethodSignature < remove_const(:MethodSignature)
|
194
|
+
private
|
195
|
+
|
196
|
+
def classify_parameters
|
197
|
+
super
|
198
|
+
return unless @method.arity == -1
|
199
|
+
return unless @method.respond_to?(:owner)
|
200
|
+
return unless @method.owner.respond_to?(:java_class)
|
201
|
+
java_instance_methods = @method.owner.java_class.java_instance_methods
|
202
|
+
compatible_overloads = java_instance_methods.select do |java_method|
|
203
|
+
@method == @method.owner.instance_method(java_method.name)
|
204
|
+
end
|
205
|
+
if compatible_overloads.size == 1
|
206
|
+
classify_arity(compatible_overloads.first.arity)
|
207
|
+
end
|
208
|
+
end
|
170
209
|
end
|
171
210
|
end
|
172
211
|
end
|
@@ -323,7 +362,14 @@ module RSpec
|
|
323
362
|
|
324
363
|
def split_args(*args)
|
325
364
|
kw_args = if @signature.has_kw_args_in?(args)
|
326
|
-
args.pop
|
365
|
+
last = args.pop
|
366
|
+
non_kw_args = last.reject { |k, _| k.is_a?(Symbol) }
|
367
|
+
if non_kw_args.empty?
|
368
|
+
last.keys
|
369
|
+
else
|
370
|
+
args << non_kw_args
|
371
|
+
last.select { |k, _| k.is_a?(Symbol) }.keys
|
372
|
+
end
|
327
373
|
else
|
328
374
|
[]
|
329
375
|
end
|
@@ -5,7 +5,7 @@ module RSpec
|
|
5
5
|
# Provide additional output details beyond what `inspect` provides when
|
6
6
|
# printing Time, DateTime, or BigDecimal
|
7
7
|
# @api private
|
8
|
-
class ObjectFormatter # rubocop:disable
|
8
|
+
class ObjectFormatter # rubocop:disable Metrics/ClassLength
|
9
9
|
ELLIPSIS = "..."
|
10
10
|
|
11
11
|
attr_accessor :max_formatted_output_length
|
@@ -31,15 +31,15 @@ module RSpec
|
|
31
31
|
|
32
32
|
def format(object)
|
33
33
|
if max_formatted_output_length.nil?
|
34
|
-
|
34
|
+
prepare_for_inspection(object).inspect
|
35
35
|
else
|
36
36
|
formatted_object = prepare_for_inspection(object).inspect
|
37
37
|
if formatted_object.length < max_formatted_output_length
|
38
|
-
|
38
|
+
formatted_object
|
39
39
|
else
|
40
40
|
beginning = truncate_string formatted_object, 0, max_formatted_output_length / 2
|
41
41
|
ending = truncate_string formatted_object, -max_formatted_output_length / 2, -1
|
42
|
-
|
42
|
+
beginning + ELLIPSIS + ending
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
@@ -73,7 +73,7 @@ module RSpec
|
|
73
73
|
|
74
74
|
def prepare_hash(input_hash)
|
75
75
|
with_entering_structure(input_hash) do
|
76
|
-
input_hash.inject({}) do |output_hash, key_and_value|
|
76
|
+
sort_hash_keys(input_hash).inject({}) do |output_hash, key_and_value|
|
77
77
|
key, value = key_and_value.map { |element| prepare_element(element) }
|
78
78
|
output_hash[key] = value
|
79
79
|
output_hash
|
@@ -81,6 +81,14 @@ module RSpec
|
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
84
|
+
def sort_hash_keys(input_hash)
|
85
|
+
if input_hash.keys.all? { |k| k.is_a?(String) || k.is_a?(Symbol) }
|
86
|
+
Hash[input_hash.sort_by { |k, _v| k.to_s }]
|
87
|
+
else
|
88
|
+
input_hash
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
84
92
|
def prepare_element(element)
|
85
93
|
if recursive_structure?(element)
|
86
94
|
case element
|
@@ -217,7 +225,7 @@ module RSpec
|
|
217
225
|
end
|
218
226
|
|
219
227
|
def inspect
|
220
|
-
"#<#{object.class}(#{formatter.format(object.__getobj__)})>"
|
228
|
+
"#<#{object.class}(#{formatter.format(object.send(:__getobj__))})>"
|
221
229
|
end
|
222
230
|
end
|
223
231
|
|
@@ -56,6 +56,22 @@ module RSpec
|
|
56
56
|
module RubyFeatures
|
57
57
|
module_function
|
58
58
|
|
59
|
+
if Ruby.jruby?
|
60
|
+
# On JRuby 1.7 `--1.8` mode, `Process.respond_to?(:fork)` returns true,
|
61
|
+
# but when you try to fork, it raises an error:
|
62
|
+
# NotImplementedError: fork is not available on this platform
|
63
|
+
#
|
64
|
+
# When we drop support for JRuby 1.7 and/or Ruby 1.8, we can drop
|
65
|
+
# this special case.
|
66
|
+
def fork_supported?
|
67
|
+
false
|
68
|
+
end
|
69
|
+
else
|
70
|
+
def fork_supported?
|
71
|
+
Process.respond_to?(:fork)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
59
75
|
def optional_and_splat_args_supported?
|
60
76
|
Method.method_defined?(:parameters)
|
61
77
|
end
|
@@ -109,7 +125,6 @@ module RSpec
|
|
109
125
|
end
|
110
126
|
else
|
111
127
|
# RBX / JRuby et al support is unknown for keyword arguments
|
112
|
-
# rubocop:disable Lint/Eval
|
113
128
|
begin
|
114
129
|
eval("o = Object.new; def o.m(a: 1); end;"\
|
115
130
|
" raise SyntaxError unless o.method(:m).parameters.include?([:key, :a])")
|
@@ -147,7 +162,6 @@ module RSpec
|
|
147
162
|
false
|
148
163
|
end
|
149
164
|
end
|
150
|
-
# rubocop:enable Lint/Eval
|
151
165
|
end
|
152
166
|
|
153
167
|
def module_refinement_supported?
|
@@ -45,13 +45,16 @@ module RSpec
|
|
45
45
|
@location ||= args.find { |arg| arg.is_a?(Location) }
|
46
46
|
end
|
47
47
|
|
48
|
-
|
48
|
+
# We use a loop here (instead of recursion) to prevent SystemStackError
|
49
|
+
def each
|
49
50
|
return to_enum(__method__) unless block_given?
|
50
51
|
|
51
|
-
|
52
|
+
node_queue = []
|
53
|
+
node_queue << self
|
52
54
|
|
53
|
-
|
54
|
-
|
55
|
+
while (current_node = node_queue.shift)
|
56
|
+
yield current_node
|
57
|
+
node_queue.concat(current_node.children)
|
55
58
|
end
|
56
59
|
end
|
57
60
|
|
@@ -59,10 +59,15 @@ module RSpec
|
|
59
59
|
l =~ %r{bundler/source/rubygems} ||
|
60
60
|
# Ignore bundler + rubygems warning.
|
61
61
|
l =~ %r{site_ruby/\d\.\d\.\d/rubygems} ||
|
62
|
+
l =~ %r{jruby-\d\.\d\.\d\.\d/lib/ruby/stdlib/rubygems} ||
|
62
63
|
# This is required for windows for some reason
|
63
64
|
l =~ %r{lib/bundler/rubygems} ||
|
64
65
|
# This is a JRuby file that generates warnings on 9.0.3.0
|
65
|
-
l =~ %r{lib/ruby/stdlib/jar}
|
66
|
+
l =~ %r{lib/ruby/stdlib/jar} ||
|
67
|
+
# This is a JRuby file that generates warnings on 9.1.7.0
|
68
|
+
l =~ %r{org/jruby/RubyKernel\.java} ||
|
69
|
+
# Remove blank lines
|
70
|
+
l == "" || l.nil?
|
66
71
|
end.join("\n")
|
67
72
|
end
|
68
73
|
|
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.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Chelimsky
|
@@ -48,22 +48,8 @@ cert_chain:
|
|
48
48
|
ZsVDj6a7lH3cNqtWXZxrb2wO38qV5AkYj8SQK7Hj3/Yui9myUX3crr+PdetazSqQ
|
49
49
|
F3MdtaDehhjC
|
50
50
|
-----END CERTIFICATE-----
|
51
|
-
date:
|
51
|
+
date: 2019-10-07 00:00:00.000000000 Z
|
52
52
|
dependencies:
|
53
|
-
- !ruby/object:Gem::Dependency
|
54
|
-
name: bundler
|
55
|
-
requirement: !ruby/object:Gem::Requirement
|
56
|
-
requirements:
|
57
|
-
- - "~>"
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
version: '1.3'
|
60
|
-
type: :development
|
61
|
-
prerelease: false
|
62
|
-
version_requirements: !ruby/object:Gem::Requirement
|
63
|
-
requirements:
|
64
|
-
- - "~>"
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
version: '1.3'
|
67
53
|
- !ruby/object:Gem::Dependency
|
68
54
|
name: rake
|
69
55
|
requirement: !ruby/object:Gem::Requirement
|
@@ -135,7 +121,12 @@ files:
|
|
135
121
|
homepage: https://github.com/rspec/rspec-support
|
136
122
|
licenses:
|
137
123
|
- MIT
|
138
|
-
metadata:
|
124
|
+
metadata:
|
125
|
+
bug_tracker_uri: https://github.com/rspec/rspec-support/issues
|
126
|
+
changelog_uri: https://github.com/rspec/rspec-support/blob/v3.9.0/Changelog.md
|
127
|
+
documentation_uri: https://rspec.info/documentation/
|
128
|
+
mailing_list_uri: https://groups.google.com/forum/#!forum/rspec
|
129
|
+
source_code_uri: https://github.com/rspec/rspec-support
|
139
130
|
post_install_message:
|
140
131
|
rdoc_options:
|
141
132
|
- "--charset=UTF-8"
|
@@ -152,9 +143,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
152
143
|
- !ruby/object:Gem::Version
|
153
144
|
version: '0'
|
154
145
|
requirements: []
|
155
|
-
|
156
|
-
rubygems_version: 2.6.14
|
146
|
+
rubygems_version: 3.0.6
|
157
147
|
signing_key:
|
158
148
|
specification_version: 4
|
159
|
-
summary: rspec-support-3.
|
149
|
+
summary: rspec-support-3.9.0
|
160
150
|
test_files: []
|
metadata.gz.sig
CHANGED
Binary file
|