rspec-expectations 3.8.4 → 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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/Changelog.md +29 -0
- data/README.md +31 -16
- data/lib/rspec/expectations/handler.rb +2 -2
- data/lib/rspec/expectations/version.rb +1 -1
- data/lib/rspec/matchers.rb +28 -24
- data/lib/rspec/matchers/built_in/compound.rb +6 -1
- data/lib/rspec/matchers/built_in/respond_to.rb +11 -2
- data/lib/rspec/matchers/dsl.rb +8 -1
- data/lib/rspec/matchers/expecteds_for_multiple_diffs.rb +16 -7
- metadata +16 -16
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d8cb915ab51f5b587fcbaa864e697cc291ff3c1f49afd8d829837c1a9c4c4f6b
|
|
4
|
+
data.tar.gz: 6aa770883cacbfcf2921074a98506a0a789b4557ee6a7ea79738f008107e582d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fc2669ca822767874cc62c9e7cef32040f90da7cd0d4c13b1bd97fde68230f7f7019a8b717e2ebfcd223da5b9e25aaa60270c0797ba4d304def5e4ae3bb63f03
|
|
7
|
+
data.tar.gz: e9d7a9e1b186c1eee547c315f177181992f5be9e35c61a16a041d97901537d054943a779e0d6bd7f2502e51a1fcbf95f0f6a10eab46fcdd85bebd8be1170a369
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
data.tar.gz.sig
CHANGED
|
Binary file
|
data/Changelog.md
CHANGED
|
@@ -1,3 +1,32 @@
|
|
|
1
|
+
### 3.9.0 / 2019-10-02
|
|
2
|
+
[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.8.5...v3.9.0)
|
|
3
|
+
|
|
4
|
+
Enhancements:
|
|
5
|
+
|
|
6
|
+
* The `respond_to` matcher now uses the signature from `initialize` to validate checks
|
|
7
|
+
for `new` (unless `new` is non standard). (Jon Rowe, #1072)
|
|
8
|
+
* Generated descriptions for matchers now use `is expected to` rather than `should` in
|
|
9
|
+
line with our preferred DSL. (Pete Johns, #1080, rspec/rspec-core#2572)
|
|
10
|
+
* Add the ability to re-raise expectation errors when matching
|
|
11
|
+
with `match_when_negated` blocks. (Jon Rowe, #1130)
|
|
12
|
+
* Add a warning when an empty diff is produce due to identical inspect output.
|
|
13
|
+
(Benoit Tigeot, #1126)
|
|
14
|
+
|
|
15
|
+
### 3.8.6 / 2019-10-07
|
|
16
|
+
|
|
17
|
+
Bug Fixes:
|
|
18
|
+
|
|
19
|
+
* Revert #1125 due to the change being incompatible with our semantic versioning
|
|
20
|
+
policy.
|
|
21
|
+
|
|
22
|
+
### 3.8.5 / 2019-10-02
|
|
23
|
+
[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.8.4...v3.8.5)
|
|
24
|
+
|
|
25
|
+
Bug Fixes:
|
|
26
|
+
|
|
27
|
+
* Prevent unsupported implicit block expectation syntax from being used.
|
|
28
|
+
(Phil Pirozhkov, #1125)
|
|
29
|
+
|
|
1
30
|
### 3.8.4 / 2019-06-10
|
|
2
31
|
[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.8.3...v3.8.4)
|
|
3
32
|
|
data/README.md
CHANGED
|
@@ -175,30 +175,45 @@ expect(1..10).to cover(3)
|
|
|
175
175
|
### Collection membership
|
|
176
176
|
|
|
177
177
|
```ruby
|
|
178
|
-
|
|
178
|
+
# exact order, entire collection
|
|
179
|
+
expect(actual).to eq(expected)
|
|
180
|
+
|
|
181
|
+
# exact order, partial collection (based on an exact position)
|
|
179
182
|
expect(actual).to start_with(expected)
|
|
180
183
|
expect(actual).to end_with(expected)
|
|
181
184
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
+
# any order, entire collection
|
|
186
|
+
expect(actual).to match_array(expected)
|
|
187
|
+
|
|
188
|
+
# You can also express this by passing the expected elements
|
|
189
|
+
# as individual arguments
|
|
190
|
+
expect(actual).to contain_exactly(expected_element1, expected_element2)
|
|
191
|
+
|
|
192
|
+
# any order, partial collection
|
|
193
|
+
expect(actual).to include(expected)
|
|
185
194
|
```
|
|
186
195
|
|
|
187
196
|
#### Examples
|
|
188
197
|
|
|
189
198
|
```ruby
|
|
190
|
-
expect([1, 2, 3]).to
|
|
191
|
-
expect([1, 2, 3]).to include(1,
|
|
192
|
-
expect([1, 2, 3]).to
|
|
193
|
-
expect([1, 2, 3]).to start_with(1,
|
|
194
|
-
expect([1, 2, 3]).to
|
|
195
|
-
expect([1, 2, 3]).to end_with(
|
|
196
|
-
expect(
|
|
197
|
-
expect(
|
|
198
|
-
expect("this string").to
|
|
199
|
-
expect("this string").to
|
|
200
|
-
expect(
|
|
201
|
-
expect([1, 2, 3]).to
|
|
199
|
+
expect([1, 2, 3]).to eq([1, 2, 3]) # Order dependent equality check
|
|
200
|
+
expect([1, 2, 3]).to include(1) # Exact ordering, partial collection matches
|
|
201
|
+
expect([1, 2, 3]).to include(2, 3) #
|
|
202
|
+
expect([1, 2, 3]).to start_with(1) # As above, but from the start of the collection
|
|
203
|
+
expect([1, 2, 3]).to start_with(1, 2) #
|
|
204
|
+
expect([1, 2, 3]).to end_with(3) # As above but from the end of the collection
|
|
205
|
+
expect([1, 2, 3]).to end_with(2, 3) #
|
|
206
|
+
expect({:a => 'b'}).to include(:a => 'b') # Matching within hashes
|
|
207
|
+
expect("this string").to include("is str") # Matching within strings
|
|
208
|
+
expect("this string").to start_with("this") #
|
|
209
|
+
expect("this string").to end_with("ring") #
|
|
210
|
+
expect([1, 2, 3]).to contain_exactly(2, 3, 1) # Order independent matches
|
|
211
|
+
expect([1, 2, 3]).to match_array([3, 2, 1]) #
|
|
212
|
+
|
|
213
|
+
# Order dependent compound matchers
|
|
214
|
+
expect(
|
|
215
|
+
[{:a => 'hash'},{:a => 'another'}]
|
|
216
|
+
).to match([a_hash_including(:a => 'hash'), a_hash_including(:a => 'another')])
|
|
202
217
|
```
|
|
203
218
|
|
|
204
219
|
## `should` syntax
|
|
@@ -52,7 +52,7 @@ module RSpec
|
|
|
52
52
|
end
|
|
53
53
|
|
|
54
54
|
def self.verb
|
|
55
|
-
|
|
55
|
+
'is expected to'
|
|
56
56
|
end
|
|
57
57
|
|
|
58
58
|
def self.should_method
|
|
@@ -82,7 +82,7 @@ module RSpec
|
|
|
82
82
|
end
|
|
83
83
|
|
|
84
84
|
def self.verb
|
|
85
|
-
|
|
85
|
+
'is expected not to'
|
|
86
86
|
end
|
|
87
87
|
|
|
88
88
|
def self.should_method
|
data/lib/rspec/matchers.rb
CHANGED
|
@@ -266,9 +266,9 @@ module RSpec
|
|
|
266
266
|
# @example
|
|
267
267
|
# expect(actual).to eq(expected)
|
|
268
268
|
# expect(actual).not_to eq(expected)
|
|
269
|
-
# @return [ExpectationTarget]
|
|
270
|
-
# @see ExpectationTarget#to
|
|
271
|
-
# @see ExpectationTarget#not_to
|
|
269
|
+
# @return [Expectations::ExpectationTarget]
|
|
270
|
+
# @see Expectations::ExpectationTarget#to
|
|
271
|
+
# @see Expectations::ExpectationTarget#not_to
|
|
272
272
|
|
|
273
273
|
# Allows multiple expectations in the provided block to fail, and then
|
|
274
274
|
# aggregates them into a single exception, rather than aborting on the
|
|
@@ -1003,31 +1003,35 @@ module RSpec
|
|
|
1003
1003
|
is_a_matcher?(obj) && obj.respond_to?(:description)
|
|
1004
1004
|
end
|
|
1005
1005
|
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
# Note that `included` doesn't work for this because it is triggered
|
|
1009
|
-
# _after_ `RSpec::Matchers` is an ancestor of the inclusion host, rather
|
|
1010
|
-
# than _before_, like `append_features`. It's important we check this before
|
|
1011
|
-
# in order to find the cases where it was already previously included.
|
|
1012
|
-
def self.append_features(mod)
|
|
1013
|
-
return super if mod < self # `mod < self` indicates a re-inclusion.
|
|
1006
|
+
class << self
|
|
1007
|
+
private
|
|
1014
1008
|
|
|
1015
|
-
|
|
1016
|
-
|
|
1009
|
+
if RSpec::Support::Ruby.mri? && RUBY_VERSION[0, 3] == '1.9'
|
|
1010
|
+
# Note that `included` doesn't work for this because it is triggered
|
|
1011
|
+
# _after_ `RSpec::Matchers` is an ancestor of the inclusion host, rather
|
|
1012
|
+
# than _before_, like `append_features`. It's important we check this before
|
|
1013
|
+
# in order to find the cases where it was already previously included.
|
|
1014
|
+
# @api private
|
|
1015
|
+
def append_features(mod)
|
|
1016
|
+
return super if mod < self # `mod < self` indicates a re-inclusion.
|
|
1017
1017
|
|
|
1018
|
-
|
|
1019
|
-
|
|
1018
|
+
subclasses = ObjectSpace.each_object(Class).select { |c| c < mod && c < self }
|
|
1019
|
+
return super unless subclasses.any?
|
|
1020
1020
|
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
"which can trigger infinite recursion from `super` due to an MRI 1.9 bug " \
|
|
1024
|
-
"(https://redmine.ruby-lang.org/issues/3351). To work around this, " \
|
|
1025
|
-
"either upgrade to MRI 2.0+, include a dup of the module (e.g. " \
|
|
1026
|
-
"`include #{self}.dup`), or find a way to include `#{self}` in `#{mod}` " \
|
|
1027
|
-
"before it is included in subclasses (#{subclasses}). See " \
|
|
1028
|
-
"https://github.com/rspec/rspec-expectations/issues/814 for more info"
|
|
1021
|
+
subclasses.reject! { |s| subclasses.any? { |s2| s < s2 } } # Filter to the root ancestor.
|
|
1022
|
+
subclasses = subclasses.map { |s| "`#{s}`" }.join(", ")
|
|
1029
1023
|
|
|
1030
|
-
|
|
1024
|
+
RSpec.warning "`#{self}` has been included in a superclass (`#{mod}`) " \
|
|
1025
|
+
"after previously being included in subclasses (#{subclasses}), " \
|
|
1026
|
+
"which can trigger infinite recursion from `super` due to an MRI 1.9 bug " \
|
|
1027
|
+
"(https://redmine.ruby-lang.org/issues/3351). To work around this, " \
|
|
1028
|
+
"either upgrade to MRI 2.0+, include a dup of the module (e.g. " \
|
|
1029
|
+
"`include #{self}.dup`), or find a way to include `#{self}` in `#{mod}` " \
|
|
1030
|
+
"before it is included in subclasses (#{subclasses}). See " \
|
|
1031
|
+
"https://github.com/rspec/rspec-expectations/issues/814 for more info"
|
|
1032
|
+
|
|
1033
|
+
super
|
|
1034
|
+
end
|
|
1031
1035
|
end
|
|
1032
1036
|
end
|
|
1033
1037
|
end
|
|
@@ -154,7 +154,12 @@ module RSpec
|
|
|
154
154
|
end
|
|
155
155
|
|
|
156
156
|
def matcher_matches?(matcher)
|
|
157
|
-
@match_results.fetch(matcher)
|
|
157
|
+
@match_results.fetch(matcher) do
|
|
158
|
+
raise ArgumentError, "Your #{matcher.description} has no match " \
|
|
159
|
+
"results, this can occur when an unexpected call stack or " \
|
|
160
|
+
"local jump occurs. Prehaps one of your matchers needs to " \
|
|
161
|
+
"declare `expects_call_stack_jump?` as `true`?"
|
|
162
|
+
end
|
|
158
163
|
end
|
|
159
164
|
|
|
160
165
|
private
|
|
@@ -125,9 +125,18 @@ module RSpec
|
|
|
125
125
|
|
|
126
126
|
return true if expectation.empty?
|
|
127
127
|
|
|
128
|
-
|
|
128
|
+
Support::StrictSignatureVerifier.new(method_signature_for(actual, name)).
|
|
129
|
+
with_expectation(expectation).valid?
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def method_signature_for(actual, name)
|
|
133
|
+
method_handle = Support.method_handle_for(actual, name)
|
|
129
134
|
|
|
130
|
-
|
|
135
|
+
if name == :new && method_handle.owner === ::Class && ::Class === actual
|
|
136
|
+
Support::MethodSignature.new(actual.instance_method(:initialize))
|
|
137
|
+
else
|
|
138
|
+
Support::MethodSignature.new(method_handle)
|
|
139
|
+
end
|
|
131
140
|
end
|
|
132
141
|
|
|
133
142
|
def with_arity
|
data/lib/rspec/matchers/dsl.rb
CHANGED
|
@@ -147,8 +147,14 @@ module RSpec
|
|
|
147
147
|
# is rarely necessary, but can be helpful, for example, when specifying
|
|
148
148
|
# asynchronous processes that require different timeouts.
|
|
149
149
|
#
|
|
150
|
+
# By default the match block will swallow expectation errors (e.g.
|
|
151
|
+
# caused by using an expectation such as `expect(1).to eq 2`), if you
|
|
152
|
+
# with to allow these to bubble up, pass in the option
|
|
153
|
+
# `:notify_expectation_failures => true`.
|
|
154
|
+
#
|
|
155
|
+
# @param [Hash] options for defining the behavior of the match block.
|
|
150
156
|
# @yield [Object] actual the actual value (i.e. the value wrapped by `expect`)
|
|
151
|
-
def match_when_negated(&match_block)
|
|
157
|
+
def match_when_negated(options={}, &match_block)
|
|
152
158
|
define_user_override(:does_not_match?, match_block) do |actual|
|
|
153
159
|
begin
|
|
154
160
|
@actual = actual
|
|
@@ -156,6 +162,7 @@ module RSpec
|
|
|
156
162
|
super(*actual_arg_for(match_block))
|
|
157
163
|
end
|
|
158
164
|
rescue RSpec::Expectations::ExpectationNotMetError
|
|
165
|
+
raise if options[:notify_expectation_failures]
|
|
159
166
|
false
|
|
160
167
|
end
|
|
161
168
|
end
|
|
@@ -52,20 +52,29 @@ module RSpec
|
|
|
52
52
|
|
|
53
53
|
private
|
|
54
54
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
class << self
|
|
56
|
+
private
|
|
57
|
+
|
|
58
|
+
def diff_label_for(matcher)
|
|
59
|
+
"Diff for (#{truncated(RSpec::Support::ObjectFormatter.format(matcher))}):"
|
|
60
|
+
end
|
|
58
61
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
+
def truncated(description)
|
|
63
|
+
return description if description.length <= DESCRIPTION_MAX_LENGTH
|
|
64
|
+
description[0...DESCRIPTION_MAX_LENGTH - 3] << "..."
|
|
65
|
+
end
|
|
62
66
|
end
|
|
63
67
|
|
|
64
68
|
def diffs(differ, actual)
|
|
65
69
|
@expected_list.map do |(expected, diff_label)|
|
|
66
70
|
diff = differ.diff(actual, expected)
|
|
67
71
|
next if diff.strip.empty?
|
|
68
|
-
|
|
72
|
+
if diff == "\e[0m\n\e[0m"
|
|
73
|
+
"#{diff_label}\n" \
|
|
74
|
+
" <The diff is empty, are your objects producing identical `#inspect` output?>"
|
|
75
|
+
else
|
|
76
|
+
"#{diff_label}#{diff}"
|
|
77
|
+
end
|
|
69
78
|
end.compact.join("\n")
|
|
70
79
|
end
|
|
71
80
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rspec-expectations
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.
|
|
4
|
+
version: 3.9.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Steven Baker
|
|
@@ -45,7 +45,7 @@ cert_chain:
|
|
|
45
45
|
ZsVDj6a7lH3cNqtWXZxrb2wO38qV5AkYj8SQK7Hj3/Yui9myUX3crr+PdetazSqQ
|
|
46
46
|
F3MdtaDehhjC
|
|
47
47
|
-----END CERTIFICATE-----
|
|
48
|
-
date: 2019-
|
|
48
|
+
date: 2019-10-07 00:00:00.000000000 Z
|
|
49
49
|
dependencies:
|
|
50
50
|
- !ruby/object:Gem::Dependency
|
|
51
51
|
name: rspec-support
|
|
@@ -53,14 +53,14 @@ dependencies:
|
|
|
53
53
|
requirements:
|
|
54
54
|
- - "~>"
|
|
55
55
|
- !ruby/object:Gem::Version
|
|
56
|
-
version: 3.
|
|
56
|
+
version: 3.9.0
|
|
57
57
|
type: :runtime
|
|
58
58
|
prerelease: false
|
|
59
59
|
version_requirements: !ruby/object:Gem::Requirement
|
|
60
60
|
requirements:
|
|
61
61
|
- - "~>"
|
|
62
62
|
- !ruby/object:Gem::Version
|
|
63
|
-
version: 3.
|
|
63
|
+
version: 3.9.0
|
|
64
64
|
- !ruby/object:Gem::Dependency
|
|
65
65
|
name: diff-lcs
|
|
66
66
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -82,19 +82,19 @@ dependencies:
|
|
|
82
82
|
- !ruby/object:Gem::Version
|
|
83
83
|
version: '2.0'
|
|
84
84
|
- !ruby/object:Gem::Dependency
|
|
85
|
-
name:
|
|
85
|
+
name: aruba
|
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
|
87
87
|
requirements:
|
|
88
88
|
- - "~>"
|
|
89
89
|
- !ruby/object:Gem::Version
|
|
90
|
-
version:
|
|
90
|
+
version: 0.14.10
|
|
91
91
|
type: :development
|
|
92
92
|
prerelease: false
|
|
93
93
|
version_requirements: !ruby/object:Gem::Requirement
|
|
94
94
|
requirements:
|
|
95
95
|
- - "~>"
|
|
96
96
|
- !ruby/object:Gem::Version
|
|
97
|
-
version:
|
|
97
|
+
version: 0.14.10
|
|
98
98
|
- !ruby/object:Gem::Dependency
|
|
99
99
|
name: cucumber
|
|
100
100
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -110,33 +110,33 @@ dependencies:
|
|
|
110
110
|
- !ruby/object:Gem::Version
|
|
111
111
|
version: '1.3'
|
|
112
112
|
- !ruby/object:Gem::Dependency
|
|
113
|
-
name:
|
|
113
|
+
name: minitest
|
|
114
114
|
requirement: !ruby/object:Gem::Requirement
|
|
115
115
|
requirements:
|
|
116
116
|
- - "~>"
|
|
117
117
|
- !ruby/object:Gem::Version
|
|
118
|
-
version:
|
|
118
|
+
version: '5.2'
|
|
119
119
|
type: :development
|
|
120
120
|
prerelease: false
|
|
121
121
|
version_requirements: !ruby/object:Gem::Requirement
|
|
122
122
|
requirements:
|
|
123
123
|
- - "~>"
|
|
124
124
|
- !ruby/object:Gem::Version
|
|
125
|
-
version:
|
|
125
|
+
version: '5.2'
|
|
126
126
|
- !ruby/object:Gem::Dependency
|
|
127
|
-
name:
|
|
127
|
+
name: rake
|
|
128
128
|
requirement: !ruby/object:Gem::Requirement
|
|
129
129
|
requirements:
|
|
130
130
|
- - "~>"
|
|
131
131
|
- !ruby/object:Gem::Version
|
|
132
|
-
version:
|
|
132
|
+
version: 10.0.0
|
|
133
133
|
type: :development
|
|
134
134
|
prerelease: false
|
|
135
135
|
version_requirements: !ruby/object:Gem::Requirement
|
|
136
136
|
requirements:
|
|
137
137
|
- - "~>"
|
|
138
138
|
- !ruby/object:Gem::Version
|
|
139
|
-
version:
|
|
139
|
+
version: 10.0.0
|
|
140
140
|
description: rspec-expectations provides a simple, readable API to express expected
|
|
141
141
|
outcomes of a code example.
|
|
142
142
|
email: rspec@googlegroups.com
|
|
@@ -202,7 +202,7 @@ licenses:
|
|
|
202
202
|
- MIT
|
|
203
203
|
metadata:
|
|
204
204
|
bug_tracker_uri: https://github.com/rspec/rspec-expectations/issues
|
|
205
|
-
changelog_uri: https://github.com/rspec/rspec-expectations/blob/v3.
|
|
205
|
+
changelog_uri: https://github.com/rspec/rspec-expectations/blob/v3.9.0/Changelog.md
|
|
206
206
|
documentation_uri: https://rspec.info/documentation/
|
|
207
207
|
mailing_list_uri: https://groups.google.com/forum/#!forum/rspec
|
|
208
208
|
source_code_uri: https://github.com/rspec/rspec-expectations
|
|
@@ -222,8 +222,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
222
222
|
- !ruby/object:Gem::Version
|
|
223
223
|
version: '0'
|
|
224
224
|
requirements: []
|
|
225
|
-
rubygems_version: 3.0.
|
|
225
|
+
rubygems_version: 3.0.6
|
|
226
226
|
signing_key:
|
|
227
227
|
specification_version: 4
|
|
228
|
-
summary: rspec-expectations-3.
|
|
228
|
+
summary: rspec-expectations-3.9.0
|
|
229
229
|
test_files: []
|
metadata.gz.sig
CHANGED
|
Binary file
|