active_object 3.1.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
- data/.DS_Store +0 -0
- data/.fasterer.yml +19 -0
- data/.reek +39 -0
- data/.rubocop.yml +38 -0
- data/Gemfile +1 -1
- data/README.md +224 -239
- data/Rakefile +1 -1
- data/active_object.gemspec +19 -16
- data/bin/console +4 -4
- data/bin/rake +6 -7
- data/lib/.DS_Store +0 -0
- data/lib/active_object.rb +4 -33
- data/lib/active_object/.DS_Store +0 -0
- data/lib/active_object/array.rb +55 -41
- data/lib/active_object/date.rb +17 -22
- data/lib/active_object/enumerable.rb +73 -56
- data/lib/active_object/hash.rb +47 -37
- data/lib/active_object/integer.rb +8 -9
- data/lib/active_object/numeric.rb +132 -122
- data/lib/active_object/object.rb +10 -10
- data/lib/active_object/range.rb +1 -1
- data/lib/active_object/settings.rb +17 -0
- data/lib/active_object/string.rb +93 -90
- data/lib/active_object/time.rb +37 -48
- data/lib/active_object/version.rb +1 -1
- data/lib/generators/active_object/install_generator.rb +6 -8
- data/lib/generators/active_object/templates/install.rb +1 -1
- metadata +51 -3
- data/lib/active_object/configuration.rb +0 -21
data/lib/active_object/object.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module ActiveObject::Object
|
2
|
-
FALSE_VALUES = [false, 0,
|
3
|
-
TRUE_VALUES = [true, 1,
|
2
|
+
FALSE_VALUES = [false, 0, '0', 'false', 'FALSE', 'f', 'F'].freeze
|
3
|
+
TRUE_VALUES = [true, 1, '1', 'true', 'TRUE', 't', 'T'].freeze
|
4
4
|
|
5
5
|
def array?
|
6
6
|
is_a?(Array)
|
@@ -56,7 +56,7 @@ module ActiveObject::Object
|
|
56
56
|
is_a?(Range)
|
57
57
|
end
|
58
58
|
|
59
|
-
def salvage(placeholder=
|
59
|
+
def salvage(placeholder = '---')
|
60
60
|
blank? ? placeholder : self
|
61
61
|
end
|
62
62
|
|
@@ -76,18 +76,18 @@ module ActiveObject::Object
|
|
76
76
|
TRUE_VALUES.include?(self)
|
77
77
|
end
|
78
78
|
|
79
|
-
def try(*
|
80
|
-
try!(*
|
79
|
+
def try(*obj, &block)
|
80
|
+
try!(*obj, yield(block)) if obj.empty? || respond_to?(obj.first)
|
81
81
|
end
|
82
82
|
|
83
|
-
def try!(*
|
84
|
-
if
|
85
|
-
|
83
|
+
def try!(*obj, &block)
|
84
|
+
if obj.empty? && block_given?
|
85
|
+
block.arity.zero? ? instance_eval(yield(block)) : yield(self)
|
86
86
|
else
|
87
|
-
public_send(*
|
87
|
+
public_send(*obj, yield(block))
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
91
|
end
|
92
92
|
|
93
|
-
Object.send(:include, ActiveObject::Object) if ActiveObject.
|
93
|
+
Object.send(:include, ActiveObject::Object) if ActiveObject::Settings.config.autoload_object
|
data/lib/active_object/range.rb
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'dry-configurable'
|
2
|
+
|
3
|
+
class ActiveObject::Settings
|
4
|
+
extend Dry::Configurable
|
5
|
+
|
6
|
+
setting :autoload_array, true
|
7
|
+
setting :autoload_date, true
|
8
|
+
setting :autoload_enumerable, true
|
9
|
+
setting :autoload_hash, true
|
10
|
+
setting :autoload_integer, true
|
11
|
+
setting :autoload_numeric, true
|
12
|
+
setting :autoload_object, true
|
13
|
+
setting :autoload_range, true
|
14
|
+
setting :autoload_string, true
|
15
|
+
setting :autoload_time, true
|
16
|
+
|
17
|
+
end
|
data/lib/active_object/string.rb
CHANGED
@@ -2,7 +2,10 @@ module ActiveObject::String
|
|
2
2
|
|
3
3
|
def any?(*keys)
|
4
4
|
included = false
|
5
|
-
keys.flatten.each
|
5
|
+
keys.flatten.each do |key|
|
6
|
+
included = include?(key)
|
7
|
+
break if included
|
8
|
+
end
|
6
9
|
included
|
7
10
|
end
|
8
11
|
|
@@ -10,9 +13,13 @@ module ActiveObject::String
|
|
10
13
|
self[position]
|
11
14
|
end
|
12
15
|
|
13
|
-
def camelize(first_letter
|
16
|
+
def camelize(first_letter = :upper)
|
14
17
|
if first_letter.to_sym != :lower
|
15
|
-
|
18
|
+
regex_last = Regexp.last_match(1).upcase
|
19
|
+
|
20
|
+
to_s
|
21
|
+
.gsub(%r{\/(.?)}) { "::#{regex_last}" }
|
22
|
+
.gsub(%r{^/(?:^|_)(.)}) { regex_last }
|
16
23
|
else
|
17
24
|
"#{to_s.first.chr.downcase}#{camelize(self)[1..-1]}"
|
18
25
|
end
|
@@ -20,14 +27,14 @@ module ActiveObject::String
|
|
20
27
|
|
21
28
|
alias_method :camelcase, :camelize
|
22
29
|
|
23
|
-
def camelize!(first_letter
|
30
|
+
def camelize!(first_letter = :upper)
|
24
31
|
replace(camelize(first_letter))
|
25
32
|
end
|
26
33
|
|
27
34
|
alias_method :camelcase!, :camelize!
|
28
35
|
|
29
36
|
def classify
|
30
|
-
to_s.sub(/.*\./,
|
37
|
+
to_s.sub(/.*\./, '').camelize
|
31
38
|
end
|
32
39
|
|
33
40
|
def classify!
|
@@ -39,7 +46,7 @@ module ActiveObject::String
|
|
39
46
|
end
|
40
47
|
|
41
48
|
def dasherize
|
42
|
-
|
49
|
+
tr(/_/, '-')
|
43
50
|
end
|
44
51
|
|
45
52
|
def dasherize!
|
@@ -47,7 +54,7 @@ module ActiveObject::String
|
|
47
54
|
end
|
48
55
|
|
49
56
|
def deconstantize
|
50
|
-
to_s[0, rindex(
|
57
|
+
to_s[0, rindex('::') || 0]
|
51
58
|
end
|
52
59
|
|
53
60
|
def deconstantize!
|
@@ -55,7 +62,7 @@ module ActiveObject::String
|
|
55
62
|
end
|
56
63
|
|
57
64
|
def demodulize
|
58
|
-
to_s.gsub(/^.*::/,
|
65
|
+
to_s.gsub(/^.*::/, '')
|
59
66
|
end
|
60
67
|
|
61
68
|
def demodulize!
|
@@ -63,63 +70,63 @@ module ActiveObject::String
|
|
63
70
|
end
|
64
71
|
|
65
72
|
def domain
|
66
|
-
self =~ (
|
73
|
+
self =~ %r{^(?:\w+:\/\/)?([^\/?]+)(?:\/|\?|$)} ? Regexp.last_match(1) : self
|
67
74
|
end
|
68
75
|
|
69
76
|
def downcase?
|
70
77
|
downcase == self
|
71
78
|
end
|
72
79
|
|
73
|
-
def ellipsize(ellipsize_at, options={})
|
74
|
-
|
80
|
+
def ellipsize(ellipsize_at, options = {})
|
81
|
+
return(self) if length <= ellipsize_at
|
75
82
|
|
76
|
-
|
77
|
-
|
83
|
+
separator = options[:separator] || '...'
|
84
|
+
offset = options[:offset] || 4
|
78
85
|
|
79
|
-
|
86
|
+
"#{self[0, offset]}#{separator}#{self[-offset, offset]}"
|
80
87
|
end
|
81
88
|
|
82
89
|
def exclude?(string)
|
83
90
|
!include?(string)
|
84
91
|
end
|
85
92
|
|
86
|
-
def first(limit=1)
|
87
|
-
return(
|
93
|
+
def first(limit = 1)
|
94
|
+
return('') if limit.zero?
|
88
95
|
|
89
96
|
limit >= length ? self : to(limit - 1)
|
90
97
|
end
|
91
98
|
|
92
99
|
def format(*args)
|
93
|
-
super(self, *
|
100
|
+
super(self, *args.flatten)
|
94
101
|
end
|
95
102
|
|
96
103
|
def from(position)
|
97
104
|
self[position..-1]
|
98
105
|
end
|
99
106
|
|
100
|
-
def humanize(options={})
|
101
|
-
capitalize = options
|
107
|
+
def humanize(options = {})
|
108
|
+
capitalize = options[:capitalize] || true
|
102
109
|
|
103
|
-
underscore
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
110
|
+
underscore
|
111
|
+
.gsub(/_id\z/, '')
|
112
|
+
.tr('_', ' ')
|
113
|
+
.squish
|
114
|
+
.gsub(/([a-z\d]*)/i, &:downcase)
|
115
|
+
.gsub(/\A\w/) { |str| capitalize ? str.upcase : str }
|
109
116
|
end
|
110
117
|
|
111
|
-
def humanize!(options={})
|
118
|
+
def humanize!(options = {})
|
112
119
|
replace(humanize(options))
|
113
120
|
end
|
114
121
|
|
115
|
-
def indent(amount, indent_string=nil, indent_empty_lines=false)
|
116
|
-
indent_string = indent_string || self[/^[ \t]/] ||
|
122
|
+
def indent(amount, indent_string = nil, indent_empty_lines = false)
|
123
|
+
indent_string = indent_string || self[/^[ \t]/] || ' '
|
117
124
|
substitutes = indent_empty_lines ? /^/ : /^(?!$)/
|
118
125
|
|
119
126
|
gsub(substitutes, indent_string * amount)
|
120
127
|
end
|
121
128
|
|
122
|
-
def indent!(amount, indent_string=nil, indent_empty_lines=false)
|
129
|
+
def indent!(amount, indent_string = nil, indent_empty_lines = false)
|
123
130
|
replace(indent(amount, indent_string, indent_empty_lines))
|
124
131
|
end
|
125
132
|
|
@@ -128,7 +135,7 @@ module ActiveObject::String
|
|
128
135
|
arr_indexes = []
|
129
136
|
srch_index = rindex(pattern)
|
130
137
|
|
131
|
-
while srch_index
|
138
|
+
while srch_index
|
132
139
|
temp_string = self[0..(srch_index - 1)]
|
133
140
|
arr_indexes << srch_index
|
134
141
|
srch_index = srch_index.zero? ? nil : temp_string.rindex(pattern)
|
@@ -137,28 +144,27 @@ module ActiveObject::String
|
|
137
144
|
arr_indexes.reverse
|
138
145
|
end
|
139
146
|
|
140
|
-
def labelize(options={})
|
141
|
-
capitalize = options
|
147
|
+
def labelize(options = {})
|
148
|
+
capitalize = options[:capitalize] || true
|
142
149
|
|
143
|
-
underscore
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
150
|
+
underscore
|
151
|
+
.tr('_', ' ')
|
152
|
+
.squish
|
153
|
+
.gsub(/([a-z\d]*)/i, &:downcase)
|
154
|
+
.gsub(/\A\w/) { |str| capitalize ? str.upcase : str }
|
155
|
+
.gsub(/ id\z/, ' ID')
|
149
156
|
end
|
150
157
|
|
151
158
|
alias_method :labelcase, :labelize
|
152
159
|
|
153
|
-
def labelize!(options={})
|
160
|
+
def labelize!(options = {})
|
154
161
|
replace(labelize(options))
|
155
162
|
end
|
156
163
|
|
157
164
|
alias_method :labelcase!, :labelize!
|
158
165
|
|
159
|
-
|
160
|
-
|
161
|
-
return("") if limit.zero?
|
166
|
+
def last(limit = 1)
|
167
|
+
return('') if limit.zero?
|
162
168
|
|
163
169
|
limit >= length ? self : from(-limit)
|
164
170
|
end
|
@@ -175,19 +181,19 @@ module ActiveObject::String
|
|
175
181
|
to_i.ordinalize
|
176
182
|
end
|
177
183
|
|
178
|
-
def parameterize(seperator=
|
184
|
+
def parameterize(seperator = '-')
|
179
185
|
underscore.gsub(/\s+/, seperator).downcase
|
180
186
|
end
|
181
187
|
|
182
|
-
def parameterize!(seperator=
|
188
|
+
def parameterize!(seperator = '-')
|
183
189
|
replace(parameterize(seperator))
|
184
190
|
end
|
185
191
|
|
186
|
-
def pollute(delimiter=
|
187
|
-
split(
|
192
|
+
def pollute(delimiter = '^--^--^')
|
193
|
+
split('').map { |chr| "#{chr}#{delimiter}" }.join
|
188
194
|
end
|
189
195
|
|
190
|
-
def pollute!(delimiter=
|
196
|
+
def pollute!(delimiter = '^--^--^')
|
191
197
|
replace(pollute(delimiter))
|
192
198
|
end
|
193
199
|
|
@@ -202,12 +208,8 @@ module ActiveObject::String
|
|
202
208
|
def remove(*patterns)
|
203
209
|
string = dup
|
204
210
|
|
205
|
-
patterns.flatten.each do |
|
206
|
-
|
207
|
-
string.slice!(p)
|
208
|
-
else
|
209
|
-
string.gsub!(p, "")
|
210
|
-
end
|
211
|
+
patterns.flatten.each do |pat|
|
212
|
+
pat.is_a?(Range) ? string.slice!(pat) : string.gsub!(pat, '')
|
211
213
|
end
|
212
214
|
|
213
215
|
string
|
@@ -218,18 +220,18 @@ module ActiveObject::String
|
|
218
220
|
end
|
219
221
|
|
220
222
|
def remove_tags
|
221
|
-
gsub(
|
223
|
+
gsub(%r{<\/?[^>]*>}, '')
|
222
224
|
end
|
223
225
|
|
224
226
|
def remove_tags!
|
225
227
|
replace(remove_tags)
|
226
228
|
end
|
227
229
|
|
228
|
-
def sample(separator=
|
230
|
+
def sample(separator = ' ')
|
229
231
|
split(separator).sample
|
230
232
|
end
|
231
233
|
|
232
|
-
def sample!(separator=
|
234
|
+
def sample!(separator = ' ')
|
233
235
|
replace(sample(separator))
|
234
236
|
end
|
235
237
|
|
@@ -238,7 +240,7 @@ module ActiveObject::String
|
|
238
240
|
self[0]
|
239
241
|
else
|
240
242
|
string = dup
|
241
|
-
patterns.flatten.each { |
|
243
|
+
patterns.flatten.each { |pat| string.sub!(pat, '') }
|
242
244
|
string
|
243
245
|
end
|
244
246
|
end
|
@@ -247,21 +249,21 @@ module ActiveObject::String
|
|
247
249
|
replace(shift(*patterns))
|
248
250
|
end
|
249
251
|
|
250
|
-
def shuffle(separator=
|
252
|
+
def shuffle(separator = '')
|
251
253
|
split(separator).shuffle.join
|
252
254
|
end
|
253
255
|
|
254
|
-
def shuffle!(separator=
|
256
|
+
def shuffle!(separator = '')
|
255
257
|
replace(shuffle(separator))
|
256
258
|
end
|
257
259
|
|
258
260
|
def sift(chars_to_keep)
|
259
261
|
chars_to_keep = case chars_to_keep
|
260
262
|
when String then chars_to_keep.chars
|
261
|
-
when Array then chars_to_keep.map
|
262
|
-
when Range then chars_to_keep.to_a.map
|
263
|
+
when Array then chars_to_keep.map(&:to_s)
|
264
|
+
when Range then chars_to_keep.to_a.map(&:to_s)
|
263
265
|
else
|
264
|
-
raise TypeError,
|
266
|
+
raise TypeError, 'Invalid parameter'
|
265
267
|
end
|
266
268
|
|
267
269
|
chars.keep_if { |chr| chars_to_keep.include?(chr) }.join
|
@@ -272,11 +274,11 @@ module ActiveObject::String
|
|
272
274
|
end
|
273
275
|
|
274
276
|
def slugify
|
275
|
-
gsub(/[^\x00-\x7F]+/,
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
277
|
+
gsub(/[^\x00-\x7F]+/, '')
|
278
|
+
.gsub(/[^\w_ \-]+/i, '')
|
279
|
+
.gsub(/[ \-]+/i, '-')
|
280
|
+
.gsub(/^\-|\-$/i, '')
|
281
|
+
.downcase
|
280
282
|
end
|
281
283
|
|
282
284
|
def slugify!
|
@@ -284,7 +286,7 @@ module ActiveObject::String
|
|
284
286
|
end
|
285
287
|
|
286
288
|
def squish
|
287
|
-
strip.gsub(/\s+/,
|
289
|
+
strip.gsub(/\s+/, ' ')
|
288
290
|
end
|
289
291
|
|
290
292
|
def squish!
|
@@ -315,49 +317,50 @@ module ActiveObject::String
|
|
315
317
|
self[0..position]
|
316
318
|
end
|
317
319
|
|
318
|
-
def truncate(truncate_at, options={})
|
320
|
+
def truncate(truncate_at, options = {})
|
319
321
|
return(dup) unless length > truncate_at
|
320
322
|
|
321
|
-
omission = options
|
323
|
+
omission = options[:omission] || '...'
|
322
324
|
size_with_room_for_omission = truncate_at - omission.length
|
323
325
|
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
326
|
+
seperator = options[:separator]
|
327
|
+
stop = if seperator
|
328
|
+
rindex(seperator || '', size_with_room_for_omission) || size_with_room_for_omission
|
329
|
+
else
|
330
|
+
size_with_room_for_omission
|
331
|
+
end
|
329
332
|
|
330
333
|
"#{self[0, stop]}#{omission}"
|
331
334
|
end
|
332
335
|
|
333
|
-
def truncate_words(words_count, options={})
|
334
|
-
sep = options
|
335
|
-
sep = Regexp.escape(sep.to_s) unless Regexp
|
336
|
+
def truncate_words(words_count, options = {})
|
337
|
+
sep = options[:separator] || /\s+/
|
338
|
+
sep = Regexp.escape(sep.to_s) unless sep.is_a(Regexp)
|
336
339
|
|
337
340
|
if self =~ /\A((?:.+?#{sep}){#{words_count - 1}}.+?)#{sep}.*/m
|
338
|
-
"#{
|
341
|
+
"#{Regexp.last_match(1)}#{options[:omissio] || '...'}"
|
339
342
|
else
|
340
343
|
self
|
341
344
|
end
|
342
345
|
end
|
343
346
|
|
344
347
|
def underscore
|
345
|
-
gsub(/::/,
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
348
|
+
gsub(/::/, '/')
|
349
|
+
.gsub(/([A-Z\d]+)([A-Z][a-z])/, "\1_\2")
|
350
|
+
.gsub(/([a-z\d])([A-Z])/, "\1_\2")
|
351
|
+
.tr('-', '_')
|
352
|
+
.downcase
|
350
353
|
end
|
351
354
|
|
352
355
|
def underscore!
|
353
356
|
replace(underscore)
|
354
357
|
end
|
355
358
|
|
356
|
-
def unpollute(delimiter=
|
357
|
-
gsub(delimiter,
|
359
|
+
def unpollute(delimiter = '^--^--^')
|
360
|
+
gsub(delimiter, '')
|
358
361
|
end
|
359
362
|
|
360
|
-
def unpollute!(delimiter=
|
363
|
+
def unpollute!(delimiter = '^--^--^')
|
361
364
|
replace(unpollute(delimiter))
|
362
365
|
end
|
363
366
|
|
@@ -366,8 +369,8 @@ module ActiveObject::String
|
|
366
369
|
end
|
367
370
|
|
368
371
|
def unshift(*patterns)
|
369
|
-
string =
|
370
|
-
patterns.flatten.each { |
|
372
|
+
string = ''
|
373
|
+
patterns.flatten.each { |pat| string.concat(pat) }
|
371
374
|
string.concat(self)
|
372
375
|
string
|
373
376
|
end
|
@@ -378,4 +381,4 @@ module ActiveObject::String
|
|
378
381
|
|
379
382
|
end
|
380
383
|
|
381
|
-
String.send(:include, ActiveObject::String) if ActiveObject.
|
384
|
+
String.send(:include, ActiveObject::String) if ActiveObject::Settings.config.autoload_string
|