active_object 2.5.2 → 3.0.0
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/Gemfile +2 -2
- data/LICENSE.txt +2 -2
- data/README.md +127 -54
- data/active_object.gemspec +5 -4
- data/bin/rake +6 -6
- data/lib/active_object.rb +25 -1
- data/lib/active_object/array.rb +91 -80
- data/lib/active_object/configuration.rb +21 -0
- data/lib/active_object/date.rb +31 -98
- data/lib/active_object/enumerable.rb +20 -26
- data/lib/active_object/hash.rb +73 -94
- data/lib/active_object/integer.rb +8 -17
- data/lib/active_object/numeric.rb +125 -129
- data/lib/active_object/object.rb +19 -25
- data/lib/active_object/range.rb +12 -14
- data/lib/active_object/string.rb +154 -224
- data/lib/active_object/time.rb +54 -146
- data/lib/active_object/version.rb +2 -2
- data/lib/generators/active_object/install_generator.rb +12 -0
- data/lib/generators/active_object/templates/install.rb +12 -0
- metadata +21 -4
data/lib/active_object/object.rb
CHANGED
@@ -1,19 +1,17 @@
|
|
1
|
-
|
1
|
+
module ActiveObject::Object
|
2
2
|
|
3
3
|
def array?
|
4
4
|
is_a?(Array)
|
5
5
|
end
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
respond_to?(:empty?) ? object.empty? : !object
|
12
|
-
end
|
7
|
+
def blank?
|
8
|
+
object = self
|
9
|
+
object = object.strip if respond_to?(:strip)
|
10
|
+
respond_to?(:empty?) ? object.empty? : !object
|
13
11
|
end
|
14
12
|
|
15
13
|
def boolean?
|
16
|
-
[false, "false", true, "true", nil, 0, "0", 1, "1"].
|
14
|
+
[false, "false", true, "true", nil, 0, "0", 1, "1"].include?(self)
|
17
15
|
end
|
18
16
|
|
19
17
|
def false?
|
@@ -21,7 +19,7 @@ class Object
|
|
21
19
|
end
|
22
20
|
|
23
21
|
def falsey?
|
24
|
-
[false, "false", nil, 0, "0", "1"].
|
22
|
+
[false, "false", nil, 0, "0", "1"].include?(self)
|
25
23
|
end
|
26
24
|
|
27
25
|
def float?
|
@@ -48,10 +46,8 @@ class Object
|
|
48
46
|
to_s == to_s.reverse
|
49
47
|
end
|
50
48
|
|
51
|
-
|
52
|
-
|
53
|
-
!blank?
|
54
|
-
end
|
49
|
+
def present?
|
50
|
+
!blank?
|
55
51
|
end
|
56
52
|
|
57
53
|
def range?
|
@@ -78,20 +74,18 @@ class Object
|
|
78
74
|
!falsey?
|
79
75
|
end
|
80
76
|
|
81
|
-
|
82
|
-
|
83
|
-
try!(*a, &b) if a.empty? || respond_to?(a.first)
|
84
|
-
end
|
77
|
+
def try(*a, &b)
|
78
|
+
try!(*a, &b) if a.empty? || respond_to?(a.first)
|
85
79
|
end
|
86
80
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
public_send(*a, &b)
|
93
|
-
end
|
81
|
+
def try!(*a, &b)
|
82
|
+
if a.empty? && block_given?
|
83
|
+
b.arity.zero? ? instance_eval(&b) : yield(self)
|
84
|
+
else
|
85
|
+
public_send(*a, &b)
|
94
86
|
end
|
95
87
|
end
|
96
88
|
|
97
|
-
end
|
89
|
+
end
|
90
|
+
|
91
|
+
Object.send(:include, ActiveObject::Object) if ActiveObject.configuration.autoload_object
|
data/lib/active_object/range.rb
CHANGED
@@ -1,24 +1,20 @@
|
|
1
|
-
|
1
|
+
module ActiveObject::Range
|
2
2
|
|
3
3
|
def combine(other)
|
4
4
|
to_a.concat(other.to_a)
|
5
5
|
end
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
include?(other)
|
14
|
-
end
|
7
|
+
def include_with_range?(other)
|
8
|
+
if other.is_a?(::Range)
|
9
|
+
operator = exclude_end? && !other.exclude_end? ? :< : :<=
|
10
|
+
include?(other.first) && other.last.send(operator, last)
|
11
|
+
else
|
12
|
+
include?(other)
|
15
13
|
end
|
16
14
|
end
|
17
15
|
|
18
|
-
|
19
|
-
|
20
|
-
cover?(other.first) || other.cover?(first)
|
21
|
-
end
|
16
|
+
def overlaps?(other)
|
17
|
+
cover?(other.first) || other.cover?(first)
|
22
18
|
end
|
23
19
|
|
24
20
|
def sample
|
@@ -33,4 +29,6 @@ class Range
|
|
33
29
|
cover?(other.first) && cover?(other.last)
|
34
30
|
end
|
35
31
|
|
36
|
-
end
|
32
|
+
end
|
33
|
+
|
34
|
+
Range.send(:include, ActiveObject::Range) if ActiveObject.configuration.autoload_range
|
data/lib/active_object/string.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
module ActiveObject::String
|
2
2
|
|
3
3
|
def any?(*keys)
|
4
4
|
included = false
|
@@ -6,93 +6,64 @@ class String
|
|
6
6
|
included
|
7
7
|
end
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
self[position]
|
12
|
-
end
|
9
|
+
def at(position)
|
10
|
+
self[position]
|
13
11
|
end
|
14
12
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
gsub(/(?:^|_)(.)/) { $1.upcase }
|
21
|
-
else
|
22
|
-
"#{to_s.first.chr.downcase}#{camelize(self)[1..-1]}"
|
23
|
-
end
|
13
|
+
def camelize(first_letter=:upper)
|
14
|
+
if first_letter.to_sym != :lower
|
15
|
+
to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
|
16
|
+
else
|
17
|
+
"#{to_s.first.chr.downcase}#{camelize(self)[1..-1]}"
|
24
18
|
end
|
25
|
-
|
26
|
-
alias_method :camelcase, :camelize
|
27
19
|
end
|
28
20
|
|
29
|
-
|
30
|
-
def camelize!(first_letter=:upper)
|
31
|
-
replace(camelize(first_letter))
|
32
|
-
end
|
21
|
+
alias_method :camelcase, :camelize
|
33
22
|
|
34
|
-
|
23
|
+
def camelize!(first_letter=:upper)
|
24
|
+
replace(camelize(first_letter))
|
35
25
|
end
|
36
26
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
camelize
|
42
|
-
end
|
27
|
+
alias_method :camelcase!, :camelize!
|
28
|
+
|
29
|
+
def classify
|
30
|
+
to_s.sub(/.*\./, "").camelize
|
43
31
|
end
|
44
32
|
|
45
|
-
|
46
|
-
|
47
|
-
replace(classify)
|
48
|
-
end
|
33
|
+
def classify!
|
34
|
+
replace(classify)
|
49
35
|
end
|
50
36
|
|
51
|
-
|
52
|
-
|
53
|
-
Object.const_get(self)
|
54
|
-
end
|
37
|
+
def constantize
|
38
|
+
Object.const_get(self)
|
55
39
|
end
|
56
40
|
|
57
|
-
|
58
|
-
|
59
|
-
gsub(/_/, '-'.freeze)
|
60
|
-
end
|
41
|
+
def dasherize
|
42
|
+
gsub(/_/, "-")
|
61
43
|
end
|
62
44
|
|
63
|
-
|
64
|
-
|
65
|
-
replace(dasherize)
|
66
|
-
end
|
45
|
+
def dasherize!
|
46
|
+
replace(dasherize)
|
67
47
|
end
|
68
48
|
|
69
|
-
|
70
|
-
|
71
|
-
to_s[0, rindex('::'.freeze) || 0]
|
72
|
-
end
|
49
|
+
def deconstantize
|
50
|
+
to_s[0, rindex("::") || 0]
|
73
51
|
end
|
74
52
|
|
75
|
-
|
76
|
-
|
77
|
-
replace(deconstantize)
|
78
|
-
end
|
53
|
+
def deconstantize!
|
54
|
+
replace(deconstantize)
|
79
55
|
end
|
80
56
|
|
81
|
-
|
82
|
-
|
83
|
-
to_s.gsub(/^.*::/, ''.freeze)
|
84
|
-
end
|
57
|
+
def demodulize
|
58
|
+
to_s.gsub(/^.*::/, "")
|
85
59
|
end
|
86
60
|
|
87
|
-
|
88
|
-
|
89
|
-
replace(demodulize)
|
90
|
-
end
|
61
|
+
def demodulize!
|
62
|
+
replace(demodulize)
|
91
63
|
end
|
92
64
|
|
93
65
|
def domain
|
94
|
-
|
95
|
-
string =~ (/^(?:\w+:\/\/)?([^\/?]+)(?:\/|\?|$)/) ? $1 : string
|
66
|
+
self =~ (/^(?:\w+:\/\/)?([^\/?]+)(?:\/|\?|$)/) ? $1 : self
|
96
67
|
end
|
97
68
|
|
98
69
|
def downcase?
|
@@ -100,87 +71,81 @@ class String
|
|
100
71
|
end
|
101
72
|
|
102
73
|
def ellipsize(ellipsize_at, options={})
|
103
|
-
return(self)if length <= ellipsize_at
|
74
|
+
return(self) if length <= ellipsize_at
|
104
75
|
|
105
|
-
separator = options.fetch(:separator,
|
106
|
-
offset
|
76
|
+
separator = options.fetch(:separator, "...")
|
77
|
+
offset = options.fetch(:offset, 4)
|
107
78
|
|
108
79
|
"#{self[0, offset]}#{separator}#{self[-offset, offset]}"
|
109
80
|
end
|
110
81
|
|
111
|
-
|
112
|
-
|
113
|
-
!include?(string)
|
114
|
-
end
|
82
|
+
def exclude?(string)
|
83
|
+
!include?(string)
|
115
84
|
end
|
116
85
|
|
117
|
-
|
118
|
-
|
119
|
-
return(''.freeze) if limit.zero?
|
86
|
+
def first(limit=1)
|
87
|
+
return("") if limit.zero?
|
120
88
|
|
121
|
-
|
122
|
-
end
|
89
|
+
limit >= length ? self : to(limit - 1)
|
123
90
|
end
|
124
91
|
|
125
|
-
|
126
|
-
|
127
|
-
self[position..-1]
|
128
|
-
end
|
92
|
+
def format(*args)
|
93
|
+
super(self, *(args.flatten))
|
129
94
|
end
|
130
95
|
|
131
|
-
|
132
|
-
|
133
|
-
underscore.
|
134
|
-
gsub(/_id\z/, ''.freeze).
|
135
|
-
tr('_'.freeze, ' '.freeze).
|
136
|
-
squish.
|
137
|
-
gsub(/([a-z\d]*)/i) { |s| s.downcase }.
|
138
|
-
gsub(/\A\w/) { |s| options.fetch(:capitalize, true) ? s.upcase : s }
|
139
|
-
end
|
96
|
+
def from(position)
|
97
|
+
self[position..-1]
|
140
98
|
end
|
141
99
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
100
|
+
def humanize(options={})
|
101
|
+
capitalize = options.fetch(:capitalize, true)
|
102
|
+
|
103
|
+
underscore.
|
104
|
+
gsub(/_id\z/, "").
|
105
|
+
tr("_", " ").
|
106
|
+
squish.
|
107
|
+
gsub(/([a-z\d]*)/i) { |s| s.downcase }.
|
108
|
+
gsub(/\A\w/) { |s| capitalize ? s.upcase : s }
|
146
109
|
end
|
147
110
|
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
substitutes = indent_empty_lines ? /^/ : /^(?!$)/
|
111
|
+
def humanize!(options={})
|
112
|
+
replace(humanize(options))
|
113
|
+
end
|
152
114
|
|
153
|
-
|
154
|
-
|
115
|
+
def indent(amount, indent_string=nil, indent_empty_lines=false)
|
116
|
+
indent_string = indent_string || self[/^[ \t]/] || " "
|
117
|
+
substitutes = indent_empty_lines ? /^/ : /^(?!$)/
|
118
|
+
|
119
|
+
gsub(substitutes, indent_string * amount)
|
155
120
|
end
|
156
121
|
|
157
|
-
|
158
|
-
|
159
|
-
replace(indent(amount, indent_string, indent_empty_lines))
|
160
|
-
end
|
122
|
+
def indent!(amount, indent_string=nil, indent_empty_lines=false)
|
123
|
+
replace(indent(amount, indent_string, indent_empty_lines))
|
161
124
|
end
|
162
125
|
|
163
126
|
def index_all(pattern)
|
164
|
-
pattern
|
127
|
+
pattern = pattern.to_s if pattern.is_a?(Numeric)
|
165
128
|
arr_indexes = []
|
166
|
-
srch_index
|
129
|
+
srch_index = rindex(pattern)
|
167
130
|
|
168
131
|
while srch_index do
|
169
132
|
temp_string = self[0..(srch_index - 1)]
|
170
133
|
arr_indexes << srch_index
|
171
|
-
srch_index
|
134
|
+
srch_index = srch_index.zero? ? nil : temp_string.rindex(pattern)
|
172
135
|
end
|
173
136
|
|
174
137
|
arr_indexes.reverse
|
175
138
|
end
|
176
139
|
|
177
140
|
def labelize(options={})
|
141
|
+
capitalize = options.fetch(:capitalize, true)
|
142
|
+
|
178
143
|
underscore.
|
179
|
-
tr(
|
144
|
+
tr("_", " ").
|
180
145
|
squish.
|
181
146
|
gsub(/([a-z\d]*)/i) { |s| s.downcase }.
|
182
|
-
gsub(/\A\w/) { |s|
|
183
|
-
gsub(/ id\z/,
|
147
|
+
gsub(/\A\w/) { |s| capitalize ? s.upcase : s }.
|
148
|
+
gsub(/ id\z/, " ID")
|
184
149
|
end
|
185
150
|
|
186
151
|
alias_method :labelcase, :labelize
|
@@ -191,50 +156,38 @@ class String
|
|
191
156
|
|
192
157
|
alias_method :labelcase!, :labelize!
|
193
158
|
|
194
|
-
unless defined?(Rails)
|
195
|
-
def last(limit=1)
|
196
|
-
return(''.freeze) if limit.zero?
|
197
159
|
|
198
|
-
|
199
|
-
|
160
|
+
def last(limit=1)
|
161
|
+
return("") if limit.zero?
|
162
|
+
|
163
|
+
limit >= length ? self : from(-limit)
|
200
164
|
end
|
201
165
|
|
202
166
|
def mixedcase?
|
203
167
|
!upcase? && !downcase?
|
204
168
|
end
|
205
169
|
|
206
|
-
|
207
|
-
|
208
|
-
to_i.ordinal
|
209
|
-
end
|
170
|
+
def ordinal
|
171
|
+
to_i.ordinal
|
210
172
|
end
|
211
173
|
|
212
|
-
|
213
|
-
|
214
|
-
to_i.ordinalize
|
215
|
-
end
|
174
|
+
def ordinalize
|
175
|
+
to_i.ordinalize
|
216
176
|
end
|
217
177
|
|
218
|
-
|
219
|
-
|
220
|
-
underscore.
|
221
|
-
gsub(/\s+/, '_'.freeze).
|
222
|
-
gsub('_'.freeze, seperator).
|
223
|
-
downcase
|
224
|
-
end
|
178
|
+
def parameterize(seperator="-")
|
179
|
+
underscore.gsub(/\s+/, seperator).downcase
|
225
180
|
end
|
226
181
|
|
227
|
-
|
228
|
-
|
229
|
-
replace(parameterize(seperator))
|
230
|
-
end
|
182
|
+
def parameterize!(seperator="-")
|
183
|
+
replace(parameterize(seperator))
|
231
184
|
end
|
232
185
|
|
233
|
-
def pollute(delimiter=
|
234
|
-
split(
|
186
|
+
def pollute(delimiter="^--^--^")
|
187
|
+
split("").map { |c| "#{c}#{delimiter}" }.join
|
235
188
|
end
|
236
189
|
|
237
|
-
def pollute!(delimiter=
|
190
|
+
def pollute!(delimiter="^--^--^")
|
238
191
|
replace(pollute(delimiter))
|
239
192
|
end
|
240
193
|
|
@@ -246,41 +199,37 @@ class String
|
|
246
199
|
replace(concat(string))
|
247
200
|
end
|
248
201
|
|
249
|
-
|
250
|
-
|
251
|
-
string = dup
|
202
|
+
def remove(*patterns)
|
203
|
+
string = dup
|
252
204
|
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
end
|
205
|
+
patterns.flatten.each do |p|
|
206
|
+
if p.is_a?(Range)
|
207
|
+
string.slice!(p)
|
208
|
+
else
|
209
|
+
string.gsub!(p, "")
|
259
210
|
end
|
260
|
-
|
261
|
-
string
|
262
211
|
end
|
212
|
+
|
213
|
+
string
|
263
214
|
end
|
264
215
|
|
265
|
-
|
266
|
-
|
267
|
-
replace(remove(*patterns))
|
268
|
-
end
|
216
|
+
def remove!(*patterns)
|
217
|
+
replace(remove(*patterns))
|
269
218
|
end
|
270
219
|
|
271
220
|
def remove_tags
|
272
|
-
gsub(/<\/?[^>]*>/,
|
221
|
+
gsub(/<\/?[^>]*>/, "")
|
273
222
|
end
|
274
223
|
|
275
224
|
def remove_tags!
|
276
225
|
replace(remove_tags)
|
277
226
|
end
|
278
227
|
|
279
|
-
def sample(separator=
|
228
|
+
def sample(separator=" ")
|
280
229
|
split(separator).sample
|
281
230
|
end
|
282
231
|
|
283
|
-
def sample!(separator=
|
232
|
+
def sample!(separator=" ")
|
284
233
|
replace(sample(separator))
|
285
234
|
end
|
286
235
|
|
@@ -289,7 +238,7 @@ class String
|
|
289
238
|
self[0]
|
290
239
|
else
|
291
240
|
string = dup
|
292
|
-
patterns.flatten.each { |p| string.sub!(p,
|
241
|
+
patterns.flatten.each { |p| string.sub!(p, "") }
|
293
242
|
string
|
294
243
|
end
|
295
244
|
end
|
@@ -298,19 +247,19 @@ class String
|
|
298
247
|
replace(shift(*patterns))
|
299
248
|
end
|
300
249
|
|
301
|
-
def shuffle(separator=
|
250
|
+
def shuffle(separator="")
|
302
251
|
split(separator).shuffle.join
|
303
252
|
end
|
304
253
|
|
305
|
-
def shuffle!(separator=
|
254
|
+
def shuffle!(separator="")
|
306
255
|
replace(shuffle(separator))
|
307
256
|
end
|
308
257
|
|
309
258
|
def sift(chars_to_keep)
|
310
259
|
chars_to_keep = case chars_to_keep
|
311
260
|
when String then chars_to_keep.chars
|
312
|
-
when Array
|
313
|
-
when Range
|
261
|
+
when Array then chars_to_keep.map { |c| c.to_s }
|
262
|
+
when Range then chars_to_keep.to_a.map { |c| c.to_s }
|
314
263
|
else
|
315
264
|
raise TypeError, "Invalid parameter"
|
316
265
|
end
|
@@ -323,10 +272,10 @@ class String
|
|
323
272
|
end
|
324
273
|
|
325
274
|
def slugify
|
326
|
-
gsub(/[^\x00-\x7F]+/,
|
327
|
-
gsub(/[^\w_ \-]+/i,
|
328
|
-
gsub(/[ \-]+/i,
|
329
|
-
gsub(/^\-|\-$/i,
|
275
|
+
gsub(/[^\x00-\x7F]+/, "").
|
276
|
+
gsub(/[^\w_ \-]+/i, "").
|
277
|
+
gsub(/[ \-]+/i, "-").
|
278
|
+
gsub(/^\-|\-$/i, "").
|
330
279
|
downcase
|
331
280
|
end
|
332
281
|
|
@@ -334,17 +283,12 @@ class String
|
|
334
283
|
replace(slugify)
|
335
284
|
end
|
336
285
|
|
337
|
-
|
338
|
-
|
339
|
-
strip.
|
340
|
-
gsub(/\s+/, ' '.freeze)
|
341
|
-
end
|
286
|
+
def squish
|
287
|
+
strip.gsub(/\s+/, " ")
|
342
288
|
end
|
343
289
|
|
344
|
-
|
345
|
-
|
346
|
-
replace(squish)
|
347
|
-
end
|
290
|
+
def squish!
|
291
|
+
replace(squish)
|
348
292
|
end
|
349
293
|
|
350
294
|
def sort
|
@@ -355,81 +299,65 @@ class String
|
|
355
299
|
replace(sort)
|
356
300
|
end
|
357
301
|
|
358
|
-
|
359
|
-
|
360
|
-
underscore.
|
361
|
-
humanize.
|
362
|
-
gsub(/\b(?<!['’`])[a-z]/) { $&.capitalize }
|
363
|
-
end
|
364
|
-
|
365
|
-
alias_method :titlecase, :titleize
|
302
|
+
def titleize
|
303
|
+
underscore.humanize.gsub(/\b(?<!['’`])[a-z]/) { $&.capitalize }
|
366
304
|
end
|
367
305
|
|
368
|
-
|
369
|
-
def titleize!
|
370
|
-
replace(titleize)
|
371
|
-
end
|
306
|
+
alias_method :titlecase, :titleize
|
372
307
|
|
373
|
-
|
308
|
+
def titleize!
|
309
|
+
replace(titleize)
|
374
310
|
end
|
375
311
|
|
376
|
-
|
377
|
-
def to(position)
|
378
|
-
self[0..position]
|
379
|
-
end
|
380
|
-
end
|
312
|
+
alias_method :titlecase!, :titleize!
|
381
313
|
|
382
|
-
|
383
|
-
|
384
|
-
|
314
|
+
def to(position)
|
315
|
+
self[0..position]
|
316
|
+
end
|
385
317
|
|
386
|
-
|
387
|
-
|
318
|
+
def truncate(truncate_at, options={})
|
319
|
+
return(dup) unless length > truncate_at
|
388
320
|
|
389
|
-
|
390
|
-
|
391
|
-
else
|
392
|
-
size_with_room_for_omission
|
393
|
-
end
|
321
|
+
omission = options.fetch(:omission, "...")
|
322
|
+
size_with_room_for_omission = truncate_at - omission.length
|
394
323
|
|
395
|
-
|
324
|
+
stop = if options.fetch(:separator, false)
|
325
|
+
rindex(options.fetch(:separator, ""), size_with_room_for_omission) || size_with_room_for_omission
|
326
|
+
else
|
327
|
+
size_with_room_for_omission
|
396
328
|
end
|
329
|
+
|
330
|
+
"#{self[0, stop]}#{omission}"
|
397
331
|
end
|
398
332
|
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
sep = Regexp.escape(sep.to_s) unless Regexp === sep
|
333
|
+
def truncate_words(words_count, options={})
|
334
|
+
sep = options.fetch(:separator, /\s+/)
|
335
|
+
sep = Regexp.escape(sep.to_s) unless Regexp === sep
|
403
336
|
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
end
|
337
|
+
if self =~ /\A((?:.+?#{sep}){#{words_count - 1}}.+?)#{sep}.*/m
|
338
|
+
"#{$1}#{options.fetch(:omission, '...')}"
|
339
|
+
else
|
340
|
+
self
|
409
341
|
end
|
410
342
|
end
|
411
343
|
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
downcase
|
419
|
-
end
|
344
|
+
def underscore
|
345
|
+
gsub(/::/, "/").
|
346
|
+
gsub(/([A-Z\d]+)([A-Z][a-z])/, "\1_\2").
|
347
|
+
gsub(/([a-z\d])([A-Z])/, "\1_\2").
|
348
|
+
tr("-", "_").
|
349
|
+
downcase
|
420
350
|
end
|
421
351
|
|
422
|
-
|
423
|
-
|
424
|
-
replace(underscore)
|
425
|
-
end
|
352
|
+
def underscore!
|
353
|
+
replace(underscore)
|
426
354
|
end
|
427
355
|
|
428
|
-
def unpollute(delimiter=
|
429
|
-
gsub(delimiter,
|
356
|
+
def unpollute(delimiter="^--^--^")
|
357
|
+
gsub(delimiter, "")
|
430
358
|
end
|
431
359
|
|
432
|
-
def unpollute!(delimiter=
|
360
|
+
def unpollute!(delimiter="^--^--^")
|
433
361
|
replace(unpollute(delimiter))
|
434
362
|
end
|
435
363
|
|
@@ -438,7 +366,7 @@ class String
|
|
438
366
|
end
|
439
367
|
|
440
368
|
def unshift(*patterns)
|
441
|
-
string =
|
369
|
+
string = ""
|
442
370
|
patterns.flatten.each { |p| string.concat(p) }
|
443
371
|
string.concat(self)
|
444
372
|
string
|
@@ -448,4 +376,6 @@ class String
|
|
448
376
|
replace(unshift(*patterns))
|
449
377
|
end
|
450
378
|
|
451
|
-
end
|
379
|
+
end
|
380
|
+
|
381
|
+
String.send(:include, ActiveObject::String) if ActiveObject.configuration.autoload_string
|