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
@@ -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
|