refinements 3.2.0 → 4.0.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.md +22 -9
- data/lib/refinements/hashes.rb +26 -25
- data/lib/refinements/identity.rb +1 -1
- data/lib/refinements/strings.rb +41 -22
- metadata +8 -8
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 19bcdd156b3b6053dd3ff8a312502d807b6dacfd
|
4
|
+
data.tar.gz: 91b591f5acfd7ae55b174dd48183effdf09fb10f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5af7222803acf6bebb65b266d8a33b76eebd3712181a4f9b321464d28290a6d51e4611eb3248a33e18c3c5402488ec8a8fd91ec982b43ecf8072966bd846b875
|
7
|
+
data.tar.gz: ff2fb700725382ef9dd508d9e72df9a7ba5675730c916bb4b6865799b1e4b5da9a484d299a7196337fbf085f5ef32ea9ebe46f7a81be1035edbfda2b59a741c4
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/README.md
CHANGED
@@ -42,8 +42,8 @@ Provides a collection of refinements to core Ruby objects.
|
|
42
42
|
- Provides BigDecimal refinements:
|
43
43
|
- `BigDecimal#inspect` - Allows one to inspect a big decimal with numeric representation.
|
44
44
|
- Provides Hash refinements:
|
45
|
-
-
|
46
|
-
-
|
45
|
+
- `except` - Answers new hash with given with given keys removed without modifying calling hash.
|
46
|
+
- `except!` - Answers new hash with given with given keys removed while modifying calling hash.
|
47
47
|
- `#symbolize_keys` - Converts keys to symbols without modifying itself.
|
48
48
|
- `#symbolize_keys!` - Converts keys to symbols while modifying itself.
|
49
49
|
- `#slice` - Selects hash subset for given keys without modifying itself.
|
@@ -53,6 +53,8 @@ Provides a collection of refinements to core Ruby objects.
|
|
53
53
|
- `#reverse_merge` - Merges calling hash into passed in hash without modifying calling hash.
|
54
54
|
- `#reverse_merge!` - Merges calling hash into passed in hash while modifying calling hash.
|
55
55
|
- Provides String refinements:
|
56
|
+
- `#first` - Answers first character of a string or first set of characters if given a number.
|
57
|
+
- `#last` - Answers last character of a string or last set of characters if given a number.
|
56
58
|
- `#blank?` - Answers `true`/`false` based on whether string is blank or not (i.e. `<space>`,
|
57
59
|
`\n`, `\t`, `\r`).
|
58
60
|
- `#up` - Answers string with only first letter upcased.
|
@@ -60,10 +62,12 @@ Provides a collection of refinements to core Ruby objects.
|
|
60
62
|
- `#camelcase` - Answers a camelcased string. Example: "ThisIsCamelcase".
|
61
63
|
- `#snakecase` - Answers a snakecased string. Example: "this_is_snakecase".
|
62
64
|
- `#titleize` - Answers titleized string. Example: "This Is Titleized".
|
65
|
+
- `#use` - Provides hash value computation, via a block, by using
|
66
|
+
only the keys as arguments to the block.
|
63
67
|
|
64
68
|
# Requirements
|
65
69
|
|
66
|
-
0. [Ruby 2.
|
70
|
+
0. [Ruby 2.4.x](https://www.ruby-lang.org).
|
67
71
|
0. A solid understanding of [Ruby refinements and lexical scope](https://www.youtube.com/watch?v=qXC9Gk4dCEw).
|
68
72
|
|
69
73
|
# Setup
|
@@ -117,6 +121,12 @@ The following sections demonstrate how each refinement enriches your objects wit
|
|
117
121
|
|
118
122
|
### String
|
119
123
|
|
124
|
+
"example".first # => "e"
|
125
|
+
"example".first 4 # => "exam"
|
126
|
+
|
127
|
+
"instant".last # => "t"
|
128
|
+
"instant".first 3 # => "ant"
|
129
|
+
|
120
130
|
" \n\t\r".blank? # => true
|
121
131
|
"example".up # => "Example"
|
122
132
|
"EXAMPLE".down # => "eXAMPLE"
|
@@ -141,13 +151,13 @@ The following sections demonstrate how each refinement enriches your objects wit
|
|
141
151
|
|
142
152
|
### Hash
|
143
153
|
|
144
|
-
example = {a: 1, b:
|
145
|
-
example.
|
146
|
-
example # => {a: 1, b:
|
154
|
+
example = {a: 1, b: 2, c: 3}
|
155
|
+
example.except :a, :b # => {c: 3}
|
156
|
+
example # => {a: 1, b: 2, c: 3}
|
147
157
|
|
148
|
-
example = {a: 1, b:
|
149
|
-
example.
|
150
|
-
example # => {
|
158
|
+
example = {a: 1, b: 2, c: 3}
|
159
|
+
example.except! :a, :b # => {c: 3}
|
160
|
+
example # => {c: 3}
|
151
161
|
|
152
162
|
example = {"a" => 1, "b" => 2}
|
153
163
|
example.symbolize_keys # => {a: 1, b: 2}
|
@@ -181,6 +191,9 @@ The following sections demonstrate how each refinement enriches your objects wit
|
|
181
191
|
example.reverse_merge! a: 0, c: 3 # => {a: 1, b: 2, c: 3}
|
182
192
|
example # => {a: 1, b: 2, c: 3}
|
183
193
|
|
194
|
+
example = {unit: "221B", street: "Baker Street", city: "London", country: "UK"}
|
195
|
+
example.use { |unit, street| "#{unit} #{street}" } # => "221B Baker Street"
|
196
|
+
|
184
197
|
# Tests
|
185
198
|
|
186
199
|
To test, run:
|
data/lib/refinements/hashes.rb
CHANGED
@@ -5,16 +5,12 @@ module Refinements
|
|
5
5
|
module Hashes
|
6
6
|
# rubocop:disable Metrics/BlockLength
|
7
7
|
refine Hash do
|
8
|
-
|
9
|
-
|
10
|
-
puts "[DEPRECATION]: #compact is deprecated and is included, by default, in Ruby 2.4."
|
11
|
-
dup.compact!
|
8
|
+
def except *keys
|
9
|
+
reject { |key, _value| keys.include? key }
|
12
10
|
end
|
13
11
|
|
14
|
-
|
15
|
-
|
16
|
-
puts "[DEPRECATION]: #compact! is deprecated and is included, by default, in Ruby 2.4."
|
17
|
-
reject! { |_, value| value.nil? }
|
12
|
+
def except! *keys
|
13
|
+
replace except(*keys)
|
18
14
|
end
|
19
15
|
|
20
16
|
def symbolize_keys
|
@@ -27,39 +23,44 @@ module Refinements
|
|
27
23
|
end
|
28
24
|
|
29
25
|
def slice *keys
|
30
|
-
|
31
|
-
sliced_hash[key] = self[key] if key?(key)
|
32
|
-
end
|
26
|
+
select { |key, _value| keys.include? key }
|
33
27
|
end
|
34
28
|
|
35
29
|
def slice! *keys
|
36
30
|
replace slice(*keys)
|
37
31
|
end
|
38
32
|
|
39
|
-
def deep_merge
|
40
|
-
dup.deep_merge!
|
33
|
+
def deep_merge other
|
34
|
+
dup.deep_merge! other
|
41
35
|
end
|
42
36
|
|
43
|
-
def deep_merge!
|
44
|
-
|
45
|
-
current_value =
|
46
|
-
|
37
|
+
def deep_merge! other
|
38
|
+
other.each do |(other_key, other_value)|
|
39
|
+
current_value = self[other_key]
|
40
|
+
|
41
|
+
self[other_key] = if current_value.is_a?(Hash) && other_value.is_a?(Hash)
|
42
|
+
current_value.deep_merge! other_value
|
43
|
+
else
|
44
|
+
other_value
|
45
|
+
end
|
47
46
|
end
|
47
|
+
|
48
|
+
self
|
48
49
|
end
|
49
50
|
|
50
|
-
def reverse_merge
|
51
|
-
|
51
|
+
def reverse_merge other
|
52
|
+
other.merge self
|
52
53
|
end
|
53
54
|
|
54
|
-
def reverse_merge!
|
55
|
-
merge!(
|
55
|
+
def reverse_merge! other
|
56
|
+
merge!(other) { |_key, old_value, _new_value| old_value }
|
56
57
|
end
|
57
58
|
|
58
|
-
|
59
|
+
def use &block
|
60
|
+
return [] unless block_given?
|
59
61
|
|
60
|
-
|
61
|
-
|
62
|
-
other_value
|
62
|
+
values = block.parameters.map { |(_type, key)| self[key] }
|
63
|
+
yield values
|
63
64
|
end
|
64
65
|
end
|
65
66
|
end
|
data/lib/refinements/identity.rb
CHANGED
data/lib/refinements/strings.rb
CHANGED
@@ -11,42 +11,66 @@ module Refinements
|
|
11
11
|
|
12
12
|
# rubocop:disable Metrics/BlockLength
|
13
13
|
refine String do
|
14
|
+
def first number = 0
|
15
|
+
return self if empty?
|
16
|
+
|
17
|
+
max = Integer number
|
18
|
+
|
19
|
+
return self[0] if max.zero?
|
20
|
+
return "" if max.negative?
|
21
|
+
|
22
|
+
self[0..(max - 1)]
|
23
|
+
end
|
24
|
+
|
25
|
+
# :reek:TooManyStatements
|
26
|
+
def last number = 0
|
27
|
+
return self if empty?
|
28
|
+
|
29
|
+
min = Integer number
|
30
|
+
max = size - 1
|
31
|
+
|
32
|
+
return self[max] if min.zero?
|
33
|
+
return "" if min.negative?
|
34
|
+
|
35
|
+
self[(min + 1)..max]
|
36
|
+
end
|
37
|
+
|
14
38
|
def blank?
|
15
|
-
|
39
|
+
match?(/\A\s*\z/)
|
16
40
|
end
|
17
41
|
|
18
42
|
def up
|
19
43
|
return self if empty?
|
20
|
-
|
44
|
+
first.upcase + self[1, size]
|
21
45
|
end
|
22
46
|
|
23
47
|
def down
|
24
48
|
return self if empty?
|
25
|
-
|
49
|
+
first.downcase + self[1, size]
|
26
50
|
end
|
27
51
|
|
28
52
|
def camelcase
|
29
|
-
if self
|
30
|
-
result =
|
31
|
-
|
53
|
+
if match?(self.class.delimiters)
|
54
|
+
result = join_parts split(%r(\s*\-\s*|\s*\/\s*|\s*\:+\s*)), method: :up, delimiter: "::"
|
55
|
+
join_parts result.split(/\s*\_\s*|\s+/), method: :up
|
32
56
|
else
|
33
57
|
up
|
34
58
|
end
|
35
59
|
end
|
36
60
|
|
37
61
|
def snakecase
|
38
|
-
if self
|
39
|
-
result =
|
40
|
-
|
62
|
+
if match?(self.class.delimiters)
|
63
|
+
result = join_parts split(%r(\s*\-\s*|\s*\/\s*|\s*\:+\s*)), method: :down, delimiter: "/"
|
64
|
+
join_parts result.split(/(?=[A-Z])|\s*\_\s*|\s+/), method: :down, delimiter: "_"
|
41
65
|
else
|
42
66
|
downcase
|
43
67
|
end
|
44
68
|
end
|
45
69
|
|
46
70
|
def titleize
|
47
|
-
if self
|
48
|
-
result =
|
49
|
-
|
71
|
+
if match?(self.class.delimiters)
|
72
|
+
result = join_parts split(/(?=[A-Z])|\s*\_\s*|\s*\-\s*|\s+/), method: :up, delimiter: " "
|
73
|
+
join_parts result.split(%r(\s*\/\s*|\s*\:+\s*)), method: :up, delimiter: "/"
|
50
74
|
else
|
51
75
|
capitalize
|
52
76
|
end
|
@@ -54,17 +78,12 @@ module Refinements
|
|
54
78
|
|
55
79
|
private
|
56
80
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
"#{result}#{delimiter}#{part.up}"
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def down_and_join parts, delimiter: ""
|
81
|
+
# :reek:DuplicateMethodCall
|
82
|
+
# :reek:UtilityFunction
|
83
|
+
def join_parts parts, method:, delimiter: ""
|
65
84
|
parts.reduce "" do |result, part|
|
66
|
-
next part.
|
67
|
-
"#{result}#{delimiter}#{part.
|
85
|
+
next part.send(method) if result.empty?
|
86
|
+
"#{result}#{delimiter}#{part.send method}"
|
68
87
|
end
|
69
88
|
end
|
70
89
|
end
|
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:
|
4
|
+
version: 4.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brooke Kuhlmann
|
@@ -30,7 +30,7 @@ cert_chain:
|
|
30
30
|
n/LUZ1dKhIHzfKx1B4+TEIefArObGfkLIDM8+Dq1RX7TF1k81Men7iu4MgE9bYBn
|
31
31
|
3dE+xI3FdB5gWcdWxdtgRCmWjtXeYYyb4z6NQQ==
|
32
32
|
-----END CERTIFICATE-----
|
33
|
-
date:
|
33
|
+
date: 2017-01-22 00:00:00.000000000 Z
|
34
34
|
dependencies:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: rake
|
@@ -50,14 +50,14 @@ dependencies:
|
|
50
50
|
name: gemsmith
|
51
51
|
requirement: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- - "
|
53
|
+
- - ">="
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '8.2'
|
56
56
|
type: :development
|
57
57
|
prerelease: false
|
58
58
|
version_requirements: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- - "
|
60
|
+
- - ">="
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: '8.2'
|
63
63
|
- !ruby/object:Gem::Dependency
|
@@ -206,14 +206,14 @@ dependencies:
|
|
206
206
|
requirements:
|
207
207
|
- - "~>"
|
208
208
|
- !ruby/object:Gem::Version
|
209
|
-
version: '0.
|
209
|
+
version: '0.47'
|
210
210
|
type: :development
|
211
211
|
prerelease: false
|
212
212
|
version_requirements: !ruby/object:Gem::Requirement
|
213
213
|
requirements:
|
214
214
|
- - "~>"
|
215
215
|
- !ruby/object:Gem::Version
|
216
|
-
version: '0.
|
216
|
+
version: '0.47'
|
217
217
|
- !ruby/object:Gem::Dependency
|
218
218
|
name: codeclimate-test-reporter
|
219
219
|
requirement: !ruby/object:Gem::Requirement
|
@@ -257,7 +257,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
257
257
|
requirements:
|
258
258
|
- - "~>"
|
259
259
|
- !ruby/object:Gem::Version
|
260
|
-
version: '2.
|
260
|
+
version: '2.4'
|
261
261
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
262
262
|
requirements:
|
263
263
|
- - ">="
|
@@ -265,7 +265,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
265
265
|
version: '0'
|
266
266
|
requirements: []
|
267
267
|
rubyforge_project:
|
268
|
-
rubygems_version: 2.6.
|
268
|
+
rubygems_version: 2.6.9
|
269
269
|
signing_key:
|
270
270
|
specification_version: 4
|
271
271
|
summary: Provides a collection of refinements to core Ruby objects.
|
metadata.gz.sig
CHANGED
Binary file
|