active_object 1.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 +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,523 @@
|
|
1
|
+
class Numeric
|
2
|
+
|
3
|
+
MILLI = 0.001
|
4
|
+
CENTI = MILLI * 10
|
5
|
+
DECI = CENTI * 10
|
6
|
+
DECA = 10
|
7
|
+
HECTO = DECA * 10
|
8
|
+
KILO = HECTO * 10
|
9
|
+
|
10
|
+
KILOBYTE = 1024
|
11
|
+
MEGABYTE = KILOBYTE * 1024
|
12
|
+
GIGABYTE = MEGABYTE * 1024
|
13
|
+
TERABYTE = GIGABYTE * 1024
|
14
|
+
PETABYTE = TERABYTE * 1024
|
15
|
+
EXABYTE = PETABYTE * 1024
|
16
|
+
|
17
|
+
FEET = 12
|
18
|
+
YARD = FEET * 3
|
19
|
+
MILE = YARD * 1760
|
20
|
+
NAUTICAL_MILE = MILE * 1.15078
|
21
|
+
|
22
|
+
METRIC_TON = KILO * 1000
|
23
|
+
POUND = 16
|
24
|
+
STONE = POUND * 14
|
25
|
+
TON = POUND * 2000
|
26
|
+
|
27
|
+
MINUTE = 60
|
28
|
+
HOUR = MINUTE * 60
|
29
|
+
DAY = HOUR * 24
|
30
|
+
WEEK = DAY * 7
|
31
|
+
YEAR = DAY * 365.25
|
32
|
+
DECADE = YEAR * 10
|
33
|
+
CENTURY = DECADE * 10
|
34
|
+
MILLENNIUM = CENTURY * 10
|
35
|
+
|
36
|
+
def add(n)
|
37
|
+
self + n
|
38
|
+
end
|
39
|
+
|
40
|
+
unless method_defined?(:bytes)
|
41
|
+
def bytes
|
42
|
+
self
|
43
|
+
end
|
44
|
+
|
45
|
+
alias_method :byte, :bytes
|
46
|
+
end
|
47
|
+
|
48
|
+
def centigrams
|
49
|
+
self * CENTI
|
50
|
+
end
|
51
|
+
|
52
|
+
alias_method :centigram, :centigrams
|
53
|
+
|
54
|
+
def centimeters
|
55
|
+
self * CENTI
|
56
|
+
end
|
57
|
+
|
58
|
+
alias_method :centimeter, :centimeters
|
59
|
+
|
60
|
+
def centuries
|
61
|
+
self * CENTURY
|
62
|
+
end
|
63
|
+
|
64
|
+
alias_method :century, :centuries
|
65
|
+
|
66
|
+
def days
|
67
|
+
self * DAY
|
68
|
+
end
|
69
|
+
|
70
|
+
alias_method :day, :days
|
71
|
+
|
72
|
+
def decades
|
73
|
+
self * DECADE
|
74
|
+
end
|
75
|
+
|
76
|
+
alias_method :decade, :decades
|
77
|
+
|
78
|
+
def decagrams
|
79
|
+
self * DECA
|
80
|
+
end
|
81
|
+
|
82
|
+
alias_method :decagram, :decagrams
|
83
|
+
|
84
|
+
def decameters
|
85
|
+
self * DECA
|
86
|
+
end
|
87
|
+
|
88
|
+
alias_method :decameter, :decameters
|
89
|
+
|
90
|
+
def decigrams
|
91
|
+
self * DECI
|
92
|
+
end
|
93
|
+
|
94
|
+
alias_method :decigram, :decigrams
|
95
|
+
|
96
|
+
def decimeters
|
97
|
+
self * DECI
|
98
|
+
end
|
99
|
+
|
100
|
+
alias_method :decimeter, :decimeters
|
101
|
+
|
102
|
+
def divide(n)
|
103
|
+
self / n
|
104
|
+
end
|
105
|
+
|
106
|
+
unless method_defined?(:exabytes)
|
107
|
+
def exabytes
|
108
|
+
self * EXABYTE
|
109
|
+
end
|
110
|
+
|
111
|
+
alias_method :exabyte, :exabytes
|
112
|
+
end
|
113
|
+
|
114
|
+
def feet
|
115
|
+
self * FEET
|
116
|
+
end
|
117
|
+
|
118
|
+
alias_method :foot, :feet
|
119
|
+
|
120
|
+
unless method_defined?(:gigabytes)
|
121
|
+
def gigabytes
|
122
|
+
self * GIGABYTE
|
123
|
+
end
|
124
|
+
|
125
|
+
alias_method :gigabyte, :gigabytes
|
126
|
+
end
|
127
|
+
|
128
|
+
def grams
|
129
|
+
self
|
130
|
+
end
|
131
|
+
|
132
|
+
alias_method :gram, :grams
|
133
|
+
|
134
|
+
def hectograms
|
135
|
+
self * HECTO
|
136
|
+
end
|
137
|
+
|
138
|
+
alias_method :hectogram, :hectograms
|
139
|
+
|
140
|
+
def hectometers
|
141
|
+
self * HECTO
|
142
|
+
end
|
143
|
+
|
144
|
+
alias_method :hectometer, :hectometers
|
145
|
+
|
146
|
+
def hours
|
147
|
+
self * HOUR
|
148
|
+
end
|
149
|
+
|
150
|
+
alias_method :hour, :hours
|
151
|
+
|
152
|
+
def inches
|
153
|
+
self
|
154
|
+
end
|
155
|
+
|
156
|
+
alias_method :inch, :inches
|
157
|
+
|
158
|
+
unless method_defined?(:kilobytes)
|
159
|
+
def kilobytes
|
160
|
+
self * KILOBYTE
|
161
|
+
end
|
162
|
+
|
163
|
+
alias_method :kilobyte, :kilobytes
|
164
|
+
end
|
165
|
+
|
166
|
+
def kilometers
|
167
|
+
self * KILO
|
168
|
+
end
|
169
|
+
|
170
|
+
alias_method :kilometer, :kilometers
|
171
|
+
|
172
|
+
def kilograms
|
173
|
+
self * KILO
|
174
|
+
end
|
175
|
+
|
176
|
+
alias_method :kilogram, :kilograms
|
177
|
+
|
178
|
+
def metric_tons
|
179
|
+
self * METRIC_TON
|
180
|
+
end
|
181
|
+
|
182
|
+
alias_method :metric_ton, :metric_tons
|
183
|
+
|
184
|
+
unless method_defined?(:megabytes)
|
185
|
+
def megabytes
|
186
|
+
self * MEGABYTE
|
187
|
+
end
|
188
|
+
|
189
|
+
alias_method :megabyte, :megabytes
|
190
|
+
end
|
191
|
+
|
192
|
+
def meters
|
193
|
+
self
|
194
|
+
end
|
195
|
+
|
196
|
+
alias_method :meter, :meters
|
197
|
+
|
198
|
+
def miles
|
199
|
+
self * MILE
|
200
|
+
end
|
201
|
+
|
202
|
+
alias_method :mile, :miles
|
203
|
+
|
204
|
+
def millenniums
|
205
|
+
self * MILLENNIUM
|
206
|
+
end
|
207
|
+
|
208
|
+
alias_method :millennium, :millenniums
|
209
|
+
|
210
|
+
def milligrams
|
211
|
+
self * MILLI
|
212
|
+
end
|
213
|
+
|
214
|
+
alias_method :milligram, :milligrams
|
215
|
+
|
216
|
+
def millimeters
|
217
|
+
self * MILLI
|
218
|
+
end
|
219
|
+
|
220
|
+
alias_method :millimeter, :millimeters
|
221
|
+
|
222
|
+
def minutes
|
223
|
+
self * MINUTE
|
224
|
+
end
|
225
|
+
|
226
|
+
alias_method :minute, :minutes
|
227
|
+
|
228
|
+
def multiply(n)
|
229
|
+
self * n
|
230
|
+
end
|
231
|
+
|
232
|
+
unless method_defined?(:multiple_of?)
|
233
|
+
def multiple_of?(number)
|
234
|
+
number != 0 ? modulo(number).zero? : zero?
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
def nautical_miles
|
239
|
+
self * NAUTICAL_MILE
|
240
|
+
end
|
241
|
+
|
242
|
+
alias_method :nautical_mile, :nautical_miles
|
243
|
+
|
244
|
+
def negative?
|
245
|
+
self < 0
|
246
|
+
end
|
247
|
+
|
248
|
+
unless method_defined?(:ordinal)
|
249
|
+
def ordinal
|
250
|
+
abs_number = abs
|
251
|
+
|
252
|
+
if (11..13).include?(abs_number % 100)
|
253
|
+
"th"
|
254
|
+
else
|
255
|
+
case abs_number % 10
|
256
|
+
when 1; "st"
|
257
|
+
when 2; "nd"
|
258
|
+
when 3; "rd"
|
259
|
+
else "th"
|
260
|
+
end
|
261
|
+
end
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
unless method_defined?(:ordinalize)
|
266
|
+
def ordinalize
|
267
|
+
"#{self}#{self.ordinal}"
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
def ounces
|
272
|
+
self
|
273
|
+
end
|
274
|
+
|
275
|
+
alias_method :ounce, :ounces
|
276
|
+
|
277
|
+
def pad(options={})
|
278
|
+
pad_number = options.fetch(:pad_number, 0)
|
279
|
+
precision = options.fetch(:precision, 3)
|
280
|
+
|
281
|
+
to_s.rjust(precision, pad_number.to_s)
|
282
|
+
end
|
283
|
+
|
284
|
+
def pad_precision(options={})
|
285
|
+
pad_number = options.fetch(:pad_number, 0)
|
286
|
+
precision = options.fetch(:precision, 2)
|
287
|
+
separator = options.fetch(:separator, ".")
|
288
|
+
string = to_s
|
289
|
+
|
290
|
+
string << separator unless string.include?(separator)
|
291
|
+
ljust_count = string.split(separator).first.size
|
292
|
+
ljust_count += (string.count(separator) + precision) if precision > 0
|
293
|
+
num_count = string.size
|
294
|
+
ljust_count >= num_count ? string.ljust(ljust_count, pad_number.to_s) : string[0..(ljust_count - 1)]
|
295
|
+
end
|
296
|
+
|
297
|
+
unless method_defined?(:petabytes)
|
298
|
+
def petabytes
|
299
|
+
self * PETABYTE
|
300
|
+
end
|
301
|
+
|
302
|
+
alias_method :petabyte, :petabytes
|
303
|
+
end
|
304
|
+
|
305
|
+
def positive?
|
306
|
+
self > 0
|
307
|
+
end
|
308
|
+
|
309
|
+
def pounds
|
310
|
+
self * POUND
|
311
|
+
end
|
312
|
+
|
313
|
+
alias_method :pound, :pounds
|
314
|
+
|
315
|
+
def power(n)
|
316
|
+
self ** n
|
317
|
+
end
|
318
|
+
|
319
|
+
def root(n)
|
320
|
+
self ** (1.0 / n)
|
321
|
+
end
|
322
|
+
|
323
|
+
def seconds
|
324
|
+
self
|
325
|
+
end
|
326
|
+
|
327
|
+
alias_method :second, :seconds
|
328
|
+
|
329
|
+
def stones
|
330
|
+
self * STONE
|
331
|
+
end
|
332
|
+
|
333
|
+
alias_method :stone, :stones
|
334
|
+
|
335
|
+
def subtract(n)
|
336
|
+
self - n
|
337
|
+
end
|
338
|
+
|
339
|
+
unless method_defined?(:terabytes)
|
340
|
+
def terabytes
|
341
|
+
self * TERABYTE
|
342
|
+
end
|
343
|
+
|
344
|
+
alias_method :terabyte, :terabytes
|
345
|
+
end
|
346
|
+
|
347
|
+
def to_byte(from, to)
|
348
|
+
valid_keys = [
|
349
|
+
:byte, :bytes,
|
350
|
+
:kilobyte, :kilobytes,
|
351
|
+
:megabyte, :megabytes,
|
352
|
+
:gigabyte, :gigabytes,
|
353
|
+
:terabyte, :terabytes,
|
354
|
+
:petabyte, :petabytes,
|
355
|
+
:exabyte, :exabytes
|
356
|
+
]
|
357
|
+
|
358
|
+
unless valid_keys.include?(from) && valid_keys.include?(to)
|
359
|
+
raise ArgumentError,
|
360
|
+
"Unknown key(s): form: #{from.inspect} and to: #{to.inspect}, Valid keys are: #{valid_keys.map(&:inspect).join(', ')}"
|
361
|
+
end
|
362
|
+
|
363
|
+
to_f * 1.send(from) / 1.send(to)
|
364
|
+
end
|
365
|
+
|
366
|
+
def to_length(from, to)
|
367
|
+
valid_keys = [
|
368
|
+
:meter, :meters,
|
369
|
+
:millimeter, :millimeters,
|
370
|
+
:centimeter, :centimeters,
|
371
|
+
:decimeter, :decimeters,
|
372
|
+
:decameter, :decameters,
|
373
|
+
:hectometer, :hectometers,
|
374
|
+
:kilometer, :kilometers,
|
375
|
+
:inch, :inches,
|
376
|
+
:foot, :feet,
|
377
|
+
:yard, :yards,
|
378
|
+
:mile, :miles,
|
379
|
+
:nautical_mile, :nautical_miles
|
380
|
+
]
|
381
|
+
|
382
|
+
unless valid_keys.include?(from) && valid_keys.include?(to)
|
383
|
+
raise ArgumentError,
|
384
|
+
"Unknown key(s): form: #{from.inspect} and to: #{to.inspect}, Valid keys are: #{valid_keys.map(&:inspect).join(', ')}"
|
385
|
+
end
|
386
|
+
|
387
|
+
case to
|
388
|
+
when from
|
389
|
+
self
|
390
|
+
when :meter, :meters, :millimeter, :millimeters, :centimeter, :centimeters, :decimeter, :decimeters, :decameter, :decameters, :hectometer, :hectometers, :kilometer, :kilometers
|
391
|
+
if valid_keys.first(14).include?(from)
|
392
|
+
to_f * 1.send(from) / 1.send(to)
|
393
|
+
else
|
394
|
+
to_f * ((1.send(from) * 0.0254) / 1.send(to))
|
395
|
+
end
|
396
|
+
when :inch, :inches, :foot, :feet, :yard, :yards, :mile, :miles, :nautical_mile, :nautical_miles
|
397
|
+
if valid_keys.first(14).include?(from)
|
398
|
+
to_f * ((1.send(from) * 39.3701) / 1.send(to))
|
399
|
+
else
|
400
|
+
to_f * 1.send(from) / 1.send(to)
|
401
|
+
end
|
402
|
+
end
|
403
|
+
end
|
404
|
+
|
405
|
+
def to_mass(from, to)
|
406
|
+
valid_keys = [
|
407
|
+
:gram, :grams,
|
408
|
+
:milligram, :milligrams,
|
409
|
+
:centigram, :centigrams,
|
410
|
+
:decigram, :decigrams,
|
411
|
+
:decagram, :decagrams,
|
412
|
+
:hectogram, :hectograms,
|
413
|
+
:kilogram, :kilograms,
|
414
|
+
:metric_ton, :metric_tons,
|
415
|
+
:ounce, :ounces,
|
416
|
+
:pound, :pounds,
|
417
|
+
:stone, :stones,
|
418
|
+
:ton, :tons
|
419
|
+
]
|
420
|
+
|
421
|
+
unless valid_keys.include?(from) && valid_keys.include?(to)
|
422
|
+
raise ArgumentError,
|
423
|
+
"Unknown key(s): form: #{from.inspect} and to: #{to.inspect}, Valid keys are: #{valid_keys.map(&:inspect).join(', ')}"
|
424
|
+
end
|
425
|
+
|
426
|
+
case to
|
427
|
+
when from
|
428
|
+
self
|
429
|
+
when :gram, :grams, :milligram, :milligrams, :centigram, :centigrams, :decigram, :decigrams, :decagram, :decagrams, :hectogram, :hectograms, :kilogram, :kilograms, :metric_ton, :metric_tons
|
430
|
+
if valid_keys.first(16).include?(from)
|
431
|
+
to_f * 1.send(from) / 1.send(to)
|
432
|
+
else
|
433
|
+
to_f * ((1.send(from) * 28.3495) / 1.send(to))
|
434
|
+
end
|
435
|
+
when :ounce, :ounces, :pound, :pounds, :stone, :stones, :ton, :tons
|
436
|
+
if valid_keys.first(16).include?(from)
|
437
|
+
to_f * ((1.send(from) * 0.035274) / 1.send(to))
|
438
|
+
else
|
439
|
+
to_f * 1.send(from) / 1.send(to)
|
440
|
+
end
|
441
|
+
end
|
442
|
+
end
|
443
|
+
|
444
|
+
def to_nearest_value(values=[])
|
445
|
+
return(self) if values.size.zero?
|
446
|
+
value = values.first
|
447
|
+
difference = (self - value).abs
|
448
|
+
|
449
|
+
values.each do |v|
|
450
|
+
if (self - v).abs < difference
|
451
|
+
difference = (self - v).abs
|
452
|
+
value = v
|
453
|
+
end
|
454
|
+
end
|
455
|
+
value
|
456
|
+
end
|
457
|
+
|
458
|
+
def to_temperature(from, to)
|
459
|
+
valid_keys = [:celsius, :fahrenheit, :kelvin]
|
460
|
+
|
461
|
+
unless valid_keys.include?(from) && valid_keys.include?(to)
|
462
|
+
raise ArgumentError,
|
463
|
+
"Unknown key(s): form: #{from.inspect} and to: #{to.inspect}, Valid keys are: #{valid_keys.map(&:inspect).join(', ')}"
|
464
|
+
end
|
465
|
+
|
466
|
+
case to
|
467
|
+
when from
|
468
|
+
self
|
469
|
+
when :celsius
|
470
|
+
from == :kelvin ? (to_f - 273.15) : ((to_f - 32.0) * 5.0 / 9.0)
|
471
|
+
when :fahrenheit
|
472
|
+
from == :kelvin ? (1.8 * (to_f - 273.15) + 32.0) : ((to_f * 9.0 / 5.0) + 32.0)
|
473
|
+
when :kelvin
|
474
|
+
from == :celsius ? (to_f + 273.15) : (((to_f - 32.0) * 5.0 / 9.0) + 273.15)
|
475
|
+
end
|
476
|
+
end
|
477
|
+
|
478
|
+
def to_time(from, to)
|
479
|
+
valid_keys = [
|
480
|
+
:second, :seconds,
|
481
|
+
:minute, :minutes,
|
482
|
+
:hour, :hours,
|
483
|
+
:day, :days,
|
484
|
+
:week, :weeks,
|
485
|
+
:year, :years,
|
486
|
+
:decade, :decades,
|
487
|
+
:century, :centuries,
|
488
|
+
:millennium, :millenniums
|
489
|
+
]
|
490
|
+
|
491
|
+
unless valid_keys.include?(from) && valid_keys.include?(to)
|
492
|
+
raise ArgumentError,
|
493
|
+
"Unknown key(s): form: #{from.inspect} and to: #{to.inspect}, Valid keys are: #{valid_keys.map(&:inspect).join(', ')}"
|
494
|
+
end
|
495
|
+
|
496
|
+
to_f * 1.send(from) / 1.send(to)
|
497
|
+
end
|
498
|
+
|
499
|
+
def tons
|
500
|
+
self * TON
|
501
|
+
end
|
502
|
+
|
503
|
+
alias_method :ton, :tons
|
504
|
+
|
505
|
+
def weeks
|
506
|
+
self * WEEK
|
507
|
+
end
|
508
|
+
|
509
|
+
alias_method :week, :weeks
|
510
|
+
|
511
|
+
def yards
|
512
|
+
self * YARD
|
513
|
+
end
|
514
|
+
|
515
|
+
alias_method :yard, :yards
|
516
|
+
|
517
|
+
def years
|
518
|
+
self * YEAR
|
519
|
+
end
|
520
|
+
|
521
|
+
alias_method :year, :years
|
522
|
+
|
523
|
+
end
|