refinements 9.3.3 → 9.6.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: 45b1bdce43acf8214718786c93fea980981facaf122c63c146f8cf441bd83f43
4
- data.tar.gz: e252fc216237d62623600447037dcaf1d35a52f5940119802472f20d736db9e8
3
+ metadata.gz: 5c0144180dd3a5cabe861b385cd0c766eaf54280ca6812dc6e82db4e564ce6c0
4
+ data.tar.gz: b339710c168c98fffbe5b1994031f033041c9f6c16b0df96555cb80fd5cd7269
5
5
  SHA512:
6
- metadata.gz: 764a260bb45b9e7166d1e93f8403db75d0162604161b4a51fc95ced2eaa77f0fca8fbc5e2cc51f7b26bbf9212c3f5f3d56d7bdc0548b855886301d4272e3d409
7
- data.tar.gz: 7671415d0c5a05a95835ac1b5f3ff6273df8a97c34b0d949d374eac1d928e1fbdaa9488243955ce055145901206c1426ea13de31d659818f6aaa4d6ab16d889d
6
+ metadata.gz: 926090205f29ac111494e00e7de37b59b8549c6f979c8a0d62d852e9d87193093073ac0f005564243fc472eacf4de68f62bea8b1d45f3f363e113805758f726d
7
+ data.tar.gz: 22a524d073a48922d6347119f01f4c059bbd2bba8f65a2e6573951b137b772dc3f7797a3596ccb850bb63159a9b2ab501bb334f7ac8a80f66ca93f55886bdb09
checksums.yaml.gz.sig CHANGED
Binary file
data/README.adoc CHANGED
@@ -21,6 +21,8 @@ Enhances the following objects:
21
21
  * DateTime
22
22
  * Hash
23
23
  * IO
24
+ * LogDevice
25
+ * Logger
24
26
  * Pathname
25
27
  * String
26
28
  * StringIO
@@ -73,6 +75,8 @@ require "refinements/strings"
73
75
  require "refinements/string_ios"
74
76
  require "refinements/structs"
75
77
  require "refinements/symbols"
78
+ require "refinements/log_devices"
79
+ require "refinements/loggers"
76
80
  ----
77
81
 
78
82
  === Using
@@ -93,6 +97,8 @@ class Example
93
97
  using Refinements::StringIOs
94
98
  using Refinements::Structs
95
99
  using Refinements::Symbols
100
+ using Refinements::LogDevices
101
+ using Refinements::Loggers
96
102
  end
97
103
  ----
98
104
 
@@ -102,6 +108,24 @@ The following sections demonstrate how each refinement enriches your objects wit
102
108
 
103
109
  ==== Array
104
110
 
111
+ ===== #combinatorial?
112
+
113
+ Answers if an array is equal to another array when the elements are equal but in any order and/or subset.
114
+
115
+ [source,ruby]
116
+ ----
117
+ example = %w[a b c]
118
+
119
+ example.combinatorial? %w[a b c] # true
120
+ example.combinatorial? %w[c a b] # true
121
+ example.combinatorial? %w[c] # true
122
+ example.combinatorial? %w[c b] # true
123
+ example.combinatorial? %w[x] # false
124
+ example.combinatorial? %w[z b c] # false
125
+ example.combinatorial? %w[a b c d] # false
126
+ example.combinatorial? [] # false
127
+ ----
128
+
105
129
  ===== #compress
106
130
 
107
131
  Removes `nil` and empty objects without mutating itself.
@@ -254,6 +278,21 @@ example.ring { |(before, current, after)| puts "#{before} #{current} #{after}" }
254
278
  # [2 3 1]
255
279
  ----
256
280
 
281
+ ===== #to_sentence
282
+
283
+ Answers a sentence using `", "` as the default delimiter and `"and"` as the default conjunction.
284
+ Useful when building documentation, answering human readable error messages, etc.
285
+
286
+ [source,ruby]
287
+ ----
288
+ [].to_sentence # ""
289
+ ["test"].to_sentence # "test"
290
+ ["a", :b].to_sentence # "a and b"
291
+ [1, "a", :b, 2.0, /\w+/].map(&:inspect).to_sentence # 1, "a", :b, 2.0, and /\w+/
292
+ %w[one two three].to_sentence # "one, two, and three"
293
+ %w[eins zwei drei].to_sentence delimiter: " ", conjunction: "und" # "eins zwei und drei"
294
+ ----
295
+
257
296
  ==== Big Decimal
258
297
 
259
298
  ===== #inspect
@@ -581,6 +620,54 @@ io.squelch { io.write "Test" } # "#<IO:fd 20>"
581
620
  io.reread # ""
582
621
  ----
583
622
 
623
+ ==== LogDevice
624
+
625
+ ===== #reread
626
+
627
+ Answers previously written content by rewinding to beginning of device.
628
+
629
+ [source,ruby]
630
+ ----
631
+ # With File.
632
+ device = Logger::LogDevice.new "test.log"
633
+ device.write "Test."
634
+ device.reread # "Test."
635
+
636
+ # With StringIO.
637
+ device = Logger::LogDevice.new StringIO.new
638
+ device.write "Test."
639
+ device.reread # "Test."
640
+
641
+ # With STDOUT.
642
+ device = Logger::LogDevice.new $stdout
643
+ device.write "Test."
644
+ device.reread # ""
645
+ ----
646
+
647
+ ==== Logger
648
+
649
+ ===== #reread
650
+
651
+ Answers previously written content by rewinding to beginning of log.
652
+
653
+ [source,ruby]
654
+ ----
655
+ # With File.
656
+ logger = Logger.new "test.log"
657
+ logger.write "Test."
658
+ logger.reread # "Test."
659
+
660
+ # With StringIO.
661
+ logger = Logger.new StringIO.new
662
+ logger.write "Test."
663
+ logger.reread # "Test."
664
+
665
+ # With STDOUT.
666
+ logger = Logger.new $stdout
667
+ logger.write "Test."
668
+ logger.reread # ""
669
+ ----
670
+
584
671
  ==== Pathname
585
672
 
586
673
  ===== Pathname
@@ -8,6 +8,8 @@ module Refinements
8
8
  refine Array do
9
9
  import_methods Shared::Enumerables::Many
10
10
 
11
+ def combinatorial?(other) = !other.empty? && size == union(other).size
12
+
11
13
  def compress = dup.compress!
12
14
 
13
15
  def compress!
@@ -32,6 +34,14 @@ module Refinements
32
34
  def pad(value, max: size) = dup.fill(value, size..(max - 1))
33
35
 
34
36
  def ring(&) = [last, *self, first].each_cons(3, &)
37
+
38
+ def to_sentence delimiter: ", ", conjunction: "and"
39
+ case length
40
+ when (3..) then "#{self[..-2].join delimiter}#{delimiter}#{conjunction} #{last}"
41
+ when 2 then join " #{conjunction} "
42
+ else join
43
+ end
44
+ end
35
45
  end
36
46
  end
37
47
  end
@@ -21,7 +21,8 @@ module Refinements
21
21
  def compress!
22
22
  return self if empty?
23
23
 
24
- compact!.delete_if { |_key, value| value.respond_to?(:empty?) && value.empty? }
24
+ compact!
25
+ delete_if { |_key, value| value.respond_to?(:empty?) && value.empty? }
25
26
  end
26
27
 
27
28
  def deep_merge other
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "refinements/shared/ios/reread"
4
+
3
5
  module Refinements
4
6
  # Provides additional enhancements to the IO primitive.
5
7
  module IOs
@@ -15,6 +17,8 @@ module Refinements
15
17
  end
16
18
 
17
19
  refine IO do
20
+ import_methods Shared::IOs::Reread
21
+
18
22
  def redirect other
19
23
  return self unless block_given?
20
24
 
@@ -24,8 +28,6 @@ module Refinements
24
28
  reopen backup
25
29
  end
26
30
 
27
- def reread(length = nil, buffer: nil) = tap(&:rewind).read(length, buffer)
28
-
29
31
  def squelch(&) = self.class.void.then { |void| redirect(void, &) }
30
32
  end
31
33
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "logger"
4
+ require "refinements/string_ios"
5
+
6
+ module Refinements
7
+ # Provides additional enhancements to a log device.
8
+ module LogDevices
9
+ using StringIOs
10
+
11
+ refine Logger::LogDevice do
12
+ def reread
13
+ case dev
14
+ when File then dev.class.new(dev).read
15
+ when StringIO then dev.reread
16
+ else ""
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/log_devices"
4
+
5
+ module Refinements
6
+ # Provides additional enhancements to a logger.
7
+ module Loggers
8
+ using LogDevices
9
+
10
+ refine Logger do
11
+ def reread = @logdev.reread
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Refinements
4
+ module Shared
5
+ module IOs
6
+ # Provides shared functionality for I/O object rewinding.
7
+ module Reread
8
+ def reread(length = nil, buffer: nil) = tap(&:rewind).read(length, buffer)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -1,12 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "stringio"
4
+ require "refinements/shared/ios/reread"
4
5
 
5
6
  module Refinements
6
7
  # Provides additional enhancements to the StringIO primitive.
7
8
  module StringIOs
8
9
  refine StringIO do
9
- def reread(length = nil, buffer: nil) = tap(&:rewind).read(length, buffer)
10
+ import_methods Shared::IOs::Reread
10
11
  end
11
12
  end
12
13
  end
data/lib/refinements.rb CHANGED
@@ -10,3 +10,5 @@ require "refinements/strings"
10
10
  require "refinements/string_ios"
11
11
  require "refinements/structs"
12
12
  require "refinements/symbols"
13
+ require "refinements/log_devices"
14
+ require "refinements/loggers"
data/refinements.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "refinements"
5
- spec.version = "9.3.3"
5
+ spec.version = "9.6.0"
6
6
  spec.authors = ["Brooke Kuhlmann"]
7
7
  spec.email = ["brooke@alchemists.io"]
8
8
  spec.homepage = "https://www.alchemists.io/projects/refinements"
@@ -13,6 +13,7 @@ Gem::Specification.new do |spec|
13
13
  "bug_tracker_uri" => "https://github.com/bkuhlmann/refinements/issues",
14
14
  "changelog_uri" => "https://www.alchemists.io/projects/refinements/versions",
15
15
  "documentation_uri" => "https://www.alchemists.io/projects/refinements",
16
+ "funding_uri" => "https://github.com/sponsors/bkuhlmann",
16
17
  "label" => "Refinements",
17
18
  "rubygems_mfa_required" => "true",
18
19
  "source_code_uri" => "https://github.com/bkuhlmann/refinements"
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: refinements
3
3
  version: !ruby/object:Gem::Version
4
- version: 9.3.3
4
+ version: 9.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brooke Kuhlmann
@@ -28,7 +28,7 @@ cert_chain:
28
28
  CxDe2+VuChj4I1nvIHdu+E6XoEVlanUPKmSg6nddhkKn2gC45Kyzh6FZqnzH/CRp
29
29
  RFE=
30
30
  -----END CERTIFICATE-----
31
- date: 2022-04-23 00:00:00.000000000 Z
31
+ date: 2022-07-17 00:00:00.000000000 Z
32
32
  dependencies: []
33
33
  description:
34
34
  email:
@@ -47,8 +47,11 @@ files:
47
47
  - lib/refinements/date_times.rb
48
48
  - lib/refinements/hashes.rb
49
49
  - lib/refinements/ios.rb
50
+ - lib/refinements/log_devices.rb
51
+ - lib/refinements/loggers.rb
50
52
  - lib/refinements/pathnames.rb
51
53
  - lib/refinements/shared/enumerables/many.rb
54
+ - lib/refinements/shared/ios/reread.rb
52
55
  - lib/refinements/string_ios.rb
53
56
  - lib/refinements/strings.rb
54
57
  - lib/refinements/structs.rb
@@ -61,6 +64,7 @@ metadata:
61
64
  bug_tracker_uri: https://github.com/bkuhlmann/refinements/issues
62
65
  changelog_uri: https://www.alchemists.io/projects/refinements/versions
63
66
  documentation_uri: https://www.alchemists.io/projects/refinements
67
+ funding_uri: https://github.com/sponsors/bkuhlmann
64
68
  label: Refinements
65
69
  rubygems_mfa_required: 'true'
66
70
  source_code_uri: https://github.com/bkuhlmann/refinements
@@ -79,7 +83,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
79
83
  - !ruby/object:Gem::Version
80
84
  version: '0'
81
85
  requirements: []
82
- rubygems_version: 3.3.12
86
+ rubygems_version: 3.3.18
83
87
  signing_key:
84
88
  specification_version: 4
85
89
  summary: A collection of refinements to core Ruby objects.
metadata.gz.sig CHANGED
Binary file