refinements 10.1.0 → 11.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/README.adoc +98 -38
- data/lib/refinements/arrays.rb +28 -1
- data/lib/refinements/big_decimals.rb +1 -1
- data/lib/refinements/hashes.rb +1 -1
- data/lib/refinements/pathnames.rb +1 -3
- data/lib/refinements/strings.rb +2 -2
- data/refinements.gemspec +2 -2
- data.tar.gz.sig +3 -2
- metadata +28 -28
- 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: 252744b620f3c79a0c38b635157f62fc9e48527701145e871de885c547b44b61
|
4
|
+
data.tar.gz: 411b88c5cf6b9b95c59c43055b8a2402c95d9954b612837fce70a106c4c4a5f1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0c12fb201556e5949190657cd591b126115ba7efb9f14aec4aeb107455d7cd04676b0dd1cc05f84e9bdd8b7c61e2fbadbabe377b739ffd14a643c3d98d717068
|
7
|
+
data.tar.gz: db75e0359afed8603daba0bae481b8e839b9d9ede700ef22bbcde22116e2a75b221b5d56d0381500ccf992f73c11cb7a4555823c4294b131077972800a03f3c1
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/README.adoc
CHANGED
@@ -4,11 +4,7 @@
|
|
4
4
|
|
5
5
|
= Refinements
|
6
6
|
|
7
|
-
|
8
|
-
to debug link:https://alchemists.io/articles/ruby_antipatterns/#_monkey_patches[monkey patches].
|
9
|
-
These refinements give you additional syntactic sugar to develop clean and concise implementations
|
10
|
-
while using less code. By refining our code we can acquire the functionality we wish the core
|
11
|
-
primitives had!
|
7
|
+
These refinements augment and enhance Ruby primitives so you can avoid link:https://alchemists.io/articles/ruby_antipatterns/#_monkey_patches[monkey patches]. They also allow you to develop clean and concise implementations while using less code. By refining your code, you can acquire the functionality you wish the core primitives had!
|
12
8
|
|
13
9
|
toc::[]
|
14
10
|
|
@@ -31,30 +27,45 @@ Enhances the following objects:
|
|
31
27
|
== Requirements
|
32
28
|
|
33
29
|
. https://www.ruby-lang.org[Ruby].
|
34
|
-
. A solid understanding of link:https://alchemists.io/articles/ruby_refinements[
|
35
|
-
and lexical scope].
|
30
|
+
. A solid understanding of link:https://alchemists.io/articles/ruby_refinements[refinements].
|
36
31
|
|
37
32
|
== Setup
|
38
33
|
|
39
|
-
To install, run:
|
34
|
+
To install _with_ security, run:
|
35
|
+
|
36
|
+
[source,bash]
|
37
|
+
----
|
38
|
+
# 💡 Skip this line if you already have the public certificate installed.
|
39
|
+
gem cert --add <(curl --compressed --location https://alchemists.io/gems.pem)
|
40
|
+
gem install refinements --trust-policy HighSecurity
|
41
|
+
----
|
42
|
+
|
43
|
+
To install _without_ security, run:
|
40
44
|
|
41
45
|
[source,bash]
|
42
46
|
----
|
43
47
|
gem install refinements
|
44
48
|
----
|
45
49
|
|
46
|
-
|
50
|
+
You can also add the gem directly to your project:
|
51
|
+
|
52
|
+
[source,bash]
|
53
|
+
----
|
54
|
+
bundle add refinements
|
55
|
+
----
|
56
|
+
|
57
|
+
Once the gem is installed, you only need to require it:
|
47
58
|
|
48
59
|
[source,ruby]
|
49
60
|
----
|
50
|
-
|
61
|
+
require "refinements"
|
51
62
|
----
|
52
63
|
|
53
64
|
== Usage
|
54
65
|
|
55
66
|
=== Requires
|
56
67
|
|
57
|
-
If
|
68
|
+
If no refinements are desired, then add the following to your `Gemfile` instead:
|
58
69
|
|
59
70
|
[source,ruby]
|
60
71
|
----
|
@@ -195,7 +206,7 @@ Adds given array or elements without mutating itself.
|
|
195
206
|
|
196
207
|
===== #intersperse
|
197
208
|
|
198
|
-
Inserts additional elements or array between all members of given array.
|
209
|
+
Inserts additional elements or an array between all members of given array.
|
199
210
|
|
200
211
|
[source,ruby]
|
201
212
|
----
|
@@ -267,6 +278,46 @@ needs to be a specific size with padded values.
|
|
267
278
|
[1, 2].pad 3, max: 3 # [1, 2, 3]
|
268
279
|
----
|
269
280
|
|
281
|
+
===== #pick
|
282
|
+
|
283
|
+
Answers value of first element that matches given key.
|
284
|
+
|
285
|
+
[source,ruby]
|
286
|
+
----
|
287
|
+
array = [{name: "a", label: "A"}, {name: "b", label: "B"}, {name: "c", label: "C"}]
|
288
|
+
|
289
|
+
array.pick :name # "a"
|
290
|
+
array.pick :name, :label # ["a", "A"]
|
291
|
+
array.pick # nil
|
292
|
+
[].pick(:test) # nil
|
293
|
+
----
|
294
|
+
|
295
|
+
===== #pluck
|
296
|
+
|
297
|
+
Answers values of all elements that match given keys.
|
298
|
+
|
299
|
+
[source,ruby]
|
300
|
+
----
|
301
|
+
array = [{name: "a", label: "A"}, {name: "b", label: "B"}, {name: "c", label: "C"}]
|
302
|
+
|
303
|
+
array.pluck :name # ["a", "b", "c"]
|
304
|
+
array.pluck :name, :label # [["a", "A"], ["b", "B"], ["c", "C"]]
|
305
|
+
array.pluck # []
|
306
|
+
[].pluck :test # []
|
307
|
+
----
|
308
|
+
|
309
|
+
===== #replace_at
|
310
|
+
|
311
|
+
Answers mutated array where an element -- at a specific index -- is replaced by single or multiple elements.
|
312
|
+
|
313
|
+
[source,ruby]
|
314
|
+
----
|
315
|
+
%i[a b c].replace_at(0, :x) # [:x, :b, :c]
|
316
|
+
%i[a b c].replace_at(1, :x) # [:a, :x, :c]
|
317
|
+
%i[a b c].replace_at(1, :x, :y) # [:a, :x, :y, :c]
|
318
|
+
%i[a b c].replace_at(-1, :x) # [:a, :b, :x]
|
319
|
+
----
|
320
|
+
|
270
321
|
===== #ring
|
271
322
|
|
272
323
|
Answers a circular array which can enumerate before, current, after elements.
|
@@ -308,17 +359,31 @@ Answers mutated array where all target elements are replaced by single or multip
|
|
308
359
|
|
309
360
|
===== #to_sentence
|
310
361
|
|
311
|
-
Answers a sentence using `"
|
362
|
+
Answers a sentence using `"and"` as the default conjunction and `", "` as the default delimiter.
|
312
363
|
Useful when building documentation, answering human readable error messages, etc.
|
313
364
|
|
314
365
|
[source,ruby]
|
315
366
|
----
|
316
|
-
[].to_sentence
|
317
|
-
["test"].to_sentence
|
318
|
-
["a", :b].to_sentence
|
319
|
-
[1, "a", :b, 2.0, /\w+/].map(&:inspect).to_sentence
|
320
|
-
%w[one two three].to_sentence
|
321
|
-
%w[eins zwei drei].to_sentence
|
367
|
+
[].to_sentence # ""
|
368
|
+
["test"].to_sentence # "test"
|
369
|
+
["a", :b].to_sentence # "a and b"
|
370
|
+
[1, "a", :b, 2.0, /\w+/].map(&:inspect).to_sentence # 1, "a", :b, 2.0, and /\w+/
|
371
|
+
%w[one two three].to_sentence # "one, two, and three"
|
372
|
+
%w[eins zwei drei].to_sentence "und", delimiter: " " # "eins zwei und drei"
|
373
|
+
----
|
374
|
+
|
375
|
+
===== #to_usage
|
376
|
+
|
377
|
+
Builds upon and enhances `#to_sentence` further by answering a sentence which all elements are inspected -- where each element of the array is called with `#inspect` -- before turned into a sentence using `"and"` as the default conjunction and `", "` as the default delimiter. This is useful when providing detailed error messages _and_ you need to show the element types used.
|
378
|
+
|
379
|
+
[source,ruby]
|
380
|
+
----
|
381
|
+
[].to_usage # ""
|
382
|
+
["test"].to_usage # "test"
|
383
|
+
["a", :b].to_usage # "a and b"
|
384
|
+
[1, "a", :b, 2.0, /\w+/].map(&:inspect).to_usage # 1, "a", :b, 2.0, and /\w+/
|
385
|
+
%w[one two three].to_usage # "one, two, and three"
|
386
|
+
%w[eins zwei drei].to_usage "und", delimiter: " " # "eins zwei und drei"
|
322
387
|
----
|
323
388
|
|
324
389
|
==== Big Decimal
|
@@ -371,7 +436,7 @@ example[:b] # []
|
|
371
436
|
|
372
437
|
===== #compress
|
373
438
|
|
374
|
-
Removes `nil` and empty objects without mutating itself. Answers itself if
|
439
|
+
Removes `nil` and empty objects without mutating itself. Answers itself if nothing to remove.
|
375
440
|
|
376
441
|
[source,ruby]
|
377
442
|
----
|
@@ -386,7 +451,7 @@ example # {a: 1, b: "blueberry", c: nil, d: "", e: [], f: {}, g:
|
|
386
451
|
|
387
452
|
===== #compress!
|
388
453
|
|
389
|
-
Removes `nil` and empty objects while mutating itself. Answers `nil` if
|
454
|
+
Removes `nil` and empty objects while mutating itself. Answers `nil` if nothing to remove.
|
390
455
|
|
391
456
|
[source,ruby]
|
392
457
|
----
|
@@ -584,9 +649,7 @@ example # {a: 1, b: 2}
|
|
584
649
|
|
585
650
|
===== #transform_with
|
586
651
|
|
587
|
-
Transforms
|
588
|
-
|
589
|
-
You can transform multiple values at once:
|
652
|
+
Transforms values of keys using specific operations (i.e. any object that responds to `#call`). Does not mutate itself and you can transform multiple values at once:
|
590
653
|
|
591
654
|
[source,ruby]
|
592
655
|
----
|
@@ -605,7 +668,7 @@ example.transform_with bogus: -> value { value.tr "<>", "" }
|
|
605
668
|
# {email: "<jd@example.com>"}
|
606
669
|
----
|
607
670
|
|
608
|
-
The original object
|
671
|
+
The original object _will not_ be mutated:
|
609
672
|
|
610
673
|
[source,ruby]
|
611
674
|
----
|
@@ -614,9 +677,7 @@ example # {name: "Jayne Doe", email: "<jd@example.com>"}
|
|
614
677
|
|
615
678
|
===== #transform_with!
|
616
679
|
|
617
|
-
Transforms
|
618
|
-
|
619
|
-
You can transform multiple values at once:
|
680
|
+
Transforms values of keys using specific operations (i.e. any object that responds to `#call`). Mutates itself and you can transform multiple values at once:
|
620
681
|
|
621
682
|
[source,ruby]
|
622
683
|
----
|
@@ -635,7 +696,7 @@ example.transform_with! bogus: -> value { value.tr "<>", "" }
|
|
635
696
|
# {email: "<jd@example.com>"}
|
636
697
|
----
|
637
698
|
|
638
|
-
The original object
|
699
|
+
The original object _will be_ mutated:
|
639
700
|
|
640
701
|
[source,ruby]
|
641
702
|
----
|
@@ -644,7 +705,7 @@ example # {name: "Jayne", email: "jd@example.com"}
|
|
644
705
|
|
645
706
|
===== #use
|
646
707
|
|
647
|
-
|
708
|
+
Uses the hash's keys as block arguments where the value of the block argument is equal to the value of the key found within the hash. Works best with hashes that use symbols for keys but falls back to string keys when symbol keys can't be found.
|
648
709
|
|
649
710
|
[source,ruby]
|
650
711
|
----
|
@@ -822,8 +883,7 @@ Pathname.make_temp_dir { |path| path.join "sub_dir" } # Pathname:/var/fol
|
|
822
883
|
|
823
884
|
===== .require_tree
|
824
885
|
|
825
|
-
Requires all files in given root path and corresponding nested tree structure. All files are sorted
|
826
|
-
before being required to ensure consistent behavior. Example:
|
886
|
+
Requires all Ruby files in given root path and corresponding nested tree structure. All files are sorted before being required to ensure consistent behavior. Example:
|
827
887
|
|
828
888
|
[source,ruby]
|
829
889
|
----
|
@@ -1147,15 +1207,15 @@ Answers first character of a string or first set of characters if given a number
|
|
1147
1207
|
|
1148
1208
|
===== #indent
|
1149
1209
|
|
1150
|
-
Answers string
|
1210
|
+
Answers indentation (string) which is the result of the multiplier times padding. By default, the multiplier is `1` and the padding is `" "` which equates to two spaces.
|
1151
1211
|
|
1152
1212
|
[source,ruby]
|
1153
1213
|
----
|
1154
|
-
"example".indent
|
1155
|
-
"example".indent 0
|
1156
|
-
"example".indent -1
|
1157
|
-
"example".indent 2
|
1158
|
-
"example".indent 3,
|
1214
|
+
"example".indent # " example"
|
1215
|
+
"example".indent 0 # "example"
|
1216
|
+
"example".indent -1 # "example"
|
1217
|
+
"example".indent 2 # " example"
|
1218
|
+
"example".indent 3, pad: " " # " example"
|
1159
1219
|
----
|
1160
1220
|
|
1161
1221
|
===== #last
|
data/lib/refinements/arrays.rb
CHANGED
@@ -33,6 +33,29 @@ module Refinements
|
|
33
33
|
|
34
34
|
def pad(value, max: size) = dup.fill(value, size..(max - 1))
|
35
35
|
|
36
|
+
def pick(*keys)
|
37
|
+
return if empty?
|
38
|
+
|
39
|
+
keys.many? ? keys.map { |key| first[key] } : first[keys.first]
|
40
|
+
end
|
41
|
+
|
42
|
+
def pluck(*keys)
|
43
|
+
return dup if empty?
|
44
|
+
return [] if keys.empty?
|
45
|
+
|
46
|
+
if keys.many?
|
47
|
+
map { |element| keys.map { |key| element[key] } }
|
48
|
+
else
|
49
|
+
key = keys.first
|
50
|
+
map { |element| element[key] }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def replace_at(index, *elements)
|
55
|
+
delete_at index
|
56
|
+
insert(index, *elements)
|
57
|
+
end
|
58
|
+
|
36
59
|
def ring(&) = [last, *self, first].each_cons(3, &)
|
37
60
|
|
38
61
|
def supplant target, *replacements
|
@@ -49,13 +72,17 @@ module Refinements
|
|
49
72
|
self
|
50
73
|
end
|
51
74
|
|
52
|
-
def to_sentence
|
75
|
+
def to_sentence conjunction = "and", delimiter: ", "
|
53
76
|
case length
|
54
77
|
when (3..) then "#{self[..-2].join delimiter}#{delimiter}#{conjunction} #{last}"
|
55
78
|
when 2 then join " #{conjunction} "
|
56
79
|
else join
|
57
80
|
end
|
58
81
|
end
|
82
|
+
|
83
|
+
def to_usage conjunction = "and", delimiter: ", "
|
84
|
+
map(&:inspect).to_sentence conjunction, delimiter:
|
85
|
+
end
|
59
86
|
end
|
60
87
|
end
|
61
88
|
end
|
@@ -6,7 +6,7 @@ module Refinements
|
|
6
6
|
# Provides additional enhancements to the BigDecimal primitive.
|
7
7
|
module BigDecimals
|
8
8
|
refine BigDecimal do
|
9
|
-
def inspect = format("#<BigDecimal
|
9
|
+
def inspect = format("#<BigDecimal:%<id>s %<string>s>", id: object_id, string: to_s("F"))
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
data/lib/refinements/hashes.rb
CHANGED
@@ -24,9 +24,7 @@ module Refinements
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
def require_tree
|
28
|
-
new(root).files(pattern).each { |path| require path.to_s }
|
29
|
-
end
|
27
|
+
def require_tree(root) = new(root).files("**/*.rb").each { |path| require path.to_s }
|
30
28
|
|
31
29
|
def root = new(File::SEPARATOR)
|
32
30
|
end
|
data/lib/refinements/strings.rb
CHANGED
@@ -26,8 +26,8 @@ module Refinements
|
|
26
26
|
self[..(maximum - 1)]
|
27
27
|
end
|
28
28
|
|
29
|
-
def indent multiplier = 1,
|
30
|
-
multiplier.negative? ? self : (
|
29
|
+
def indent multiplier = 1, pad: " "
|
30
|
+
multiplier.negative? ? self : (pad * multiplier) + self
|
31
31
|
end
|
32
32
|
|
33
33
|
def last minimum = 0
|
data/refinements.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |spec|
|
4
4
|
spec.name = "refinements"
|
5
|
-
spec.version = "
|
5
|
+
spec.version = "11.0.0"
|
6
6
|
spec.authors = ["Brooke Kuhlmann"]
|
7
7
|
spec.email = ["brooke@alchemists.io"]
|
8
8
|
spec.homepage = "https://alchemists.io/projects/refinements"
|
9
|
-
spec.summary = "A collection of
|
9
|
+
spec.summary = "A collection of core Ruby object refinements."
|
10
10
|
spec.license = "Hippocratic-2.1"
|
11
11
|
|
12
12
|
spec.metadata = {
|
data.tar.gz.sig
CHANGED
@@ -1,2 +1,3 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
��ã?_���۶5Πu#=��i;��w�7�����K<�`I����0������$*)�Jv�KƩp|#��2��Z�d��2�Tlӆ�H��*�#ݠ�m�B�&�+��V Jx��;Zo��N
|
2
|
+
'j|�6L�dSF��A}���SJQJ���U�ӻ�q��UB�ʕ-��Z{]�q���?0�HG��ʕ#�T���t�y��ޙB7�ѻ���oہo 9`��c��Mچ
|
3
|
+
']fP�E����
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: refinements
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 11.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brooke Kuhlmann
|
@@ -10,32 +10,32 @@ bindir: bin
|
|
10
10
|
cert_chain:
|
11
11
|
- |
|
12
12
|
-----BEGIN CERTIFICATE-----
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
13
|
+
MIIEeDCCAuCgAwIBAgIBATANBgkqhkiG9w0BAQsFADBBMQ8wDQYDVQQDDAZicm9v
|
14
|
+
a2UxGjAYBgoJkiaJk/IsZAEZFgphbGNoZW1pc3RzMRIwEAYKCZImiZPyLGQBGRYC
|
15
|
+
aW8wHhcNMjMwMzIyMTYxNDQxWhcNMjUwMzIxMTYxNDQxWjBBMQ8wDQYDVQQDDAZi
|
16
|
+
cm9va2UxGjAYBgoJkiaJk/IsZAEZFgphbGNoZW1pc3RzMRIwEAYKCZImiZPyLGQB
|
17
|
+
GRYCaW8wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCro8tj5/E1Hg88
|
18
|
+
f4qfiwPVd2zJQHvdYt4GHVvuHRRgx4HGhJuNp+4BId08RBn7V6V1MW6MY3kezRBs
|
19
|
+
M+7QOQ4b1xNLTvY7FYQB1wGK5a4x7TTokDrPYQxDB2jmsdDYCzVbIMrAvUfcecRi
|
20
|
+
khyGZCdByiiCl4fKv77P12tTT+NfsvXkLt/AYCGwjOUyGKTQ01Z6eC09T27GayPH
|
21
|
+
QQvIkakyFgcJtzSyGzs8bzK5q9u7wQ12MNTjJoXzW69lqp0oNvDylu81EiSUb5S6
|
22
|
+
QzzPxZBiRB1sgtbt1gUbVI262ZDq1gR+HxPFmp+Cgt7ZLIJZAtesQvtcMzseXpfn
|
23
|
+
hpmm0Sw22KGhRAy/mqHBRhDl5HqS1SJp2Ko3lcnpXeFResp0HNlt8NSu13vhC08j
|
24
|
+
GUHU9MyIXbFOsnp3K3ADrAVjPWop8EZkmUR3MV/CUm00w2cZHCSGiXl1KMpiVKvk
|
25
|
+
Ywr1gd2ZME4QLSo+EXUtLxDUa/W3xnBS8dBOuMMz02FPWYr3PN8CAwEAAaN7MHkw
|
26
|
+
CQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFAFgmv0tYMZnItuPycSM
|
27
|
+
F5wykJEVMB8GA1UdEQQYMBaBFGJyb29rZUBhbGNoZW1pc3RzLmlvMB8GA1UdEgQY
|
28
|
+
MBaBFGJyb29rZUBhbGNoZW1pc3RzLmlvMA0GCSqGSIb3DQEBCwUAA4IBgQAX+EGY
|
29
|
+
9RLYGxF1VLZz+G1ACQc4uyrCB6kXwI06kzUa5dF9tPXqTX9ffnz3/W8ck2IQhKzu
|
30
|
+
MKO2FVijzbDWTsZeZGglS4E+4Jxpau1lU9HhOIcKolv6LeC6UdALTFudY+GLb8Xw
|
31
|
+
REXgaJkjzzhkUSILmEnRwEbY08dVSl7ZAaxVI679vfI2yapLlIwpbBgmQTiTvPr3
|
32
|
+
qyyLUno9flYEOv9fmGHunSrM+gE0/0niGTXa5GgXBXYGS2he4LQGgSBfGp/cTwMU
|
33
|
+
rDKJRcusZ12lNBeDfgqACz/BBJF8FLodgk6rGMRZz7+ZmjjHEmpG5bQpR6Q2BuWL
|
34
|
+
XMtYk/QzaWuhiR7pWjiF8jbdd7RO6or0ohq7iFkokz/5xrtQ/vPzU2RQ3Qc6YaKw
|
35
|
+
3n5C8/6Zh9DYTkpcwPSuIfAga6wf4nXc9m6JAw8AuMLaiWN/r/2s4zJsUHYERJEu
|
36
|
+
gZGm4JqtuSg8pYjPeIJxS960owq+SfuC+jxqmRA54BisFCv/0VOJi7tiJVY=
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date: 2023-
|
38
|
+
date: 2023-06-13 00:00:00.000000000 Z
|
39
39
|
dependencies: []
|
40
40
|
description:
|
41
41
|
email:
|
@@ -90,8 +90,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
90
90
|
- !ruby/object:Gem::Version
|
91
91
|
version: '0'
|
92
92
|
requirements: []
|
93
|
-
rubygems_version: 3.4.
|
93
|
+
rubygems_version: 3.4.14
|
94
94
|
signing_key:
|
95
95
|
specification_version: 4
|
96
|
-
summary: A collection of
|
96
|
+
summary: A collection of core Ruby object refinements.
|
97
97
|
test_files: []
|
metadata.gz.sig
CHANGED
Binary file
|