active_object 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +14 -0
- data/.rspec +4 -0
- data/.travis.yml +13 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +1361 -0
- data/Rakefile +1 -0
- data/active_object.gemspec +25 -0
- data/lib/active_object.rb +9 -0
- data/lib/active_object/array.rb +118 -0
- data/lib/active_object/enumerable.rb +172 -0
- data/lib/active_object/hash.rb +203 -0
- data/lib/active_object/integer.rb +7 -0
- data/lib/active_object/numeric.rb +523 -0
- data/lib/active_object/object.rb +41 -0
- data/lib/active_object/string.rb +311 -0
- data/lib/active_object/time.rb +150 -0
- data/lib/active_object/version.rb +3 -0
- data/spec/lib/array_spec.rb +125 -0
- data/spec/lib/enumerable_spec.rb +326 -0
- data/spec/lib/hash_spec.rb +191 -0
- data/spec/lib/integer_spec.rb +11 -0
- data/spec/lib/numeric_spec.rb +604 -0
- data/spec/lib/object_spec.rb +85 -0
- data/spec/lib/string_spec.rb +459 -0
- data/spec/lib/time_spec.rb +455 -0
- data/spec/spec_helper.rb +4 -0
- metadata +137 -0
@@ -0,0 +1,41 @@
|
|
1
|
+
class Object
|
2
|
+
|
3
|
+
unless method_defined?(:blank?)
|
4
|
+
def blank?
|
5
|
+
object = self
|
6
|
+
object = object.strip if respond_to?(:strip)
|
7
|
+
respond_to?(:empty?) ? !!object.empty? : !object
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def numeric?
|
12
|
+
!to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/).nil?
|
13
|
+
end
|
14
|
+
|
15
|
+
def palindrome?
|
16
|
+
to_s == to_s.reverse
|
17
|
+
end
|
18
|
+
|
19
|
+
unless method_defined?(:present?)
|
20
|
+
def present?
|
21
|
+
!blank?
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
unless method_defined?(:try)
|
26
|
+
def try(*a, &b)
|
27
|
+
try!(*a, &b) if a.empty? || respond_to?(a.first)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
unless method_defined?(:try!)
|
32
|
+
def try!(*a, &b)
|
33
|
+
if a.empty? && block_given?
|
34
|
+
b.arity.zero? ? instance_eval(&b) : yield(self)
|
35
|
+
else
|
36
|
+
public_send(*a, &b)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,311 @@
|
|
1
|
+
class String
|
2
|
+
|
3
|
+
unless method_defined?(:at)
|
4
|
+
def at(position)
|
5
|
+
self[position]
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
unless method_defined?(:camelize)
|
10
|
+
def camelize(first_letter=:upper)
|
11
|
+
if first_letter != :lower
|
12
|
+
to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
|
13
|
+
else
|
14
|
+
to_s.first.chr.downcase + camelize(self)[1..-1]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
alias_method :camelcase, :camelize
|
19
|
+
end
|
20
|
+
|
21
|
+
unless method_defined?(:camelize!)
|
22
|
+
def camelize!(first_letter=:upper)
|
23
|
+
replace(camelize(first_letter))
|
24
|
+
end
|
25
|
+
|
26
|
+
alias_method :camelcase!, :camelize!
|
27
|
+
end
|
28
|
+
|
29
|
+
unless method_defined?(:classify)
|
30
|
+
def classify
|
31
|
+
to_s.sub(/.*\./, "").camelize
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
unless method_defined?(:classify!)
|
36
|
+
def classify!
|
37
|
+
replace(classify)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
unless method_defined?(:dasherize)
|
42
|
+
def dasherize
|
43
|
+
gsub(/_/, "-")
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
unless method_defined?(:dasherize!)
|
48
|
+
def dasherize!
|
49
|
+
replace(dasherize)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
unless method_defined?(:demodulize)
|
54
|
+
def demodulize
|
55
|
+
to_s.gsub(/^.*::/, "")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
unless method_defined?(:demodulize!)
|
60
|
+
def demodulize!
|
61
|
+
replace(demodulize)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def domain
|
66
|
+
string = dup
|
67
|
+
string =~ (/^(?:\w+:\/\/)?([^\/?]+)(?:\/|\?|$)/) ? $1 : string
|
68
|
+
end
|
69
|
+
|
70
|
+
def downcase?
|
71
|
+
downcase == self
|
72
|
+
end
|
73
|
+
|
74
|
+
def ellipsize(ellipsize_at, options={})
|
75
|
+
return(self)if size <= ellipsize_at
|
76
|
+
separator = options.fetch(:separator, "...")
|
77
|
+
offset = options.fetch(:offset, 4)
|
78
|
+
|
79
|
+
"#{self[0,offset]}#{separator}#{self[-offset,offset]}"
|
80
|
+
end
|
81
|
+
|
82
|
+
unless method_defined?(:exclude?)
|
83
|
+
def exclude?(string)
|
84
|
+
!include?(string)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
unless method_defined?(:first)
|
89
|
+
def first(limit=1)
|
90
|
+
return("") if limit.zero?
|
91
|
+
limit >= size ? self.dup : to(limit - 1)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
unless method_defined?(:from)
|
96
|
+
def from(position)
|
97
|
+
self[position..-1]
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
unless method_defined?(:humanize)
|
102
|
+
def humanize(options = {})
|
103
|
+
underscore.
|
104
|
+
gsub(/_id\z/, "").
|
105
|
+
tr("_", " ").
|
106
|
+
gsub(/([a-z\d]*)/i) { |s| s.downcase }.
|
107
|
+
gsub(/\A\w/) { |s| options.fetch(:capitalize, true) ? s.upcase : s }
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
unless method_defined?(:humanize!)
|
112
|
+
def humanize!(options={})
|
113
|
+
replace(humanize(options))
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
unless method_defined?(:indent!)
|
118
|
+
def indent(amount, indent_string=nil, indent_empty_lines=false)
|
119
|
+
indent_string = indent_string || self[/^[ \t]/] || " "
|
120
|
+
substitutes = indent_empty_lines ? /^/ : /^(?!$)/
|
121
|
+
gsub(substitutes, indent_string * amount)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
unless method_defined?(:indent!)
|
126
|
+
def indent!(amount, indent_string=nil, indent_empty_lines=false)
|
127
|
+
replace(indent(amount, indent_string, indent_empty_lines))
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
unless method_defined?(:last)
|
132
|
+
def last(limit=1)
|
133
|
+
return("") if limit.zero?
|
134
|
+
limit >= size ? self.dup : from(-limit)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def mixedcase?
|
139
|
+
!upcase? && !downcase?
|
140
|
+
end
|
141
|
+
|
142
|
+
unless method_defined?(:ordinal)
|
143
|
+
def ordinal
|
144
|
+
to_i.ordinal
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
unless method_defined?(:ordinalize)
|
149
|
+
def ordinalize
|
150
|
+
to_i.ordinalize
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
unless method_defined?(:parameterize)
|
155
|
+
def parameterize(sep="-")
|
156
|
+
underscore.
|
157
|
+
gsub(/\s+/, "_").
|
158
|
+
gsub("_", sep).
|
159
|
+
downcase
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
unless method_defined?(:parameterize!)
|
164
|
+
def parameterize!(sep="-")
|
165
|
+
replace(parameterize(sep))
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
def pollute(delimiter="^--^--^")
|
170
|
+
split('').map { |c| "#{c}#{delimiter}" }.join
|
171
|
+
end
|
172
|
+
|
173
|
+
unless method_defined?(:remove)
|
174
|
+
def remove(*patterns)
|
175
|
+
string = dup
|
176
|
+
patterns.each do |pattern|
|
177
|
+
string.gsub!(pattern, "")
|
178
|
+
end
|
179
|
+
string
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
unless method_defined?(:remove!)
|
184
|
+
def remove!(*patterns)
|
185
|
+
replace(remove(*patterns))
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
def remove_tags
|
190
|
+
gsub(/<\/?[^>]*>/, "")
|
191
|
+
end
|
192
|
+
|
193
|
+
def remove_tags!
|
194
|
+
replace(remove_tags)
|
195
|
+
end
|
196
|
+
|
197
|
+
def shift(*patterns)
|
198
|
+
string = dup
|
199
|
+
patterns.each do |pattern|
|
200
|
+
string.sub!(pattern, "")
|
201
|
+
end
|
202
|
+
string
|
203
|
+
end
|
204
|
+
|
205
|
+
def shift!(*patterns)
|
206
|
+
replace(shift(*patterns))
|
207
|
+
end
|
208
|
+
|
209
|
+
def slugify
|
210
|
+
gsub(/[^\x00-\x7F]+/, '').
|
211
|
+
gsub(/[^\w_ \-]+/i, '').
|
212
|
+
gsub(/[ \-]+/i, '-').
|
213
|
+
gsub(/^\-|\-$/i, '').
|
214
|
+
downcase
|
215
|
+
end
|
216
|
+
|
217
|
+
def slugify!
|
218
|
+
replace(slugify)
|
219
|
+
end
|
220
|
+
|
221
|
+
unless method_defined?(:squish)
|
222
|
+
def squish
|
223
|
+
strip.gsub(/\s+/, ' ')
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
unless method_defined?(:squish!)
|
228
|
+
def squish!
|
229
|
+
replace(squish)
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
unless method_defined?(:titleize)
|
234
|
+
def titleize
|
235
|
+
underscore.
|
236
|
+
humanize.
|
237
|
+
gsub(/\b(?<!['’`])[a-z]/) { $&.capitalize }
|
238
|
+
end
|
239
|
+
|
240
|
+
alias_method :titlecase, :titleize
|
241
|
+
end
|
242
|
+
|
243
|
+
unless method_defined?(:titleize!)
|
244
|
+
def titleize!
|
245
|
+
replace(titleize)
|
246
|
+
end
|
247
|
+
|
248
|
+
alias_method :titlecase!, :titleize!
|
249
|
+
end
|
250
|
+
|
251
|
+
unless method_defined?(:to)
|
252
|
+
def to(position)
|
253
|
+
self[0..position]
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
unless method_defined?(:truncate)
|
258
|
+
def truncate(truncate_at, options={})
|
259
|
+
return(dup) unless length > truncate_at
|
260
|
+
|
261
|
+
omission = options.fetch(:omission, "...")
|
262
|
+
length_with_room_for_omission = truncate_at - omission.length
|
263
|
+
|
264
|
+
stop = if options.fetch(:separator, false)
|
265
|
+
rindex(options.fetch(:separator, ''), length_with_room_for_omission) || length_with_room_for_omission
|
266
|
+
else
|
267
|
+
length_with_room_for_omission
|
268
|
+
end
|
269
|
+
|
270
|
+
"#{self[0, stop]}#{omission}"
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
unless method_defined?(:truncate_words)
|
275
|
+
def truncate_words(words_count, options={})
|
276
|
+
sep = options[:separator] || /\s+/
|
277
|
+
sep = Regexp.escape(sep.to_s) unless Regexp === sep
|
278
|
+
|
279
|
+
if self =~ /\A((?:.+?#{sep}){#{words_count - 1}}.+?)#{sep}.*/m
|
280
|
+
$1 + (options[:omission] || '...')
|
281
|
+
else
|
282
|
+
dup
|
283
|
+
end
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
unless method_defined?(:underscore)
|
288
|
+
def underscore
|
289
|
+
gsub(/::/, '/').
|
290
|
+
gsub(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2').
|
291
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
292
|
+
tr("-", "_").
|
293
|
+
downcase
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
unless method_defined?(:underscore!)
|
298
|
+
def underscore!
|
299
|
+
replace(underscore)
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
def unpollute(delimiter="^--^--^")
|
304
|
+
gsub(delimiter, "")
|
305
|
+
end
|
306
|
+
|
307
|
+
def upcase?
|
308
|
+
upcase == self
|
309
|
+
end
|
310
|
+
|
311
|
+
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
class Time
|
2
|
+
|
3
|
+
def format(string)
|
4
|
+
delimiters = string.scan /\W+/
|
5
|
+
formatters = string.scan /[a-z0-9_]+/i
|
6
|
+
|
7
|
+
format_units = {
|
8
|
+
"d" => "d",
|
9
|
+
"day" => "d",
|
10
|
+
"day_zero" => "d",
|
11
|
+
"dd" => "-d",
|
12
|
+
"Day" => "-d",
|
13
|
+
"day_unpadded" => "-d",
|
14
|
+
"ddd" => "_d",
|
15
|
+
"DAY" => "_d",
|
16
|
+
"day_blank" => "_d",
|
17
|
+
"dddd" => "j",
|
18
|
+
"day_of_the_year" => "j",
|
19
|
+
"m" => "m",
|
20
|
+
"month" => "m",
|
21
|
+
"month_zero" => "m",
|
22
|
+
"mm" => "-m",
|
23
|
+
"Month" => "-m",
|
24
|
+
"month_unpadded" => "-m",
|
25
|
+
"mmm" => "_m",
|
26
|
+
"MONTH" => "_m",
|
27
|
+
"month_blank" => "_m",
|
28
|
+
"mmmm" => "B",
|
29
|
+
"month_name" => "B",
|
30
|
+
"mmmmm" => "b",
|
31
|
+
"month_name_abbr" => "b",
|
32
|
+
"w" => "u",
|
33
|
+
"weekday" => "u",
|
34
|
+
"ww" => "w",
|
35
|
+
"weekday_offset" => "w",
|
36
|
+
"www" => "A",
|
37
|
+
"weekday_name" => "A",
|
38
|
+
"wwww" => "a",
|
39
|
+
"weekday_name_abbr" => "a",
|
40
|
+
"wwwww" => "W",
|
41
|
+
"week" => "W",
|
42
|
+
"wwwwww" => "U",
|
43
|
+
"week_offset" => "U",
|
44
|
+
"yy" => "y",
|
45
|
+
"yr" => "y",
|
46
|
+
"yyyy" => "Y",
|
47
|
+
"year" => "Y",
|
48
|
+
"h" => "H",
|
49
|
+
"hour" => "H",
|
50
|
+
"hour_zero" => "H",
|
51
|
+
"hh" => "k",
|
52
|
+
"HOUR" => "k",
|
53
|
+
"hour_blank" => "k",
|
54
|
+
"hhh" => "I",
|
55
|
+
"hour_imperical" => "I",
|
56
|
+
"hour_imperical_zero" => "I",
|
57
|
+
"hhhh" => "l",
|
58
|
+
"HOUR_IMPERICAL" => "l",
|
59
|
+
"hour_imperical_blank" => "l",
|
60
|
+
"ampm" => "P",
|
61
|
+
"meridian" => "P",
|
62
|
+
"AMPM" => "p",
|
63
|
+
"MERIDIAN" => "p",
|
64
|
+
"n" => "M",
|
65
|
+
"minute" => "M",
|
66
|
+
"s" => "S",
|
67
|
+
"second" => "S",
|
68
|
+
"z" => "z",
|
69
|
+
"time_zone" => "z",
|
70
|
+
"zz" => ":z",
|
71
|
+
"time_zone_offset" => ":z",
|
72
|
+
"zzz" => "::z",
|
73
|
+
"time_zone_offset_full" => "::z",
|
74
|
+
"zzzz" => "Z",
|
75
|
+
"time_zone_name" => "Z"
|
76
|
+
}
|
77
|
+
|
78
|
+
strftime(formatters.map { |f| "%#{format_units.fetch(f)}#{delimiters.shift || ''}" }.join(""))
|
79
|
+
end
|
80
|
+
|
81
|
+
def to_format(key)
|
82
|
+
format_units = {
|
83
|
+
month: "%m",
|
84
|
+
month_zero: "%m",
|
85
|
+
month_unpadded: "%-m",
|
86
|
+
month_blank: "%_m",
|
87
|
+
month_name: "%B",
|
88
|
+
month_name_abbr: "%b",
|
89
|
+
weekday: "%d",
|
90
|
+
weekday_zero: "%d",
|
91
|
+
weekday_unpadded: "%-d",
|
92
|
+
weekday_blank: "%_d",
|
93
|
+
weekday_name: "%A",
|
94
|
+
weekday_name_abbr: "%a",
|
95
|
+
yr: "%y",
|
96
|
+
year: "%Y",
|
97
|
+
hour: "%H",
|
98
|
+
hour_zero: "%H",
|
99
|
+
hour_blank: "%k",
|
100
|
+
hour_imperical: "%I",
|
101
|
+
hour_imperical_zero: "%I",
|
102
|
+
hour_imperical_blank: "%l",
|
103
|
+
ampm: "%P",
|
104
|
+
meridian: "%P",
|
105
|
+
minute: "%M",
|
106
|
+
second: "%S",
|
107
|
+
time_zone: "%z",
|
108
|
+
time_zone_offset: "%:z",
|
109
|
+
time_zone_offset_full: "%::z",
|
110
|
+
time_zone_name: "%Z",
|
111
|
+
date: "%B %-d, %Y",
|
112
|
+
date_abbr: "%b %-d, %Y",
|
113
|
+
date_iso: "%Y-%m-%d",
|
114
|
+
datetime: "%B %-d, %Y %H:%M",
|
115
|
+
datetime_abbr: "%b %-d, %Y %H:%M",
|
116
|
+
datetime_iso: "%Y-%m-%d %H:%M",
|
117
|
+
datetime_imperical: "%B %-d, %Y %I:%M %P",
|
118
|
+
datetime_imperical_abbr: "%b %-d, %Y %I:%M %P",
|
119
|
+
datetime_imperical_iso: "%Y-%m-%d %I:%M %P",
|
120
|
+
datetime_tzn: "%B %-d, %Y %H:%M %Z",
|
121
|
+
datetime_abbr_tzn: "%b %-d, %Y %H:%M %Z",
|
122
|
+
datetime_iso_tzn: "%Y-%m-%d %H:%M %z",
|
123
|
+
datetime_imperical_tzn: "%B %-d, %Y %I:%M %P %Z",
|
124
|
+
datetime_imperical_abbr_tzn: "%b %-d, %Y %I:%M %P %Z",
|
125
|
+
datetime_imperical_iso_tzn: "%Y-%m-%d %I:%M %P %z",
|
126
|
+
day: "%B %-d",
|
127
|
+
day_abbr: "%b %-d",
|
128
|
+
day_iso: "%m-%d",
|
129
|
+
daytime: "%B %-d %H:%M",
|
130
|
+
daytime_abbr: "%b %-d %H:%M",
|
131
|
+
daytime_iso: "%m-%d %H:%M",
|
132
|
+
daytime_imperical: "%B %-d %I:%M %P",
|
133
|
+
daytime_imperical_abbr: "%b %-d %I:%M %P",
|
134
|
+
daytime_imperical_iso: "%m-%d %I:%M %P",
|
135
|
+
time: "%H:%M",
|
136
|
+
time_zero: "%H:%M",
|
137
|
+
time_blank: "%k:%M",
|
138
|
+
time_tz: "%H:%M %z",
|
139
|
+
time_tzn: "%H:%M %Z",
|
140
|
+
time_imperical: "%I:%M %P",
|
141
|
+
time_imperical_zero: "%I:%M %P",
|
142
|
+
time_imperical_blank: "%l:%M %P",
|
143
|
+
time_imperical_tz: "%I:%M %P %z",
|
144
|
+
time_imperical_tzn: "%I:%M %P %Z"
|
145
|
+
}
|
146
|
+
|
147
|
+
strftime(format_units.fetch(key))
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|