refinements 9.0.2 → 9.1.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 +133 -66
- data/lib/refinements/arrays.rb +4 -0
- data/lib/refinements/hashes.rb +4 -0
- data/lib/refinements/identity.rb +1 -1
- data/lib/refinements/pathnames.rb +5 -1
- data/lib/refinements/shared/enumerables/many.rb +17 -0
- data/lib/refinements/strings.rb +1 -2
- data/lib/refinements/structs.rb +9 -2
- data.tar.gz.sig +0 -0
- metadata +4 -3
- 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: 4d3e2ba6964cfd39388a7f055fa830a5654ee264d04b2f519c1a735b922c08a7
|
4
|
+
data.tar.gz: f711604bba6cd3809398a5a2f6cb0ec867851538e58355c403a2b26aac4d75e3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a72da7caf3a0698ae29bce0c51e3ce66829c41ac471e90a0f8777dc0f2e587c79304daf5ffb98983bf6ac50c79afb621d570216e557e550d0771208a039a52ed
|
7
|
+
data.tar.gz: ad031fb50b8d0c747d69b856d6e3a41eea74ba7de959bb8bfeda6b17c5b866ef2480fadce96ba50baa9b66c8e2fa6469d82e0a115cfa09a0d645668c2b3a0ef3
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/README.adoc
CHANGED
@@ -183,6 +183,19 @@ Inserts additional elements or array between all members of given array.
|
|
183
183
|
[1, 2, 3].intersperse %i[a b c] # [1, :a, :b, :c, 2, :a, :b, :c, 3]
|
184
184
|
----
|
185
185
|
|
186
|
+
===== #many?
|
187
|
+
|
188
|
+
Answers true if an array has more than one element. Can take a block which evaluates as truthy or
|
189
|
+
falsey.
|
190
|
+
|
191
|
+
[source,ruby]
|
192
|
+
----
|
193
|
+
[1, 2].many? # true
|
194
|
+
[1, 2, 3].many?(&:odd?) # true
|
195
|
+
[1].many? # false
|
196
|
+
[].many? # false
|
197
|
+
----
|
198
|
+
|
186
199
|
===== #maximum
|
187
200
|
|
188
201
|
Answers the maximum extracted value from a collection of objects.
|
@@ -436,6 +449,19 @@ example.flatten_keys! # {a_b: 1}
|
|
436
449
|
example # {a_b: 1}
|
437
450
|
----
|
438
451
|
|
452
|
+
===== #many?
|
453
|
+
|
454
|
+
Answers true if a hash has more than one element. Can take a block which evaluates as truthy or
|
455
|
+
falsey.
|
456
|
+
|
457
|
+
[source,ruby]
|
458
|
+
----
|
459
|
+
{a: 1, b: 2}.many? # true
|
460
|
+
{a: 1, b: 2, c: 2}.many? { |_key, value| value == 2 } # true
|
461
|
+
{a: 1}.many? # false
|
462
|
+
{}.many? # false
|
463
|
+
----
|
464
|
+
|
439
465
|
===== #recurse
|
440
466
|
|
441
467
|
Recursively iterates over the hash and any hash value by applying the given block to it. Does not
|
@@ -694,6 +720,28 @@ Pathname("/example.txt").touch.delete # Pathname("/example")
|
|
694
720
|
Pathname("/example.txt").delete # Errno::ENOENT
|
695
721
|
----
|
696
722
|
|
723
|
+
===== #delete_prefix
|
724
|
+
|
725
|
+
Deletes a path prefix and answers new pathname.
|
726
|
+
|
727
|
+
[source,ruby]
|
728
|
+
----
|
729
|
+
Pathname("a/path/example-test.rb").delete_prefix("example-") # Pathname("a/path/test.rb")
|
730
|
+
Pathname("example-test.rb").delete_prefix("example-") # Pathname("test.rb")
|
731
|
+
Pathname("example-test.rb").delete_prefix("miss") # Pathname("example-test.rb")
|
732
|
+
----
|
733
|
+
|
734
|
+
===== #delete_suffix
|
735
|
+
|
736
|
+
Deletes a path suffix and answers new pathname.
|
737
|
+
|
738
|
+
[source,ruby]
|
739
|
+
----
|
740
|
+
Pathname("a/path/test-example.rb").delete_suffix("-example") # Pathname("a/path/test.rb")
|
741
|
+
Pathname("test-example.rb").delete_suffix("-example") # Pathname("test.rb")
|
742
|
+
Pathname("test-example.rb").delete_suffix("miss") # Pathname("test-example.rb")
|
743
|
+
----
|
744
|
+
|
697
745
|
===== #directories
|
698
746
|
|
699
747
|
Answers all directories or filtered directories for current path.
|
@@ -1055,14 +1103,14 @@ whether the struct was constructed with positional or keyword arguments.
|
|
1055
1103
|
[source,ruby]
|
1056
1104
|
----
|
1057
1105
|
Example = Struct.new :a, :b, :c
|
1058
|
-
Example.with_keywords a: 1, b: 2, c: 3 #
|
1059
|
-
Example.with_keywords a: 1 #
|
1060
|
-
Example.with_keywords c: 1 #
|
1106
|
+
Example.with_keywords a: 1, b: 2, c: 3 # #<struct a=1, b=2, c=3>
|
1107
|
+
Example.with_keywords a: 1 # #<struct a=1, b=nil, c=nil>
|
1108
|
+
Example.with_keywords c: 1 # #<struct a=nil, b=nil, c=1>
|
1061
1109
|
|
1062
1110
|
Example = Struct.new :a, :b, :c, keyword_init: true
|
1063
|
-
Example.with_keywords a: 1, b: 2, c: 3 #
|
1064
|
-
Example.with_keywords a: 1 #
|
1065
|
-
Example.with_keywords c: 1 #
|
1111
|
+
Example.with_keywords a: 1, b: 2, c: 3 # #<struct a=1, b=2, c=3>
|
1112
|
+
Example.with_keywords a: 1 # #<struct a=1, b=nil, c=nil>
|
1113
|
+
Example.with_keywords c: 1 # #<struct a=nil, b=nil, c=1>
|
1066
1114
|
----
|
1067
1115
|
|
1068
1116
|
===== .with_positions
|
@@ -1073,106 +1121,125 @@ whether the struct was constructed with positional or keyword arguments.
|
|
1073
1121
|
[source,ruby]
|
1074
1122
|
----
|
1075
1123
|
Example = Struct.new :a, :b, :c
|
1076
|
-
Example.with_positions 1, 2, 3 #
|
1077
|
-
Example.with_positions 1 #
|
1124
|
+
Example.with_positions 1, 2, 3 # #<struct a=1, b=2, c=3>
|
1125
|
+
Example.with_positions 1 # #<struct a=1, b=nil, c=nil>
|
1078
1126
|
|
1079
1127
|
Example = Struct.new :a, :b, :c, keyword_init: true
|
1080
|
-
Example.with_positions 1, 2, 3 #
|
1081
|
-
Example.with_positions 1 #
|
1128
|
+
Example.with_positions 1, 2, 3 # #<struct a=1, b=2, c=3>
|
1129
|
+
Example.with_positions 1 # #<struct a=1, b=nil, c=nil>
|
1082
1130
|
----
|
1083
1131
|
|
1084
1132
|
===== #merge
|
1085
1133
|
|
1086
1134
|
Merges multiple attributes without mutating itself and supports any object that responds to `#to_h`.
|
1135
|
+
Works regardless of whether the struct is constructed with positional or keyword arguments.
|
1087
1136
|
|
1088
1137
|
[source,ruby]
|
1089
1138
|
----
|
1139
|
+
example = Struct.new("Example", :a, :b, :c).new 1, 2, 3
|
1090
1140
|
other = Struct.new("Other", :a, :b, :c).new 7, 8, 9
|
1091
1141
|
|
1092
|
-
example
|
1093
|
-
example.merge a: 10
|
1094
|
-
example.merge a: 10, c: 30
|
1095
|
-
example.merge
|
1096
|
-
example
|
1097
|
-
example.merge other # "#<struct a=7, b=8, c=9>"
|
1098
|
-
example # "#<struct a=1, b=2, c=3>"
|
1099
|
-
|
1100
|
-
example = Struct.new(:a, :b, :c, keyword_init: true).new a: 1, b: 2, c: 3
|
1101
|
-
example.merge a: 10 # "#<struct a=10, b=2, c=3>"
|
1102
|
-
example.merge a: 10, c: 30 # "#<struct a=10, b=2, c=30>"
|
1103
|
-
example.merge {a: 10, b: 20} # "#<struct a=10, b=20, c=3>"
|
1104
|
-
example.merge other # "#<struct a=7, b=8, c=9>"
|
1105
|
-
example.merge a: 10, b: 20, c: 30 # "#<struct a=10, b=20, c=30>"
|
1106
|
-
example # "#<struct a=1, b=2, c=3>"
|
1142
|
+
example.merge a: 10 # #<struct Struct::Example a=10, b=2, c=3>
|
1143
|
+
example.merge a: 10, c: 30 # #<struct Struct::Example a=10, b=2, c=30>
|
1144
|
+
example.merge a: 10, b: 20, c: 30 # #<struct Struct::Example a=10, b=20, c=30>
|
1145
|
+
example.merge other # #<struct Struct::Example a=7, b=8, c=9>
|
1146
|
+
example # #<struct Struct::Example a=1, b=2, c=3>
|
1107
1147
|
----
|
1108
1148
|
|
1109
1149
|
===== #merge!
|
1110
1150
|
|
1111
1151
|
Merges multiple attributes while mutating itself and supports any object that responds to `#to_h`.
|
1152
|
+
Works regardless of whether the struct is constructed with positional or keyword arguments.
|
1112
1153
|
|
1113
1154
|
[source,ruby]
|
1114
1155
|
----
|
1156
|
+
example = Struct.new("Example", :a, :b, :c).new 1, 2, 3
|
1115
1157
|
other = Struct.new("Other", :a, :b, :c).new 7, 8, 9
|
1116
1158
|
|
1117
|
-
example
|
1118
|
-
example.merge! a: 10
|
1119
|
-
example.merge!
|
1120
|
-
example.merge!
|
1121
|
-
example
|
1122
|
-
example.merge! a: 10, b: 20, c: 30 # "#<struct a=10, b=20, c=30>"
|
1123
|
-
example # "#<struct a=10, b=20, c=30>"
|
1124
|
-
|
1125
|
-
example = Struct.new(:a, :b, :c, keyword_init: true).new a: 1, b: 2, c: 3
|
1126
|
-
example.merge! a: 10 # "#<struct a=10, b=2, c=3>"
|
1127
|
-
example.merge! a: 10, c: 30 # "#<struct a=10, b=2, c=30>"
|
1128
|
-
example.merge! {a: 10, b: 20} # "#<struct a=10, b=20, c=3>"
|
1129
|
-
example.merge! other # "#<struct a=7, b=8, c=9>"
|
1130
|
-
example.merge! a: 10, b: 20, c: 30 # "#<struct a=10, b=20, c=30>"
|
1131
|
-
example # "#<struct a=10, b=20, c=30>"
|
1159
|
+
example.merge! a: 10 # #<struct Struct::Example a=10, b=2, c=3>
|
1160
|
+
example.merge! a: 10, c: 30 # #<struct Struct::Example a=10, b=2, c=30>
|
1161
|
+
example.merge! other # #<struct Struct::Example a=7, b=8, c=9>
|
1162
|
+
example.merge! a: 10, b: 20, c: 30 # #<struct Struct::Example a=10, b=20, c=30>
|
1163
|
+
example # #<struct Struct::Example a=10, b=20, c=30>
|
1132
1164
|
----
|
1133
1165
|
|
1134
1166
|
===== #revalue
|
1135
1167
|
|
1136
|
-
Transforms values without mutating itself. An optional hash can be supplied to
|
1137
|
-
|
1138
|
-
|
1139
|
-
|
1140
|
-
|
1168
|
+
Transforms values without mutating itself. An optional hash can be supplied to target specific
|
1169
|
+
attributes. In the event that a block isn't supplied, the struct will answer itself since there is
|
1170
|
+
nothing to operate on. Behavior is the same regardless of whether the struct is constructed using
|
1171
|
+
positional or keyword arguments. Works regardless of whether the struct is constructed with
|
1172
|
+
positional or keyword arguments.
|
1141
1173
|
|
1142
1174
|
[source,ruby]
|
1143
1175
|
----
|
1144
1176
|
example = Struct.new("Example", :a, :b, :c).new 1, 2, 3
|
1145
|
-
|
1146
|
-
example.revalue
|
1147
|
-
example.revalue
|
1148
|
-
example.revalue
|
1149
|
-
example
|
1177
|
+
|
1178
|
+
example.revalue { |value| value * 2 } # #<struct Struct::Example a=2, b=4, c=6>
|
1179
|
+
example.revalue(c: 2) { |previous, current| previous + current } # #<struct Struct::Example a=1, b=2, c=5>
|
1180
|
+
example.revalue c: 2 # #<struct Struct::Example a=1, b=2, c=3>
|
1181
|
+
example.revalue # #<struct Struct::Example a=1, b=2, c=3>
|
1182
|
+
example # #<struct Struct::Example a=1, b=2, c=3>
|
1150
1183
|
----
|
1151
1184
|
|
1152
1185
|
===== #revalue!
|
1153
1186
|
|
1154
|
-
Transforms values while mutating itself. An optional hash can be supplied to
|
1155
|
-
|
1156
|
-
|
1157
|
-
|
1158
|
-
|
1187
|
+
Transforms values while mutating itself. An optional hash can be supplied to target specific
|
1188
|
+
attributes. In the event that a block isn't supplied, the struct will answer itself since there is
|
1189
|
+
nothing to operate on. Behavior is the same regardless of whether the struct is constructed using
|
1190
|
+
positional or keyword arguments. Works regardless of whether the struct is constructed with
|
1191
|
+
positional or keyword arguments.
|
1159
1192
|
|
1160
1193
|
[source,ruby]
|
1161
1194
|
----
|
1162
|
-
|
1195
|
+
one = Struct.new("One", :a, :b, :c).new 1, 2, 3
|
1196
|
+
one.revalue! { |value| value * 2 } # #<struct Struct::One a=2, b=4, c=6>
|
1197
|
+
one # #<struct Struct::One a=2, b=4, c=6>
|
1198
|
+
|
1199
|
+
two = Struct.new("Two", :a, :b, :c).new 1, 2, 3
|
1200
|
+
two.revalue!(c: 2) { |previous, current| previous + current } # #<struct Struct::Two a=1, b=2, c=5>
|
1201
|
+
two # #<struct Struct::Two a=1, b=2, c=5>
|
1202
|
+
|
1203
|
+
three = Struct.new("Three", :a, :b, :c).new 1, 2, 3
|
1204
|
+
three.revalue! c: 2 # #<struct Struct::Three a=1, b=2, c=3>
|
1205
|
+
three.revalue! # #<struct Struct::Three a=1, b=2, c=3>
|
1206
|
+
three # #<struct Struct::Three a=1, b=2, c=3>
|
1207
|
+
----
|
1163
1208
|
|
1164
|
-
|
1165
|
-
example.revalue! { |value| value * 2 } # "#<struct a=2, b=4, c=6>"
|
1166
|
-
example # "#<struct a=2, b=4, c=6>"
|
1209
|
+
===== #transmute
|
1167
1210
|
|
1168
|
-
|
1169
|
-
|
1170
|
-
|
1211
|
+
Transmutes given enumerable by using the foreign key map and merging those key values into the
|
1212
|
+
current struct while not mutating itself. Works regardless of whether the struct is constructed with
|
1213
|
+
positional or keyword arguments.
|
1214
|
+
|
1215
|
+
[source,ruby]
|
1216
|
+
----
|
1217
|
+
a = Struct.new("A", :a, :b, :c).new 1, 2, 3
|
1218
|
+
b = Struct.new("B", :x, :y, :z).new 7, 8, 9
|
1219
|
+
c = {r: 10, s: 20, t: 30}
|
1220
|
+
|
1221
|
+
a.transmute b, a: :x, b: :y, c: :z # #<struct Struct::A a=7, b=8, c=9>
|
1222
|
+
a.transmute b, b: :y # #<struct Struct::A a=1, b=8, c=3>
|
1223
|
+
a.transmute c, c: :t # #<struct Struct::A a=1, b=2, c=30>
|
1224
|
+
a # #<struct Struct::A a=1, b=2, c=3>
|
1225
|
+
----
|
1226
|
+
|
1227
|
+
===== #transmute!
|
1228
|
+
|
1229
|
+
Transmutes given enumerable by using the foreign key map and merging those key values into the
|
1230
|
+
current struct while mutating itself. Works regardless of whether the struct is constructed with
|
1231
|
+
positional or keyword arguments.
|
1232
|
+
|
1233
|
+
[source,ruby]
|
1234
|
+
----
|
1235
|
+
a = Struct.new("A", :a, :b, :c).new 1, 2, 3
|
1236
|
+
b = Struct.new("B", :x, :y, :z).new 7, 8, 9
|
1237
|
+
c = {r: 10, s: 20, t: 30}
|
1171
1238
|
|
1172
|
-
|
1173
|
-
|
1174
|
-
|
1175
|
-
|
1239
|
+
a.transmute! b, a: :x, b: :y, c: :z # #<struct Struct::A a=7, b=8, c=9>
|
1240
|
+
a.transmute! b, b: :y # #<struct Struct::A a=1, b=8, c=3>
|
1241
|
+
a.transmute! c, c: :t # #<struct Struct::A a=1, b=2, c=30>
|
1242
|
+
a # #<struct Struct::A a=7, b=8, c=30>
|
1176
1243
|
----
|
1177
1244
|
|
1178
1245
|
==== Symbol
|
data/lib/refinements/arrays.rb
CHANGED
@@ -1,9 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "refinements/shared/enumerables/many"
|
4
|
+
|
3
5
|
module Refinements
|
4
6
|
# Provides additional enhancements to the Array primitive.
|
5
7
|
module Arrays
|
6
8
|
refine Array do
|
9
|
+
import_methods Shared::Enumerables::Many
|
10
|
+
|
7
11
|
def compress = dup.compress!
|
8
12
|
|
9
13
|
def compress!
|
data/lib/refinements/hashes.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "refinements/shared/enumerables/many"
|
4
|
+
|
3
5
|
module Refinements
|
4
6
|
# Provides additional enhancements to the Hash primitive.
|
5
7
|
module Hashes
|
@@ -12,6 +14,8 @@ module Refinements
|
|
12
14
|
end
|
13
15
|
|
14
16
|
refine Hash do
|
17
|
+
import_methods Shared::Enumerables::Many
|
18
|
+
|
15
19
|
def compress = dup.compress!
|
16
20
|
|
17
21
|
def compress!
|
data/lib/refinements/identity.rb
CHANGED
@@ -50,6 +50,10 @@ module Refinements
|
|
50
50
|
|
51
51
|
def delete = super && self
|
52
52
|
|
53
|
+
def delete_prefix(pattern) = parent.join %(#{name.sub(/\A#{pattern}/, "")}#{extname})
|
54
|
+
|
55
|
+
def delete_suffix(pattern) = parent.join %(#{name.sub(/#{pattern}\z/, "")}#{extname})
|
56
|
+
|
53
57
|
def directories pattern = "*", flag: File::FNM_SYSCASE
|
54
58
|
glob(pattern, flag).select(&:directory?).sort
|
55
59
|
end
|
@@ -74,7 +78,7 @@ module Refinements
|
|
74
78
|
self
|
75
79
|
end
|
76
80
|
|
77
|
-
def name = basename
|
81
|
+
def name = basename extname
|
78
82
|
|
79
83
|
def relative_parent(root_dir) = relative_path_from(root_dir).parent
|
80
84
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Refinements
|
4
|
+
module Shared
|
5
|
+
module Enumerables
|
6
|
+
# Provides shared functionality for knowing whether an enumerable has many elements or not.
|
7
|
+
module Many
|
8
|
+
def many?
|
9
|
+
return size > 1 unless block_given?
|
10
|
+
|
11
|
+
total = reduce(0) { |count, item| yield(item) ? count + 1 : count }
|
12
|
+
total > 1
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/refinements/strings.rb
CHANGED
@@ -64,11 +64,10 @@ module Refinements
|
|
64
64
|
|
65
65
|
private
|
66
66
|
|
67
|
-
# :reek:DuplicateMethodCall
|
68
67
|
# :reek:UtilityFunction
|
69
68
|
def combine parts, method, delimiter = ""
|
70
69
|
parts.reduce "" do |result, part|
|
71
|
-
next part.
|
70
|
+
next part.public_send method if result.empty?
|
72
71
|
|
73
72
|
"#{result}#{delimiter}#{part.__send__ method}"
|
74
73
|
end
|
data/lib/refinements/structs.rb
CHANGED
@@ -15,10 +15,10 @@ module Refinements
|
|
15
15
|
end
|
16
16
|
|
17
17
|
refine Struct do
|
18
|
-
def merge(
|
18
|
+
def merge(...) = dup.merge!(...)
|
19
19
|
|
20
20
|
def merge! object = nil
|
21
|
-
to_h.merge(**object.to_h).each { |key, value| self[key] = value }
|
21
|
+
to_h.merge!(**object.to_h).each { |key, value| self[key] = value }
|
22
22
|
self
|
23
23
|
end
|
24
24
|
|
@@ -34,6 +34,13 @@ module Refinements
|
|
34
34
|
attributes.each { |key, value| self[key] = yield self[key], value }
|
35
35
|
self
|
36
36
|
end
|
37
|
+
|
38
|
+
def transmute(...) = dup.transmute!(...)
|
39
|
+
|
40
|
+
def transmute! object, **key_map
|
41
|
+
mapping = key_map.invert
|
42
|
+
merge! object.to_h.slice(*mapping.keys).transform_keys!(mapping)
|
43
|
+
end
|
37
44
|
end
|
38
45
|
end
|
39
46
|
end
|
data.tar.gz.sig
CHANGED
Binary file
|
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: 9.0
|
4
|
+
version: 9.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brooke Kuhlmann
|
@@ -28,7 +28,7 @@ cert_chain:
|
|
28
28
|
lkHilIrX69jq8wMPpBhlaw2mRmeSL50Wv5u6xVBvOHhXFSP1crXM95vfLhLyRYod
|
29
29
|
W2A=
|
30
30
|
-----END CERTIFICATE-----
|
31
|
-
date: 2022-01-
|
31
|
+
date: 2022-01-17 00:00:00.000000000 Z
|
32
32
|
dependencies: []
|
33
33
|
description:
|
34
34
|
email:
|
@@ -49,6 +49,7 @@ files:
|
|
49
49
|
- lib/refinements/identity.rb
|
50
50
|
- lib/refinements/ios.rb
|
51
51
|
- lib/refinements/pathnames.rb
|
52
|
+
- lib/refinements/shared/enumerables/many.rb
|
52
53
|
- lib/refinements/string_ios.rb
|
53
54
|
- lib/refinements/strings.rb
|
54
55
|
- lib/refinements/structs.rb
|
@@ -77,7 +78,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
77
78
|
- !ruby/object:Gem::Version
|
78
79
|
version: '0'
|
79
80
|
requirements: []
|
80
|
-
rubygems_version: 3.3.
|
81
|
+
rubygems_version: 3.3.5
|
81
82
|
signing_key:
|
82
83
|
specification_version: 4
|
83
84
|
summary: A collection of refinements to core Ruby objects.
|
metadata.gz.sig
CHANGED
Binary file
|