refinements 7.12.0 → 7.13.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.tar.gz.sig +0 -0
- data/README.adoc +219 -157
- data/lib/refinements/arrays.rb +4 -4
- data/lib/refinements/hashes.rb +43 -43
- data/lib/refinements/identity.rb +1 -1
- data/lib/refinements/ios.rb +4 -4
- data/lib/refinements/pathnames.rb +30 -9
- data/lib/refinements/strings.rb +29 -29
- metadata +2 -2
- 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: 58f24ccfa83d2f2af820c05d19c575e371ed5c6471177c8c58648006cf3ca945
|
4
|
+
data.tar.gz: 7fccb86818487e2de337969b42c8ec81f52e28bc1a3edb1d8cc0bf2c206ee2b0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 773c5bf918f8e7f958dc602b9c6d7edefc29d644d7d928db0f21e2fa93616781e075b1c4743281b025daf8335c13761d460d149caa470c8000a11aecc91f25f8
|
7
|
+
data.tar.gz: 1cbe58132380e683a0e47813fe676440055fa2a9af1bd582bf8661c3778b1aa354cda5d3939f07b69a6190f72b28e9635890aaa6810af7c9255fef27c025e1a5
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/README.adoc
CHANGED
@@ -6,6 +6,8 @@
|
|
6
6
|
|
7
7
|
[link=http://badge.fury.io/rb/refinements]
|
8
8
|
image::https://badge.fury.io/rb/refinements.svg[Gem Version]
|
9
|
+
[link=https://www.alchemists.io/projects/code_quality]
|
10
|
+
image::https://img.shields.io/badge/code_style-alchemists-brightgreen.svg[Alchemists Style Guide]
|
9
11
|
[link=https://circleci.com/gh/bkuhlmann/refinements]
|
10
12
|
image::https://circleci.com/gh/bkuhlmann/refinements.svg?style=svg[Circle CI Status]
|
11
13
|
|
@@ -123,6 +125,16 @@ example.compress! # => ["An", "Example"]
|
|
123
125
|
example # => ["An", "Example"]
|
124
126
|
----
|
125
127
|
|
128
|
+
===== #exclude
|
129
|
+
|
130
|
+
Removes given array or elements without mutating itself.
|
131
|
+
|
132
|
+
[source,ruby]
|
133
|
+
----
|
134
|
+
[1, 2, 3, 4, 5].exclude [4, 5] # => [1, 2, 3]
|
135
|
+
[1, 2, 3, 4, 5].exclude 4, 5 # => [1, 2, 3]
|
136
|
+
----
|
137
|
+
|
126
138
|
===== #include
|
127
139
|
|
128
140
|
Adds given array or elements without mutating itself.
|
@@ -144,16 +156,6 @@ Inserts additional elements or array between all members of given array.
|
|
144
156
|
[1, 2, 3].intersperse %i[a b c] # => [1, :a, :b, :c, 2, :a, :b, :c, 3]
|
145
157
|
----
|
146
158
|
|
147
|
-
===== #exclude
|
148
|
-
|
149
|
-
Removes given array or elements without mutating itself.
|
150
|
-
|
151
|
-
[source,ruby]
|
152
|
-
----
|
153
|
-
[1, 2, 3, 4, 5].exclude [4, 5] # => [1, 2, 3]
|
154
|
-
[1, 2, 3, 4, 5].exclude 4, 5 # => [1, 2, 3]
|
155
|
-
----
|
156
|
-
|
157
159
|
===== #mean
|
158
160
|
|
159
161
|
Answers mean/average all elements within an array.
|
@@ -241,102 +243,6 @@ example = Hash.with_default []
|
|
241
243
|
example[:b] # => []
|
242
244
|
----
|
243
245
|
|
244
|
-
===== #except
|
245
|
-
|
246
|
-
Answers new hash with given keys removed without mutating itself.
|
247
|
-
|
248
|
-
[source,ruby]
|
249
|
-
----
|
250
|
-
example = {a: 1, b: 2, c: 3}
|
251
|
-
example.except :a, :b # => {c: 3}
|
252
|
-
example # => {a: 1, b: 2, c: 3}
|
253
|
-
----
|
254
|
-
|
255
|
-
===== #except!
|
256
|
-
|
257
|
-
Answers new hash with given keys removed while mutating itself.
|
258
|
-
|
259
|
-
[source,ruby]
|
260
|
-
----
|
261
|
-
example = {a: 1, b: 2, c: 3}
|
262
|
-
example.except! :a, :b # => {c: 3}
|
263
|
-
example # => {c: 3}
|
264
|
-
----
|
265
|
-
|
266
|
-
===== #flatten_keys
|
267
|
-
|
268
|
-
Flattens nested keys as top-level keys without mutating itself. Does not handle nested arrays,
|
269
|
-
though.
|
270
|
-
|
271
|
-
[source,ruby]
|
272
|
-
----
|
273
|
-
{a: {b: 1}}.flatten_keys prefix: :test # => {test_a_b: 1}
|
274
|
-
{a: {b: 1}}.flatten_keys delimiter: :| # => {:"a|b" => 1}
|
275
|
-
|
276
|
-
{a: {b: 1}}.flatten_keys cast: :to_s # => {"a_b" => 1}
|
277
|
-
{"a" => {"b" => 1}}.flatten_keys cast: :to_sym # => {a_b: 1}
|
278
|
-
|
279
|
-
example = {a: {b: 1}}
|
280
|
-
example.flatten_keys # => {a_b: 1}
|
281
|
-
example # => {a: {b: 1}}
|
282
|
-
----
|
283
|
-
|
284
|
-
===== #flatten_keys!
|
285
|
-
|
286
|
-
Flattens nested keys as top-level keys while mutating itself. Does not handle nested arrays,
|
287
|
-
though.
|
288
|
-
|
289
|
-
[source,ruby]
|
290
|
-
----
|
291
|
-
example = {a: {b: 1}}
|
292
|
-
example.flatten_keys! # => {a_b: 1}
|
293
|
-
example # => {a_b: 1}
|
294
|
-
----
|
295
|
-
|
296
|
-
===== #stringify_keys
|
297
|
-
|
298
|
-
Converts keys to strings without mutating itself.
|
299
|
-
|
300
|
-
[source,ruby]
|
301
|
-
----
|
302
|
-
example = {a: 1, b: 2}
|
303
|
-
example.stringify_keys # => {"a" => 1, "b" => 2}
|
304
|
-
example # => {a: 1, b: 2}
|
305
|
-
----
|
306
|
-
|
307
|
-
===== #stringify_keys!
|
308
|
-
|
309
|
-
Converts keys to strings while mutating itself.
|
310
|
-
|
311
|
-
[source,ruby]
|
312
|
-
----
|
313
|
-
example = {a: 1, b: 2}
|
314
|
-
example.stringify_keys! # => {"a" => 1, "b" => 2}
|
315
|
-
example # => {"a" => 1, "b" => 2}
|
316
|
-
----
|
317
|
-
|
318
|
-
===== #symbolize_keys
|
319
|
-
|
320
|
-
Converts keys to symbols without mutating itself.
|
321
|
-
|
322
|
-
[source,ruby]
|
323
|
-
----
|
324
|
-
example = {"a" => 1, "b" => 2}
|
325
|
-
example.symbolize_keys # => {a: 1, b: 2}
|
326
|
-
example # => {"a" => 1, "b" => 2}
|
327
|
-
----
|
328
|
-
|
329
|
-
===== #symbolize_keys!
|
330
|
-
|
331
|
-
Converts keys to symbols while mutating itself.
|
332
|
-
|
333
|
-
[source,ruby]
|
334
|
-
----
|
335
|
-
example = {"a" => 1, "b" => 2}
|
336
|
-
example.symbolize_keys! # => {a: 1, b: 2}
|
337
|
-
example # => {a: 1, b: 2}
|
338
|
-
----
|
339
|
-
|
340
246
|
===== #deep_merge
|
341
247
|
|
342
248
|
Merges deeply nested hashes together without mutating itself.
|
@@ -403,6 +309,58 @@ example.deep_symbolize_keys! # => {a: {b: 1}}
|
|
403
309
|
example # => {a: {b: 1}}
|
404
310
|
----
|
405
311
|
|
312
|
+
===== #except
|
313
|
+
|
314
|
+
Answers new hash with given keys removed without mutating itself.
|
315
|
+
|
316
|
+
[source,ruby]
|
317
|
+
----
|
318
|
+
example = {a: 1, b: 2, c: 3}
|
319
|
+
example.except :a, :b # => {c: 3}
|
320
|
+
example # => {a: 1, b: 2, c: 3}
|
321
|
+
----
|
322
|
+
|
323
|
+
===== #except!
|
324
|
+
|
325
|
+
Answers new hash with given keys removed while mutating itself.
|
326
|
+
|
327
|
+
[source,ruby]
|
328
|
+
----
|
329
|
+
example = {a: 1, b: 2, c: 3}
|
330
|
+
example.except! :a, :b # => {c: 3}
|
331
|
+
example # => {c: 3}
|
332
|
+
----
|
333
|
+
|
334
|
+
===== #flatten_keys
|
335
|
+
|
336
|
+
Flattens nested keys as top-level keys without mutating itself. Does not handle nested arrays,
|
337
|
+
though.
|
338
|
+
|
339
|
+
[source,ruby]
|
340
|
+
----
|
341
|
+
{a: {b: 1}}.flatten_keys prefix: :test # => {test_a_b: 1}
|
342
|
+
{a: {b: 1}}.flatten_keys delimiter: :| # => {:"a|b" => 1}
|
343
|
+
|
344
|
+
{a: {b: 1}}.flatten_keys cast: :to_s # => {"a_b" => 1}
|
345
|
+
{"a" => {"b" => 1}}.flatten_keys cast: :to_sym # => {a_b: 1}
|
346
|
+
|
347
|
+
example = {a: {b: 1}}
|
348
|
+
example.flatten_keys # => {a_b: 1}
|
349
|
+
example # => {a: {b: 1}}
|
350
|
+
----
|
351
|
+
|
352
|
+
===== #flatten_keys!
|
353
|
+
|
354
|
+
Flattens nested keys as top-level keys while mutating itself. Does not handle nested arrays,
|
355
|
+
though.
|
356
|
+
|
357
|
+
[source,ruby]
|
358
|
+
----
|
359
|
+
example = {a: {b: 1}}
|
360
|
+
example.flatten_keys! # => {a_b: 1}
|
361
|
+
example # => {a_b: 1}
|
362
|
+
----
|
363
|
+
|
406
364
|
===== #recurse
|
407
365
|
|
408
366
|
Recursively iterates over the hash and any hash value by applying the given block to it. Does not
|
@@ -459,6 +417,50 @@ example.reverse_merge! a: 0, c: 3 # => {a: 1, b: 2, c: 3}
|
|
459
417
|
example # => {a: 1, b: 2, c: 3}
|
460
418
|
----
|
461
419
|
|
420
|
+
===== #stringify_keys
|
421
|
+
|
422
|
+
Converts keys to strings without mutating itself.
|
423
|
+
|
424
|
+
[source,ruby]
|
425
|
+
----
|
426
|
+
example = {a: 1, b: 2}
|
427
|
+
example.stringify_keys # => {"a" => 1, "b" => 2}
|
428
|
+
example # => {a: 1, b: 2}
|
429
|
+
----
|
430
|
+
|
431
|
+
===== #stringify_keys!
|
432
|
+
|
433
|
+
Converts keys to strings while mutating itself.
|
434
|
+
|
435
|
+
[source,ruby]
|
436
|
+
----
|
437
|
+
example = {a: 1, b: 2}
|
438
|
+
example.stringify_keys! # => {"a" => 1, "b" => 2}
|
439
|
+
example # => {"a" => 1, "b" => 2}
|
440
|
+
----
|
441
|
+
|
442
|
+
===== #symbolize_keys
|
443
|
+
|
444
|
+
Converts keys to symbols without mutating itself.
|
445
|
+
|
446
|
+
[source,ruby]
|
447
|
+
----
|
448
|
+
example = {"a" => 1, "b" => 2}
|
449
|
+
example.symbolize_keys # => {a: 1, b: 2}
|
450
|
+
example # => {"a" => 1, "b" => 2}
|
451
|
+
----
|
452
|
+
|
453
|
+
===== #symbolize_keys!
|
454
|
+
|
455
|
+
Converts keys to symbols while mutating itself.
|
456
|
+
|
457
|
+
[source,ruby]
|
458
|
+
----
|
459
|
+
example = {"a" => 1, "b" => 2}
|
460
|
+
example.symbolize_keys! # => {a: 1, b: 2}
|
461
|
+
example # => {a: 1, b: 2}
|
462
|
+
----
|
463
|
+
|
462
464
|
===== #use
|
463
465
|
|
464
466
|
Passes each hash value as a block argument for further processing.
|
@@ -486,18 +488,6 @@ io = IO.void { |void| void.write "nevermore" }
|
|
486
488
|
io.closed? # => true
|
487
489
|
----
|
488
490
|
|
489
|
-
===== #squelch
|
490
|
-
|
491
|
-
Temporarily ignores any reads/writes for current stream for all code executed within the block. When
|
492
|
-
not given a block, it answers itself.
|
493
|
-
|
494
|
-
[source,ruby]
|
495
|
-
----
|
496
|
-
io = IO.new IO.sysopen(Pathname("test.txt").to_s, "w+")
|
497
|
-
io.squelch { io.write "Test" }
|
498
|
-
io.reread # => ""
|
499
|
-
----
|
500
|
-
|
501
491
|
===== #redirect
|
502
492
|
|
503
493
|
Redirects current stream to other stream when given a block. Without a block, the original stream is
|
@@ -532,6 +522,18 @@ io.reread(buffer: buffer)
|
|
532
522
|
buffer # => "This is a test."
|
533
523
|
----
|
534
524
|
|
525
|
+
===== #squelch
|
526
|
+
|
527
|
+
Temporarily ignores any reads/writes for current stream for all code executed within the block. When
|
528
|
+
not given a block, it answers itself.
|
529
|
+
|
530
|
+
[source,ruby]
|
531
|
+
----
|
532
|
+
io = IO.new IO.sysopen(Pathname("test.txt").to_s, "w+")
|
533
|
+
io.squelch { io.write "Test" }
|
534
|
+
io.reread # => ""
|
535
|
+
----
|
536
|
+
|
535
537
|
==== Pathname
|
536
538
|
|
537
539
|
===== Pathname
|
@@ -546,13 +548,20 @@ can still be used to construct a valid path.
|
|
546
548
|
Pathname(nil) # => Pathname("")
|
547
549
|
----
|
548
550
|
|
549
|
-
===== #
|
551
|
+
===== #change_dir
|
550
552
|
|
551
|
-
|
553
|
+
Inherits and wraps `Dir.chdir` behavior by changing to directory of current path. See
|
554
|
+
link:https://rubyapi.org/2.7/o/s?q=Dir.chdir[Dir.chdir] for details.
|
552
555
|
|
553
556
|
[source,ruby]
|
554
557
|
----
|
555
|
-
Pathname
|
558
|
+
Pathname.pwd # => "/"
|
559
|
+
Pathname("/test").make_dir.change_dir # => Pathname "/test"
|
560
|
+
Pathname.pwd # => "/test"
|
561
|
+
|
562
|
+
Pathname.pwd # => "/"
|
563
|
+
Pathname("/test").make_dir.change_dir { # Implementation details } # => Pathname "/test"
|
564
|
+
Pathname.pwd # => "/"
|
556
565
|
----
|
557
566
|
|
558
567
|
===== #copy
|
@@ -608,78 +617,111 @@ Pathname("/%placeholder%/some/%placeholder%").gsub("%placeholder%", "test")
|
|
608
617
|
# => Pathname("/test/some/test")
|
609
618
|
----
|
610
619
|
|
611
|
-
===== #
|
620
|
+
===== #make_ancestors
|
612
621
|
|
613
|
-
|
622
|
+
Ensures all ancestor directories are created for a path.
|
614
623
|
|
615
624
|
[source,ruby]
|
616
625
|
----
|
617
|
-
Pathname("/one/two
|
626
|
+
Pathname("/one/two").make_ancestors
|
627
|
+
Pathname("/one").exist? # => true
|
628
|
+
Pathname("/one/two").exist? # => false
|
618
629
|
----
|
619
630
|
|
620
|
-
===== #
|
631
|
+
===== #make_dir
|
621
632
|
|
622
|
-
|
633
|
+
Provides alternative `#mkdir` behavior by always answering itself (even when directory exists) and
|
634
|
+
not throwing errors when directory does exist in order to ensure the pathname can be chained.
|
623
635
|
|
624
636
|
[source,ruby]
|
625
637
|
----
|
626
|
-
Pathname("/one/
|
627
|
-
Pathname("/one").
|
628
|
-
Pathname("/one/two").exist? # => false
|
638
|
+
Pathname("/one").make_dir # => Pathname("/one")
|
639
|
+
Pathname("/one").make_dir.make_dir # => Pathname("/one")
|
629
640
|
----
|
630
641
|
|
631
|
-
===== #
|
642
|
+
===== #make_path
|
632
643
|
|
633
|
-
|
634
|
-
errors when directory
|
644
|
+
Provides alternative `#mkpath` behavior by always answering itself (even when full path exists) and
|
645
|
+
not throwing errors when directory does exist in order to ensure the pathname can be chained.
|
635
646
|
|
636
647
|
[source,ruby]
|
637
648
|
----
|
638
|
-
Pathname("/one").
|
639
|
-
Pathname("/one").
|
649
|
+
Pathname("/one/two/three").make_path # => Pathname("/one/two/three")
|
650
|
+
Pathname("/one/two/three").make_path.make_path # => Pathname("/one/two/three")
|
640
651
|
----
|
641
652
|
|
642
|
-
===== #
|
653
|
+
===== #name
|
643
654
|
|
644
|
-
|
645
|
-
immediate writing back to the same file.
|
655
|
+
Answers file name without extension.
|
646
656
|
|
647
657
|
[source,ruby]
|
648
658
|
----
|
649
|
-
Pathname("
|
659
|
+
Pathname("example.txt").name # => Pathname("example")
|
650
660
|
----
|
651
661
|
|
652
|
-
===== #
|
662
|
+
===== #relative_parent
|
653
663
|
|
654
|
-
|
664
|
+
Answers relative path from parent directory. This is a complement to `#relative_path_from`.
|
655
665
|
|
656
666
|
[source,ruby]
|
657
667
|
----
|
658
|
-
Pathname("
|
659
|
-
Pathname("example.txt").touch at: Time.now - 1
|
668
|
+
Pathname("/one/two/three").relative_parent("/one") # => Pathname "two"
|
660
669
|
----
|
661
670
|
|
662
|
-
|
671
|
+
===== #remove_dir
|
663
672
|
|
664
|
-
|
673
|
+
Provides alternative `#rmdir` behavior by always answering itself (even when full path exists) and
|
674
|
+
not throwing errors when directory does exist in order to ensure the pathname can be chained.
|
665
675
|
|
666
|
-
|
676
|
+
[source,ruby]
|
677
|
+
----
|
678
|
+
Pathname("/test").make_dir.remove_dir.exist? # => false
|
679
|
+
Pathname("/test").remove_dir # => Pathname("/test")
|
680
|
+
Pathname("/test").remove_dir.remove_dir # => Pathname("/test")
|
681
|
+
----
|
682
|
+
|
683
|
+
===== #remove_tree
|
684
|
+
|
685
|
+
Provides alternative `#rmtree` behavior by always answering itself (even when full path exists) and
|
686
|
+
not throwing errors when directory does exist in order to ensure the pathname can be chained.
|
667
687
|
|
668
688
|
[source,ruby]
|
669
689
|
----
|
670
|
-
|
671
|
-
|
690
|
+
parent_path = Pathname "/one"
|
691
|
+
child_path = parent_path.join "two"
|
692
|
+
|
693
|
+
child_path.make_path
|
694
|
+
child_path.remove_tree # => Pathname "/one/two"
|
695
|
+
child_path.exist? # => false
|
696
|
+
paremt_path.exist? # => true
|
697
|
+
|
698
|
+
child_path.make_path
|
699
|
+
parent_path.remove_tree # => Pathname "/one"
|
700
|
+
child_path.exist? # => false
|
701
|
+
parent_path.exist? # => false
|
672
702
|
----
|
673
703
|
|
674
|
-
===== #
|
704
|
+
===== #rewrite
|
675
705
|
|
676
|
-
|
706
|
+
When given a block, it provides the contents of the recently read file for manipulation and
|
707
|
+
immediate writing back to the same file.
|
677
708
|
|
678
709
|
[source,ruby]
|
679
710
|
----
|
680
|
-
"
|
681
|
-
|
711
|
+
Pathname("/test.txt").rewrite { |content| content.sub "[placeholder]", "example" }
|
712
|
+
----
|
713
|
+
|
714
|
+
===== #touch
|
715
|
+
|
716
|
+
Updates access and modification times for path. Defaults to current time.
|
717
|
+
|
718
|
+
[source,ruby]
|
682
719
|
----
|
720
|
+
Pathname("example.txt").touch
|
721
|
+
Pathname("example.txt").touch at: Time.now - 1
|
722
|
+
----
|
723
|
+
|
724
|
+
==== String
|
683
725
|
|
684
726
|
===== #blank?
|
685
727
|
|
@@ -690,13 +732,13 @@ Answers `true`/`false` based on whether string is blank, `<space>`, `\n`, `\t`,
|
|
690
732
|
" \n\t\r".blank? # => true
|
691
733
|
----
|
692
734
|
|
693
|
-
===== #
|
735
|
+
===== #camelcase
|
694
736
|
|
695
|
-
Answers
|
737
|
+
Answers a camelcased string.
|
696
738
|
|
697
739
|
[source,ruby]
|
698
740
|
----
|
699
|
-
"
|
741
|
+
"this_is_an_example".camelcase # => "ThisIsAnExample"
|
700
742
|
----
|
701
743
|
|
702
744
|
===== #down
|
@@ -708,6 +750,16 @@ Answers string with only first letter downcased.
|
|
708
750
|
"EXAMPLE".down # => "eXAMPLE"
|
709
751
|
----
|
710
752
|
|
753
|
+
===== #first
|
754
|
+
|
755
|
+
Answers first character of a string or first set of characters if given a number.
|
756
|
+
|
757
|
+
[source,ruby]
|
758
|
+
----
|
759
|
+
"example".first # => "e"
|
760
|
+
"example".first 4 # => "exam"
|
761
|
+
----
|
762
|
+
|
711
763
|
===== #indent
|
712
764
|
|
713
765
|
Answers string indented by two spaces by default.
|
@@ -721,13 +773,14 @@ Answers string indented by two spaces by default.
|
|
721
773
|
"example".indent 3, padding: " " # => " example"
|
722
774
|
----
|
723
775
|
|
724
|
-
===== #
|
776
|
+
===== #last
|
725
777
|
|
726
|
-
Answers a
|
778
|
+
Answers last character of a string or last set of characters if given a number.
|
727
779
|
|
728
780
|
[source,ruby]
|
729
781
|
----
|
730
|
-
"
|
782
|
+
"instant".last # => "t"
|
783
|
+
"instant".last 3 # => "ant"
|
731
784
|
----
|
732
785
|
|
733
786
|
===== #snakecase
|
@@ -761,6 +814,15 @@ Answers string as a boolean.
|
|
761
814
|
"example".to_bool # => false
|
762
815
|
----
|
763
816
|
|
817
|
+
===== #up
|
818
|
+
|
819
|
+
Answers string with only first letter upcased.
|
820
|
+
|
821
|
+
[source,ruby]
|
822
|
+
----
|
823
|
+
"example".up # => "Example"
|
824
|
+
----
|
825
|
+
|
764
826
|
==== String IO
|
765
827
|
|
766
828
|
===== #reread
|
data/lib/refinements/arrays.rb
CHANGED
@@ -11,6 +11,10 @@ module Refinements
|
|
11
11
|
replace compress
|
12
12
|
end
|
13
13
|
|
14
|
+
def exclude *elements
|
15
|
+
self - elements.flatten
|
16
|
+
end
|
17
|
+
|
14
18
|
def include *elements
|
15
19
|
self + elements.flatten
|
16
20
|
end
|
@@ -19,10 +23,6 @@ module Refinements
|
|
19
23
|
product([elements]).tap(&:pop).flatten.push last
|
20
24
|
end
|
21
25
|
|
22
|
-
def exclude *elements
|
23
|
-
self - elements.flatten
|
24
|
-
end
|
25
|
-
|
26
26
|
def mean
|
27
27
|
size.zero? ? 0 : sum(0) / size
|
28
28
|
end
|
data/lib/refinements/hashes.rb
CHANGED
@@ -13,49 +13,6 @@ module Refinements
|
|
13
13
|
end
|
14
14
|
|
15
15
|
refine Hash do
|
16
|
-
def except *keys
|
17
|
-
reject { |key, _value| keys.include? key }
|
18
|
-
end
|
19
|
-
|
20
|
-
def except! *keys
|
21
|
-
replace except(*keys)
|
22
|
-
end
|
23
|
-
|
24
|
-
# :reek:TooManyStatements
|
25
|
-
def flatten_keys prefix: nil, delimiter: "_", cast: :to_sym
|
26
|
-
fail StandardError, "Unknown cast: #{cast}." unless %i[to_sym to_s].include? cast
|
27
|
-
|
28
|
-
reduce({}) do |flat, (key, value)|
|
29
|
-
flat_key = prefix ? "#{prefix}#{delimiter}#{key}" : key
|
30
|
-
|
31
|
-
next flat.merge flat_key.public_send(cast) => value unless value.is_a? self.class
|
32
|
-
|
33
|
-
flat.merge(
|
34
|
-
recurse { value.flatten_keys prefix: flat_key, delimiter: delimiter, cast: cast }
|
35
|
-
)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def flatten_keys! prefix: nil, delimiter: "_", cast: :to_sym
|
40
|
-
replace flatten_keys(prefix: prefix, delimiter: delimiter, cast: cast)
|
41
|
-
end
|
42
|
-
|
43
|
-
def stringify_keys
|
44
|
-
reduce({}) { |hash, (key, value)| hash.merge key.to_s => value }
|
45
|
-
end
|
46
|
-
|
47
|
-
def stringify_keys!
|
48
|
-
replace stringify_keys
|
49
|
-
end
|
50
|
-
|
51
|
-
def symbolize_keys
|
52
|
-
reduce({}) { |hash, (key, value)| hash.merge key.to_sym => value }
|
53
|
-
end
|
54
|
-
|
55
|
-
def symbolize_keys!
|
56
|
-
replace symbolize_keys
|
57
|
-
end
|
58
|
-
|
59
16
|
def deep_merge other
|
60
17
|
clazz = self.class
|
61
18
|
|
@@ -88,6 +45,33 @@ module Refinements
|
|
88
45
|
replace deep_symbolize_keys
|
89
46
|
end
|
90
47
|
|
48
|
+
def except *keys
|
49
|
+
reject { |key, _value| keys.include? key }
|
50
|
+
end
|
51
|
+
|
52
|
+
def except! *keys
|
53
|
+
replace except(*keys)
|
54
|
+
end
|
55
|
+
|
56
|
+
# :reek:TooManyStatements
|
57
|
+
def flatten_keys prefix: nil, delimiter: "_", cast: :to_sym
|
58
|
+
fail StandardError, "Unknown cast: #{cast}." unless %i[to_sym to_s].include? cast
|
59
|
+
|
60
|
+
reduce({}) do |flat, (key, value)|
|
61
|
+
flat_key = prefix ? "#{prefix}#{delimiter}#{key}" : key
|
62
|
+
|
63
|
+
next flat.merge flat_key.public_send(cast) => value unless value.is_a? self.class
|
64
|
+
|
65
|
+
flat.merge(
|
66
|
+
recurse { value.flatten_keys prefix: flat_key, delimiter: delimiter, cast: cast }
|
67
|
+
)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def flatten_keys! prefix: nil, delimiter: "_", cast: :to_sym
|
72
|
+
replace flatten_keys(prefix: prefix, delimiter: delimiter, cast: cast)
|
73
|
+
end
|
74
|
+
|
91
75
|
def recurse &block
|
92
76
|
return self unless block_given?
|
93
77
|
|
@@ -118,6 +102,22 @@ module Refinements
|
|
118
102
|
replace reverse_merge(other)
|
119
103
|
end
|
120
104
|
|
105
|
+
def stringify_keys
|
106
|
+
reduce({}) { |hash, (key, value)| hash.merge key.to_s => value }
|
107
|
+
end
|
108
|
+
|
109
|
+
def stringify_keys!
|
110
|
+
replace stringify_keys
|
111
|
+
end
|
112
|
+
|
113
|
+
def symbolize_keys
|
114
|
+
reduce({}) { |hash, (key, value)| hash.merge key.to_sym => value }
|
115
|
+
end
|
116
|
+
|
117
|
+
def symbolize_keys!
|
118
|
+
replace symbolize_keys
|
119
|
+
end
|
120
|
+
|
121
121
|
def use &block
|
122
122
|
return [] unless block_given?
|
123
123
|
|
data/lib/refinements/identity.rb
CHANGED
data/lib/refinements/ios.rb
CHANGED
@@ -14,10 +14,6 @@ module Refinements
|
|
14
14
|
end
|
15
15
|
|
16
16
|
refine IO do
|
17
|
-
def squelch &block
|
18
|
-
self.class.void.then { |void| redirect(void, &block) }
|
19
|
-
end
|
20
|
-
|
21
17
|
def redirect other
|
22
18
|
return self unless block_given?
|
23
19
|
|
@@ -30,6 +26,10 @@ module Refinements
|
|
30
26
|
def reread length = nil, buffer: nil
|
31
27
|
tap(&:rewind).read length, buffer
|
32
28
|
end
|
29
|
+
|
30
|
+
def squelch &block
|
31
|
+
self.class.void.then { |void| redirect(void, &block) }
|
32
|
+
end
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
@@ -13,8 +13,9 @@ module Refinements
|
|
13
13
|
end
|
14
14
|
|
15
15
|
refine Pathname do
|
16
|
-
def
|
17
|
-
|
16
|
+
def change_dir &block
|
17
|
+
Dir.chdir(self, &block)
|
18
|
+
self
|
18
19
|
end
|
19
20
|
|
20
21
|
def copy to
|
@@ -39,6 +40,28 @@ module Refinements
|
|
39
40
|
self.class.new to_s.gsub(pattern, replacement)
|
40
41
|
end
|
41
42
|
|
43
|
+
def make_ancestors
|
44
|
+
dirname.mkpath
|
45
|
+
self
|
46
|
+
end
|
47
|
+
|
48
|
+
def make_dir
|
49
|
+
exist? ? self : mkdir and self
|
50
|
+
end
|
51
|
+
|
52
|
+
def make_path
|
53
|
+
mkpath
|
54
|
+
self
|
55
|
+
end
|
56
|
+
|
57
|
+
def mkdir
|
58
|
+
exist? ? self : super and self
|
59
|
+
end
|
60
|
+
|
61
|
+
def name
|
62
|
+
basename extname
|
63
|
+
end
|
64
|
+
|
42
65
|
def relative_parent root_dir
|
43
66
|
relative_path_from(root_dir).parent
|
44
67
|
end
|
@@ -49,16 +72,14 @@ module Refinements
|
|
49
72
|
relative_parent root_dir
|
50
73
|
end
|
51
74
|
|
52
|
-
def
|
53
|
-
|
54
|
-
self
|
75
|
+
def remove_dir
|
76
|
+
exist? ? (rmdir and self) : self
|
55
77
|
end
|
56
78
|
|
57
|
-
|
58
|
-
|
59
|
-
self
|
79
|
+
def remove_tree
|
80
|
+
rmtree if exist?
|
81
|
+
self
|
60
82
|
end
|
61
|
-
# rubocop:enable Style/RedundantSelf
|
62
83
|
|
63
84
|
def rewrite
|
64
85
|
read.then { |content| write yield(content) if block_given? }
|
data/lib/refinements/strings.rb
CHANGED
@@ -12,42 +12,33 @@ module Refinements
|
|
12
12
|
end
|
13
13
|
|
14
14
|
refine String do
|
15
|
-
def
|
16
|
-
|
17
|
-
|
18
|
-
max = Integer number
|
15
|
+
def blank?
|
16
|
+
match?(/\A\s*\z/)
|
17
|
+
end
|
19
18
|
|
20
|
-
|
21
|
-
return
|
19
|
+
def camelcase
|
20
|
+
return up unless match? DELIMITERS
|
22
21
|
|
23
|
-
|
22
|
+
split(%r(\s*-\s*|\s*/\s*|\s*:+\s*)).then { |parts| combine parts, :up, "::" }
|
23
|
+
.then { |text| text.split(/\s*_\s*|\s+/) }
|
24
|
+
.then { |parts| combine parts, :up }
|
24
25
|
end
|
25
26
|
|
26
|
-
def
|
27
|
+
def down
|
27
28
|
return self if empty?
|
28
29
|
|
29
|
-
|
30
|
-
|
31
|
-
return self[size - 1] if min.zero?
|
32
|
-
return "" if min.negative?
|
33
|
-
|
34
|
-
self[(min + 1)..]
|
35
|
-
end
|
36
|
-
|
37
|
-
def blank?
|
38
|
-
match?(/\A\s*\z/)
|
30
|
+
first.downcase + self[1, size]
|
39
31
|
end
|
40
32
|
|
41
|
-
def
|
33
|
+
def first number = 0
|
42
34
|
return self if empty?
|
43
35
|
|
44
|
-
|
45
|
-
end
|
36
|
+
max = Integer number
|
46
37
|
|
47
|
-
|
48
|
-
return
|
38
|
+
return self[0] if max.zero?
|
39
|
+
return "" if max.negative?
|
49
40
|
|
50
|
-
|
41
|
+
self[..(max - 1)]
|
51
42
|
end
|
52
43
|
|
53
44
|
def indent multiplier = 1, padding: " "
|
@@ -56,12 +47,15 @@ module Refinements
|
|
56
47
|
padding * multiplier + self
|
57
48
|
end
|
58
49
|
|
59
|
-
def
|
60
|
-
return
|
50
|
+
def last number = 0
|
51
|
+
return self if empty?
|
61
52
|
|
62
|
-
|
63
|
-
|
64
|
-
|
53
|
+
min = Integer number
|
54
|
+
|
55
|
+
return self[size - 1] if min.zero?
|
56
|
+
return "" if min.negative?
|
57
|
+
|
58
|
+
self[(min + 1)..]
|
65
59
|
end
|
66
60
|
|
67
61
|
def snakecase
|
@@ -84,6 +78,12 @@ module Refinements
|
|
84
78
|
%w[true yes on t y 1].include? downcase.strip
|
85
79
|
end
|
86
80
|
|
81
|
+
def up
|
82
|
+
return self if empty?
|
83
|
+
|
84
|
+
first.upcase + self[1, size]
|
85
|
+
end
|
86
|
+
|
87
87
|
private
|
88
88
|
|
89
89
|
# :reek:DuplicateMethodCall
|
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: 7.
|
4
|
+
version: 7.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brooke Kuhlmann
|
@@ -28,7 +28,7 @@ cert_chain:
|
|
28
28
|
2XV8FRa7/JimI07sPLC13eLY3xd/aYTi85Z782KIA4j0G8XEEWAX0ouBhlXPocZv
|
29
29
|
QWc=
|
30
30
|
-----END CERTIFICATE-----
|
31
|
-
date: 2020-11-
|
31
|
+
date: 2020-11-07 00:00:00.000000000 Z
|
32
32
|
dependencies:
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: bundler-audit
|
metadata.gz.sig
CHANGED
Binary file
|