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
@@ -2,7 +2,6 @@ module Enumerable
|
|
2
2
|
|
3
3
|
def cluster(&block)
|
4
4
|
result = []
|
5
|
-
|
6
5
|
each do |element|
|
7
6
|
if result.last && (yield(result.last.last) == yield(element))
|
8
7
|
result.last << element
|
@@ -10,7 +9,6 @@ module Enumerable
|
|
10
9
|
result << [element]
|
11
10
|
end
|
12
11
|
end
|
13
|
-
|
14
12
|
result
|
15
13
|
end
|
16
14
|
|
@@ -41,7 +39,7 @@ module Enumerable
|
|
41
39
|
def drop_last_if
|
42
40
|
return(to_enum(:drop_last_if)) unless block_given?
|
43
41
|
|
44
|
-
result
|
42
|
+
result = []
|
45
43
|
dropping = true
|
46
44
|
reverse_each do |value|
|
47
45
|
result.unshift(value) unless dropping &&= yield(value)
|
@@ -55,10 +53,8 @@ module Enumerable
|
|
55
53
|
(found_count > n) ? false : n == found_count
|
56
54
|
end
|
57
55
|
|
58
|
-
|
59
|
-
|
60
|
-
!include?(object)
|
61
|
-
end
|
56
|
+
def exclude?(object)
|
57
|
+
!include?(object)
|
62
58
|
end
|
63
59
|
|
64
60
|
def expand
|
@@ -81,17 +77,15 @@ module Enumerable
|
|
81
77
|
any? { |x| object === x }
|
82
78
|
end
|
83
79
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
found_count > 1
|
91
|
-
end
|
92
|
-
else
|
93
|
-
any? { (found_count += 1) > 1 }
|
80
|
+
def many?
|
81
|
+
found_count = 0
|
82
|
+
if block_given?
|
83
|
+
any? do |v|
|
84
|
+
found_count += 1 if yield v
|
85
|
+
found_count > 1
|
94
86
|
end
|
87
|
+
else
|
88
|
+
any? { (found_count += 1) > 1 }
|
95
89
|
end
|
96
90
|
end
|
97
91
|
|
@@ -110,6 +104,8 @@ module Enumerable
|
|
110
104
|
sum.to_f / collection_length.to_f
|
111
105
|
end
|
112
106
|
|
107
|
+
alias_method :average, :mean
|
108
|
+
|
113
109
|
def median(identity=0)
|
114
110
|
collection_length = length.to_f
|
115
111
|
collection_sorted = sort
|
@@ -127,7 +123,7 @@ module Enumerable
|
|
127
123
|
return(identity) unless length > 0
|
128
124
|
|
129
125
|
frequency_distribution = inject(Hash.new(0)) { |h, v| h[v] += 1; h }
|
130
|
-
frequency_top_two
|
126
|
+
frequency_top_two = frequency_distribution.sort { |k, v| v[1] <=> k[1] }.take(2)
|
131
127
|
|
132
128
|
if frequency_top_two.length == 1
|
133
129
|
frequency_top_two.first.first
|
@@ -165,13 +161,11 @@ module Enumerable
|
|
165
161
|
Math.sqrt(variance)
|
166
162
|
end
|
167
163
|
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
inject { |s, v| s + v } || identity
|
174
|
-
end
|
164
|
+
def sum(identity=0, &block)
|
165
|
+
if block_given?
|
166
|
+
map(&block).sum(identity)
|
167
|
+
else
|
168
|
+
inject { |s, v| s + v } || identity
|
175
169
|
end
|
176
170
|
end
|
177
171
|
|
@@ -200,4 +194,4 @@ module Enumerable
|
|
200
194
|
sum.to_f / (collection_length.to_f - 1.0)
|
201
195
|
end
|
202
196
|
|
203
|
-
end
|
197
|
+
end
|
data/lib/active_object/hash.rb
CHANGED
@@ -1,48 +1,49 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
end
|
1
|
+
module ActiveObject::Hash
|
2
|
+
|
3
|
+
def assert_valid_keys(*valid_keys)
|
4
|
+
valid_keys.flatten!
|
5
|
+
|
6
|
+
each_key do |k|
|
7
|
+
unless valid_keys.include?(k)
|
8
|
+
raise ArgumentError,
|
9
|
+
"Unknown key: #{k.inspect}. Valid keys are: #{valid_keys.map(&:inspect).join(', ')}"
|
11
10
|
end
|
12
11
|
end
|
13
12
|
end
|
14
13
|
|
15
|
-
|
16
|
-
|
17
|
-
select { |k, v| !v.nil? }
|
18
|
-
end
|
14
|
+
def compact
|
15
|
+
select { |k, v| !v.nil? }
|
19
16
|
end
|
20
17
|
|
21
|
-
|
22
|
-
|
23
|
-
reject! { |k, v| v.nil? }
|
24
|
-
end
|
18
|
+
def compact!
|
19
|
+
reject! { |k, v| v.nil? }
|
25
20
|
end
|
26
21
|
|
27
|
-
|
28
|
-
|
29
|
-
dup.deep_merge!(other_hash, &block)
|
30
|
-
end
|
22
|
+
def deep_merge(other_hash, &block)
|
23
|
+
dup.deep_merge!(other_hash, &block)
|
31
24
|
end
|
32
25
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
this_value = self[current_key]
|
26
|
+
def deep_merge!(other_hash, &block)
|
27
|
+
other_hash.each_pair do |current_key, other_value|
|
28
|
+
this_value = self[current_key]
|
37
29
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
end
|
30
|
+
self[current_key] = if this_value.is_a?(Hash) && other_value.is_a?(Hash)
|
31
|
+
this_value.deep_merge(other_value, &block)
|
32
|
+
else
|
33
|
+
block_given? && key?(current_key) ? block.call(current_key, this_value, other_value) : other_value
|
43
34
|
end
|
35
|
+
end
|
44
36
|
|
45
|
-
|
37
|
+
self
|
38
|
+
end
|
39
|
+
|
40
|
+
def dig(key, *rest)
|
41
|
+
if value = (self[key] rescue nil)
|
42
|
+
if rest.empty?
|
43
|
+
value
|
44
|
+
elsif value.respond_to?(:dig)
|
45
|
+
value.dig(*rest)
|
46
|
+
end
|
46
47
|
end
|
47
48
|
end
|
48
49
|
|
@@ -91,16 +92,12 @@ class Hash
|
|
91
92
|
self
|
92
93
|
end
|
93
94
|
|
94
|
-
|
95
|
-
|
96
|
-
other_hash.merge(self)
|
97
|
-
end
|
95
|
+
def reverse_merge(other_hash)
|
96
|
+
other_hash.merge(self)
|
98
97
|
end
|
99
98
|
|
100
|
-
|
101
|
-
|
102
|
-
replace(reverse_merge(other_hash))
|
103
|
-
end
|
99
|
+
def reverse_merge!(other_hash)
|
100
|
+
replace(reverse_merge(other_hash))
|
104
101
|
end
|
105
102
|
|
106
103
|
def sample
|
@@ -143,37 +140,29 @@ class Hash
|
|
143
140
|
replace(shuffle)
|
144
141
|
end
|
145
142
|
|
146
|
-
|
147
|
-
|
148
|
-
keys.flatten.each_with_object(self.class.new) { |k, h| h[k] = self[k] if has_key?(k) }
|
149
|
-
end
|
143
|
+
def slice(*keys)
|
144
|
+
keys.flatten.each_with_object(self.class.new) { |k, h| h[k] = self[k] if has_key?(k) }
|
150
145
|
end
|
151
146
|
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
hash = slice(*keys)
|
147
|
+
def slice!(*keys)
|
148
|
+
omit = slice(*self.keys - keys)
|
149
|
+
hash = slice(*keys)
|
156
150
|
|
157
|
-
|
158
|
-
|
151
|
+
hash.default = default
|
152
|
+
hash.default_proc = default_proc if default_proc
|
159
153
|
|
160
|
-
|
161
|
-
|
162
|
-
end
|
154
|
+
replace(hash)
|
155
|
+
omit
|
163
156
|
end
|
164
157
|
|
165
|
-
|
166
|
-
|
167
|
-
dup.stringify_keys!
|
168
|
-
end
|
158
|
+
def stringify_keys
|
159
|
+
dup.stringify_keys!
|
169
160
|
end
|
170
161
|
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
options
|
176
|
-
end
|
162
|
+
def stringify_keys!
|
163
|
+
inject({}) do |options, (key, value)|
|
164
|
+
options[key.to_s] = value
|
165
|
+
options
|
177
166
|
end
|
178
167
|
end
|
179
168
|
|
@@ -185,18 +174,14 @@ class Hash
|
|
185
174
|
reject! { |k, v| v.blank? }
|
186
175
|
end
|
187
176
|
|
188
|
-
|
189
|
-
|
190
|
-
dup.symbolize_keys!
|
191
|
-
end
|
177
|
+
def symbolize_keys
|
178
|
+
dup.symbolize_keys!
|
192
179
|
end
|
193
180
|
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
options
|
199
|
-
end
|
181
|
+
def symbolize_keys!
|
182
|
+
inject({}) do |options, (key, value)|
|
183
|
+
options[(key.to_sym rescue key) || key] = value
|
184
|
+
options
|
200
185
|
end
|
201
186
|
end
|
202
187
|
|
@@ -206,38 +191,32 @@ class Hash
|
|
206
191
|
|
207
192
|
def symbolize_and_underscore_keys!
|
208
193
|
inject({}) do |options, (key, value)|
|
209
|
-
options[(key.to_s.gsub(
|
194
|
+
options[(key.to_s.gsub(" ", "_").underscore.to_sym rescue key) || key] = value
|
210
195
|
options
|
211
196
|
end
|
212
197
|
end
|
213
198
|
|
214
|
-
|
215
|
-
|
216
|
-
dup.transform_keys!(&block)
|
217
|
-
end
|
199
|
+
def transform_keys(&block)
|
200
|
+
dup.transform_keys!(&block)
|
218
201
|
end
|
219
202
|
|
220
|
-
|
221
|
-
|
222
|
-
return(enum_for(:transform_keys!)) unless block_given?
|
203
|
+
def transform_keys!(&block)
|
204
|
+
return(enum_for(:transform_keys!)) unless block_given?
|
223
205
|
|
224
|
-
|
225
|
-
|
226
|
-
end
|
206
|
+
keys.each { |k| self[yield(k)] = delete(k) }
|
207
|
+
self
|
227
208
|
end
|
228
209
|
|
229
|
-
|
230
|
-
|
231
|
-
dup.transform_values!(&block)
|
232
|
-
end
|
210
|
+
def transform_values(&block)
|
211
|
+
dup.transform_values!(&block)
|
233
212
|
end
|
234
213
|
|
235
|
-
|
236
|
-
|
237
|
-
return(enum_for(:transform_values!)) unless block_given?
|
214
|
+
def transform_values!(&block)
|
215
|
+
return(enum_for(:transform_values!)) unless block_given?
|
238
216
|
|
239
|
-
|
240
|
-
end
|
217
|
+
each { |k, v| self[k] = yield(v) }
|
241
218
|
end
|
242
219
|
|
243
|
-
end
|
220
|
+
end
|
221
|
+
|
222
|
+
Hash.send(:include, ActiveObject::Hash) if ActiveObject.configuration.autoload_hash
|
@@ -1,20 +1,9 @@
|
|
1
|
-
|
1
|
+
module ActiveObject::Integer
|
2
2
|
|
3
3
|
ROMAN_VALUES = {
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
'CD' => 400,
|
8
|
-
'C' => 100,
|
9
|
-
'XC' => 90,
|
10
|
-
'L' => 50,
|
11
|
-
'XL' => 40,
|
12
|
-
'X' => 10,
|
13
|
-
'IX' => 9,
|
14
|
-
'V' => 5,
|
15
|
-
'IV' => 4,
|
16
|
-
'I' => 1
|
17
|
-
}.freeze
|
4
|
+
M: 1000, CM: 900, D: 500, CD: 400, C: 100, XC: 90, L: 50, XL: 40, X: 10,
|
5
|
+
IX: 9, V: 5, IV: 4, I: 1
|
6
|
+
}
|
18
7
|
|
19
8
|
def factorial
|
20
9
|
return(1) if zero?
|
@@ -26,7 +15,7 @@ class Integer
|
|
26
15
|
end
|
27
16
|
|
28
17
|
def roman
|
29
|
-
return(
|
18
|
+
return("") if zero?
|
30
19
|
return("-#{(-self).roman}") if self < 0
|
31
20
|
|
32
21
|
ROMAN_VALUES.each { |k, v| return("#{k}#{(self - v).roman}") if v <= self }
|
@@ -36,4 +25,6 @@ class Integer
|
|
36
25
|
Time.at(self)
|
37
26
|
end
|
38
27
|
|
39
|
-
end
|
28
|
+
end
|
29
|
+
|
30
|
+
Integer.send(:include, ActiveObject::Integer) if ActiveObject.configuration.autoload_integer
|
@@ -1,40 +1,68 @@
|
|
1
|
-
|
1
|
+
module ActiveObject::Numeric
|
2
2
|
|
3
3
|
MILLI = 0.001
|
4
4
|
CENTI = MILLI * 10
|
5
|
-
DECI
|
6
|
-
DECA
|
5
|
+
DECI = CENTI * 10
|
6
|
+
DECA = 10
|
7
7
|
HECTO = DECA * 10
|
8
|
-
KILO
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
YARD = FEET * 3
|
21
|
-
MILE = YARD * 1760
|
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
|
22
20
|
NAUTICAL_MILE = MILE * 1.15078
|
23
21
|
|
24
22
|
METRIC_TON = KILO * 1000
|
25
|
-
POUND
|
26
|
-
STONE
|
27
|
-
TON
|
28
|
-
|
29
|
-
MINUTE
|
30
|
-
HOUR
|
31
|
-
DAY
|
32
|
-
WEEK
|
33
|
-
YEAR
|
34
|
-
DECADE
|
35
|
-
CENTURY
|
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
|
36
34
|
MILLENNIUM = CENTURY * 10
|
37
35
|
|
36
|
+
BYTE_KEYS = [
|
37
|
+
:byte, :bytes, :kilobyte, :kilobytes, :megabyte, :megabytes, :gigabyte,
|
38
|
+
:gigabytes, :terabyte, :terabytes, :petabyte, :petabytes, :exabyte, :exabytes
|
39
|
+
]
|
40
|
+
LENGTH_KEYS = {
|
41
|
+
metric: [
|
42
|
+
:meter, :meters, :millimeter, :millimeters, :centimeter, :centimeters,
|
43
|
+
:decimeter, :decimeters, :decameter, :decameters, :hectometer, :hectometers,
|
44
|
+
:kilometer, :kilometers
|
45
|
+
],
|
46
|
+
imperical: [
|
47
|
+
:inch, :inches, :foot, :feet, :yard, :yards, :mile, :miles,
|
48
|
+
:nautical_mile, :nautical_miles
|
49
|
+
]
|
50
|
+
}
|
51
|
+
MASS_KEYS = {
|
52
|
+
metric: [
|
53
|
+
:gram, :grams, :milligram, :milligrams, :centigram, :centigrams,
|
54
|
+
:decigram, :decigrams, :decagram, :decagrams, :hectogram, :hectograms,
|
55
|
+
:kilogram, :kilograms, :metric_ton, :metric_tons
|
56
|
+
],
|
57
|
+
imperical: [:ounce, :ounces, :pound, :pounds, :stone, :stones, :ton, :tons]
|
58
|
+
}
|
59
|
+
TEMPERATURE_KEYS = [:celsius, :fahrenheit, :kelvin]
|
60
|
+
TIME_KEYS = [
|
61
|
+
:second, :seconds, :minute, :minutes, :hour, :hours, :day, :days,
|
62
|
+
:week, :weeks, :year, :years, :decade, :decades, :century, :centuries,
|
63
|
+
:millennium, :millenniums
|
64
|
+
]
|
65
|
+
|
38
66
|
def add(n)
|
39
67
|
self + n
|
40
68
|
end
|
@@ -63,6 +91,14 @@ class Numeric
|
|
63
91
|
|
64
92
|
alias_method :century_in_seconds, :centuries_in_seconds
|
65
93
|
|
94
|
+
def clamp(min, max=nil)
|
95
|
+
if max.nil? && min.is_a?(Range)
|
96
|
+
self < min.min ? min.min : self > min.max ? min.max : self
|
97
|
+
else
|
98
|
+
self < min ? min : self > max ? max : self
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
66
102
|
def days_in_seconds
|
67
103
|
self * DAY
|
68
104
|
end
|
@@ -99,6 +135,16 @@ class Numeric
|
|
99
135
|
|
100
136
|
alias_method :decimeter_in_meters, :decimeters_in_meters
|
101
137
|
|
138
|
+
def decrement(amount=1.0)
|
139
|
+
self + amount
|
140
|
+
end
|
141
|
+
|
142
|
+
def degrees_to_radians
|
143
|
+
self * Math::PI / 180.0
|
144
|
+
end
|
145
|
+
|
146
|
+
alias_method :degree_to_radians, :degrees_to_radians
|
147
|
+
|
102
148
|
def distance(n)
|
103
149
|
(self - n).abs
|
104
150
|
end
|
@@ -163,6 +209,10 @@ class Numeric
|
|
163
209
|
|
164
210
|
alias_method :inch_in_inches, :inches_in_inches
|
165
211
|
|
212
|
+
def increment(amount=1.0)
|
213
|
+
self + amount
|
214
|
+
end
|
215
|
+
|
166
216
|
def inside?(start, finish)
|
167
217
|
(start < self) && (self < finish)
|
168
218
|
end
|
@@ -245,10 +295,8 @@ class Numeric
|
|
245
295
|
self * n
|
246
296
|
end
|
247
297
|
|
248
|
-
|
249
|
-
|
250
|
-
number != 0 ? modulo(number).zero? : zero?
|
251
|
-
end
|
298
|
+
def multiple_of?(number)
|
299
|
+
number != 0 ? modulo(number).zero? : zero?
|
252
300
|
end
|
253
301
|
|
254
302
|
def nautical_miles_in_inches
|
@@ -261,27 +309,23 @@ class Numeric
|
|
261
309
|
self < 0
|
262
310
|
end
|
263
311
|
|
264
|
-
|
265
|
-
|
266
|
-
abs_number = abs
|
312
|
+
def ordinal
|
313
|
+
abs_number = abs
|
267
314
|
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
end
|
315
|
+
if (11..13).cover?(abs_number % 100)
|
316
|
+
"th"
|
317
|
+
else
|
318
|
+
case abs_number % 10
|
319
|
+
when 1; "st"
|
320
|
+
when 2; "nd"
|
321
|
+
when 3; "rd"
|
322
|
+
else "th"
|
277
323
|
end
|
278
324
|
end
|
279
325
|
end
|
280
326
|
|
281
|
-
|
282
|
-
|
283
|
-
"#{self}#{self.ordinal}"
|
284
|
-
end
|
327
|
+
def ordinalize
|
328
|
+
"#{self}#{self.ordinal}"
|
285
329
|
end
|
286
330
|
|
287
331
|
def ounces_in_ounces
|
@@ -296,21 +340,21 @@ class Numeric
|
|
296
340
|
|
297
341
|
def pad(options={})
|
298
342
|
pad_number = options.fetch(:pad_number, 0)
|
299
|
-
precision
|
343
|
+
precision = options.fetch(:precision, 3)
|
300
344
|
|
301
345
|
to_s.rjust(precision, pad_number.to_s)
|
302
346
|
end
|
303
347
|
|
304
348
|
def pad_precision(options={})
|
305
349
|
pad_number = options.fetch(:pad_number, 0)
|
306
|
-
precision
|
307
|
-
separator
|
308
|
-
string
|
350
|
+
precision = options.fetch(:precision, 2)
|
351
|
+
separator = options.fetch(:separator, ".")
|
352
|
+
string = to_s
|
309
353
|
|
310
|
-
string
|
354
|
+
string << separator unless string.include?(separator)
|
311
355
|
ljust_count = string.split(separator).first.length
|
312
356
|
ljust_count += (string.count(separator) + precision) if precision > 0
|
313
|
-
num_count
|
357
|
+
num_count = string.length
|
314
358
|
ljust_count >= num_count ? string.ljust(ljust_count, pad_number.to_s) : string[0..(ljust_count - 1)]
|
315
359
|
end
|
316
360
|
|
@@ -361,62 +405,40 @@ class Numeric
|
|
361
405
|
alias_method :terabyte_in_bytes, :terabytes_in_bytes
|
362
406
|
|
363
407
|
def to_byte(from, to)
|
364
|
-
|
365
|
-
:byte, :bytes,
|
366
|
-
:kilobyte, :kilobytes,
|
367
|
-
:megabyte, :megabytes,
|
368
|
-
:gigabyte, :gigabytes,
|
369
|
-
:terabyte, :terabytes,
|
370
|
-
:petabyte, :petabytes,
|
371
|
-
:exabyte, :exabytes
|
372
|
-
].freeze
|
373
|
-
|
374
|
-
unless valid_keys.include?(from) && valid_keys.include?(to)
|
408
|
+
unless BYTE_KEYS.include?(from) && BYTE_KEYS.include?(to)
|
375
409
|
raise ArgumentError,
|
376
|
-
"Unknown key(s): from: #{from.inspect} and to: #{to.inspect}. Valid keys are: #{
|
410
|
+
"Unknown key(s): from: #{from.inspect} and to: #{to.inspect}. Valid keys are: #{BYTE_KEYS.map(&:inspect).join(', ')}"
|
377
411
|
end
|
378
412
|
|
379
413
|
to_f * 1.send("#{from}_in_bytes").to_f / 1.send("#{to}_in_bytes").to_f
|
380
414
|
end
|
381
415
|
|
382
416
|
def to_currency(options={})
|
383
|
-
unit = options.fetch(:unit,
|
417
|
+
unit = options.fetch(:unit, "$")
|
384
418
|
|
385
419
|
"#{unit}#{pad_precision(options.only(:precision))}"
|
386
420
|
end
|
387
421
|
|
388
422
|
def to_length(from, to)
|
389
|
-
|
390
|
-
|
391
|
-
:millimeter, :millimeters,
|
392
|
-
:centimeter, :centimeters,
|
393
|
-
:decimeter, :decimeters,
|
394
|
-
:decameter, :decameters,
|
395
|
-
:hectometer, :hectometers,
|
396
|
-
:kilometer, :kilometers,
|
397
|
-
:inch, :inches,
|
398
|
-
:foot, :feet,
|
399
|
-
:yard, :yards,
|
400
|
-
:mile, :miles,
|
401
|
-
:nautical_mile, :nautical_miles
|
402
|
-
].freeze
|
423
|
+
metric_keys = LENGTH_KEYS.fetch(:metric)
|
424
|
+
valid_keys = LENGTH_KEYS.collect { |k, v| v }.flatten
|
403
425
|
|
404
426
|
unless valid_keys.include?(from) && valid_keys.include?(to)
|
405
427
|
raise ArgumentError,
|
406
|
-
"Unknown key(s): from: #{from.inspect} and to: #{to.inspect}. Valid keys are: #{valid_keys.map(&:inspect).join(', '
|
428
|
+
"Unknown key(s): from: #{from.inspect} and to: #{to.inspect}. Valid keys are: #{valid_keys.map(&:inspect).join(', ')}"
|
407
429
|
end
|
408
430
|
|
409
431
|
case to
|
410
432
|
when from
|
411
433
|
self
|
412
434
|
when :meter, :meters, :millimeter, :millimeters, :centimeter, :centimeters, :decimeter, :decimeters, :decameter, :decameters, :hectometer, :hectometers, :kilometer, :kilometers
|
413
|
-
if
|
435
|
+
if metric_keys.include?(from)
|
414
436
|
to_f * 1.send("#{from}_in_meters").to_f / 1.send("#{to}_in_meters").to_f
|
415
437
|
else
|
416
438
|
to_f * ((1.send("#{from}_in_inches").to_f * 0.0254) / 1.send("#{to}_in_meters").to_f)
|
417
439
|
end
|
418
440
|
when :inch, :inches, :foot, :feet, :yard, :yards, :mile, :miles, :nautical_mile, :nautical_miles
|
419
|
-
if
|
441
|
+
if metric_keys.include?(from)
|
420
442
|
to_f * ((1.send("#{from}_in_meters").to_f * 39.3701) / 1.send("#{to}_in_inches").to_f)
|
421
443
|
else
|
422
444
|
to_f * 1.send("#{from}_in_inches").to_f / 1.send("#{to}_in_inches").to_f
|
@@ -425,37 +447,25 @@ class Numeric
|
|
425
447
|
end
|
426
448
|
|
427
449
|
def to_mass(from, to)
|
428
|
-
|
429
|
-
|
430
|
-
:milligram, :milligrams,
|
431
|
-
:centigram, :centigrams,
|
432
|
-
:decigram, :decigrams,
|
433
|
-
:decagram, :decagrams,
|
434
|
-
:hectogram, :hectograms,
|
435
|
-
:kilogram, :kilograms,
|
436
|
-
:metric_ton, :metric_tons,
|
437
|
-
:ounce, :ounces,
|
438
|
-
:pound, :pounds,
|
439
|
-
:stone, :stones,
|
440
|
-
:ton, :tons
|
441
|
-
].freeze
|
450
|
+
metric_keys = MASS_KEYS.fetch(:metric)
|
451
|
+
valid_keys = MASS_KEYS.collect { |k, v| v }.flatten
|
442
452
|
|
443
453
|
unless valid_keys.include?(from) && valid_keys.include?(to)
|
444
454
|
raise ArgumentError,
|
445
|
-
"Unknown key(s): from: #{from.inspect} and to: #{to.inspect}. Valid keys are: #{valid_keys.map(&:inspect).join(', '
|
455
|
+
"Unknown key(s): from: #{from.inspect} and to: #{to.inspect}. Valid keys are: #{valid_keys.map(&:inspect).join(', ')}"
|
446
456
|
end
|
447
457
|
|
448
458
|
case to
|
449
459
|
when from
|
450
460
|
self
|
451
461
|
when :gram, :grams, :milligram, :milligrams, :centigram, :centigrams, :decigram, :decigrams, :decagram, :decagrams, :hectogram, :hectograms, :kilogram, :kilograms, :metric_ton, :metric_tons
|
452
|
-
if
|
462
|
+
if metric_keys.include?(from)
|
453
463
|
to_f * 1.send("#{from}_in_grams").to_f / 1.send("#{to}_in_grams").to_f
|
454
464
|
else
|
455
465
|
to_f * ((1.send("#{from}_in_ounces") * 28.3495).to_f / 1.send("#{to}_in_grams").to_f)
|
456
466
|
end
|
457
467
|
when :ounce, :ounces, :pound, :pounds, :stone, :stones, :ton, :tons
|
458
|
-
if
|
468
|
+
if metric_keys.include?(from)
|
459
469
|
to_f * ((1.send("#{from}_in_grams") * 0.035274).to_f / 1.send("#{to}_in_ounces").to_f)
|
460
470
|
else
|
461
471
|
to_f * 1.send("#{from}_in_ounces").to_f / 1.send("#{to}_in_ounces").to_f
|
@@ -466,13 +476,13 @@ class Numeric
|
|
466
476
|
def to_nearest_value(values=[])
|
467
477
|
return(self) if values.length.zero?
|
468
478
|
|
469
|
-
value
|
479
|
+
value = values.first
|
470
480
|
difference = (self - value).abs
|
471
481
|
|
472
482
|
values.each do |v|
|
473
483
|
if (self - v).abs < difference
|
474
484
|
difference = (self - v).abs
|
475
|
-
value
|
485
|
+
value = v
|
476
486
|
end
|
477
487
|
end
|
478
488
|
|
@@ -480,52 +490,36 @@ class Numeric
|
|
480
490
|
end
|
481
491
|
|
482
492
|
def to_percentage(options={})
|
483
|
-
unit = options.fetch(:unit,
|
493
|
+
unit = options.fetch(:unit, "%")
|
484
494
|
|
485
495
|
"#{pad_precision(options.only(:precision))}#{unit}"
|
486
496
|
end
|
487
497
|
|
488
498
|
def to_temperature(from, to)
|
489
|
-
|
490
|
-
|
491
|
-
unless valid_keys.include?(from) && valid_keys.include?(to)
|
499
|
+
unless TEMPERATURE_KEYS.include?(from) && TEMPERATURE_KEYS.include?(to)
|
492
500
|
raise ArgumentError,
|
493
|
-
"Unknown key(s): from: #{from.inspect} and to: #{to.inspect}. Valid keys are: #{
|
501
|
+
"Unknown key(s): from: #{from.inspect} and to: #{to.inspect}. Valid keys are: #{TEMPERATURE_KEYS.map(&:inspect).join(', ')}"
|
494
502
|
end
|
495
503
|
|
496
|
-
number = to_f
|
497
|
-
|
498
504
|
case to
|
499
505
|
when from
|
500
506
|
self
|
501
507
|
when :celsius
|
502
|
-
from == :kelvin ? (
|
508
|
+
from == :kelvin ? (self - 273.15) : ((self - 32.0) * 5.0 / 9.0)
|
503
509
|
when :fahrenheit
|
504
|
-
from == :kelvin ? (1.8 * (
|
510
|
+
from == :kelvin ? (1.8 * (self - 273.15) + 32.0) : ((self * 9.0 / 5.0) + 32.0)
|
505
511
|
when :kelvin
|
506
|
-
from == :celsius ? (
|
512
|
+
from == :celsius ? (self + 273.15) : (((self - 32.0) * 5.0 / 9.0) + 273.15)
|
507
513
|
end
|
508
514
|
end
|
509
515
|
|
510
516
|
def to_time(from, to)
|
511
|
-
|
512
|
-
:second, :seconds,
|
513
|
-
:minute, :minutes,
|
514
|
-
:hour, :hours,
|
515
|
-
:day, :days,
|
516
|
-
:week, :weeks,
|
517
|
-
:year, :years,
|
518
|
-
:decade, :decades,
|
519
|
-
:century, :centuries,
|
520
|
-
:millennium, :millenniums
|
521
|
-
].freeze
|
522
|
-
|
523
|
-
unless valid_keys.include?(from) && valid_keys.include?(to)
|
517
|
+
unless TIME_KEYS.include?(from) && TIME_KEYS.include?(to)
|
524
518
|
raise ArgumentError,
|
525
|
-
"Unknown key(s): from: #{from.inspect} and to: #{to.inspect}. Valid keys are: #{
|
519
|
+
"Unknown key(s): from: #{from.inspect} and to: #{to.inspect}. Valid keys are: #{TIME_KEYS.map(&:inspect).join(', ')}"
|
526
520
|
end
|
527
521
|
|
528
|
-
to_f * 1.send("#{from}_in_seconds").to_f / 1.send("#{to}_in_seconds").to_f
|
522
|
+
(to_f * 1.send("#{from}_in_seconds").to_f) / 1.send("#{to}_in_seconds").to_f
|
529
523
|
end
|
530
524
|
|
531
525
|
def tons_in_ounces
|
@@ -560,4 +554,6 @@ class Numeric
|
|
560
554
|
|
561
555
|
alias_method :year_in_seconds, :years_in_seconds
|
562
556
|
|
563
|
-
end
|
557
|
+
end
|
558
|
+
|
559
|
+
Numeric.send(:include, ActiveObject::Numeric) if ActiveObject.configuration.autoload_numeric
|