active_object 2.5.2 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|