refinements 7.3.0 → 7.8.0

Sign up to get free protection for your applications and to get access to all the features.
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