active_object 4.0.14 → 5.0.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 +4 -4
- data/.reek +1 -5
- data/.rubocop.yml +2 -18
- data/Gemfile +2 -0
- data/README.md +1 -2
- data/Rakefile +2 -0
- data/active_object.gemspec +2 -3
- data/bin/console +1 -0
- data/bin/rake +2 -2
- data/lib/active_object/array.rb +165 -161
- data/lib/active_object/configuration.rb +37 -0
- data/lib/active_object/date.rb +84 -78
- data/lib/active_object/enumerable.rb +6 -5
- data/lib/active_object/hash.rb +197 -193
- data/lib/active_object/integer.rb +25 -21
- data/lib/active_object/numeric.rb +440 -436
- data/lib/active_object/object.rb +80 -76
- data/lib/active_object/range.rb +28 -24
- data/lib/active_object/string.rb +281 -277
- data/lib/active_object/time.rb +121 -117
- data/lib/active_object/version.rb +3 -1
- data/lib/active_object.rb +3 -1
- data/lib/generators/active_object/install_generator.rb +2 -0
- data/lib/generators/active_object/templates/install.rb +3 -1
- metadata +4 -33
- data/.coveralls.yml +0 -1
- data/lib/active_object/settings.rb +0 -17
data/lib/active_object/hash.rb
CHANGED
@@ -1,255 +1,259 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
module ActiveObject
|
4
|
+
module Hash
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
def assert_valid_keys(*valid_keys)
|
7
|
+
valid_keys.flatten!
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
end
|
12
|
-
end
|
9
|
+
each_key do |key|
|
10
|
+
next if valid_keys.include?(key)
|
13
11
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
"Empty hash. Valid keys are: #{valid_keys.map(&:inspect).join(', ')}"
|
18
|
-
else
|
19
|
-
assert_valid_keys(*valid_keys)
|
12
|
+
raise ArgumentError,
|
13
|
+
"Unknown key: #{key.inspect}. Valid keys are: #{valid_keys.map(&:inspect).join(', ')}"
|
14
|
+
end
|
20
15
|
end
|
21
|
-
end
|
22
16
|
|
23
|
-
|
24
|
-
|
25
|
-
|
17
|
+
def assert_valid_keys!(*valid_keys)
|
18
|
+
if empty?
|
19
|
+
raise ArgumentError,
|
20
|
+
"Empty hash. Valid keys are: #{valid_keys.map(&:inspect).join(', ')}"
|
21
|
+
else
|
22
|
+
assert_valid_keys(*valid_keys)
|
23
|
+
end
|
24
|
+
end
|
26
25
|
|
27
|
-
|
28
|
-
|
29
|
-
|
26
|
+
def compact
|
27
|
+
select { |_, val| !val.nil? }
|
28
|
+
end
|
30
29
|
|
31
|
-
|
32
|
-
|
33
|
-
|
30
|
+
def compact!
|
31
|
+
reject! { |_, val| val.nil? }
|
32
|
+
end
|
34
33
|
|
35
|
-
|
36
|
-
|
34
|
+
# rubocop:disable Lint/UnusedMethodArgument
|
35
|
+
def collect_keys(&block)
|
36
|
+
return(enum_for(:collect_keys)) unless block_given?
|
37
37
|
|
38
|
-
|
39
|
-
|
38
|
+
collect { |key, _| yield(key) }
|
39
|
+
end
|
40
40
|
|
41
|
-
|
42
|
-
|
43
|
-
# rubocop:enable Lint/UnusedMethodArgument
|
41
|
+
def collect_values(&block)
|
42
|
+
return(enum_for(:collect_values)) unless block_given?
|
44
43
|
|
45
|
-
|
46
|
-
|
47
|
-
|
44
|
+
collect { |_, val| yield(val) }
|
45
|
+
end
|
46
|
+
# rubocop:enable Lint/UnusedMethodArgument
|
48
47
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
this_value = self[current_key]
|
48
|
+
def deep_merge(other_hash, &block)
|
49
|
+
dup.deep_merge!(other_hash, yield(block))
|
50
|
+
end
|
53
51
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
52
|
+
# rubocop:disable Metrics/MethodLength
|
53
|
+
def deep_merge!(other_hash, &block)
|
54
|
+
other_hash.each_pair do |current_key, other_value|
|
55
|
+
this_value = self[current_key]
|
56
|
+
|
57
|
+
self[current_key] = if this_value.is_a?(Hash) && other_value.is_a?(Hash)
|
58
|
+
this_value.deep_merge(other_value, yield(block))
|
59
|
+
elsif block_given? && key?(current_key)
|
60
|
+
yield(current_key, this_value, other_value)
|
61
|
+
else
|
62
|
+
other_value
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
self
|
61
67
|
end
|
68
|
+
# rubocop:enable Metrics/MethodLength
|
62
69
|
|
63
|
-
|
64
|
-
|
65
|
-
|
70
|
+
def denillify(value = 0)
|
71
|
+
each { |key, val| self[key] = val.nil? ? value : val }
|
72
|
+
end
|
66
73
|
|
67
|
-
|
68
|
-
|
69
|
-
|
74
|
+
def denillify!(value = 0)
|
75
|
+
replace(denillify(value))
|
76
|
+
end
|
70
77
|
|
71
|
-
|
72
|
-
|
73
|
-
end
|
78
|
+
def dig(key, *rest)
|
79
|
+
value = (self[key] rescue nil)
|
74
80
|
|
75
|
-
|
76
|
-
|
81
|
+
return if value.nil?
|
82
|
+
return value if rest.empty?
|
83
|
+
return value.dig(*rest) if value.respond_to?(:dig)
|
84
|
+
end
|
77
85
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
end
|
86
|
+
def except(*keys)
|
87
|
+
dup.except!(*keys)
|
88
|
+
end
|
82
89
|
|
83
|
-
|
84
|
-
|
85
|
-
|
90
|
+
def except!(*keys)
|
91
|
+
keys.flatten.each { |key| delete(key) }
|
92
|
+
self
|
93
|
+
end
|
86
94
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
end
|
95
|
+
def hmap(&block)
|
96
|
+
dup.hmap!(&block)
|
97
|
+
end
|
91
98
|
|
92
|
-
|
93
|
-
|
94
|
-
|
99
|
+
# rubocop:disable Lint/UnusedMethodArgument
|
100
|
+
def hmap!(&block)
|
101
|
+
inject({}) { |hash, (key, val)| hash.merge(yield(key, val)) }
|
102
|
+
end
|
103
|
+
# rubocop:enable Lint/UnusedMethodArgument
|
95
104
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
end
|
100
|
-
# rubocop:enable Lint/UnusedMethodArgument
|
105
|
+
def nillify
|
106
|
+
dup.nillify!
|
107
|
+
end
|
101
108
|
|
102
|
-
|
103
|
-
|
104
|
-
|
109
|
+
def nillify!
|
110
|
+
each { |key, val| self[key] = nil if !val.nil? && (val.try(:blank?) || val.try(:to_s).blank?) }
|
111
|
+
end
|
105
112
|
|
106
|
-
|
107
|
-
|
108
|
-
|
113
|
+
def only(*keys)
|
114
|
+
dup.only!(*keys)
|
115
|
+
end
|
109
116
|
|
110
|
-
|
111
|
-
|
112
|
-
|
117
|
+
def only!(*keys)
|
118
|
+
hash = {}
|
119
|
+
keys.flatten.each { |key| hash[key] = self[key] if key?(key) }
|
120
|
+
replace(hash)
|
121
|
+
end
|
113
122
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
replace(hash)
|
118
|
-
end
|
123
|
+
def rename_keys(*keys)
|
124
|
+
dup.rename_keys!(*keys)
|
125
|
+
end
|
119
126
|
|
120
|
-
|
121
|
-
|
122
|
-
|
127
|
+
def rename_keys!(*keys)
|
128
|
+
keys = ::Hash[*keys.flatten]
|
129
|
+
keys.each { |key, val| self[val] = delete(key) if self[key] }
|
130
|
+
self
|
131
|
+
end
|
123
132
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
self
|
128
|
-
end
|
133
|
+
def reverse_merge(other_hash)
|
134
|
+
other_hash.merge(self)
|
135
|
+
end
|
129
136
|
|
130
|
-
|
131
|
-
|
132
|
-
|
137
|
+
def reverse_merge!(other_hash)
|
138
|
+
replace(reverse_merge(other_hash))
|
139
|
+
end
|
133
140
|
|
134
|
-
|
135
|
-
|
136
|
-
|
141
|
+
def sample
|
142
|
+
key = sample_key
|
143
|
+
[key, fetch(key)]
|
144
|
+
end
|
137
145
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
146
|
+
def sample!
|
147
|
+
key, value = sample
|
148
|
+
delete(key)
|
149
|
+
[key, value]
|
150
|
+
end
|
142
151
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
end
|
152
|
+
def sample_key
|
153
|
+
hash_keys = keys
|
154
|
+
hash_keys.at(::Random.rand(hash_keys.length - 1))
|
155
|
+
end
|
148
156
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
157
|
+
def sample_key!
|
158
|
+
key, = sample
|
159
|
+
delete(key)
|
160
|
+
key
|
161
|
+
end
|
153
162
|
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
key
|
158
|
-
end
|
163
|
+
def sample_value
|
164
|
+
fetch(sample_key)
|
165
|
+
end
|
159
166
|
|
160
|
-
|
161
|
-
|
162
|
-
|
167
|
+
def sample_value!
|
168
|
+
key, value = sample
|
169
|
+
delete(key)
|
170
|
+
value
|
171
|
+
end
|
163
172
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
value
|
168
|
-
end
|
173
|
+
def shuffle
|
174
|
+
::Hash[to_a.sample(length)]
|
175
|
+
end
|
169
176
|
|
170
|
-
|
171
|
-
|
172
|
-
|
177
|
+
def shuffle!
|
178
|
+
replace(shuffle)
|
179
|
+
end
|
173
180
|
|
174
|
-
|
175
|
-
|
176
|
-
|
181
|
+
def slice(*keys)
|
182
|
+
keys.flatten
|
183
|
+
.each_with_object(self.class.new) { |key, hsh| hsh[key] = self[key] if key?(key) }
|
184
|
+
end
|
177
185
|
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
end
|
186
|
+
def slice!(*keys)
|
187
|
+
omit = slice(*self.keys - keys)
|
188
|
+
hash = slice(*keys)
|
182
189
|
|
183
|
-
|
184
|
-
|
185
|
-
hash = slice(*keys)
|
190
|
+
hash.default = default
|
191
|
+
hash.default_proc = default_proc if default_proc
|
186
192
|
|
187
|
-
|
188
|
-
|
193
|
+
replace(hash)
|
194
|
+
omit
|
195
|
+
end
|
189
196
|
|
190
|
-
|
191
|
-
|
192
|
-
|
197
|
+
def stringify_keys
|
198
|
+
dup.stringify_keys!
|
199
|
+
end
|
193
200
|
|
194
|
-
|
195
|
-
|
196
|
-
|
201
|
+
def stringify_keys!
|
202
|
+
each_with_object({}) { |(key, val), options| options[key.to_s] = val }
|
203
|
+
end
|
197
204
|
|
198
|
-
|
199
|
-
|
200
|
-
|
205
|
+
def strip
|
206
|
+
select { |_, val| !val.blank? }
|
207
|
+
end
|
201
208
|
|
202
|
-
|
203
|
-
|
204
|
-
|
209
|
+
def strip!
|
210
|
+
reject! { |_, val| val.blank? }
|
211
|
+
end
|
205
212
|
|
206
|
-
|
207
|
-
|
208
|
-
|
213
|
+
def symbolize_keys
|
214
|
+
dup.symbolize_keys!
|
215
|
+
end
|
209
216
|
|
210
|
-
|
211
|
-
|
212
|
-
|
217
|
+
def symbolize_keys!
|
218
|
+
each_with_object({}) { |(key, val), options| options[(key.to_sym rescue key) || key] = val }
|
219
|
+
end
|
213
220
|
|
214
|
-
|
215
|
-
|
216
|
-
|
221
|
+
def symbolize_and_underscore_keys
|
222
|
+
dup.symbolize_and_underscore_keys!
|
223
|
+
end
|
217
224
|
|
218
|
-
|
219
|
-
|
220
|
-
|
225
|
+
def symbolize_and_underscore_keys!
|
226
|
+
each_with_object({}) do |(key, val), options|
|
227
|
+
options[(key.to_s.tr(' ', '_').underscore.to_sym rescue key) || key] = val
|
228
|
+
end
|
229
|
+
end
|
221
230
|
|
222
|
-
|
223
|
-
|
224
|
-
options[(key.to_s.tr(' ', '_').underscore.to_sym rescue key) || key] = val
|
231
|
+
def transform_keys(&block)
|
232
|
+
dup.transform_keys!(&block)
|
225
233
|
end
|
226
|
-
end
|
227
234
|
|
228
|
-
|
229
|
-
|
230
|
-
|
235
|
+
# rubocop:disable Lint/UnusedMethodArgument
|
236
|
+
def transform_keys!(&block)
|
237
|
+
return(enum_for(:transform_keys!)) unless block_given?
|
231
238
|
|
232
|
-
|
233
|
-
|
234
|
-
|
239
|
+
each_key { |key| self[yield(key)] = delete(key) }
|
240
|
+
self
|
241
|
+
end
|
242
|
+
# rubocop:enable Lint/UnusedMethodArgument
|
235
243
|
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
# rubocop:enable Lint/UnusedMethodArgument
|
244
|
+
def transform_values(&block)
|
245
|
+
dup.transform_values!(&block)
|
246
|
+
end
|
240
247
|
|
241
|
-
|
242
|
-
|
243
|
-
|
248
|
+
# rubocop:disable Lint/UnusedMethodArgument
|
249
|
+
def transform_values!(&block)
|
250
|
+
return(enum_for(:transform_values!)) unless block_given?
|
244
251
|
|
245
|
-
|
246
|
-
|
247
|
-
|
252
|
+
each { |key, val| self[key] = yield(val) }
|
253
|
+
end
|
254
|
+
# rubocop:enable Lint/UnusedMethodArgument
|
248
255
|
|
249
|
-
each { |key, val| self[key] = yield(val) }
|
250
256
|
end
|
251
|
-
# rubocop:enable Lint/UnusedMethodArgument
|
252
|
-
|
253
257
|
end
|
254
258
|
|
255
|
-
Hash.include(ActiveObject::Hash) if ActiveObject
|
259
|
+
Hash.include(ActiveObject::Hash) if ActiveObject.configuration.autoload_hash
|
@@ -1,30 +1,34 @@
|
|
1
|
-
|
2
|
-
ROMAN_VALUES ||= {
|
3
|
-
M: 1000, CM: 900, D: 500, CD: 400, C: 100, XC: 90, L: 50, XL: 40, X: 10, IX: 9, V: 5, IV: 4,
|
4
|
-
I: 1
|
5
|
-
}.freeze
|
1
|
+
# frozen_string_literal: true
|
6
2
|
|
7
|
-
|
8
|
-
|
3
|
+
module ActiveObject
|
4
|
+
module Integer
|
5
|
+
ROMAN_VALUES ||= {
|
6
|
+
M: 1000, CM: 900, D: 500, CD: 400, C: 100, XC: 90, L: 50, XL: 40, X: 10, IX: 9, V: 5, IV: 4,
|
7
|
+
I: 1
|
8
|
+
}.freeze
|
9
9
|
|
10
|
-
|
11
|
-
|
10
|
+
def factorial
|
11
|
+
return 1 if zero?
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
end
|
13
|
+
2.upto(self).inject(1) { |acc, elem| acc * elem }
|
14
|
+
end
|
16
15
|
|
17
|
-
|
18
|
-
|
19
|
-
|
16
|
+
def of(&block)
|
17
|
+
::Array.new(self, &block)
|
18
|
+
end
|
20
19
|
|
21
|
-
|
22
|
-
|
20
|
+
def roman
|
21
|
+
return '' if zero?
|
22
|
+
return "-#{(-self).roman}" if negative?
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
ROMAN_VALUES.each { |key, val| return("#{key}#{(self - val).roman}") if val <= self }
|
25
|
+
end
|
26
|
+
|
27
|
+
def time
|
28
|
+
::Time.at(self)
|
29
|
+
end
|
27
30
|
|
31
|
+
end
|
28
32
|
end
|
29
33
|
|
30
|
-
Integer.include(ActiveObject::Integer) if ActiveObject
|
34
|
+
Integer.include(ActiveObject::Integer) if ActiveObject.configuration.autoload_integer
|