measured 0.0.11 → 0.0.12
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/lib/measured/conversion.rb +2 -1
- data/lib/measured/conversion_table.rb +4 -3
- data/lib/measured/unit.rb +1 -5
- data/lib/measured/version.rb +1 -1
- data/test/test_helper.rb +15 -0
- data/test/units/length_test.rb +15 -31
- data/test/units/weight_test.rb +12 -19
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d74ec88793dcfb465b93c16742ee24010aa23d1f
|
4
|
+
data.tar.gz: fc3b21627102730af5282ed7385263ce858d0edf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1223687fb266b9451f2d5008993e2464fed49da053d78a058dc16d74420c08f545fc15627cfe6197e2d99511ccb764be6e2ba74c0a8a27970c3bcdda5fbca37b
|
7
|
+
data.tar.gz: 5f71c822cd8c11ac4d73b47b6cd36689c8373f536ca2638af07dee05679cdb54c9a2a82c3ee7ac956ed2caf701cd10d546dfc5b3fe85804d490d6bf72a9c6be0
|
data/lib/measured/conversion.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
class Measured::Conversion
|
2
|
+
ARBITRARY_CONVERSION_PRECISION = 20
|
2
3
|
def initialize
|
3
4
|
@base_unit = nil
|
4
5
|
@units = []
|
@@ -43,7 +44,7 @@ class Measured::Conversion
|
|
43
44
|
|
44
45
|
raise Measured::UnitError, "Cannot find conversion entry from #{ from } to #{ to }" unless conversion = conversion_table[from][to]
|
45
46
|
|
46
|
-
value * conversion
|
47
|
+
BigDecimal(value.to_r * conversion,ARBITRARY_CONVERSION_PRECISION)
|
47
48
|
end
|
48
49
|
|
49
50
|
def conversion_table
|
@@ -44,7 +44,7 @@ class Measured::ConversionTable
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def find_tree_traversal_conversion(to:, from:)
|
47
|
-
traverse(from: from, to: to, unit_names: @units.map{|u| u.name }, amount:
|
47
|
+
traverse(from: from, to: to, unit_names: @units.map{|u| u.name }, amount: Rational(1))
|
48
48
|
end
|
49
49
|
|
50
50
|
def traverse(from:, to:, unit_names:, amount:)
|
@@ -52,10 +52,11 @@ class Measured::ConversionTable
|
|
52
52
|
|
53
53
|
unit_names.each do |name|
|
54
54
|
if conversion = find_direct_conversion(from: from, to: name)
|
55
|
+
new_amount = amount * conversion.to_r
|
55
56
|
if name == to
|
56
|
-
return
|
57
|
+
return new_amount
|
57
58
|
else
|
58
|
-
result = traverse(from: name, to: to, unit_names: unit_names, amount:
|
59
|
+
result = traverse(from: name, to: to, unit_names: unit_names, amount: new_amount)
|
59
60
|
return result if result
|
60
61
|
end
|
61
62
|
end
|
data/lib/measured/unit.rb
CHANGED
@@ -35,11 +35,7 @@ class Measured::Unit
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def inverse_conversion_amount
|
38
|
-
|
39
|
-
Rational(conversion_amount.denominator, conversion_amount.numerator)
|
40
|
-
else
|
41
|
-
BigDecimal(1) / conversion_amount
|
42
|
-
end
|
38
|
+
1 / conversion_amount.to_r
|
43
39
|
end
|
44
40
|
|
45
41
|
private
|
data/lib/measured/version.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -11,10 +11,25 @@ class ActiveSupport::TestCase
|
|
11
11
|
|
12
12
|
protected
|
13
13
|
|
14
|
+
def assert_close_bigdecimal exp, act, delta = BigDecimal('0.000001')
|
15
|
+
n = (exp - act).abs
|
16
|
+
msg = message(msg) {
|
17
|
+
"Expected #{act.inspect} to be\nclose to #{exp.inspect} within #{delta} but was within #{n}"
|
18
|
+
}
|
19
|
+
assert delta >= n, msg
|
20
|
+
end
|
21
|
+
|
14
22
|
def assert_conversion(klass, from, to)
|
15
23
|
from_amount, from_unit = from.split(" ")
|
16
24
|
to_amount, to_unit = to.split(" ")
|
17
25
|
|
26
|
+
assert_close_bigdecimal BigDecimal(to_amount), klass.new(from_amount, from_unit).convert_to(to_unit).value
|
27
|
+
end
|
28
|
+
|
29
|
+
def assert_exact_conversion(klass, from, to)
|
30
|
+
from_amount, from_unit = from.split(" ")
|
31
|
+
to_amount, to_unit = to.split(" ")
|
32
|
+
|
18
33
|
assert_equal BigDecimal(to_amount), klass.new(from_amount, from_unit).convert_to(to_unit).value
|
19
34
|
end
|
20
35
|
end
|
data/test/units/length_test.rb
CHANGED
@@ -19,29 +19,26 @@ class Measured::LengthTest < ActiveSupport::TestCase
|
|
19
19
|
end
|
20
20
|
|
21
21
|
test ".convert_to from cm to cm" do
|
22
|
-
|
22
|
+
assert_exact_conversion Measured::Length, "2000 cm", "2000 cm"
|
23
23
|
end
|
24
24
|
|
25
25
|
test ".convert_to from cm to ft" do
|
26
|
-
skip
|
27
26
|
assert_conversion Measured::Length, "2000 cm", "0.656167979E2 ft"
|
28
27
|
end
|
29
28
|
|
30
29
|
test ".convert_to from cm to in" do
|
31
|
-
skip
|
32
30
|
assert_conversion Measured::Length, "2000 cm", "0.7874015748E3 in"
|
33
31
|
end
|
34
32
|
|
35
33
|
test ".convert_to from cm to m" do
|
36
|
-
|
34
|
+
assert_exact_conversion Measured::Length, "2000 cm", "20 m"
|
37
35
|
end
|
38
36
|
|
39
37
|
test ".convert_to from cm to mm" do
|
40
|
-
|
38
|
+
assert_exact_conversion Measured::Length, "2000 cm", "20000 mm"
|
41
39
|
end
|
42
40
|
|
43
41
|
test ".convert_to from cm to yd" do
|
44
|
-
skip
|
45
42
|
assert_conversion Measured::Length, "2000 cm", "0.2187226596E2 yd"
|
46
43
|
end
|
47
44
|
|
@@ -50,16 +47,15 @@ class Measured::LengthTest < ActiveSupport::TestCase
|
|
50
47
|
end
|
51
48
|
|
52
49
|
test ".convert_to from ft to ft" do
|
53
|
-
|
50
|
+
assert_exact_conversion Measured::Length, "2000 ft", "2000 ft"
|
54
51
|
end
|
55
52
|
|
56
53
|
test ".convert_to from ft to in" do
|
57
|
-
|
58
|
-
assert_conversion Measured::Length, "2000 ft", "24000 in"
|
54
|
+
assert_exact_conversion Measured::Length, "2000 ft", "24000 in"
|
59
55
|
end
|
60
56
|
|
61
57
|
test ".convert_to from ft to m" do
|
62
|
-
|
58
|
+
assert_exact_conversion Measured::Length, "2000 ft", "609.6 m"
|
63
59
|
end
|
64
60
|
|
65
61
|
test ".convert_to from ft to mm" do
|
@@ -67,7 +63,6 @@ class Measured::LengthTest < ActiveSupport::TestCase
|
|
67
63
|
end
|
68
64
|
|
69
65
|
test ".convert_to from ft to yd" do
|
70
|
-
skip "returns 0.6666666664608E3"
|
71
66
|
assert_conversion Measured::Length, "2000 ft", "0.666666667E3 yd"
|
72
67
|
end
|
73
68
|
|
@@ -76,12 +71,11 @@ class Measured::LengthTest < ActiveSupport::TestCase
|
|
76
71
|
end
|
77
72
|
|
78
73
|
test ".convert_to from in to ft" do
|
79
|
-
skip
|
80
74
|
assert_conversion Measured::Length, "2000 in", "0.166666666666E3 ft"
|
81
75
|
end
|
82
76
|
|
83
77
|
test ".convert_to from in to in" do
|
84
|
-
|
78
|
+
assert_exact_conversion Measured::Length, "2000 in", "2000 in"
|
85
79
|
end
|
86
80
|
|
87
81
|
test ".convert_to from in to m" do
|
@@ -93,7 +87,6 @@ class Measured::LengthTest < ActiveSupport::TestCase
|
|
93
87
|
end
|
94
88
|
|
95
89
|
test ".convert_to from in to yd" do
|
96
|
-
skip
|
97
90
|
assert_conversion Measured::Length, "2000 in", "0.555555555384E2 yd"
|
98
91
|
end
|
99
92
|
|
@@ -102,68 +95,59 @@ class Measured::LengthTest < ActiveSupport::TestCase
|
|
102
95
|
end
|
103
96
|
|
104
97
|
test ".convert_to from m to ft" do
|
105
|
-
skip
|
106
98
|
assert_conversion Measured::Length, "2000 m", "0.656167979E4 ft"
|
107
99
|
end
|
108
100
|
|
109
101
|
test ".convert_to from m to in" do
|
110
|
-
skip
|
111
102
|
assert_conversion Measured::Length, "2000 m", "0.7874015748E5 in"
|
112
103
|
end
|
113
104
|
|
114
105
|
test ".convert_to from m to m" do
|
115
|
-
|
106
|
+
assert_exact_conversion Measured::Length, "2000 m", "2000 m"
|
116
107
|
end
|
117
108
|
|
118
109
|
test ".convert_to from m to mm" do
|
119
|
-
|
110
|
+
assert_exact_conversion Measured::Length, "2000 m", "2000000 mm"
|
120
111
|
end
|
121
112
|
|
122
113
|
test ".convert_to from m to yd" do
|
123
|
-
skip
|
124
114
|
assert_conversion Measured::Length, "2000 m", "0.2187226596E4 yd"
|
125
115
|
end
|
126
116
|
|
127
117
|
test ".convert_to from mm to cm" do
|
128
|
-
|
118
|
+
assert_exact_conversion Measured::Length, "2000 mm", "200 cm"
|
129
119
|
end
|
130
120
|
|
131
121
|
test ".convert_to from mm to ft" do
|
132
|
-
skip
|
133
122
|
assert_conversion Measured::Length, "2000 mm", "0.656167979E1 ft"
|
134
123
|
end
|
135
124
|
|
136
125
|
test ".convert_to from mm to in" do
|
137
|
-
skip
|
138
126
|
assert_conversion Measured::Length, "2000 mm", "0.7874015748E2 in"
|
139
127
|
end
|
140
128
|
|
141
129
|
test ".convert_to from mm to m" do
|
142
|
-
|
130
|
+
assert_exact_conversion Measured::Length, "2000 mm", "2 m"
|
143
131
|
end
|
144
132
|
|
145
133
|
test ".convert_to from mm to mm" do
|
146
|
-
|
134
|
+
assert_exact_conversion Measured::Length, "2000 mm", "2000 mm"
|
147
135
|
end
|
148
136
|
|
149
137
|
test ".convert_to from mm to yd" do
|
150
|
-
skip
|
151
138
|
assert_conversion Measured::Length, "2000 mm", "0.2187226596E1 yd"
|
152
139
|
end
|
153
140
|
|
154
141
|
test ".convert_to from yd to cm" do
|
155
|
-
skip
|
156
142
|
assert_conversion Measured::Length, "2000 yd", "0.18288E6 cm"
|
157
143
|
end
|
158
144
|
|
159
145
|
test ".convert_to from yd to ft" do
|
160
|
-
|
161
|
-
assert_conversion Measured::Length, "2000 yd", "6000 ft"
|
146
|
+
assert_exact_conversion Measured::Length, "2000 yd", "6000 ft"
|
162
147
|
end
|
163
148
|
|
164
149
|
test ".convert_to from yd to in" do
|
165
|
-
|
166
|
-
assert_conversion Measured::Length, "2000 yd", "72000 in"
|
150
|
+
assert_exact_conversion Measured::Length, "2000 yd", "72000 in"
|
167
151
|
end
|
168
152
|
|
169
153
|
test ".convert_to from yd to m" do
|
@@ -175,7 +159,7 @@ class Measured::LengthTest < ActiveSupport::TestCase
|
|
175
159
|
end
|
176
160
|
|
177
161
|
test ".convert_to from yd to yd" do
|
178
|
-
|
162
|
+
assert_exact_conversion Measured::Length, "2000 yd", "2000 yd"
|
179
163
|
end
|
180
164
|
|
181
165
|
end
|
data/test/units/weight_test.rb
CHANGED
@@ -24,74 +24,67 @@ class Measured::WeightTest < ActiveSupport::TestCase
|
|
24
24
|
end
|
25
25
|
|
26
26
|
test ".convert_to from g to g" do
|
27
|
-
|
27
|
+
assert_exact_conversion Measured::Weight, "2000 g", "2000 g"
|
28
28
|
end
|
29
29
|
|
30
30
|
test ".convert_to from g to kg" do
|
31
|
-
|
31
|
+
assert_exact_conversion Measured::Weight, "2000 g", "2 kg"
|
32
32
|
end
|
33
33
|
|
34
34
|
test ".convert_to from g to lb" do
|
35
|
-
skip
|
36
35
|
assert_conversion Measured::Weight, "2000 g", "4.40924524 lb"
|
37
36
|
end
|
38
37
|
|
39
38
|
test ".convert_to from g to oz" do
|
40
|
-
skip
|
41
39
|
assert_conversion Measured::Weight, "2000 g", "70.54792384 oz"
|
42
40
|
end
|
43
41
|
|
44
42
|
test ".convert_to from kg to g" do
|
45
|
-
|
43
|
+
assert_exact_conversion Measured::Weight, "2000 kg", "2000000 g"
|
46
44
|
end
|
47
45
|
|
48
46
|
test ".convert_to from kg to kg" do
|
49
|
-
|
47
|
+
assert_exact_conversion Measured::Weight, "2000 kg", "2000 kg"
|
50
48
|
end
|
51
49
|
|
52
50
|
test ".convert_to from kg to lb" do
|
53
|
-
|
54
|
-
assert_conversion Measured::Weight, "2000 kg", "4409.24524 lb"
|
51
|
+
assert_conversion Measured::Weight, "2000 kg", "4409.245243 lb"
|
55
52
|
end
|
56
53
|
|
57
54
|
test ".convert_to from kg to oz" do
|
58
|
-
|
59
|
-
assert_conversion Measured::Weight, "2000 kg", "70547.92384 oz"
|
55
|
+
assert_conversion Measured::Weight, "2000 kg", "70547.92390 oz"
|
60
56
|
end
|
61
57
|
|
62
58
|
test ".convert_to from lb to g" do
|
63
|
-
|
59
|
+
assert_exact_conversion Measured::Weight, "2000 lb", "907184.74 g"
|
64
60
|
end
|
65
61
|
|
66
62
|
test ".convert_to from lb to kg" do
|
67
|
-
|
68
|
-
assert_conversion Measured::Weight, "2000 lb", "907.18474 kg"
|
63
|
+
assert_exact_conversion Measured::Weight, "2000 lb", "907.18474 kg"
|
69
64
|
end
|
70
65
|
|
71
66
|
test ".convert_to from lb to lb" do
|
72
|
-
|
67
|
+
assert_exact_conversion Measured::Weight, "2000 lb", "2000 lb"
|
73
68
|
end
|
74
69
|
|
75
70
|
test ".convert_to from lb to oz" do
|
76
|
-
|
71
|
+
assert_exact_conversion Measured::Weight, "2000 lb", "32000 oz"
|
77
72
|
end
|
78
73
|
|
79
74
|
test ".convert_to from oz to g" do
|
80
|
-
skip
|
81
75
|
assert_conversion Measured::Weight, "2000 oz", "56699.04625 g"
|
82
76
|
end
|
83
77
|
|
84
78
|
test ".convert_to from oz to kg" do
|
85
|
-
skip
|
86
79
|
assert_conversion Measured::Weight, "2000 oz", "56.69904625 kg"
|
87
80
|
end
|
88
81
|
|
89
82
|
test ".convert_to from oz to lb" do
|
90
|
-
|
83
|
+
assert_exact_conversion Measured::Weight, "2000 oz", "125 lb"
|
91
84
|
end
|
92
85
|
|
93
86
|
test ".convert_to from oz to oz" do
|
94
|
-
|
87
|
+
assert_exact_conversion Measured::Weight, "2000 oz", "2000 oz"
|
95
88
|
end
|
96
89
|
|
97
90
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: measured
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin McPhillips
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-07-
|
11
|
+
date: 2015-07-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|