rspec-mocks 3.12.6 → 3.13.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 51d2892643ca24dce94963c553f2fdee71d55d9c3c2b2d14ba4fb2cb4ed0876a
4
- data.tar.gz: ceb42a276b994afe0eaffe46e3a7f314393caf5ba39a5804969b955dc9f309d0
3
+ metadata.gz: 4544a3c8c297ac01db63f9b354adc42f23cb91b635bb8a3c786190e305067036
4
+ data.tar.gz: 7e854083561be7cab34ab290abca139f94636785b5eaa5d01a797c32276e8397
5
5
  SHA512:
6
- metadata.gz: 3d19a308278d05b7703dafc5a88ca5b897badd3e60619fce025937b2ee677e36bea53f9ff2386b4180d107ce45dc695fecb68c69e46d0a4d0ec8063126d30b5f
7
- data.tar.gz: dd881cdd051593ef697cab19d41b760933daca59768ad12430551743936d4373c575f2cc8cfe496e955e90b3cd965d14ec1f2b097c66f63e5e35e34d720696d9
6
+ metadata.gz: dde5e6722136c724658ddc5df5875e6cc39039ea92c42d0758aa85ad7ee644a727afa94c89bee728be523c2dda7505ff648f960c6712d5077e8c88d721377d2d
7
+ data.tar.gz: d1495943f3c1d06bff956b321bf4359dcbcf04b9541d6ed11ca2f5bdc92fd455b40142f071258f17f3016ba5cc7700a7af03ee4115041c6386396280354a23b6
checksums.yaml.gz.sig CHANGED
Binary file
data/Changelog.md CHANGED
@@ -1,5 +1,27 @@
1
1
  ### Development
2
- [Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.12.6...3-12-maintenance)
2
+ [Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.13.1...3-13-maintennace)
3
+
4
+ ### 3.13.1 / 2024-05-08
5
+ [Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.13.0...v3.13.1)
6
+
7
+ Bug Fixes:
8
+
9
+ * Use `RSpec::Support::Mutex` in `RSpec::Mocks::Proxy` to avoid issues from
10
+ stubbing `::Mutex#new`. (Eric Mueller, #1575)
11
+
12
+ ### 3.13.0 / 2024-02-04
13
+ [Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.12.7...v3.13.0)
14
+
15
+ Enhancements:
16
+
17
+ * Add an `array_excluding` matcher for arguments. (Zane Wolfgang Pickett, #1528)
18
+
19
+ ### 3.12.7 / 2024-02-04
20
+ [Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.12.6...v3.12.7)
21
+
22
+ Bug Fixes:
23
+
24
+ * Reduce allocations from "any_instance" style mocks. (Carlos Palhares, #1479)
3
25
 
4
26
  ### 3.12.6 / 2023-07-11
5
27
  [Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.12.5...v3.12.6)
data/README.md CHANGED
@@ -278,6 +278,8 @@ expect(double).to receive(:msg).with(1, duck_type(:abs, :div), "b") #2nd argumen
278
278
  expect(double).to receive(:msg).with(hash_including(:a => 5)) # first arg is a hash with a: 5 as one of the key-values
279
279
  expect(double).to receive(:msg).with(array_including(5)) # first arg is an array with 5 as one of the key-values
280
280
  expect(double).to receive(:msg).with(hash_excluding(:a => 5)) # first arg is a hash without a: 5 as one of the key-values
281
+ expect(double).to receive(:msg).with(start_with('a')) # any matcher, custom or from rspec-expectations
282
+ expect(double).to receive(:msg).with(satisfy { |data| data.dig(:a, :b, :c) == 5 }) # assert anything you want
281
283
  ```
282
284
 
283
285
  ## Receive Counts
@@ -156,21 +156,23 @@ module RSpec
156
156
 
157
157
  private
158
158
 
159
- def ancestor_is_an_observer?(method_name)
160
- lambda do |ancestor|
161
- unless ancestor == @klass
162
- ::RSpec::Mocks.space.
163
- any_instance_recorder_for(ancestor).already_observing?(method_name)
164
- end
165
- end
159
+ def ancestor_is_an_observer?(ancestor, method_name)
160
+ return if ancestor == @klass
161
+
162
+ ::RSpec::Mocks.space.
163
+ any_instance_recorder_for(ancestor).already_observing?(method_name)
166
164
  end
167
165
 
168
166
  def super_class_observers_for(method_name)
169
- @klass.ancestors.select(&ancestor_is_an_observer?(method_name))
167
+ @klass.ancestors.select do |ancestor|
168
+ ancestor_is_an_observer?(ancestor, method_name)
169
+ end
170
170
  end
171
171
 
172
172
  def super_class_observing?(method_name)
173
- @klass.ancestors.any?(&ancestor_is_an_observer?(method_name))
173
+ @klass.ancestors.any? do |ancestor|
174
+ ancestor_is_an_observer?(ancestor, method_name)
175
+ end
174
176
  end
175
177
 
176
178
  def normalize_chain(*args)
@@ -71,6 +71,16 @@ module RSpec
71
71
  HashIncludingMatcher.new(ArgumentMatchers.anythingize_lonely_keys(*args))
72
72
  end
73
73
 
74
+ # Matches a hash that doesn't include the specified key(s) or key/value.
75
+ #
76
+ # @example
77
+ # expect(object).to receive(:message).with(hash_excluding(:key => val))
78
+ # expect(object).to receive(:message).with(hash_excluding(:key))
79
+ # expect(object).to receive(:message).with(hash_excluding(:key, :key2 => :val2))
80
+ def hash_excluding(*args)
81
+ HashExcludingMatcher.new(ArgumentMatchers.anythingize_lonely_keys(*args))
82
+ end
83
+
74
84
  # Matches an array that includes the specified items at least once.
75
85
  # Ignores duplicates and additional values
76
86
  #
@@ -82,14 +92,14 @@ module RSpec
82
92
  ArrayIncludingMatcher.new(actually_an_array)
83
93
  end
84
94
 
85
- # Matches a hash that doesn't include the specified key(s) or key/value.
95
+ # Matches an array that excludes the specified items.
86
96
  #
87
97
  # @example
88
- # expect(object).to receive(:message).with(hash_excluding(:key => val))
89
- # expect(object).to receive(:message).with(hash_excluding(:key))
90
- # expect(object).to receive(:message).with(hash_excluding(:key, :key2 => :val2))
91
- def hash_excluding(*args)
92
- HashExcludingMatcher.new(ArgumentMatchers.anythingize_lonely_keys(*args))
98
+ # expect(object).to receive(:message).with(array_excluding(1,2,3))
99
+ # expect(object).to receive(:message).with(array_excluding([1,2,3]))
100
+ def array_excluding(*args)
101
+ actually_an_array = Array === args.first && args.count == 1 ? args.first : args
102
+ ArrayExcludingMatcher.new(actually_an_array)
93
103
  end
94
104
 
95
105
  alias_method :hash_not_including, :hash_excluding
@@ -236,6 +246,8 @@ module RSpec
236
246
 
237
247
  def ===(actual)
238
248
  actual = actual.uniq
249
+ return true if (actual & @expected).count >= @expected.count
250
+
239
251
  @expected.uniq.all? do |expected_element|
240
252
  actual.any? do |actual_element|
241
253
  RSpec::Support::FuzzyMatcher.values_match?(expected_element, actual_element)
@@ -258,6 +270,38 @@ module RSpec
258
270
  end
259
271
  end
260
272
 
273
+ # @private
274
+ class ArrayExcludingMatcher
275
+ def initialize(unexpected)
276
+ @unexpected = unexpected.uniq
277
+ end
278
+
279
+ def ===(actual)
280
+ actual = actual.uniq
281
+ return false unless (actual & @unexpected).empty?
282
+
283
+ actual.none? do |actual_element|
284
+ @unexpected.any? do |unexpected_element|
285
+ RSpec::Support::FuzzyMatcher.values_match?(unexpected_element, actual_element)
286
+ end
287
+ end
288
+ rescue NoMethodError
289
+ false
290
+ end
291
+
292
+ def description
293
+ "array_excluding(#{formatted_unexpected_values})"
294
+ end
295
+
296
+ private
297
+
298
+ def formatted_unexpected_values
299
+ @unexpected.map do |x|
300
+ RSpec::Support.rspec_description_for_object(x)
301
+ end.join(", ")
302
+ end
303
+ end
304
+
261
305
  # @private
262
306
  class DuckTypeMatcher
263
307
  def initialize(*methods_to_respond_to)
@@ -312,7 +356,7 @@ module RSpec
312
356
  begin
313
357
  object.class.name.include?(matcher_namespace)
314
358
  rescue NoMethodError
315
- # Some objects, like BasicObject, don't implemented standard
359
+ # Some objects, like BasicObject, don't implement standard
316
360
  # reflection methods.
317
361
  false
318
362
  end
@@ -156,7 +156,7 @@ module RSpec
156
156
  end
157
157
 
158
158
  # @private
159
- # Used to track wether we are temporarily suppressing verifying partial
159
+ # Used to track whether we are temporarily suppressing verifying partial
160
160
  # doubles with `without_partial_double_verification { ... }`
161
161
  attr_accessor :temporarily_suppress_partial_double_verification
162
162
 
@@ -101,7 +101,7 @@ module RSpec
101
101
  #
102
102
  # allow(api).to receive(:get_foo).and_invoke(-> { raise ApiTimeout }, -> { raise ApiTimeout }, -> { :a_foo })
103
103
  # api.get_foo # => raises ApiTimeout
104
- # api.get_foo # => rasies ApiTimeout
104
+ # api.get_foo # => raises ApiTimeout
105
105
  # api.get_foo # => :a_foo
106
106
  # api.get_foo # => :a_foo
107
107
  # api.get_foo # => :a_foo
@@ -1,3 +1,5 @@
1
+ RSpec::Support.require_rspec_support 'mutex'
2
+
1
3
  module RSpec
2
4
  module Mocks
3
5
  # @private
@@ -9,11 +11,6 @@ module RSpec
9
11
  end
10
12
  end
11
13
 
12
- unless defined?(Mutex)
13
- Support.require_rspec_support 'mutex'
14
- Mutex = Support::Mutex
15
- end
16
-
17
14
  # @private
18
15
  def ensure_implemented(*_args)
19
16
  # noop for basic proxies, see VerifyingProxy for behaviour.
@@ -27,7 +24,7 @@ module RSpec
27
24
  @order_group = order_group
28
25
  @error_generator = ErrorGenerator.new(object)
29
26
  @messages_received = []
30
- @messages_received_mutex = Mutex.new
27
+ @messages_received_mutex = Support::Mutex.new
31
28
  @options = options
32
29
  @null_object = false
33
30
  @method_doubles = Hash.new { |h, k| h[k] = MethodDouble.new(@object, k, self) }
@@ -3,7 +3,7 @@ module RSpec
3
3
  # Version information for RSpec mocks.
4
4
  module Version
5
5
  # Version of RSpec mocks currently in use in SemVer format.
6
- STRING = '3.12.6'
6
+ STRING = '3.13.1'
7
7
  end
8
8
  end
9
9
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-mocks
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.12.6
4
+ version: 3.13.1
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: 2023-07-11 00:00:00.000000000 Z
48
+ date: 2024-05-08 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.12.0
56
+ version: 3.13.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.12.0
63
+ version: 3.13.0
64
64
  - !ruby/object:Gem::Dependency
65
65
  name: diff-lcs
66
66
  requirement: !ruby/object:Gem::Requirement
@@ -113,16 +113,22 @@ dependencies:
113
113
  name: aruba
114
114
  requirement: !ruby/object:Gem::Requirement
115
115
  requirements:
116
- - - "~>"
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: 1.1.0
119
+ - - "<"
117
120
  - !ruby/object:Gem::Version
118
- version: '1.1'
121
+ version: 3.0.0
119
122
  type: :development
120
123
  prerelease: false
121
124
  version_requirements: !ruby/object:Gem::Requirement
122
125
  requirements:
123
- - - "~>"
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: 1.1.0
129
+ - - "<"
124
130
  - !ruby/object:Gem::Version
125
- version: '1.1'
131
+ version: 3.0.0
126
132
  - !ruby/object:Gem::Dependency
127
133
  name: minitest
128
134
  requirement: !ruby/object:Gem::Requirement
@@ -194,7 +200,7 @@ licenses:
194
200
  - MIT
195
201
  metadata:
196
202
  bug_tracker_uri: https://github.com/rspec/rspec-mocks/issues
197
- changelog_uri: https://github.com/rspec/rspec-mocks/blob/v3.12.6/Changelog.md
203
+ changelog_uri: https://github.com/rspec/rspec-mocks/blob/v3.13.1/Changelog.md
198
204
  documentation_uri: https://rspec.info/documentation/
199
205
  mailing_list_uri: https://groups.google.com/forum/#!forum/rspec
200
206
  source_code_uri: https://github.com/rspec/rspec-mocks
@@ -214,8 +220,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
214
220
  - !ruby/object:Gem::Version
215
221
  version: '0'
216
222
  requirements: []
217
- rubygems_version: 3.4.1
223
+ rubygems_version: 3.1.6
218
224
  signing_key:
219
225
  specification_version: 4
220
- summary: rspec-mocks-3.12.6
226
+ summary: rspec-mocks-3.13.1
221
227
  test_files: []
metadata.gz.sig CHANGED
Binary file