refinements 9.0.0 → 9.2.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/README.adoc +158 -108
- data/lib/refinements/arrays.rb +4 -0
- data/lib/refinements/hashes.rb +4 -2
- data/lib/refinements/pathnames.rb +10 -2
- data/lib/refinements/shared/enumerables/many.rb +17 -0
- data/lib/refinements/strings.rb +1 -2
- data/lib/refinements/structs.rb +15 -5
- data/lib/refinements/symbols.rb +0 -2
- data/lib/refinements.rb +0 -1
- data/refinements.gemspec +30 -0
- data.tar.gz.sig +0 -0
- metadata +7 -5
- metadata.gz.sig +0 -0
- data/lib/refinements/identity.rb +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aac49ade733ea3bd5f36bd51d47c805c50dd6841ee7f8f24102336ff67bc8d08
|
4
|
+
data.tar.gz: 8d8f3d7edcc8289b90ba632f71970a64f22c41309c14eb68f555312d5516d320
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 82dcc0b789e630281874f9d73e891927231066caa2c0255e3f3d63242edae1e32cc0eca709e76b6f82a85c13be92852e9e59e6a2b47b4802f6913235e38c6a0a
|
7
|
+
data.tar.gz: d17b6d4ee10c5568f52b6eee57e97538b1af910ff7241fc8faca30079dd82168da472dbe6c6d1d6f9f015f1887a53e85ced855173c293bcb6f9efb56cfc454f4
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/README.adoc
CHANGED
@@ -11,12 +11,11 @@ image::https://img.shields.io/badge/code_style-alchemists-brightgreen.svg[Alchem
|
|
11
11
|
[link=https://circleci.com/gh/bkuhlmann/refinements]
|
12
12
|
image::https://circleci.com/gh/bkuhlmann/refinements.svg?style=svg[Circle CI Status]
|
13
13
|
|
14
|
-
Refinements are a collection
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
had!
|
14
|
+
Refinements are a collection primitive Ruby objects enhancements without needing to resort to hard
|
15
|
+
to debug link:https://www.alchemists.io/articles/ruby_antipatterns/#_monkey_patches[monkey patches].
|
16
|
+
These refinements give you additional syntactic sugar to develop clean and concise implementations
|
17
|
+
while using less code. By refining our code we can acquire the functionality we wish the core
|
18
|
+
primitives had!
|
20
19
|
|
21
20
|
toc::[]
|
22
21
|
|
@@ -148,7 +147,7 @@ Removes given array or elements without mutating itself.
|
|
148
147
|
|
149
148
|
===== #filter_find
|
150
149
|
|
151
|
-
Answers the first
|
150
|
+
Answers the first element which evaluates to true from a filtered collection.
|
152
151
|
|
153
152
|
[source,ruby]
|
154
153
|
----
|
@@ -184,6 +183,19 @@ Inserts additional elements or array between all members of given array.
|
|
184
183
|
[1, 2, 3].intersperse %i[a b c] # [1, :a, :b, :c, 2, :a, :b, :c, 3]
|
185
184
|
----
|
186
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
|
+
|
187
199
|
===== #maximum
|
188
200
|
|
189
201
|
Answers the maximum extracted value from a collection of objects.
|
@@ -349,7 +361,7 @@ example # {a: "A", b: {one: 1, two: "Two"}}
|
|
349
361
|
|
350
362
|
===== #deep_stringify_keys
|
351
363
|
|
352
|
-
|
364
|
+
Answers string keys of a nested hash without mutating itself. Does not handle nested arrays, though.
|
353
365
|
|
354
366
|
[source,ruby]
|
355
367
|
----
|
@@ -360,7 +372,7 @@ example # {a: {b: 2}}
|
|
360
372
|
|
361
373
|
===== #deep_stringify_keys!
|
362
374
|
|
363
|
-
|
375
|
+
Answers string keys of nested hash while mutating itself. Does not handle nested arrays, though.
|
364
376
|
|
365
377
|
[source,ruby]
|
366
378
|
----
|
@@ -437,6 +449,19 @@ example.flatten_keys! # {a_b: 1}
|
|
437
449
|
example # {a_b: 1}
|
438
450
|
----
|
439
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
|
+
|
440
465
|
===== #recurse
|
441
466
|
|
442
467
|
Recursively iterates over the hash and any hash value by applying the given block to it. Does not
|
@@ -695,6 +720,28 @@ Pathname("/example.txt").touch.delete # Pathname("/example")
|
|
695
720
|
Pathname("/example.txt").delete # Errno::ENOENT
|
696
721
|
----
|
697
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
|
+
|
698
745
|
===== #directories
|
699
746
|
|
700
747
|
Answers all directories or filtered directories for current path.
|
@@ -827,14 +874,14 @@ parent_path = Pathname "/one"
|
|
827
874
|
child_path = parent_path.join "two"
|
828
875
|
|
829
876
|
child_path.make_path
|
830
|
-
|
877
|
+
parent_path.remove_tree # Pathname "/one"
|
831
878
|
child_path.exist? # false
|
832
|
-
|
879
|
+
parent_path.exist? # false
|
833
880
|
|
834
881
|
child_path.make_path
|
835
|
-
|
882
|
+
child_path.remove_tree # Pathname "/one/two"
|
836
883
|
child_path.exist? # false
|
837
|
-
parent_path.exist? #
|
884
|
+
parent_path.exist? # true
|
838
885
|
----
|
839
886
|
|
840
887
|
===== #rewrite
|
@@ -886,7 +933,7 @@ Answers `true`/`false` based on whether string is blank, `<space>`, `\n`, `\t`,
|
|
886
933
|
|
887
934
|
===== #camelcase
|
888
935
|
|
889
|
-
Answers a
|
936
|
+
Answers a camel cased string.
|
890
937
|
|
891
938
|
[source,ruby]
|
892
939
|
----
|
@@ -895,7 +942,7 @@ Answers a camelcased string.
|
|
895
942
|
|
896
943
|
===== #down
|
897
944
|
|
898
|
-
Answers string with only first letter
|
945
|
+
Answers string with only first letter down cased.
|
899
946
|
|
900
947
|
[source,ruby]
|
901
948
|
----
|
@@ -977,7 +1024,7 @@ well in other languages.
|
|
977
1024
|
|
978
1025
|
===== #snakecase
|
979
1026
|
|
980
|
-
Answers a
|
1027
|
+
Answers a snake cased string.
|
981
1028
|
|
982
1029
|
[source,ruby]
|
983
1030
|
----
|
@@ -986,7 +1033,7 @@ Answers a snakecased string.
|
|
986
1033
|
|
987
1034
|
===== #titleize
|
988
1035
|
|
989
|
-
Answers
|
1036
|
+
Answers a title string with proper capitalization of each word.
|
990
1037
|
|
991
1038
|
[source,ruby]
|
992
1039
|
----
|
@@ -1008,7 +1055,7 @@ Answers string as a boolean.
|
|
1008
1055
|
|
1009
1056
|
===== #up
|
1010
1057
|
|
1011
|
-
Answers string with only first letter
|
1058
|
+
Answers string with only first letter capitalized.
|
1012
1059
|
|
1013
1060
|
[source,ruby]
|
1014
1061
|
----
|
@@ -1038,6 +1085,8 @@ buffer # "This is a test."
|
|
1038
1085
|
|
1039
1086
|
===== .keyworded?
|
1040
1087
|
|
1088
|
+
⚠️ Will be removed in the next major version. Use `.keyword_init?` instead.
|
1089
|
+
|
1041
1090
|
Answers whether a struct was constructed with keyword or positional arguments.
|
1042
1091
|
|
1043
1092
|
[source,ruby]
|
@@ -1054,14 +1103,14 @@ whether the struct was constructed with positional or keyword arguments.
|
|
1054
1103
|
[source,ruby]
|
1055
1104
|
----
|
1056
1105
|
Example = Struct.new :a, :b, :c
|
1057
|
-
Example.with_keywords a: 1, b: 2, c: 3 #
|
1058
|
-
Example.with_keywords a: 1 #
|
1059
|
-
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>
|
1060
1109
|
|
1061
1110
|
Example = Struct.new :a, :b, :c, keyword_init: true
|
1062
|
-
Example.with_keywords a: 1, b: 2, c: 3 #
|
1063
|
-
Example.with_keywords a: 1 #
|
1064
|
-
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>
|
1065
1114
|
----
|
1066
1115
|
|
1067
1116
|
===== .with_positions
|
@@ -1072,106 +1121,125 @@ whether the struct was constructed with positional or keyword arguments.
|
|
1072
1121
|
[source,ruby]
|
1073
1122
|
----
|
1074
1123
|
Example = Struct.new :a, :b, :c
|
1075
|
-
Example.with_positions 1, 2, 3 #
|
1076
|
-
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>
|
1077
1126
|
|
1078
1127
|
Example = Struct.new :a, :b, :c, keyword_init: true
|
1079
|
-
Example.with_positions 1, 2, 3 #
|
1080
|
-
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>
|
1081
1130
|
----
|
1082
1131
|
|
1083
1132
|
===== #merge
|
1084
1133
|
|
1085
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.
|
1086
1136
|
|
1087
1137
|
[source,ruby]
|
1088
1138
|
----
|
1139
|
+
example = Struct.new("Example", :a, :b, :c).new 1, 2, 3
|
1089
1140
|
other = Struct.new("Other", :a, :b, :c).new 7, 8, 9
|
1090
1141
|
|
1091
|
-
example
|
1092
|
-
example.merge a: 10
|
1093
|
-
example.merge a: 10, c: 30
|
1094
|
-
example.merge
|
1095
|
-
example
|
1096
|
-
example.merge other # "#<struct a=7, b=8, c=9>"
|
1097
|
-
example # "#<struct a=1, b=2, c=3>"
|
1098
|
-
|
1099
|
-
example = Struct.new(:a, :b, :c, keyword_init: true).new a: 1, b: 2, c: 3
|
1100
|
-
example.merge a: 10 # "#<struct a=10, b=2, c=3>"
|
1101
|
-
example.merge a: 10, c: 30 # "#<struct a=10, b=2, c=30>"
|
1102
|
-
example.merge {a: 10, b: 20} # "#<struct a=10, b=20, c=3>"
|
1103
|
-
example.merge other # "#<struct a=7, b=8, c=9>"
|
1104
|
-
example.merge a: 10, b: 20, c: 30 # "#<struct a=10, b=20, c=30>"
|
1105
|
-
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>
|
1106
1147
|
----
|
1107
1148
|
|
1108
1149
|
===== #merge!
|
1109
1150
|
|
1110
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.
|
1111
1153
|
|
1112
1154
|
[source,ruby]
|
1113
1155
|
----
|
1156
|
+
example = Struct.new("Example", :a, :b, :c).new 1, 2, 3
|
1114
1157
|
other = Struct.new("Other", :a, :b, :c).new 7, 8, 9
|
1115
1158
|
|
1116
|
-
example
|
1117
|
-
example.merge! a: 10
|
1118
|
-
example.merge!
|
1119
|
-
example.merge!
|
1120
|
-
example
|
1121
|
-
example.merge! a: 10, b: 20, c: 30 # "#<struct a=10, b=20, c=30>"
|
1122
|
-
example # "#<struct a=10, b=20, c=30>"
|
1123
|
-
|
1124
|
-
example = Struct.new(:a, :b, :c, keyword_init: true).new a: 1, b: 2, c: 3
|
1125
|
-
example.merge! a: 10 # "#<struct a=10, b=2, c=3>"
|
1126
|
-
example.merge! a: 10, c: 30 # "#<struct a=10, b=2, c=30>"
|
1127
|
-
example.merge! {a: 10, b: 20} # "#<struct a=10, b=20, c=3>"
|
1128
|
-
example.merge! other # "#<struct a=7, b=8, c=9>"
|
1129
|
-
example.merge! a: 10, b: 20, c: 30 # "#<struct a=10, b=20, c=30>"
|
1130
|
-
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>
|
1131
1164
|
----
|
1132
1165
|
|
1133
1166
|
===== #revalue
|
1134
1167
|
|
1135
|
-
Transforms values without mutating itself. An optional hash can be supplied to
|
1136
|
-
|
1137
|
-
|
1138
|
-
|
1139
|
-
|
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.
|
1140
1173
|
|
1141
1174
|
[source,ruby]
|
1142
1175
|
----
|
1143
1176
|
example = Struct.new("Example", :a, :b, :c).new 1, 2, 3
|
1144
|
-
|
1145
|
-
example.revalue
|
1146
|
-
example.revalue
|
1147
|
-
example.revalue
|
1148
|
-
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>
|
1149
1183
|
----
|
1150
1184
|
|
1151
1185
|
===== #revalue!
|
1152
1186
|
|
1153
|
-
Transforms values while mutating itself. An optional hash can be supplied to
|
1154
|
-
|
1155
|
-
|
1156
|
-
|
1157
|
-
|
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.
|
1158
1192
|
|
1159
1193
|
[source,ruby]
|
1160
1194
|
----
|
1161
|
-
|
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
|
+
----
|
1208
|
+
|
1209
|
+
===== #transmute
|
1210
|
+
|
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
|
+
----
|
1162
1226
|
|
1163
|
-
|
1164
|
-
example.revalue! { |value| value * 2 } # "#<struct a=2, b=4, c=6>"
|
1165
|
-
example # "#<struct a=2, b=4, c=6>"
|
1227
|
+
===== #transmute!
|
1166
1228
|
|
1167
|
-
|
1168
|
-
|
1169
|
-
|
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}
|
1170
1238
|
|
1171
|
-
|
1172
|
-
|
1173
|
-
|
1174
|
-
|
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>
|
1175
1243
|
----
|
1176
1244
|
|
1177
1245
|
==== Symbol
|
@@ -1219,35 +1287,17 @@ To test, run:
|
|
1219
1287
|
bundle exec rake
|
1220
1288
|
----
|
1221
1289
|
|
1222
|
-
==
|
1223
|
-
|
1224
|
-
Read link:https://semver.org[Semantic Versioning] for details. Briefly, it means:
|
1225
|
-
|
1226
|
-
* Major (X.y.z) - Incremented for any backwards incompatible public API changes.
|
1227
|
-
* Minor (x.Y.z) - Incremented for new, backwards compatible, public API enhancements/fixes.
|
1228
|
-
* Patch (x.y.Z) - Incremented for small, backwards compatible, bug fixes.
|
1229
|
-
|
1230
|
-
== Code of Conduct
|
1231
|
-
|
1232
|
-
Please note that this project is released with a link:CODE_OF_CONDUCT.adoc[CODE OF CONDUCT]. By
|
1233
|
-
participating in this project you agree to abide by its terms.
|
1234
|
-
|
1235
|
-
== Contributions
|
1236
|
-
|
1237
|
-
Read link:CONTRIBUTING.adoc[CONTRIBUTING] for details.
|
1238
|
-
|
1239
|
-
== Community
|
1290
|
+
== link:https://www.alchemists.io/policies/license[License]
|
1240
1291
|
|
1241
|
-
|
1242
|
-
to this project and much more.
|
1292
|
+
== link:https://www.alchemists.io/policies/security[Security]
|
1243
1293
|
|
1244
|
-
==
|
1294
|
+
== link:https://www.alchemists.io/policies/code_of_conduct[Code of Conduct]
|
1245
1295
|
|
1246
|
-
|
1296
|
+
== link:https://www.alchemists.io/policies/contributions[Contributions]
|
1247
1297
|
|
1248
|
-
==
|
1298
|
+
== link:https://www.alchemists.io/projects/refinements/versions[Versions]
|
1249
1299
|
|
1250
|
-
|
1300
|
+
== link:https://www.alchemists.io/community[Community]
|
1251
1301
|
|
1252
1302
|
== Credits
|
1253
1303
|
|
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!
|
@@ -42,11 +46,9 @@ module Refinements
|
|
42
46
|
|
43
47
|
def deep_symbolize_keys! = replace(deep_symbolize_keys)
|
44
48
|
|
45
|
-
# rubocop:disable Style/MethodDefParentheses
|
46
49
|
def fetch_value(key, *default_value, &)
|
47
50
|
fetch(key, *default_value, &) || default_value.first
|
48
51
|
end
|
49
|
-
# rubocop:enable Style/MethodDefParentheses
|
50
52
|
|
51
53
|
# :reek:TooManyStatements
|
52
54
|
def flatten_keys prefix: nil, delimiter: "_", cast: :to_sym
|
@@ -17,7 +17,11 @@ module Refinements
|
|
17
17
|
def home = new(ENV["HOME"])
|
18
18
|
|
19
19
|
def make_temp_dir prefix: "temp-", suffix: nil, root: nil
|
20
|
-
|
20
|
+
if block_given?
|
21
|
+
Dir.mktmpdir([prefix, suffix], root) { |path| yield new(path) }
|
22
|
+
else
|
23
|
+
new Dir.mktmpdir([prefix, suffix], root)
|
24
|
+
end
|
21
25
|
end
|
22
26
|
|
23
27
|
def require_tree root, pattern = "**/*.rb"
|
@@ -46,6 +50,10 @@ module Refinements
|
|
46
50
|
|
47
51
|
def delete = super && self
|
48
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
|
+
|
49
57
|
def directories pattern = "*", flag: File::FNM_SYSCASE
|
50
58
|
glob(pattern, flag).select(&:directory?).sort
|
51
59
|
end
|
@@ -70,7 +78,7 @@ module Refinements
|
|
70
78
|
self
|
71
79
|
end
|
72
80
|
|
73
|
-
def name = basename
|
81
|
+
def name = basename extname
|
74
82
|
|
75
83
|
def relative_parent(root_dir) = relative_path_from(root_dir).parent
|
76
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
@@ -4,18 +4,21 @@ module Refinements
|
|
4
4
|
# Provides additional enhancements to the Struct primitive.
|
5
5
|
module Structs
|
6
6
|
refine Struct.singleton_class do
|
7
|
-
def keyworded?
|
7
|
+
def keyworded?
|
8
|
+
warn "[DEPRECATION]: .keyworded? is deprecated, use .keyword_init? instead."
|
9
|
+
inspect.include? "keyword_init: true"
|
10
|
+
end
|
8
11
|
|
9
|
-
def with_keywords(**arguments) =
|
12
|
+
def with_keywords(**arguments) = keyword_init? ? new(**arguments) : new.merge!(**arguments)
|
10
13
|
|
11
|
-
def with_positions(*values) =
|
14
|
+
def with_positions(*values) = keyword_init? ? new(**members.zip(values).to_h) : new(*values)
|
12
15
|
end
|
13
16
|
|
14
17
|
refine Struct do
|
15
|
-
def merge(
|
18
|
+
def merge(...) = dup.merge!(...)
|
16
19
|
|
17
20
|
def merge! object = nil
|
18
|
-
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 }
|
19
22
|
self
|
20
23
|
end
|
21
24
|
|
@@ -31,6 +34,13 @@ module Refinements
|
|
31
34
|
attributes.each { |key, value| self[key] = yield self[key], value }
|
32
35
|
self
|
33
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
|
34
44
|
end
|
35
45
|
end
|
36
46
|
end
|
data/lib/refinements/symbols.rb
CHANGED
@@ -4,11 +4,9 @@ module Refinements
|
|
4
4
|
# Provides additional enhancements to the Symbol primitive.
|
5
5
|
module Symbols
|
6
6
|
refine Symbol do
|
7
|
-
# rubocop:disable Style/MethodDefParentheses
|
8
7
|
def call(*arguments, &)
|
9
8
|
proc { |receiver| receiver.public_send self, *arguments, & }
|
10
9
|
end
|
11
|
-
# rubocop:enable Style/MethodDefParentheses
|
12
10
|
end
|
13
11
|
end
|
14
12
|
end
|
data/lib/refinements.rb
CHANGED
data/refinements.gemspec
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Gem::Specification.new do |spec|
|
4
|
+
spec.name = "refinements"
|
5
|
+
spec.version = "9.2.0"
|
6
|
+
spec.platform = Gem::Platform::RUBY
|
7
|
+
spec.authors = ["Brooke Kuhlmann"]
|
8
|
+
spec.email = ["brooke@alchemists.io"]
|
9
|
+
spec.homepage = "https://www.alchemists.io/projects/refinements"
|
10
|
+
spec.summary = "A collection of refinements to core Ruby objects."
|
11
|
+
spec.license = "Hippocratic-3.0"
|
12
|
+
|
13
|
+
spec.metadata = {
|
14
|
+
"bug_tracker_uri" => "https://github.com/bkuhlmann/refinements/issues",
|
15
|
+
"changelog_uri" => "https://www.alchemists.io/projects/refinements/versions",
|
16
|
+
"documentation_uri" => "https://www.alchemists.io/projects/refinements",
|
17
|
+
"label" => "Refinements",
|
18
|
+
"rubygems_mfa_required" => "true",
|
19
|
+
"source_code_uri" => "https://github.com/bkuhlmann/refinements"
|
20
|
+
}
|
21
|
+
|
22
|
+
spec.signing_key = Gem.default_key_path
|
23
|
+
spec.cert_chain = [Gem.default_cert_path]
|
24
|
+
|
25
|
+
spec.required_ruby_version = "~> 3.1"
|
26
|
+
|
27
|
+
spec.files = Dir["*.gemspec", "lib/**/*"]
|
28
|
+
spec.extra_rdoc_files = Dir["README*", "LICENSE*"]
|
29
|
+
spec.require_paths = ["lib"]
|
30
|
+
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.
|
4
|
+
version: 9.2.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:
|
31
|
+
date: 2022-01-23 00:00:00.000000000 Z
|
32
32
|
dependencies: []
|
33
33
|
description:
|
34
34
|
email:
|
@@ -46,20 +46,22 @@ files:
|
|
46
46
|
- lib/refinements/big_decimals.rb
|
47
47
|
- lib/refinements/date_times.rb
|
48
48
|
- lib/refinements/hashes.rb
|
49
|
-
- lib/refinements/identity.rb
|
50
49
|
- lib/refinements/ios.rb
|
51
50
|
- lib/refinements/pathnames.rb
|
51
|
+
- lib/refinements/shared/enumerables/many.rb
|
52
52
|
- lib/refinements/string_ios.rb
|
53
53
|
- lib/refinements/strings.rb
|
54
54
|
- lib/refinements/structs.rb
|
55
55
|
- lib/refinements/symbols.rb
|
56
|
+
- refinements.gemspec
|
56
57
|
homepage: https://www.alchemists.io/projects/refinements
|
57
58
|
licenses:
|
58
59
|
- Hippocratic-3.0
|
59
60
|
metadata:
|
60
61
|
bug_tracker_uri: https://github.com/bkuhlmann/refinements/issues
|
61
|
-
changelog_uri: https://www.alchemists.io/projects/refinements/
|
62
|
+
changelog_uri: https://www.alchemists.io/projects/refinements/versions
|
62
63
|
documentation_uri: https://www.alchemists.io/projects/refinements
|
64
|
+
label: Refinements
|
63
65
|
rubygems_mfa_required: 'true'
|
64
66
|
source_code_uri: https://github.com/bkuhlmann/refinements
|
65
67
|
post_install_message:
|
@@ -77,7 +79,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
77
79
|
- !ruby/object:Gem::Version
|
78
80
|
version: '0'
|
79
81
|
requirements: []
|
80
|
-
rubygems_version: 3.3.
|
82
|
+
rubygems_version: 3.3.5
|
81
83
|
signing_key:
|
82
84
|
specification_version: 4
|
83
85
|
summary: A collection of refinements to core Ruby objects.
|
metadata.gz.sig
CHANGED
Binary file
|
data/lib/refinements/identity.rb
DELETED