refinements 7.12.0 → 7.13.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 +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
|