refinements 7.3.0 → 7.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 07f6d846bc9cd533e7c5b7fae5eb8c5e9fbe9d496f5abe6c32443e49d1e4c74b
4
- data.tar.gz: f5c01757545c4fb8f11f5485695ec4ecdaa5061966945161e8bdb7c53cfe5d19
3
+ metadata.gz: dd72c4e1fda257b53dcd80a052db0ce99cd5b2987e531bea93f577e6b3b131f9
4
+ data.tar.gz: 67b83319903a39425640eb0534eab280e7cb138e588476c635c5192afb08758d
5
5
  SHA512:
6
- metadata.gz: 2787e284a26eb3e5db5cd3c33024163440220c1fba90a81c887b166eadf6b54ab73b5f369b3b1a03042a65abcbd886a093ff304a240315a14ec58e3ab1cd83a3
7
- data.tar.gz: 6838f0cc48d65154bcb0761c4446bea18447a7571ec6a0836b58cff7c259f97365162bd636310a82fe6d1a9b8625edbb7cdba99521115ccee0c0059ba23c21cb
6
+ metadata.gz: 8fab91775e301f8765dd3156ab91e6abdf9395bdf767fbf859f80a5d3ea2bbebabef8dbe9e5e5a65e33443082a13e127ce3d85c1384b3939d753347384dea99e
7
+ data.tar.gz: 74934f4fbb6336ad4c434961c865b826675a71b76f846faae7635e6e09d3aa99bd74a9c74d6f0289f2d63a0c3352c9e21aecb60e35c2485664879520b20a755d
@@ -1,2 +1,3 @@
1
- ̤�)#��TK �;� w!F>7K������wI�� eC���x�<�P�?�Y�Ѩo.?�I]oB��S��I��c�>���5`&�����P��߯�[�����򷄔�yi���s<�"�ҭ`�N5D[VM�ዺ��z�8���MT[zIx6޼���+��2lYӉ9
2
- ^��8y��P���~p��C�մ�8WWlaA׹�bϓ�Q
1
+ !�������PW�F�nk���~9�z��Z�3�o�GŚ��kw�+�~�� X�P���r4xvqp]���Ͱ�?��AMJM��Oc�y.π���iQl�P^��΅g�7��d � :�/oJ��ݱ�Fl_N_: kI':�M���KEW�P!
2
+ k2����]
3
+ �RC���^��&��.����7W��T8-��:!�� /�?��5"Ix+��nOho�컎��r+���F���6m��%2P��f�
data.tar.gz.sig CHANGED
Binary file
@@ -18,6 +18,8 @@ toc::[]
18
18
  * *Arrays*:
19
19
  ** `#compress` - Removes `nil` and empty values without modifying itself.
20
20
  ** `#compress!` - Removes `nil` and empty values while modifying itself.
21
+ ** `#include` - Adds given array or elements without modifying itself.
22
+ ** `#exclude` - Removes given array or elements without modifying itself.
21
23
  ** `#ring` - Answers a circular array which can enumerate before, current, after elements.
22
24
  * *BigDecimals*:
23
25
  ** `#inspect` - Allows one to inspect a big decimal with numeric representation.
@@ -27,25 +29,39 @@ toc::[]
27
29
  ** `#rewrite` - When given a file path and a block, it provides the contents of the recently read
28
30
  file for manipulation and immediate writing back to the same file.
29
31
  * *Hashes*:
30
- ** `#except` - Answers new hash with given keys removed without modifying calling hash.
31
- ** `#except!` - Answers new hash with given keys removed while modifying calling hash.
32
+ ** `.infinite` - Answers new hash where missing keys, even deeply nested, answer an empty hash.
33
+ ** `.with_default` - Answers new hash where every top-level missing key has the same default value.
34
+ ** `#except` - Answers new hash with given keys removed without modifying itself.
35
+ ** `#except!` - Answers new hash with given keys removed while modifying itself.
32
36
  ** `#symbolize_keys` - Converts keys to symbols without modifying itself.
33
37
  ** `#symbolize_keys!` - Converts keys to symbols while modifying itself.
34
38
  ** `#deep_merge` - Merges deeply nested hashes together without modifying itself.
35
39
  ** `#deep_merge!` - Merges deeply nested hashes together while modifying itself.
36
- ** `#reverse_merge` - Merges calling hash into passed in hash without modifying calling hash.
37
- ** `#reverse_merge!` - Merges calling hash into passed in hash while modifying calling hash.
40
+ ** `#deep_symbolize_keys` - Symbolizes keys of nested hash without modifying itself. Does not handle
41
+ nested arrays, though.
42
+ ** `#deep_symbolize_keys!` - Symbolizes keys of nested hash while modifying itself. Does not handle
43
+ nested arrays, though.
44
+ ** `#recurse` - Applies block to nested hash. Does not handle nested arrays, though.
45
+ ** `#rekey` - Transforms keys per mapping (size of mapping can vary) without modifying itself.
46
+ ** `#rekey!` - Transforms keys per mapping (size of mapping can vary) while modifying itself.
47
+ ** `#reverse_merge` - Merges calling hash into passed in hash without modifying itself.
48
+ ** `#reverse_merge!` - Merges calling hash into passed in hash while modifying itself.
38
49
  ** `#use` - Passes each hash value as a block argument for further processing.
39
50
  * *Pathnames*:
51
+ ** `Pathname` - Conversion function (refined from `Kernel`) which can cast `nil` into a pathname.
40
52
  ** `#name` - Answers file name without extension.
41
53
  ** `#copy` - Copies file from current location to new location.
54
+ ** `#directories` - Answers all or filtered directories for current path.
42
55
  ** `#extensions` - Answers file extensions as an array.
43
- ** `#relative_parent_from` - Answers relative path from parent directory. This is a complement to
56
+ ** `#files` - Answers all or filtered files for current path.
57
+ ** `#gsub` - Same behavior as `String#gsub` but answers a path with patterns replaced with desired
58
+ substitutes.
59
+ ** `#relative_parent` - Answers relative path from parent directory. This is a complement to
44
60
  `#relative_path_from`.
45
61
  ** `#make_ancestors` - Ensures all ancestor directories are created for a path.
46
62
  ** `#rewrite` - When given a block, it provides the contents of the recently read file for
47
63
  manipulation and immediate writing back to the same file.
48
- ** `#touch` - Updates access and modification times to current time for path.
64
+ ** `#touch` - Updates access and modification times for path. Defaults to current time.
49
65
  * *Strings*:
50
66
  ** `#first` - Answers first character of a string or first set of characters if given a number.
51
67
  ** `#last` - Answers last character of a string or last set of characters if given a number.
@@ -56,12 +72,15 @@ manipulation and immediate writing back to the same file.
56
72
  ** `#camelcase` - Answers a camelcased string.
57
73
  ** `#snakecase` - Answers a snakecased string.
58
74
  ** `#titleize` - Answers titleized string.
75
+ ** `#to_bool` - Answers string as a boolean.
76
+ * *String IOs*:
77
+ ** `#reread` - Answers full string by rewinding to beginning of string and reading all content.
59
78
 
60
79
  == Requirements
61
80
 
62
- . https://www.ruby-lang.org[Ruby 2.7.x].
63
- . A solid understanding of https://www.youtube.com/watch?v=qXC9Gk4dCEw[Ruby refinements and lexical
64
- scope].
81
+ . https://www.ruby-lang.org[Ruby].
82
+ . A solid understanding of link:https://www.alchemists.io/articles/ruby_refinements[Ruby refinements
83
+ and lexical scope].
65
84
 
66
85
  == Setup
67
86
 
@@ -156,6 +175,12 @@ example = ["An", nil, "", "Example"]
156
175
  example.compress! # => ["An", "Example"]
157
176
  example # => ["An", "Example"]
158
177
 
178
+ [1, 2, 3].include [4, 5] # => [1, 2, 3, 4, 5]
179
+ [1, 2, 3].include 4, 5 # => [1, 2, 3, 4, 5]
180
+
181
+ [1, 2, 3, 4, 5].exclude [4, 5] # => [1, 2, 3]
182
+ [1, 2, 3, 4, 5].include 4, 5 # => [1, 2, 3, 4, 5]
183
+
159
184
  example = [1, 2, 3]
160
185
  example.ring # => #<Enumerator: ...>
161
186
  example.ring { |(before, current, after)| puts "#{before} #{current} #{after}" }
@@ -189,6 +214,15 @@ File.rewrite("/test.txt") { |content| content.gsub "[placeholder]", "example" }
189
214
 
190
215
  [source,ruby]
191
216
  ----
217
+ example = Hash.infinite
218
+ example[:a] # => {}
219
+ example[:a][:b][:c] # => {}
220
+
221
+ example = Hash.with_default ""
222
+ example[:a] # => ""
223
+ example = Hash.with_default []
224
+ example[:b] # => []
225
+
192
226
  example = {a: 1, b: 2, c: 3}
193
227
  example.except :a, :b # => {c: 3}
194
228
  example # => {a: 1, b: 2, c: 3}
@@ -221,6 +255,26 @@ example = {a: "A", b: {one: "One", two: "Two"}}
221
255
  example.deep_merge! b: {one: 1} # => {a: "A", b: {one: 1, two: "Two"}}
222
256
  example # => {a: "A", b: {one: 1, two: "Two"}}
223
257
 
258
+ example = {"a" => {"b" => 2}}
259
+ example.deep_symbolize_keys # => {a: {b: 1}}
260
+ example # => {"a" => {"b" => 2}}
261
+
262
+ example = {"a" => {"b" => 2}}
263
+ example.deep_symbolize_keys! # => {a: {b: 1}}
264
+ example # => {a: {b: 1}}
265
+
266
+ example = {"a" => {"b" => 1}}
267
+ example.recurse(&:symbolize_keys) # => {a: {b: 1}}
268
+ example.recurse(&:invert) # => {{"b" => 1} => "a"}
269
+
270
+ example = {a: 1, b: 2, c: 3}
271
+ example.rekey a: :amber, b: :blue # => {amber: 1, blue: 2, c: 3}
272
+ example # => {a: 1, b: 2, c: 3}
273
+
274
+ example = {a: 1, b: 2, c: 3}
275
+ example.rekey! a: :amber, b: :blue # => {amber: 1, blue: 2, c: 3}
276
+ example # => {amber: 1, blue: 2, c: 3}
277
+
224
278
  example = {a: 1, b: 2}
225
279
  example.reverse_merge a: 0, c: 3 # => {a: 1, b: 2, c: 3}
226
280
  example # => {a: 1, b: 2}
@@ -237,12 +291,25 @@ example.use { |unit, street| "#{unit} #{street}" } # => "221B Baker Street"
237
291
 
238
292
  [source,ruby]
239
293
  ----
294
+ Pathname(nil) # => Pathname("")
295
+
240
296
  Pathname("example.txt").name # => Pathname("example")
241
297
 
242
298
  Pathname("input.txt").copy Pathname("output.txt")
243
299
 
300
+ Pathname("/example").directories # => [Pathname("a"), Pathname("b")]
301
+ Pathname("/example").directories "a*" # => [Pathname("a")]
302
+ Pathname("/example").directories flag: File::FNM_DOTMATCH # => [Pathname(".."), Pathname(".")]
303
+
244
304
  Pathname("example.txt.erb").extensions # => [".txt", ".erb"]
245
305
 
306
+ Pathname("/example").files # => [Pathname("a.txt"), Pathname("a.png")]
307
+ Pathname("/example").files "*.png" # => [Pathname("a.png")]
308
+ Pathname("/example").files flag: File::FNM_DOTMATCH # => [Pathname(".ruby-version")]
309
+
310
+ Pathname("/a/path/some/path").gsub("path", "test") # => Pathname("/a/test/some/test")
311
+ Pathname("/%placeholder%/some/%placeholder%").gsub("%placeholder%", "test") # => Pathname("/test/some/test")
312
+
246
313
  Pathname("/one/two/three").relative_parent_from("/one") # => Pathname "two"
247
314
 
248
315
  Pathname("/one/two").make_ancestors
@@ -252,7 +319,7 @@ Pathname("/one/two").exist? # => false
252
319
  Pathname("/test.txt").rewrite { |content| content.sub "[placeholder]", "example" }
253
320
 
254
321
  Pathname("example.txt").touch
255
- Pathname("example.txt").touch accessed_at: Time.now - 1, modified_at: Time.now - 1
322
+ Pathname("example.txt").touch at: Time.now - 1
256
323
  ----
257
324
 
258
325
  ==== String
@@ -266,11 +333,37 @@ Pathname("example.txt").touch accessed_at: Time.now - 1, modified_at: Time.now -
266
333
  "instant".last 3 # => "ant"
267
334
 
268
335
  " \n\t\r".blank? # => true
336
+
269
337
  "example".up # => "Example"
338
+
270
339
  "EXAMPLE".down # => "eXAMPLE"
340
+
271
341
  "this_is_an_example".camelcase # => "ThisIsAnExample"
342
+
272
343
  "ThisIsAnExample".snakecase # => "this_is_an_example"
344
+
273
345
  "ThisIsAnExample".titleize # => "This Is An Example"
346
+
347
+ "true".to_bool # => true
348
+ "yes".to_bool # => true
349
+ "1".to_bool # => true
350
+ "".to_bool # => false
351
+ "example".to_bool # => false
352
+ ----
353
+
354
+ ==== String IO
355
+
356
+ [source,ruby]
357
+ ----
358
+ io = StringIO.new
359
+ io.write "This is a test."
360
+ io.reread # => "This is a test."
361
+
362
+ io.reread(4) => "This"
363
+
364
+ buffer = "".dup
365
+ io.reread(buffer: buffer)
366
+ buffer # => "This is a test."
274
367
  ----
275
368
 
276
369
  == Tests
@@ -8,3 +8,4 @@ require "refinements/files"
8
8
  require "refinements/hashes"
9
9
  require "refinements/pathnames"
10
10
  require "refinements/strings"
11
+ require "refinements/string_ios"
@@ -11,6 +11,14 @@ module Refinements
11
11
  replace compress
12
12
  end
13
13
 
14
+ def include *elements
15
+ self + elements.flatten
16
+ end
17
+
18
+ def exclude *elements
19
+ self - elements.flatten
20
+ end
21
+
14
22
  def ring &block
15
23
  [last, *self, first].each_cons 3, &block
16
24
  end
@@ -4,6 +4,7 @@ module Refinements
4
4
  module Files
5
5
  refine File.singleton_class do
6
6
  def rewrite path
7
+ warn "[DEPRECATION]: File.rewrite is deprecated, use Pathname#rewrite instead."
7
8
  read(path).then { |content| write path, yield(content) }
8
9
  end
9
10
  end
@@ -2,6 +2,16 @@
2
2
 
3
3
  module Refinements
4
4
  module Hashes
5
+ refine Hash.singleton_class do
6
+ def infinite
7
+ new { |new_hash, missing_key| new_hash[missing_key] = new(&new_hash.default_proc) }
8
+ end
9
+
10
+ def with_default value
11
+ new { |new_hash, missing_key| new_hash[missing_key] = value }
12
+ end
13
+ end
14
+
5
15
  refine Hash do
6
16
  def except *keys
7
17
  reject { |key, _value| keys.include? key }
@@ -23,10 +33,11 @@ module Refinements
23
33
  dup.deep_merge! other
24
34
  end
25
35
 
26
- # :reek:FeatureEnvy
27
36
  def deep_merge! other
37
+ clazz = self.class
38
+
28
39
  merge! other do |_key, this_value, other_value|
29
- if this_value.is_a?(Hash) && other_value.is_a?(Hash)
40
+ if this_value.is_a?(clazz) && other_value.is_a?(clazz)
30
41
  this_value.deep_merge other_value
31
42
  else
32
43
  other_value
@@ -34,11 +45,41 @@ module Refinements
34
45
  end
35
46
  end
36
47
 
48
+ def deep_symbolize_keys
49
+ recurse(&:symbolize_keys)
50
+ end
51
+
52
+ def deep_symbolize_keys!
53
+ recurse(&:symbolize_keys!)
54
+ end
55
+
56
+ def recurse &block
57
+ return self unless block_given?
58
+
59
+ transform = yield self
60
+
61
+ transform.each do |key, value|
62
+ transform[key] = value.recurse(&block) if value.is_a? self.class
63
+ end
64
+ end
65
+
66
+ def rekey mapping = {}
67
+ return self if mapping.empty?
68
+
69
+ transform_keys { |key| mapping[key] || key }
70
+ end
71
+
72
+ def rekey! mapping = {}
73
+ replace rekey(mapping)
74
+ end
75
+
37
76
  def reverse_merge other
77
+ warn "[DEPRECATION]: #reverse_merge is deprecated, use #merge instead."
38
78
  other.merge self
39
79
  end
40
80
 
41
81
  def reverse_merge! other
82
+ warn "[DEPRECATION]: #reverse_merge! is deprecated, use #merge! instead."
42
83
  merge!(other) { |_key, old_value, _new_value| old_value }
43
84
  end
44
85
 
@@ -5,7 +5,7 @@ module Refinements
5
5
  module Identity
6
6
  NAME = "refinements"
7
7
  LABEL = "Refinements"
8
- VERSION = "7.3.0"
8
+ VERSION = "7.8.0"
9
9
  VERSION_LABEL = "#{LABEL} #{VERSION}"
10
10
  end
11
11
  end
@@ -4,6 +4,14 @@ require "pathname"
4
4
 
5
5
  module Refinements
6
6
  module Pathnames
7
+ refine Kernel do
8
+ def Pathname object
9
+ return super(String(object)) unless object
10
+
11
+ super
12
+ end
13
+ end
14
+
7
15
  refine Pathname do
8
16
  def name
9
17
  basename extname
@@ -15,12 +23,30 @@ module Refinements
15
23
  self
16
24
  end
17
25
 
26
+ def directories pattern = "*", flag: File::FNM_SYSCASE
27
+ glob(pattern, flag).select(&:directory?).sort
28
+ end
29
+
18
30
  def extensions
19
31
  basename.to_s.split(/(?=\.)+/).tap(&:shift)
20
32
  end
21
33
 
22
- def relative_parent_from root
23
- relative_path_from(root).parent
34
+ def files pattern = "*", flag: File::FNM_SYSCASE
35
+ glob(pattern, flag).select(&:file?).sort
36
+ end
37
+
38
+ def gsub pattern, replacement
39
+ self.class.new to_s.gsub(pattern, replacement)
40
+ end
41
+
42
+ def relative_parent root_dir
43
+ relative_path_from(root_dir).parent
44
+ end
45
+
46
+ def relative_parent_from root_dir
47
+ warn "[DEPRECATION]: Pathname#relative_parent_from is deprecated, " \
48
+ "use Pathname#relative_parent instead."
49
+ relative_parent root_dir
24
50
  end
25
51
 
26
52
  def make_ancestors
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "stringio"
4
+
5
+ module Refinements
6
+ module StringIOs
7
+ refine StringIO do
8
+ def reread length = nil, buffer: nil
9
+ tap(&:rewind).read length, buffer
10
+ end
11
+ end
12
+ end
13
+ end
@@ -2,9 +2,12 @@
2
2
 
3
3
  module Refinements
4
4
  module Strings
5
+ DELIMITERS = %r([a-z][A-Z]|\s*-\s*|\s*/\s*|\s*:+\s*|\s*_\s*|\s+).freeze
6
+
5
7
  refine String.singleton_class do
6
8
  def delimiters
7
- %r([a-z][A-Z]|\s*\-\s*|\s*\/\s*|\s*\:+\s*|\s*\_\s*|\s+)
9
+ warn "[DEPRECATION]: .delimiters is deprecated, use DELIMITERS instead."
10
+ DELIMITERS
8
11
  end
9
12
  end
10
13
 
@@ -17,20 +20,18 @@ module Refinements
17
20
  return self[0] if max.zero?
18
21
  return "" if max.negative?
19
22
 
20
- self[0..(max - 1)]
23
+ self[..(max - 1)]
21
24
  end
22
25
 
23
- # :reek:TooManyStatements
24
26
  def last number = 0
25
27
  return self if empty?
26
28
 
27
29
  min = Integer number
28
- max = size - 1
29
30
 
30
- return self[max] if min.zero?
31
+ return self[size - 1] if min.zero?
31
32
  return "" if min.negative?
32
33
 
33
- self[(min + 1)..max]
34
+ self[(min + 1)..]
34
35
  end
35
36
 
36
37
  def blank?
@@ -50,33 +51,31 @@ module Refinements
50
51
  end
51
52
 
52
53
  def camelcase
53
- if match? self.class.delimiters
54
- split(%r(\s*\-\s*|\s*\/\s*|\s*\:+\s*)).then { |parts| combine parts, :up, "::" }
55
- .then { |text| text.split(/\s*\_\s*|\s+/) }
56
- .then { |parts| combine parts, :up }
57
- else
58
- up
59
- end
54
+ return up unless match? DELIMITERS
55
+
56
+ split(%r(\s*-\s*|\s*/\s*|\s*:+\s*)).then { |parts| combine parts, :up, "::" }
57
+ .then { |text| text.split(/\s*_\s*|\s+/) }
58
+ .then { |parts| combine parts, :up }
60
59
  end
61
60
 
62
61
  def snakecase
63
- if match? self.class.delimiters
64
- split(%r(\s*\-\s*|\s*\/\s*|\s*\:+\s*)).then { |parts| combine parts, :down, "/" }
65
- .then { |txt| txt.split(/(?=[A-Z])|\s*\_\s*|\s+/) }
66
- .then { |parts| combine parts, :down, "_" }
67
- else
68
- downcase
69
- end
62
+ return downcase unless match? DELIMITERS
63
+
64
+ split(%r(\s*-\s*|\s*/\s*|\s*:+\s*)).then { |parts| combine parts, :down, "/" }
65
+ .then { |text| text.split(/(?=[A-Z])|\s*_\s*|\s+/) }
66
+ .then { |parts| combine parts, :down, "_" }
70
67
  end
71
68
 
72
69
  def titleize
73
- if match? self.class.delimiters
74
- split(/(?=[A-Z])|\s*\_\s*|\s*\-\s*|\s+/).then { |parts| combine parts, :up, " " }
75
- .then { |text| text.split %r(\s*\/\s*|\s*\:+\s*) }
76
- .then { |parts| combine parts, :up, "/" }
77
- else
78
- capitalize
79
- end
70
+ return capitalize unless match? DELIMITERS
71
+
72
+ split(/(?=[A-Z])|\s*_\s*|\s*-\s*|\s+/).then { |parts| combine parts, :up, " " }
73
+ .then { |text| text.split %r(\s*/\s*|\s*:+\s*) }
74
+ .then { |parts| combine parts, :up, "/" }
75
+ end
76
+
77
+ def to_bool
78
+ %w[true yes on t y 1].include? downcase.strip
80
79
  end
81
80
 
82
81
  private
metadata CHANGED
@@ -1,11 +1,11 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: refinements
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.3.0
4
+ version: 7.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brooke Kuhlmann
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain:
11
11
  - |
@@ -28,7 +28,7 @@ cert_chain:
28
28
  2XV8FRa7/JimI07sPLC13eLY3xd/aYTi85Z782KIA4j0G8XEEWAX0ouBhlXPocZv
29
29
  QWc=
30
30
  -----END CERTIFICATE-----
31
- date: 2020-05-13 00:00:00.000000000 Z
31
+ date: 2020-08-29 00:00:00.000000000 Z
32
32
  dependencies:
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: bundler-audit
@@ -50,28 +50,28 @@ dependencies:
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '14.0'
53
+ version: '14.2'
54
54
  type: :development
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '14.0'
60
+ version: '14.2'
61
61
  - !ruby/object:Gem::Dependency
62
- name: git-cop
62
+ name: git-lint
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: '4.0'
67
+ version: '1.0'
68
68
  type: :development
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: '4.0'
74
+ version: '1.0'
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: guard-rspec
77
77
  requirement: !ruby/object:Gem::Requirement
@@ -162,14 +162,14 @@ dependencies:
162
162
  requirements:
163
163
  - - "~>"
164
164
  - !ruby/object:Gem::Version
165
- version: '0.83'
165
+ version: '0.89'
166
166
  type: :development
167
167
  prerelease: false
168
168
  version_requirements: !ruby/object:Gem::Requirement
169
169
  requirements:
170
170
  - - "~>"
171
171
  - !ruby/object:Gem::Version
172
- version: '0.83'
172
+ version: '0.89'
173
173
  - !ruby/object:Gem::Dependency
174
174
  name: rubocop-performance
175
175
  requirement: !ruby/object:Gem::Requirement
@@ -226,7 +226,7 @@ dependencies:
226
226
  - - "~>"
227
227
  - !ruby/object:Gem::Version
228
228
  version: '0.18'
229
- description:
229
+ description:
230
230
  email:
231
231
  - brooke@alchemists.io
232
232
  executables: []
@@ -245,6 +245,7 @@ files:
245
245
  - lib/refinements/hashes.rb
246
246
  - lib/refinements/identity.rb
247
247
  - lib/refinements/pathnames.rb
248
+ - lib/refinements/string_ios.rb
248
249
  - lib/refinements/strings.rb
249
250
  homepage: https://www.alchemists.io/projects/refinements
250
251
  licenses:
@@ -254,7 +255,7 @@ metadata:
254
255
  changelog_uri: https://www.alchemists.io/projects/refinements/changes.html
255
256
  documentation_uri: https://www.alchemists.io/projects/refinements
256
257
  source_code_uri: https://github.com/bkuhlmann/refinements
257
- post_install_message:
258
+ post_install_message:
258
259
  rdoc_options: []
259
260
  require_paths:
260
261
  - lib
@@ -269,8 +270,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
269
270
  - !ruby/object:Gem::Version
270
271
  version: '0'
271
272
  requirements: []
272
- rubygems_version: 3.1.3
273
- signing_key:
273
+ rubygems_version: 3.1.4
274
+ signing_key:
274
275
  specification_version: 4
275
276
  summary: A collection of refinements to core Ruby objects.
276
277
  test_files: []
metadata.gz.sig CHANGED
Binary file