refinements 8.0.1 → 8.2.1

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: aa3c406709e8a34ba5de77de6416ba4a180a42dc994252fb35b9414a73d941c2
4
- data.tar.gz: 99426faa5a56f5352ed5620fe4a94e090121c7bd7555ad3c15d0b3a8beee65a1
3
+ metadata.gz: 3357c002920480a640ec080da0e8744f04a0883fa5ec54b75a88b77f7d2101d6
4
+ data.tar.gz: f7bd7990e5f362ec9b08e06f42beca263bff1c78be5a68d834cf7dc4fe58e961
5
5
  SHA512:
6
- metadata.gz: eeb946bc0824dd153fd3bb4615287b0e088c10693c45bdc728e2ee4f2f75207f079584d357afd3085ff289b3cbae45f1f5e14aeb099c0170e78adc0b6012a6bb
7
- data.tar.gz: 2fbe37e1cbc1f8c4cc966f7f3d7db70a74481481ecc4c5770053d2b156dfc681e6fd8b2ab1f4432d87daa719a9c6962dd8354a42011ccce61ed7c40d29768d25
6
+ metadata.gz: 968fc32529ba33a2833b814d722e38e0a5caffcfc3eba154528838a75469a0701847e3a9419d395d632a4c47cf52d927420e95558b90e0cb1b0868066ee99cd9
7
+ data.tar.gz: 3839e9d117a58251fd9304ad628a76aab0f22f7210542633e2e2fdc13abe38b38c25a126c111430f0c454bf29b5cc6c0b2a94d9473ed6caa59396dedeca8c2ba
checksums.yaml.gz.sig CHANGED
@@ -1,2 +1,2 @@
1
- �$�P�~�C���eY���&�"`L�%C{+z@t,6�O5��Hd�D����&wy��5]l5K��j%�͖�zK���������KGn��.td �ٖ]�-�es�gw{�������S �&3���|�&��py�T�R�#¦��%?I�m"V�����#VFk�](��55��y�t$Si@)�����iC�#���24�M{��r������*i��stk��Eu3�.t_?o�~"��3�
2
- �5��}
1
+ VmT7 �:�UlVCȡ�]��0*���8Omr�;��VHRY'������ma͒X����O1���KW%��2U����0$�ٗ>[.T,F�@랉\��[&2ѯ�ƞ��r�X�˅(�O#7dr#��g��0aJ��1yK1�bbV��N���sG��
2
+ m��
data.tar.gz.sig CHANGED
Binary file
data/README.adoc CHANGED
@@ -135,6 +135,23 @@ Removes given array or elements without mutating itself.
135
135
  [1, 2, 3, 4, 5].excluding 4, 5 # => [1, 2, 3]
136
136
  ----
137
137
 
138
+ ===== #filter_find
139
+
140
+ Answers the first truthy and filtered result from a collection.
141
+
142
+ [source,ruby]
143
+ ----
144
+ handlers = [
145
+ ->(object) { object if object == :b },
146
+ proc { false },
147
+ ->(object) { object if object == :a }
148
+ ]
149
+
150
+ handlers.filter_find # => Enumerator::Lazy
151
+ handlers.filter_find { |handler| handler.call :a } # => :a
152
+ handlers.filter_find { |handler| handler.call :x } # => nil
153
+ ----
154
+
138
155
  ===== #including
139
156
 
140
157
  Adds given array or elements without mutating itself.
@@ -156,6 +173,19 @@ Inserts additional elements or array between all members of given array.
156
173
  [1, 2, 3].intersperse %i[a b c] # => [1, :a, :b, :c, 2, :a, :b, :c, 3]
157
174
  ----
158
175
 
176
+ ===== #maximum
177
+
178
+ Answers the maximum extracted value from a collection of objects.
179
+
180
+ [source,ruby]
181
+ ----
182
+ Point = Struct.new :x, :y, keyword_init: true
183
+ points = [Point[x: 1, y: 2], Point[x: 0, y: 1], Point[x: 2, y: 3]]
184
+
185
+ points.maximum(:x) # => 2
186
+ points.maximum(:y) # => 3
187
+ ----
188
+
159
189
  ===== #mean
160
190
 
161
191
  Answers mean/average all elements within an array.
@@ -168,6 +198,19 @@ Answers mean/average all elements within an array.
168
198
  [1.25, 1.5, 1.75].mean # => 1.5
169
199
  ----
170
200
 
201
+ ===== #minimum
202
+
203
+ Answers the minimum extracted value from a collection of objects.
204
+
205
+ [source,ruby]
206
+ ----
207
+ Point = Struct.new :x, :y, keyword_init: true
208
+ points = [Point[x: 1, y: 2], Point[x: 0, y: 1], Point[x: 2, y: 3]]
209
+
210
+ points.minimum(:x) # => 0
211
+ points.minimum(:y) # => 1
212
+ ----
213
+
171
214
  ===== #pad
172
215
 
173
216
  Answers new array padded with given value up to a maximum size. Useful in situations where an array
@@ -3,37 +3,27 @@
3
3
  module Refinements
4
4
  module Arrays
5
5
  refine Array do
6
- def compress
7
- compact.reject(&:empty?)
8
- end
6
+ def compress = compact.reject(&:empty?)
9
7
 
10
- def compress!
11
- replace compress
12
- end
8
+ def compress! = replace(compress)
13
9
 
14
- def excluding *elements
15
- self - elements.flatten
16
- end
10
+ def excluding(*elements) = self - elements.flatten
17
11
 
18
- def including *elements
19
- self + elements.flatten
20
- end
12
+ def filter_find(&block) = block ? lazy.map(&block).find(&:itself) : lazy
21
13
 
22
- def intersperse *elements
23
- product([elements]).tap(&:pop).flatten.push last
24
- end
14
+ def including(*elements) = self + elements.flatten
25
15
 
26
- def mean
27
- size.zero? ? 0 : sum(0) / size
28
- end
16
+ def intersperse(*elements) = product([elements]).tap(&:pop).flatten.push(last)
29
17
 
30
- def pad value, max: size
31
- dup.fill value, size..(max - 1)
32
- end
18
+ def maximum(key) = map(&key).max
33
19
 
34
- def ring &block
35
- [last, *self, first].each_cons 3, &block
36
- end
20
+ def mean = size.zero? ? 0 : sum(0.0) / size
21
+
22
+ def minimum(key) = map(&key).min
23
+
24
+ def pad(value, max: size) = dup.fill(value, size..(max - 1))
25
+
26
+ def ring(&block) = [last, *self, first].each_cons(3, &block)
37
27
  end
38
28
  end
39
29
  end
@@ -5,9 +5,7 @@ require "bigdecimal"
5
5
  module Refinements
6
6
  module BigDecimals
7
7
  refine BigDecimal do
8
- def inspect
9
- format "#<BigDecimal:%{id} %{string}>", id: object_id, string: to_s("F")
10
- end
8
+ def inspect = format("#<BigDecimal:%{id} %{string}>", id: object_id, string: to_s("F"))
11
9
  end
12
10
  end
13
11
  end
@@ -5,9 +5,7 @@ require "date"
5
5
  module Refinements
6
6
  module DateTimes
7
7
  refine DateTime.singleton_class do
8
- def utc
9
- now.new_offset 0
10
- end
8
+ def utc = now.new_offset(0)
11
9
  end
12
10
  end
13
11
  end
@@ -7,9 +7,7 @@ module Refinements
7
7
  new { |new_hash, missing_key| new_hash[missing_key] = new(&new_hash.default_proc) }
8
8
  end
9
9
 
10
- def with_default value
11
- new { |new_hash, missing_key| new_hash[missing_key] = value }
12
- end
10
+ def with_default(value) = new { |new_hash, missing_key| new_hash[missing_key] = value }
13
11
  end
14
12
 
15
13
  refine Hash do
@@ -25,25 +23,15 @@ module Refinements
25
23
  end
26
24
  end
27
25
 
28
- def deep_merge! other
29
- replace deep_merge(other)
30
- end
26
+ def deep_merge!(other) = replace(deep_merge(other))
31
27
 
32
- def deep_stringify_keys
33
- recurse(&:stringify_keys)
34
- end
28
+ def deep_stringify_keys = recurse(&:stringify_keys)
35
29
 
36
- def deep_stringify_keys!
37
- replace deep_stringify_keys
38
- end
30
+ def deep_stringify_keys! = replace(deep_stringify_keys)
39
31
 
40
- def deep_symbolize_keys
41
- recurse(&:symbolize_keys)
42
- end
32
+ def deep_symbolize_keys = recurse(&:symbolize_keys)
43
33
 
44
- def deep_symbolize_keys!
45
- replace deep_symbolize_keys
46
- end
34
+ def deep_symbolize_keys! = replace(deep_symbolize_keys)
47
35
 
48
36
  # :reek:TooManyStatements
49
37
  def flatten_keys prefix: nil, delimiter: "_", cast: :to_sym
@@ -74,21 +62,13 @@ module Refinements
74
62
  end
75
63
  end
76
64
 
77
- def stringify_keys
78
- reduce({}) { |hash, (key, value)| hash.merge key.to_s => value }
79
- end
65
+ def stringify_keys = reduce({}) { |hash, (key, value)| hash.merge key.to_s => value }
80
66
 
81
- def stringify_keys!
82
- replace stringify_keys
83
- end
67
+ def stringify_keys! = replace(stringify_keys)
84
68
 
85
- def symbolize_keys
86
- reduce({}) { |hash, (key, value)| hash.merge key.to_sym => value }
87
- end
69
+ def symbolize_keys = reduce({}) { |hash, (key, value)| hash.merge key.to_sym => value }
88
70
 
89
- def symbolize_keys!
90
- replace symbolize_keys
91
- end
71
+ def symbolize_keys! = replace(symbolize_keys)
92
72
 
93
73
  def use &block
94
74
  return [] unless block
@@ -5,7 +5,7 @@ module Refinements
5
5
  module Identity
6
6
  NAME = "refinements"
7
7
  LABEL = "Refinements"
8
- VERSION = "8.0.1"
8
+ VERSION = "8.2.1"
9
9
  VERSION_LABEL = "#{LABEL} #{VERSION}"
10
10
  end
11
11
  end
@@ -23,13 +23,9 @@ module Refinements
23
23
  reopen backup
24
24
  end
25
25
 
26
- def reread length = nil, buffer: nil
27
- tap(&:rewind).read length, buffer
28
- end
26
+ def reread(length = nil, buffer: nil) = tap(&:rewind).read(length, buffer)
29
27
 
30
- def squelch &block
31
- self.class.void.then { |void| redirect(void, &block) }
32
- end
28
+ def squelch(&block) = self.class.void.then { |void| redirect(void, &block) }
33
29
  end
34
30
  end
35
31
  end
@@ -5,6 +5,7 @@ require "pathname"
5
5
  module Refinements
6
6
  module Pathnames
7
7
  refine Kernel do
8
+ # :reek:UncommunicativeMethodName
8
9
  def Pathname object
9
10
  return super(String(object)) unless object
10
11
 
@@ -13,9 +14,7 @@ module Refinements
13
14
  end
14
15
 
15
16
  refine Pathname.singleton_class do
16
- def home
17
- new ENV["HOME"]
18
- end
17
+ def home = new(ENV["HOME"])
19
18
 
20
19
  def make_temp_dir prefix: "temp-", suffix: nil, root: nil
21
20
  Dir.mktmpdir([prefix, suffix], root) { |path| block_given? ? yield(new path) : new(path) }
@@ -25,9 +24,7 @@ module Refinements
25
24
  new(root).files(pattern).each { |path| require path.to_s }
26
25
  end
27
26
 
28
- def root
29
- new "/"
30
- end
27
+ def root = new("/")
31
28
  end
32
29
 
33
30
  refine Pathname do
@@ -45,58 +42,36 @@ module Refinements
45
42
  glob(pattern, flag).select(&:directory?).sort
46
43
  end
47
44
 
48
- def extensions
49
- basename.to_s.split(/(?=\.)+/).tap(&:shift)
50
- end
45
+ def extensions = basename.to_s.split(/(?=\.)+/).tap(&:shift)
51
46
 
52
- def files pattern = "*", flag: File::FNM_SYSCASE
53
- glob(pattern, flag).select(&:file?).sort
54
- end
47
+ def files(pattern = "*", flag: File::FNM_SYSCASE) = glob(pattern, flag).select(&:file?).sort
55
48
 
56
- def gsub pattern, replacement
57
- self.class.new to_s.gsub(pattern, replacement)
58
- end
49
+ def gsub(pattern, replacement) = self.class.new(to_s.gsub(pattern, replacement))
59
50
 
60
51
  def make_ancestors
61
52
  dirname.mkpath
62
53
  self
63
54
  end
64
55
 
65
- def make_dir
66
- exist? ? self : mkdir and self
67
- end
56
+ def make_dir = exist? ? self : (mkdir and self)
68
57
 
69
58
  def make_path
70
59
  mkpath
71
60
  self
72
61
  end
73
62
 
74
- def name
75
- basename extname
76
- end
77
-
78
- def relative_parent root_dir
79
- relative_path_from(root_dir).parent
80
- end
63
+ def name = basename(extname)
81
64
 
82
- def relative_parent_from root_dir
83
- warn "[DEPRECATION]: Pathname#relative_parent_from is deprecated, " \
84
- "use Pathname#relative_parent instead."
85
- relative_parent root_dir
86
- end
65
+ def relative_parent(root_dir) = relative_path_from(root_dir).parent
87
66
 
88
- def remove_dir
89
- exist? ? (rmdir and self) : self
90
- end
67
+ def remove_dir = exist? ? (rmdir and self) : self
91
68
 
92
69
  def remove_tree
93
70
  rmtree if exist?
94
71
  self
95
72
  end
96
73
 
97
- def rewrite
98
- read.then { |content| write yield(content) if block_given? }
99
- end
74
+ def rewrite = read.then { |content| write yield(content) if block_given? }
100
75
 
101
76
  def touch at = Time.now
102
77
  exist? ? utime(at, at) : write("")
@@ -5,9 +5,7 @@ require "stringio"
5
5
  module Refinements
6
6
  module StringIOs
7
7
  refine StringIO do
8
- def reread length = nil, buffer: nil
9
- tap(&:rewind).read length, buffer
10
- end
8
+ def reread(length = nil, buffer: nil) = tap(&:rewind).read(length, buffer)
11
9
  end
12
10
  end
13
11
  end
@@ -5,9 +5,7 @@ module Refinements
5
5
  DELIMITERS = %r([a-z][A-Z]|\s*-\s*|\s*/\s*|\s*:+\s*|\s*_\s*|\s+)
6
6
 
7
7
  refine String do
8
- def blank?
9
- match?(/\A\s*\z/)
10
- end
8
+ def blank? = match?(/\A\s*\z/)
11
9
 
12
10
  def camelcase
13
11
  return up unless match? DELIMITERS
@@ -67,9 +65,7 @@ module Refinements
67
65
  .then { |parts| combine parts, :up, "/" }
68
66
  end
69
67
 
70
- def to_bool
71
- %w[true yes on t y 1].include? downcase.strip
72
- end
68
+ def to_bool = %w[true yes on t y 1].include?(downcase.strip)
73
69
 
74
70
  def up
75
71
  return self if empty?
@@ -3,23 +3,15 @@
3
3
  module Refinements
4
4
  module Structs
5
5
  refine Struct.singleton_class do
6
- def keyworded?
7
- inspect.include? "keyword_init: true"
8
- end
6
+ def keyworded? = inspect.include?("keyword_init: true")
9
7
 
10
- def with_keywords **arguments
11
- keyworded? ? new(**arguments) : new.merge!(**arguments)
12
- end
8
+ def with_keywords(**arguments) = keyworded? ? new(**arguments) : new.merge!(**arguments)
13
9
 
14
- def with_positions *values
15
- keyworded? ? new(**Hash[members.zip values]) : new(*values)
16
- end
10
+ def with_positions(*values) = keyworded? ? new(**members.zip(values).to_h) : new(*values)
17
11
  end
18
12
 
19
13
  refine Struct do
20
- def merge **attributes
21
- dup.merge!(**attributes)
22
- end
14
+ def merge(**attributes) = dup.merge!(**attributes)
23
15
 
24
16
  def merge! **attributes
25
17
  to_h.merge(**attributes).each { |key, value| self[key] = value }
@@ -29,9 +21,7 @@ module Refinements
29
21
  def revalue attributes = each_pair
30
22
  return self unless block_given?
31
23
 
32
- dup.tap do |copy|
33
- attributes.each { |key, value| copy[key] = yield self[key], value }
34
- end
24
+ dup.tap { |copy| attributes.each { |key, value| copy[key] = yield self[key], value } }
35
25
  end
36
26
 
37
27
  def revalue! attributes = each_pair
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: 8.0.1
4
+ version: 8.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brooke Kuhlmann
@@ -10,9 +10,9 @@ bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIC/jCCAeagAwIBAgIBAzANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpicm9v
14
- a2UvREM9YWxjaGVtaXN0cy9EQz1pbzAeFw0yMDAzMTUxNDQ1MzJaFw0yMTAzMTUx
15
- NDQ1MzJaMCUxIzAhBgNVBAMMGmJyb29rZS9EQz1hbGNoZW1pc3RzL0RDPWlvMIIB
13
+ MIIC/jCCAeagAwIBAgIBBDANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpicm9v
14
+ a2UvREM9YWxjaGVtaXN0cy9EQz1pbzAeFw0yMTAzMTkxMjQ4MDZaFw0yMjAzMTkx
15
+ MjQ4MDZaMCUxIzAhBgNVBAMMGmJyb29rZS9EQz1hbGNoZW1pc3RzL0RDPWlvMIIB
16
16
  IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6l1qpXTiomH1RfMRloyw7MiE
17
17
  xyVx/x8Yc3EupdH7uhNaTXQGyORN6aOY//1QXXMHIZ9tW74nZLhesWMSUMYy0XhB
18
18
  brs+KkurHnc9FnEJAbG7ebGvl/ncqZt72nQvaxpDxvuCBHgJAz+8i5wl6FhLw+oT
@@ -20,15 +20,15 @@ cert_chain:
20
20
  D5vkU0YlAm1r98BymuJlcQ1qdkVEI1d48ph4kcS0S0nv1RiuyVb6TCAR3Nu3VaVq
21
21
  3fPzZKJLZBx67UvXdbdicWPiUR75elI4PXpLIic3xytaF52ZJYyKZCNZJhNwfQID
22
22
  AQABozkwNzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU0nzow9vc
23
- 2CdikiiE3fJhP/gY4ggwDQYJKoZIhvcNAQELBQADggEBAIHhAlD3po4sTYqacXaQ
24
- XI9jIhrfMy//2PgbHWcETtlJPBeNUbbSNBABcllUHKqYsVDlSvSmss034KSWNR8F
25
- bF1GcloicyvcCC4y6IoW4it0COAcdeaaxkxiBSgKdQFpff9REnDlIKK4uQ9lLxIo
26
- Y2G5xubiziKZkyfWFuSr67PIjW3Bu673D1JVBArhA1qbgQmYQcy1CkGOjo+iO8Nf
27
- 7u/QSfBHb+r/bXhKscDgPpnKwbUmvgO2+94zJG9KsrmIydlzYfsD09aXKx0t6Xy4
28
- 2XV8FRa7/JimI07sPLC13eLY3xd/aYTi85Z782KIA4j0G8XEEWAX0ouBhlXPocZv
29
- QWc=
23
+ 2CdikiiE3fJhP/gY4ggwDQYJKoZIhvcNAQELBQADggEBAEjpaOXHHp8s/7GL2qCb
24
+ YAs7urOLv9VHSPfQWAwaTMVnSsIf3Sw4xzISOP/mmfEPBPXtz61K5esrE/uTFtgb
25
+ FyjxQk2H0sEWgrRXGGNHBWQRhhEs7LP/TByoC15A0br++xLxRz4r7HBLGAWQQDpg
26
+ 66BJ2TBVjxS6K64tKbq7+ACyrOZGgTfNHACh4M076y0x0oRf/rwBrU39/KRfuhbb
27
+ cm+nNCEtO35gTmZ2bVDHLGvWazi3gJt6+huQjfXTCUUG2YYBxwhu+GPdAGQPxpf9
28
+ lkHilIrX69jq8wMPpBhlaw2mRmeSL50Wv5u6xVBvOHhXFSP1crXM95vfLhLyRYod
29
+ W2A=
30
30
  -----END CERTIFICATE-----
31
- date: 2020-12-29 00:00:00.000000000 Z
31
+ date: 2021-08-08 00:00:00.000000000 Z
32
32
  dependencies: []
33
33
  description:
34
34
  email:
@@ -75,7 +75,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
75
75
  - !ruby/object:Gem::Version
76
76
  version: '0'
77
77
  requirements: []
78
- rubygems_version: 3.2.3
78
+ rubygems_version: 3.2.25
79
79
  signing_key:
80
80
  specification_version: 4
81
81
  summary: A collection of refinements to core Ruby objects.
metadata.gz.sig CHANGED
Binary file