refinements 8.2.1 → 8.5.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 +1 -2
- data/README.adoc +169 -10
- data/lib/refinements/arrays.rb +6 -2
- data/lib/refinements/big_decimals.rb +1 -0
- data/lib/refinements/classes.rb +13 -0
- data/lib/refinements/date_times.rb +1 -0
- data/lib/refinements/hashes.rb +17 -4
- data/lib/refinements/identity.rb +2 -2
- data/lib/refinements/ios.rb +1 -0
- data/lib/refinements/pathnames.rb +8 -2
- data/lib/refinements/string_ios.rb +1 -0
- data/lib/refinements/strings.rb +7 -2
- data/lib/refinements/structs.rb +1 -0
- data/lib/refinements/symbols.rb +12 -0
- data/lib/refinements.rb +2 -0
- data.tar.gz.sig +0 -0
- metadata +5 -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: 91c5c0e066eac0f4f01a1b28a73f8aa122cb51725ff510fe69466db4f2cd4dac
|
4
|
+
data.tar.gz: fc7b29eb6507fe08f2ebedd9a0b596c2bf70b7b9cd48a3b9de12cdae82613928
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b9268d53d65140f5456f6c26521e7f55254480b58cfb30a73d9106aecb7a30977a02d03e8e37d6563904419a1a26d7dfec68f0f64a25f82baf294e817c01ac48
|
7
|
+
data.tar.gz: b564b642883464ed667be47ecef73be99ef48665d1f2be8f34ae5ec48b852c6b9a07ee3c4b0c542154a538f54ceaed4e1eca9d528841150469d2c8a5957b6c3e
|
checksums.yaml.gz.sig
CHANGED
@@ -1,2 +1 @@
|
|
1
|
-
|
2
|
-
m��
|
1
|
+
`O+�b}�_2^����'�}��q8Y���E:[(�^UMO�*@�z՚�߈ϡ �>�=�cc��A�t7�Y����R� �*�5��)yr�R���.���o(ꕚѝY���8�O�<h&��fyNT+f�~_C�lX��x�9K���V<|�@'�NC�W���|�v,����&� X-d���,Tf�Q�FD5�r�
|
data/README.adoc
CHANGED
@@ -11,7 +11,9 @@ 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
|
-
|
14
|
+
Refinements is a collection of enhancements to primitive Ruby objects without needing to resort
|
15
|
+
painful and hard to debug monkey patches. These refinements give you additional syntactic sugar to
|
16
|
+
build clean and concise implementations all while using less code.
|
15
17
|
|
16
18
|
toc::[]
|
17
19
|
|
@@ -105,13 +107,14 @@ The following sections demonstrate how each refinement enriches your objects wit
|
|
105
107
|
|
106
108
|
===== #compress
|
107
109
|
|
108
|
-
Removes `nil` and empty
|
110
|
+
Removes `nil` and empty objects without mutating itself.
|
109
111
|
|
110
112
|
[source,ruby]
|
111
113
|
----
|
112
|
-
|
113
|
-
example
|
114
|
-
example
|
114
|
+
object = Object.new
|
115
|
+
example = [1, "blueberry", nil, "", [], {}, object]
|
116
|
+
example.compress # => [1, "blueberry", object]
|
117
|
+
example # => [1, "blueberry", nil, "", [], {}, object]
|
115
118
|
----
|
116
119
|
|
117
120
|
===== #compress!
|
@@ -120,9 +123,10 @@ Removes `nil` and empty values while mutating itself.
|
|
120
123
|
|
121
124
|
[source,ruby]
|
122
125
|
----
|
123
|
-
|
124
|
-
example
|
125
|
-
example
|
126
|
+
object = Object.new
|
127
|
+
example = [1, "blueberry", nil, "", [], {}, object]
|
128
|
+
example.compress # => [1, "blueberry", object]
|
129
|
+
example # => [1, "blueberry", object]
|
126
130
|
----
|
127
131
|
|
128
132
|
===== #excluding
|
@@ -249,6 +253,22 @@ Allows one to inspect a big decimal with numeric representation.
|
|
249
253
|
BigDecimal.new("5.0E-10").inspect # => "#<BigDecimal:3fd3d458fe84 0.0000000005>"
|
250
254
|
----
|
251
255
|
|
256
|
+
==== Class
|
257
|
+
|
258
|
+
===== #descendants
|
259
|
+
|
260
|
+
Answers descendants of a class.
|
261
|
+
|
262
|
+
[source,ruby]
|
263
|
+
----
|
264
|
+
a = Class.new
|
265
|
+
b = Class.new a
|
266
|
+
c = Class.new a
|
267
|
+
|
268
|
+
a.descendants # => [b, c]
|
269
|
+
Class.new.descendants # => []
|
270
|
+
----
|
271
|
+
|
252
272
|
==== DateTime
|
253
273
|
|
254
274
|
===== .utc
|
@@ -286,6 +306,30 @@ example = Hash.with_default []
|
|
286
306
|
example[:b] # => []
|
287
307
|
----
|
288
308
|
|
309
|
+
===== #compress
|
310
|
+
|
311
|
+
Removes `nil` and empty objects without mutating itself.
|
312
|
+
|
313
|
+
[source,ruby]
|
314
|
+
----
|
315
|
+
object = Object.new
|
316
|
+
example = {a: 1, b: "blueberry", c: nil, d: "", e: [], f: {}, g: object}
|
317
|
+
example.compress # => {a: 1, b: "blueberry", g: object}
|
318
|
+
example # => {a: 1, b: "blueberry", c: nil, d: "", e: [], f: {}, g: object}
|
319
|
+
----
|
320
|
+
|
321
|
+
===== #compress!
|
322
|
+
|
323
|
+
Removes `nil` and empty objects while mutating itself.
|
324
|
+
|
325
|
+
[source,ruby]
|
326
|
+
----
|
327
|
+
object = Object.new
|
328
|
+
example = {a: 1, b: "blueberry", c: nil, d: "", e: [], f: {}, g: object}
|
329
|
+
example.compress! # => {a: 1, b: "blueberry", g: object}
|
330
|
+
example # => {a: 1, b: "blueberry", g: object}
|
331
|
+
----
|
332
|
+
|
289
333
|
===== #deep_merge
|
290
334
|
|
291
335
|
Merges deeply nested hashes together without mutating itself.
|
@@ -352,6 +396,22 @@ example.deep_symbolize_keys! # => {a: {b: 1}}
|
|
352
396
|
example # => {a: {b: 1}}
|
353
397
|
----
|
354
398
|
|
399
|
+
===== #fetch_value
|
400
|
+
|
401
|
+
Fetches value for exiting or missing key. Behavior is identical to `#fetch` except when the value of
|
402
|
+
the key is `nil` you'll get the default value instead. This eliminates the need for using an _or_
|
403
|
+
expression `example.fetch(:desired_key) || "default_value"`.
|
404
|
+
|
405
|
+
[source,ruby]
|
406
|
+
----
|
407
|
+
{a: "test"}.fetch_value :a, "default" # => "test"
|
408
|
+
{a: "test"}.fetch_value :a # => "test"
|
409
|
+
{a: nil}.fetch_value :a, "default" # => "default"
|
410
|
+
{}.fetch_value(:a) { "default" } # => "default"
|
411
|
+
{}.fetch_value :a # => KeyError
|
412
|
+
{a: "test"}.fetch_value # => ArgumentError
|
413
|
+
----
|
414
|
+
|
355
415
|
===== #flatten_keys
|
356
416
|
|
357
417
|
Flattens nested keys as top-level keys without mutating itself. Does not handle nested arrays,
|
@@ -535,7 +595,7 @@ Wraps `Dir.mktmpdir` with the following behavior (see
|
|
535
595
|
link:https://rubyapi.org/o/Dir.mktmpdir#method-c-mktmpdir[Dir.mktmpdir] for details):
|
536
596
|
|
537
597
|
* *Without Block* - Answers a newly created Pathname instance which is not automatically cleaned up.
|
538
|
-
* *With Block* Yields a Pathname instance, answers result of given block, and
|
598
|
+
* *With Block* Yields a Pathname instance, answers result of given block, and automatically cleans
|
539
599
|
up temporary directory after block exits.
|
540
600
|
|
541
601
|
The following examples use truncated temporary directories for illustration purposes only. In
|
@@ -614,6 +674,30 @@ Copies file from current location to new location while answering itself so it c
|
|
614
674
|
Pathname("input.txt").copy Pathname("output.txt") # => Pathname("input.txt")
|
615
675
|
----
|
616
676
|
|
677
|
+
===== #deep_touch
|
678
|
+
|
679
|
+
Has all of the same functionality as the `#touch` method while being able to create ancestor
|
680
|
+
directories no matter how deeply nested the file might be.
|
681
|
+
|
682
|
+
[source,ruby]
|
683
|
+
----
|
684
|
+
Pathname("a/b/c/d.txt").touch # => Pathname("a/b/c/d.txt")
|
685
|
+
Pathname("a/b/c/d.txt").touch Time.now - 1 # => Pathname("a/b/c/d.txt")
|
686
|
+
----
|
687
|
+
|
688
|
+
===== #delete
|
689
|
+
|
690
|
+
Deletes file or directory and answers itself so it can be chained.
|
691
|
+
|
692
|
+
[source,ruby]
|
693
|
+
----
|
694
|
+
# When path exists.
|
695
|
+
Pathname("/example.txt").touch.delete # => Pathname("/example")
|
696
|
+
|
697
|
+
# When path doesn't exist.
|
698
|
+
Pathname("/example.txt").delete # => Errno::ENOENT
|
699
|
+
----
|
700
|
+
|
617
701
|
===== #directories
|
618
702
|
|
619
703
|
Answers all directories or filtered directories for current path.
|
@@ -625,6 +709,20 @@ Pathname("/example").directories "a*" # => [Pathname("a")]
|
|
625
709
|
Pathname("/example").directories flag: File::FNM_DOTMATCH # => [Pathname(".."), Pathname(".")]
|
626
710
|
----
|
627
711
|
|
712
|
+
===== #empty
|
713
|
+
|
714
|
+
Empties a directory of children (i.e. folders, nested folders, or files) or clears an existing file
|
715
|
+
of contents. If a directory or file doesn't exist, it will be created.
|
716
|
+
|
717
|
+
[source,ruby]
|
718
|
+
----
|
719
|
+
directory = Pathname("test").make_path
|
720
|
+
file = directory.join("test.txt").write("example")
|
721
|
+
|
722
|
+
file.empty.read # => ""
|
723
|
+
directory.empty.children # => []
|
724
|
+
----
|
725
|
+
|
628
726
|
===== #extensions
|
629
727
|
|
630
728
|
Answers file extensions as an array.
|
@@ -755,10 +853,13 @@ Pathname("/test.txt").rewrite { |body| body.sub "[token]", "example" } # => Pat
|
|
755
853
|
|
756
854
|
===== #touch
|
757
855
|
|
758
|
-
Updates access and modification times for path
|
856
|
+
Updates access and modification times for an existing path by defaulting to current time. When path
|
857
|
+
doesn't exist, it will be created as a file.
|
759
858
|
|
760
859
|
[source,ruby]
|
761
860
|
----
|
861
|
+
Pathname("example").touch # => Pathname("example")
|
862
|
+
Pathname("example").touch Time.now - 1 # => Pathname("example")
|
762
863
|
Pathname("example.txt").touch # => Pathname("example.txt")
|
763
864
|
Pathname("example.txt").touch Time.now - 1 # => Pathname("example.txt")
|
764
865
|
----
|
@@ -837,6 +938,46 @@ Answers last character of a string or last set of characters if given a number.
|
|
837
938
|
"instant".last 3 # => "ant"
|
838
939
|
----
|
839
940
|
|
941
|
+
===== #pluralize
|
942
|
+
|
943
|
+
Answers plural form of self when given a suffix to add. The plural form of the word can be
|
944
|
+
dynamically calculated when given a count and a replacement pattern (i.e. string or regular
|
945
|
+
expression) can be supplied for further specificity. Usage is based on
|
946
|
+
link:https://en.wikipedia.org/wiki/English_plurals[plurals in English] which may or may not work
|
947
|
+
well in other languages.
|
948
|
+
|
949
|
+
[source,ruby]
|
950
|
+
----
|
951
|
+
"apple".pluralize "s" # => apples
|
952
|
+
"apple".pluralize "s", count: 0 # => apples
|
953
|
+
"apple".pluralize "s", count: 1 # => apple
|
954
|
+
"apple".pluralize "s", count: -1 # => apple
|
955
|
+
"apple".pluralize "s", count: 2 # => apples
|
956
|
+
"apple".pluralize "s", count: -2 # => apples
|
957
|
+
"cactus".pluralize "i", replace: "us" # => cacti
|
958
|
+
"cul-de-sac".pluralize "ls", replace: "l" # => culs-de-sac
|
959
|
+
----
|
960
|
+
|
961
|
+
===== #singularize
|
962
|
+
|
963
|
+
Answers singular form of self when given a suffix to remove (can be a string or a regular
|
964
|
+
expression). The singular form of the word can be dynamically calculated when given a count and a
|
965
|
+
replacement string can be supplied for further specificity. Usage is based on
|
966
|
+
link:https://en.wikipedia.org/wiki/English_plurals[plurals in English] which may or may not work
|
967
|
+
well in other languages.
|
968
|
+
|
969
|
+
[source,ruby]
|
970
|
+
----
|
971
|
+
"apples".singularize "s" # => apple
|
972
|
+
"apples".singularize "s", count: 0 # => apples
|
973
|
+
"apples".singularize "s", count: 1 # => apple
|
974
|
+
"apples".singularize "s", count: -1 # => apple
|
975
|
+
"apples".singularize "s", count: 2 # => apples
|
976
|
+
"apples".singularize "s", count: -2 # => apples
|
977
|
+
"cacti".singularize "i", replace: "us" # => cactus
|
978
|
+
"culs-de-sac".singularize "ls", replace: "l" # => cul-de-sac
|
979
|
+
----
|
980
|
+
|
840
981
|
===== #snakecase
|
841
982
|
|
842
983
|
Answers a snakecased string.
|
@@ -1031,6 +1172,24 @@ example.revalue! # => #<struct
|
|
1031
1172
|
example # => #<struct a=1, b=2, c=3>
|
1032
1173
|
----
|
1033
1174
|
|
1175
|
+
==== Symbol
|
1176
|
+
|
1177
|
+
===== #call
|
1178
|
+
|
1179
|
+
Enhances symbol-to-proc by allowing you to send additional arguments and/or a block. This only works
|
1180
|
+
with public methods in order to not break encapsulation.
|
1181
|
+
|
1182
|
+
[source,ruby]
|
1183
|
+
----
|
1184
|
+
%w[clue crow cow].map(&:tr.call("c", "b")) # => ["blue", "brow", "bow"]
|
1185
|
+
[%w[a b c], %w[c a b]].map(&:index.call { |element| element == "b" }) # => [1, 2]
|
1186
|
+
%w[1.outside 2.inside].map(&:sub.call(/\./) { |bullet| bullet + " " }) # => ["1. outside", "2. inside"]
|
1187
|
+
[1, 2, 3].map(&:to_s.call) # => ["1", "2", "3"]
|
1188
|
+
----
|
1189
|
+
|
1190
|
+
⚠️ Use of `#call` without any arguments or block should be avoided in order to not incur extra
|
1191
|
+
processing costs since the original symbol-to-proc call can used instead.
|
1192
|
+
|
1034
1193
|
== Development
|
1035
1194
|
|
1036
1195
|
To contribute, run:
|
data/lib/refinements/arrays.rb
CHANGED
@@ -1,11 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Refinements
|
4
|
+
# Provides additional enhancements to the Array primitive.
|
4
5
|
module Arrays
|
5
6
|
refine Array do
|
6
|
-
def compress =
|
7
|
+
def compress = dup.compress!
|
7
8
|
|
8
|
-
def compress!
|
9
|
+
def compress!
|
10
|
+
compact!
|
11
|
+
delete_if { |element| element.respond_to?(:empty?) && element.empty? }
|
12
|
+
end
|
9
13
|
|
10
14
|
def excluding(*elements) = self - elements.flatten
|
11
15
|
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Refinements
|
4
|
+
# Provides additional enhancements to Class objects.
|
5
|
+
module Classes
|
6
|
+
refine Class do
|
7
|
+
def descendants
|
8
|
+
ObjectSpace.each_object(singleton_class)
|
9
|
+
.reject { |klass| klass.singleton_class? || klass == self }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/refinements/hashes.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Refinements
|
4
|
+
# Provides additional enhancements to the Hash primitive.
|
4
5
|
module Hashes
|
5
6
|
refine Hash.singleton_class do
|
6
7
|
def infinite
|
@@ -11,6 +12,14 @@ module Refinements
|
|
11
12
|
end
|
12
13
|
|
13
14
|
refine Hash do
|
15
|
+
def compress = dup.compress!
|
16
|
+
|
17
|
+
def compress!
|
18
|
+
return self if empty?
|
19
|
+
|
20
|
+
compact!.delete_if { |_key, value| value.respond_to?(:empty?) && value.empty? }
|
21
|
+
end
|
22
|
+
|
14
23
|
def deep_merge other
|
15
24
|
clazz = self.class
|
16
25
|
|
@@ -33,6 +42,10 @@ module Refinements
|
|
33
42
|
|
34
43
|
def deep_symbolize_keys! = replace(deep_symbolize_keys)
|
35
44
|
|
45
|
+
def fetch_value key, *default_value, &block
|
46
|
+
fetch(key, *default_value, &block) || default_value.first
|
47
|
+
end
|
48
|
+
|
36
49
|
# :reek:TooManyStatements
|
37
50
|
def flatten_keys prefix: nil, delimiter: "_", cast: :to_sym
|
38
51
|
fail StandardError, "Unknown cast: #{cast}." unless %i[to_sym to_s].include? cast
|
@@ -62,13 +75,13 @@ module Refinements
|
|
62
75
|
end
|
63
76
|
end
|
64
77
|
|
65
|
-
def stringify_keys =
|
78
|
+
def stringify_keys = transform_keys(&:to_s)
|
66
79
|
|
67
|
-
def stringify_keys! =
|
80
|
+
def stringify_keys! = transform_keys!(&:to_s)
|
68
81
|
|
69
|
-
def symbolize_keys =
|
82
|
+
def symbolize_keys = transform_keys(&:to_sym)
|
70
83
|
|
71
|
-
def symbolize_keys! =
|
84
|
+
def symbolize_keys! = transform_keys!(&:to_sym)
|
72
85
|
|
73
86
|
def use &block
|
74
87
|
return [] unless block
|
data/lib/refinements/identity.rb
CHANGED
data/lib/refinements/ios.rb
CHANGED
@@ -3,9 +3,9 @@
|
|
3
3
|
require "pathname"
|
4
4
|
|
5
5
|
module Refinements
|
6
|
+
# Provides additional enhancements to the Pathname primitive.
|
6
7
|
module Pathnames
|
7
8
|
refine Kernel do
|
8
|
-
# :reek:UncommunicativeMethodName
|
9
9
|
def Pathname object
|
10
10
|
return super(String(object)) unless object
|
11
11
|
|
@@ -24,7 +24,7 @@ module Refinements
|
|
24
24
|
new(root).files(pattern).each { |path| require path.to_s }
|
25
25
|
end
|
26
26
|
|
27
|
-
def root = new(
|
27
|
+
def root = new(File::SEPARATOR)
|
28
28
|
end
|
29
29
|
|
30
30
|
refine Pathname do
|
@@ -38,10 +38,16 @@ module Refinements
|
|
38
38
|
self
|
39
39
|
end
|
40
40
|
|
41
|
+
def deep_touch(...) = make_ancestors.touch(...)
|
42
|
+
|
43
|
+
def delete = super && self
|
44
|
+
|
41
45
|
def directories pattern = "*", flag: File::FNM_SYSCASE
|
42
46
|
glob(pattern, flag).select(&:directory?).sort
|
43
47
|
end
|
44
48
|
|
49
|
+
def empty = file? ? (truncate(0) and self) : remove_tree.make_dir
|
50
|
+
|
45
51
|
def extensions = basename.to_s.split(/(?=\.)+/).tap(&:shift)
|
46
52
|
|
47
53
|
def files(pattern = "*", flag: File::FNM_SYSCASE) = glob(pattern, flag).select(&:file?).sort
|
data/lib/refinements/strings.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Refinements
|
4
|
+
# Provides additional enhancements to the String primitive.
|
4
5
|
module Strings
|
5
6
|
DELIMITERS = %r([a-z][A-Z]|\s*-\s*|\s*/\s*|\s*:+\s*|\s*_\s*|\s+)
|
6
7
|
|
7
8
|
refine String do
|
8
|
-
def blank? = match?(/\A
|
9
|
+
def blank? = empty? || match?(/\A[[:space:]]*\z/)
|
9
10
|
|
10
11
|
def camelcase
|
11
12
|
return up unless match? DELIMITERS
|
@@ -35,7 +36,7 @@ module Refinements
|
|
35
36
|
def indent multiplier = 1, padding: " "
|
36
37
|
return self if multiplier.negative?
|
37
38
|
|
38
|
-
padding * multiplier + self
|
39
|
+
(padding * multiplier) + self
|
39
40
|
end
|
40
41
|
|
41
42
|
def last number = 0
|
@@ -49,6 +50,10 @@ module Refinements
|
|
49
50
|
self[(min + 1)..]
|
50
51
|
end
|
51
52
|
|
53
|
+
def pluralize(suffix, replace: /$/, count: 0) = count.abs == 1 ? self : sub(replace, suffix)
|
54
|
+
|
55
|
+
def singularize(suffix, replace: "", count: 1) = count.abs == 1 ? sub(suffix, replace) : self
|
56
|
+
|
52
57
|
def snakecase
|
53
58
|
return downcase unless match? DELIMITERS
|
54
59
|
|
data/lib/refinements/structs.rb
CHANGED
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Refinements
|
4
|
+
# Provides additional enhancements to the Symbol primitive.
|
5
|
+
module Symbols
|
6
|
+
refine Symbol do
|
7
|
+
def call *arguments, &block
|
8
|
+
proc { |receiver| receiver.public_send self, *arguments, &block }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/refinements.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require "refinements/identity"
|
4
4
|
require "refinements/arrays"
|
5
|
+
require "refinements/classes"
|
5
6
|
require "refinements/big_decimals"
|
6
7
|
require "refinements/date_times"
|
7
8
|
require "refinements/hashes"
|
@@ -10,3 +11,4 @@ require "refinements/pathnames"
|
|
10
11
|
require "refinements/strings"
|
11
12
|
require "refinements/string_ios"
|
12
13
|
require "refinements/structs"
|
14
|
+
require "refinements/symbols"
|
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: 8.
|
4
|
+
version: 8.5.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: 2021-
|
31
|
+
date: 2021-10-16 00:00:00.000000000 Z
|
32
32
|
dependencies: []
|
33
33
|
description:
|
34
34
|
email:
|
@@ -44,6 +44,7 @@ files:
|
|
44
44
|
- lib/refinements.rb
|
45
45
|
- lib/refinements/arrays.rb
|
46
46
|
- lib/refinements/big_decimals.rb
|
47
|
+
- lib/refinements/classes.rb
|
47
48
|
- lib/refinements/date_times.rb
|
48
49
|
- lib/refinements/hashes.rb
|
49
50
|
- lib/refinements/identity.rb
|
@@ -52,6 +53,7 @@ files:
|
|
52
53
|
- lib/refinements/string_ios.rb
|
53
54
|
- lib/refinements/strings.rb
|
54
55
|
- lib/refinements/structs.rb
|
56
|
+
- lib/refinements/symbols.rb
|
55
57
|
homepage: https://www.alchemists.io/projects/refinements
|
56
58
|
licenses:
|
57
59
|
- Apache-2.0
|
@@ -75,7 +77,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
75
77
|
- !ruby/object:Gem::Version
|
76
78
|
version: '0'
|
77
79
|
requirements: []
|
78
|
-
rubygems_version: 3.2.
|
80
|
+
rubygems_version: 3.2.29
|
79
81
|
signing_key:
|
80
82
|
specification_version: 4
|
81
83
|
summary: A collection of refinements to core Ruby objects.
|
metadata.gz.sig
CHANGED
Binary file
|