grift 2.0.1 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '06800e91cb7e76be9232c7cf700d99ede4ba25212ed323abd1d5a4e944de455d'
4
- data.tar.gz: 2d844fc80a5edcb9eb809c4946d7ee464465e8423b7a42e2f3a4ff4657e791d7
3
+ metadata.gz: aa5b5344bca43ca62082d11f90cea53e27b02ee4defc424916aa7ffa123099f0
4
+ data.tar.gz: dcc8fe58f1f753b15dc040a2663467d159de298bf08b51177d61652ac6105a9f
5
5
  SHA512:
6
- metadata.gz: c3a2e6a02bab0921a5c91c48c5fbbf67d1a9dd0b0d50bd3c4d9dfb49d6f686623ca0c017d1d51f1df3220b4c1c83c1fd9a26070daa05c36c38d657a2476a4602
7
- data.tar.gz: a7197e5fb4f7bbaf506426c9f4ed2a04733201f8a27a4f015df9af7466c9bd8563e700c2adaaef34211690c5ecf795ded15308701877bd5a0fbb6ed5278b366a
6
+ metadata.gz: cc2aa7d33cfd5296bc24a8fb10d5dc678c3b71781d9ff63a7c475055997310a41fa6963ff351c14384a321224ba3bbf2159b2ae94c06ce03b5997725da46f1ae
7
+ data.tar.gz: 2809aeaf6fde5122e733e0dd25e84d9989051b9e5d25ca7d2593e77b005785182bede7d0caf81e7743f500d389f834c4fa67b89a28d7e85d10ed4cb3f0c29006
@@ -0,0 +1,3 @@
1
+ # github sponsors
2
+ github:
3
+ - clarkedb
@@ -15,12 +15,12 @@ jobs:
15
15
  BUNDLE_WITHOUT: development:test
16
16
 
17
17
  steps:
18
- - uses: actions/checkout@v2
18
+ - uses: actions/checkout@v4
19
19
 
20
- - name: Set up Ruby 2.7
20
+ - name: Set up Ruby 3.3
21
21
  uses: ruby/setup-ruby@v1
22
22
  with:
23
- ruby-version: 2.7
23
+ ruby-version: 3.3
24
24
  bundler-cache: true
25
25
 
26
26
  - name: Rubocop
@@ -33,10 +33,10 @@ jobs:
33
33
  strategy:
34
34
  fail-fast: false
35
35
  matrix:
36
- ruby: ["2.7", "3.0", "3.1"]
36
+ ruby: ["2.7", "3.0", "3.1", "3.2", "3.3"]
37
37
 
38
38
  steps:
39
- - uses: actions/checkout@v2
39
+ - uses: actions/checkout@v4
40
40
  - uses: ruby/setup-ruby@v1
41
41
  with:
42
42
  ruby-version: ${{ matrix.ruby }}
@@ -47,7 +47,7 @@ jobs:
47
47
  run: bundle exec rake test
48
48
 
49
49
  - name: Upload coverage to Codecov
50
- uses: codecov/codecov-action@v2
50
+ uses: codecov/codecov-action@v3
51
51
  with:
52
52
  token: ${{ secrets.CODECOV_TOKEN }}
53
53
  files: ./coverage/.resultset.json
data/.rubocop.yml CHANGED
@@ -102,12 +102,12 @@ Lint/AmbiguousRange:
102
102
 
103
103
  # Metrics
104
104
  Metrics/AbcSize:
105
- Max: 20
105
+ Max: 25
106
106
  Exclude:
107
107
  - "test/**/*"
108
108
 
109
109
  Metrics/ClassLength:
110
- Max: 150
110
+ Max: 225
111
111
  CountAsOne:
112
112
  - array
113
113
  - hash
@@ -128,6 +128,9 @@ Metrics/MethodLength:
128
128
  Minitest/AssertPredicate:
129
129
  Enabled: false
130
130
 
131
+ Minitest/EmptyLineBeforeAssertionMethods:
132
+ Enabled: false
133
+
131
134
  Minitest/MultipleAssertions:
132
135
  Max: 10
133
136
 
@@ -138,6 +141,10 @@ Minitest/RefutePredicate:
138
141
  Naming/InclusiveLanguage:
139
142
  Enabled: true
140
143
 
144
+ Naming/MethodParameterName:
145
+ AllowedNames:
146
+ - n
147
+
141
148
  Naming/VariableNumber:
142
149
  EnforcedStyle: snake_case
143
150
 
data/CHANGELOG.md CHANGED
@@ -8,6 +8,21 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
8
8
 
9
9
  None
10
10
 
11
+ ## [2.2.0](https://github.com/clarkedb/grift/releases/tag/v2.2.0) - 2024-01-13
12
+
13
+ ### Added
14
+
15
+ * Official support for Ruby 3.3 ([#203](https://github.com/clarkedb/grift/pull/203))
16
+
17
+ ## [2.1.0](https://github.com/clarkedb/grift/releases/tag/v2.1.0) - 2022-12-27
18
+
19
+ ### Added
20
+
21
+ * Official support for Ruby 3.2 ([#126](https://github.com/clarkedb/grift/pull/126))
22
+ * Support for finite/self-terminating mocking for more precision in testing where a method may get called multiple times
23
+ + The Grift API now supports `mock_return_value_once`, `mock_return_value_n_times`, and `mock_return_values_in_order` ([#135](https://github.com/clarkedb/grift/pull/135))
24
+ + The Grift API now supports `mock_implementation_once` and `mock_implementation_n_times` ([#136](https://github.com/clarkedb/grift/pull/136))
25
+
11
26
  ## [2.0.1](https://github.com/clarkedb/grift/releases/tag/v2.0.1) - 2022-03-27
12
27
 
13
28
  ### Fixed
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- grift (2.0.1)
4
+ grift (2.2.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -10,53 +10,61 @@ GEM
10
10
  ast (2.4.2)
11
11
  builder (3.2.4)
12
12
  childprocess (4.1.0)
13
- codecov (0.6.0)
14
- simplecov (>= 0.15, < 0.22)
13
+ codecov (0.2.12)
14
+ json
15
+ simplecov
15
16
  docile (1.4.0)
16
17
  iniparse (1.5.0)
17
- minitest (5.15.0)
18
- minitest-reporters (1.5.0)
18
+ json (2.7.1)
19
+ language_server-protocol (3.17.0.3)
20
+ minitest (5.20.0)
21
+ minitest-reporters (1.6.1)
19
22
  ansi
20
23
  builder
21
24
  minitest (>= 5.0)
22
25
  ruby-progressbar
23
- overcommit (0.58.0)
26
+ overcommit (0.60.0)
24
27
  childprocess (>= 0.6.3, < 5)
25
28
  iniparse (~> 1.4)
26
29
  rexml (~> 3.2)
27
- parallel (1.21.0)
28
- parser (3.1.1.0)
30
+ parallel (1.24.0)
31
+ parser (3.3.0.3)
29
32
  ast (~> 2.4.1)
33
+ racc
34
+ racc (1.7.3)
30
35
  rainbow (3.1.1)
31
- rake (13.0.6)
32
- regexp_parser (2.2.1)
33
- rexml (3.2.5)
34
- rubocop (1.26.0)
36
+ rake (13.1.0)
37
+ regexp_parser (2.9.0)
38
+ rexml (3.2.6)
39
+ rubocop (1.59.0)
40
+ json (~> 2.3)
41
+ language_server-protocol (>= 3.17.0)
35
42
  parallel (~> 1.10)
36
- parser (>= 3.1.0.0)
43
+ parser (>= 3.2.2.4)
37
44
  rainbow (>= 2.2.2, < 4.0)
38
45
  regexp_parser (>= 1.8, < 3.0)
39
- rexml
40
- rubocop-ast (>= 1.16.0, < 2.0)
46
+ rexml (>= 3.2.5, < 4.0)
47
+ rubocop-ast (>= 1.30.0, < 2.0)
41
48
  ruby-progressbar (~> 1.7)
42
- unicode-display_width (>= 1.4.0, < 3.0)
43
- rubocop-ast (1.16.0)
44
- parser (>= 3.1.1.0)
45
- rubocop-minitest (0.18.0)
46
- rubocop (>= 0.90, < 2.0)
47
- rubocop-packaging (0.5.1)
48
- rubocop (>= 0.89, < 2.0)
49
- rubocop-performance (1.13.3)
49
+ unicode-display_width (>= 2.4.0, < 3.0)
50
+ rubocop-ast (1.30.0)
51
+ parser (>= 3.2.1.0)
52
+ rubocop-minitest (0.34.4)
53
+ rubocop (>= 1.39, < 2.0)
54
+ rubocop-ast (>= 1.30.0, < 2.0)
55
+ rubocop-packaging (0.5.2)
56
+ rubocop (>= 1.33, < 2.0)
57
+ rubocop-performance (1.19.1)
50
58
  rubocop (>= 1.7.0, < 2.0)
51
59
  rubocop-ast (>= 0.4.0)
52
- ruby-progressbar (1.11.0)
53
- simplecov (0.21.2)
60
+ ruby-progressbar (1.13.0)
61
+ simplecov (0.22.0)
54
62
  docile (~> 1.1)
55
63
  simplecov-html (~> 0.11)
56
64
  simplecov_json_formatter (~> 0.1)
57
65
  simplecov-html (0.12.3)
58
- simplecov_json_formatter (0.1.3)
59
- unicode-display_width (2.1.0)
66
+ simplecov_json_formatter (0.1.4)
67
+ unicode-display_width (2.5.0)
60
68
 
61
69
  PLATFORMS
62
70
  ruby
data/README.md CHANGED
@@ -1,7 +1,6 @@
1
1
  # Grift
2
2
 
3
3
  [![gem version](https://badge.fury.io/rb/grift.svg)](https://rubygems.org/gems/grift)
4
- [![downloads](https://ruby-gem-downloads-badge.herokuapp.com/grift)](https://rubygems.org/gems/grift)
5
4
  [![build](https://github.com/clarkedb/grift/actions/workflows/ci.yml/badge.svg)](https://github.com/clarkedb/grift/actions?query=workflow%3ACI)
6
5
  [![codecov](https://codecov.io/gh/clarkedb/grift/branch/main/graph/badge.svg)](https://codecov.io/gh/clarkedb/grift)
7
6
 
@@ -123,7 +122,7 @@ my_mock.mock.results
123
122
 
124
123
  ## Requirements
125
124
 
126
- Grift supports all Ruby versions >= 2.7 (including 3.1).
125
+ Grift supports all Ruby versions >= 2.7 (including 3.3).
127
126
 
128
127
  ## Development
129
128
 
@@ -11,6 +11,22 @@ module Grift
11
11
  CACHE_METHOD_PREFIX = 'grift_cache'
12
12
  private_constant :CACHE_METHOD_PREFIX
13
13
 
14
+ ##
15
+ # Hashes the class and method for tracking mocks.
16
+ #
17
+ # @example
18
+ # Grift::MockMethod.hash_key(String, :upcase)
19
+ # #=> 'String#upcase'
20
+ #
21
+ # @param klass [Class]
22
+ # @param method_name [Symbol]
23
+ #
24
+ # @return [String] the hash of the class and method
25
+ #
26
+ def self.hash_key(klass, method_name)
27
+ "#{klass}##{method_name}"
28
+ end
29
+
14
30
  ##
15
31
  # A new instance of MockMethod. Should be initialized via {Grift.mock} or {Grift.spy_on}
16
32
  #
@@ -36,7 +52,7 @@ module Grift
36
52
  @method_name = method_name
37
53
  @true_method_cached = false
38
54
  @mock_executions = MockExecutions.new
39
- @cache_method_name = "#{CACHE_METHOD_PREFIX}_#{method_name}".to_sym
55
+ @cache_method_name = :"#{CACHE_METHOD_PREFIX}_#{method_name}"
40
56
 
41
57
  # class methods are really instance methods of the singleton class
42
58
  @class_method = klass.singleton_class.method_defined?(method_name, true) ||
@@ -145,7 +161,116 @@ module Grift
145
161
 
146
162
  # record the args passed in the call to the method and the result
147
163
  mock_executions.store(args: args, result: return_value)
148
- return return_value
164
+ return_value
165
+ end
166
+ class_instance.send(@method_access, @method_name)
167
+
168
+ self
169
+ end
170
+
171
+ ##
172
+ # Accepts a block and mocks the method to execute that block instead
173
+ # of the original behavior the next time the method is called while mocked.
174
+ # After the method has been called once, it will return to its original
175
+ # behavior. The method will continue to be watched.
176
+ #
177
+ # @see #mock_implementation
178
+ #
179
+ # @example
180
+ # my_mock = Grift.spy_on(String, :downcase).mock_implementation_once do
181
+ # x = 3 + 4
182
+ # x.to_s
183
+ # end
184
+ # ["Banana", "Apple"].map(&:downcase)
185
+ # #=> ["7", "apple"]
186
+ #
187
+ # @return [self] the mock itself
188
+ #
189
+ def mock_implementation_once(*)
190
+ raise(Grift::Error, 'Must provide a block for the new implementation') unless block_given?
191
+
192
+ premock_setup
193
+
194
+ # required to access inside class instance block
195
+ mock_executions = @mock_executions
196
+ clean_mock = lambda do
197
+ unmock_method
198
+ watch_method
199
+ end
200
+
201
+ class_instance.remove_method(@method_name) if !@inherited && method_defined?
202
+ class_instance.define_method @method_name do |*args, **kwargs|
203
+ return_value = yield(*args, **kwargs)
204
+
205
+ # record the args passed in the call to the method and the result
206
+ mock_executions.store(args: args, result: return_value)
207
+
208
+ clean_mock.call
209
+
210
+ return_value
211
+ end
212
+ class_instance.send(@method_access, @method_name)
213
+
214
+ self
215
+ end
216
+
217
+ ##
218
+ # Accepts a number +n+ and a block and mocks the method to execute that block
219
+ # instaead of the original behavior the next +n+ times the method is called
220
+ # while mocked. After the method has been called once, it will return to its
221
+ # original behavior. The method will continue to be watched.
222
+ #
223
+ # **IMPORANT:** Calling {#mock_clear} clears the method call history. If it is
224
+ # called before the nth execution of the mocked method, the method will remain
225
+ # mocked for an additonal +n+ calls.
226
+ #
227
+ # @see #mock_implementation
228
+ #
229
+ # @example
230
+ # my_mock = Grift.spy_on(String, :downcase).mock_implementation_n_times(3) do
231
+ # x = 3 + 4
232
+ # x.to_s
233
+ # end
234
+ # ["Banana", "Apple", "Orange", "Guava"].map(&:downcase)
235
+ # #=> ["7", "7", "7", "guava"]
236
+ #
237
+ # @example
238
+ # my_mock = Grift.spy_on(String, :downcase).mock_implementation_n_times(5) do
239
+ # x = 3 + 4
240
+ # x.to_s
241
+ # end
242
+ # ["Banana", "Apple", "Orange", "Guava"].map(&:downcase)
243
+ # #=> ["7", "7", "7", "7"]
244
+ # my_mock.mock_clear # clear mock history before 5th (nth) method call
245
+ # ["Banana", "Apple", "Orange", "Guava"].map(&:downcase)
246
+ # #=> ["7", "7", "7", "7"]
247
+ #
248
+ # @param n [Number] the number of times to mock the implementation
249
+ #
250
+ # @return [self] the mock itself
251
+ #
252
+ def mock_implementation_n_times(n, *)
253
+ raise(Grift::Error, 'Must provide a block for the new implementation') unless block_given?
254
+
255
+ premock_setup
256
+
257
+ # required to access inside class instance block
258
+ mock_executions = @mock_executions
259
+ clean_mock = lambda do
260
+ unmock_method
261
+ watch_method
262
+ end
263
+
264
+ class_instance.remove_method(@method_name) if !@inherited && method_defined?
265
+ class_instance.define_method @method_name do |*args, **kwargs|
266
+ return_value = yield(*args, **kwargs)
267
+
268
+ # record the args passed in the call to the method and the result
269
+ mock_executions.store(args: args, result: return_value)
270
+
271
+ clean_mock.call if mock_executions.count == n
272
+
273
+ return_value
149
274
  end
150
275
  class_instance.send(@method_access, @method_name)
151
276
 
@@ -175,7 +300,7 @@ module Grift
175
300
  class_instance.define_method @method_name do |*args, **kwargs|
176
301
  # record the args passed in the call to the method and the result
177
302
  mock_executions.store(args: args, kwargs: kwargs, result: return_value)
178
- return return_value
303
+ return_value
179
304
  end
180
305
  class_instance.send(@method_access, @method_name)
181
306
 
@@ -183,30 +308,151 @@ module Grift
183
308
  end
184
309
 
185
310
  ##
186
- # String representation of the MockMethod
311
+ # Accepts a value and mocks the method to return that value once instead
312
+ # of executing its original behavior while mocked. After the method has
313
+ # been called once, it will return to its original behavior. The method
314
+ # will continue to be watched.
187
315
  #
188
- # @see Grift::MockMethod.hash_key
316
+ # @example
317
+ # my_mock = Grift.spy_on(String, :upcase).mock_return_value_once("BANANA")
318
+ # ["apple", "apple"].map(&:upcase)
319
+ # #=> ["BANANA", "APPLE"]
189
320
  #
190
- # @return [String]
321
+ # @param return_value the value to return from the method once
191
322
  #
192
- def to_s
193
- Grift::MockMethod.hash_key(@klass, @method_name)
323
+ # @return [self] the mock itself
324
+ #
325
+ def mock_return_value_once(return_value = nil)
326
+ premock_setup
327
+
328
+ # required to access mock inside class instance block
329
+ mock_executions = @mock_executions
330
+ clean_mock = lambda do
331
+ unmock_method
332
+ watch_method
333
+ end
334
+
335
+ class_instance.remove_method(@method_name) if !@inherited && method_defined?
336
+ class_instance.define_method @method_name do |*args, **kwargs|
337
+ # record the args passed in the call to the method and the result
338
+ mock_executions.store(args: args, kwargs: kwargs, result: return_value)
339
+
340
+ clean_mock.call
341
+
342
+ return_value
343
+ end
344
+ class_instance.send(@method_access, @method_name)
345
+
346
+ self
194
347
  end
195
348
 
196
349
  ##
197
- # Hashes the class and method for tracking mocks.
350
+ # Accepts a value and mocks the method to return that value +n+ times instead
351
+ # of executing its original behavior while mocked. After the method has
352
+ # been called +n+ times, it will return to its original behavior. The method
353
+ # will continue to be watched.
354
+ #
355
+ # **IMPORANT:** Calling {#mock_clear} clears the method call history. If it is
356
+ # called before the nth execution of the mocked method, the method will remain
357
+ # mocked for an additional +n+ calls.
198
358
  #
199
359
  # @example
200
- # Grift::MockMethod.hash_key(String, :upcase)
201
- # #=> 'String#upcase'
360
+ # my_mock = Grift.spy_on(String, :upcase).mock_return_value_n_times(2, "BANANA")
361
+ # ["apple", "apple", "apple"].map(&:upcase)
362
+ # #=> ["BANANA", "BANANA", "APPLE"]
202
363
  #
203
- # @param klass [Class]
204
- # @param method_name [Symbol]
364
+ # @example
365
+ # my_mock = Grift.spy_on(String, :upcase).mock_return_value_n_times(4, "BANANA")
366
+ # ["apple", "apple", "apple"].map(&:upcase)
367
+ # #=> ["BANANA", "BANANA", "BANANA"]
368
+ # my_mock.mock_clear # clear mock history before 4th (nth) method call
369
+ # ["apple", "apple", "apple"].map(&:upcase)
370
+ # #=> ["BANANA", "BANANA", "BANANA"]
205
371
  #
206
- # @return [String] the hash of the class and method
372
+ # @param n [Number] the number of times to mock the return value
373
+ # @param return_value the value to return from the method +n+ times
207
374
  #
208
- def self.hash_key(klass, method_name)
209
- "#{klass}\##{method_name}"
375
+ # @return [self] the mock itself
376
+ #
377
+ def mock_return_value_n_times(n, return_value = nil)
378
+ premock_setup
379
+
380
+ # required to access mock inside class instance block
381
+ mock_executions = @mock_executions
382
+ clean_mock = lambda do
383
+ unmock_method
384
+ watch_method
385
+ end
386
+
387
+ class_instance.remove_method(@method_name) if !@inherited && method_defined?
388
+ class_instance.define_method @method_name do |*args, **kwargs|
389
+ # record the args passed in the call to the method and the result
390
+ mock_executions.store(args: args, kwargs: kwargs, result: return_value)
391
+
392
+ clean_mock.call if mock_executions.count == n
393
+
394
+ return_value
395
+ end
396
+ class_instance.send(@method_access, @method_name)
397
+
398
+ self
399
+ end
400
+
401
+ ##
402
+ # Accepts an array of values and mocks the method to return those values
403
+ # in order instead of executing its original behavior while mocked. After
404
+ # the method has been called enough times to return each of the values,
405
+ # it will return to its original behavior. The method continue to be watched.
406
+ #
407
+ # @example
408
+ # mock_values = ["APPLE", "BANANA", "ORANGE"]
409
+ # my_mock = Grift.spy_on(String, :upcase).mock_return_values_in_order(mock_values)
410
+ # ["pineapple", "orange", "guava", "mango", "watermelon"].map(&:upcase)
411
+ # #=> ["APPLE", "BANANA", "ORANGE", "MANGO", "WATERMELON"]
412
+ #
413
+ # @param return_values [Array] the values to return from the method in order
414
+ #
415
+ # @return [self] the mock itself
416
+ #
417
+ def mock_return_values_in_order(return_values)
418
+ unless return_values.is_a?(Array) && !return_values.empty?
419
+ raise(Grift::Error, 'Must provide a non-empty array for the return values')
420
+ end
421
+
422
+ premock_setup
423
+
424
+ # required to access mock inside class instance block
425
+ mock_executions = @mock_executions
426
+ clean_mock = lambda do
427
+ unmock_method
428
+ watch_method
429
+ end
430
+ return_values_internal = return_values.dup
431
+
432
+ class_instance.remove_method(@method_name) if !@inherited && method_defined?
433
+ class_instance.define_method @method_name do |*args, **kwargs|
434
+ # record the args passed in the call to the method and the result
435
+ return_value = return_values_internal.shift
436
+ mock_executions.store(args: args, kwargs: kwargs, result: return_value)
437
+
438
+ clean_mock.call if return_values_internal.empty?
439
+
440
+ return_value
441
+ end
442
+ class_instance.send(@method_access, @method_name)
443
+
444
+ self
445
+ end
446
+
447
+ ##
448
+ # String representation of the MockMethod
449
+ #
450
+ # @see Grift::MockMethod.hash_key
451
+ #
452
+ # @return [String]
453
+ #
454
+ def to_s
455
+ Grift::MockMethod.hash_key(@klass, @method_name)
210
456
  end
211
457
 
212
458
  private
@@ -227,7 +473,7 @@ module Grift
227
473
 
228
474
  # record the args passed in the call to the method and the result
229
475
  mock_executions.store(args: args, kwargs: kwargs, result: return_value)
230
- return return_value
476
+ return_value
231
477
  end
232
478
  class_instance.send(@method_access, @method_name)
233
479
 
data/lib/grift/version.rb CHANGED
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Grift
4
4
  # gem version
5
- VERSION = '2.0.1'
5
+ VERSION = '2.2.0'
6
6
  public_constant :VERSION
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grift
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Clark Brown
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-03-27 00:00:00.000000000 Z
11
+ date: 2024-01-13 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A gem for simple mocking and spying in Ruby's MiniTest framework.
14
14
  email:
@@ -19,6 +19,7 @@ extra_rdoc_files: []
19
19
  files:
20
20
  - ".github/CODEOWNERS"
21
21
  - ".github/CONTRIBUTING.md"
22
+ - ".github/FUNDING.yml"
22
23
  - ".github/dependabot.yml"
23
24
  - ".github/workflows/ci.yml"
24
25
  - ".gitignore"
@@ -54,7 +55,7 @@ metadata:
54
55
  homepage_uri: https://github.com/clarkedb/grift
55
56
  rubygems_mfa_required: 'true'
56
57
  source_code_uri: https://github.com/clarkedb/grift
57
- post_install_message:
58
+ post_install_message:
58
59
  rdoc_options: []
59
60
  require_paths:
60
61
  - lib
@@ -69,8 +70,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
69
70
  - !ruby/object:Gem::Version
70
71
  version: '0'
71
72
  requirements: []
72
- rubygems_version: 3.2.32
73
- signing_key:
73
+ rubygems_version: 3.5.3
74
+ signing_key:
74
75
  specification_version: 4
75
76
  summary: Mocking and spying in MiniTest
76
77
  test_files: []