measured 0.0.11 → 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bf930ad9ebd6fd8480349ba1c78f893aa6d45003
4
- data.tar.gz: ccc86704e031efe9d3bb5b01078d0e7093750364
3
+ metadata.gz: d74ec88793dcfb465b93c16742ee24010aa23d1f
4
+ data.tar.gz: fc3b21627102730af5282ed7385263ce858d0edf
5
5
  SHA512:
6
- metadata.gz: 37afaff5fef0534f3687c717894f42f043b4896e3ac7de13e245a9a69372cf659153f77825fbc3afa0281b12b1d0b02af48374e0197a016db6f7dfcef721a43d
7
- data.tar.gz: 7668e545f8c31b50c44ee41de0f5cb516d0a0752fe6fec6d10813964633012852d9f0c4806ebb88345a921c07334865ccba75f0b45d03d193df888a5814b127f
6
+ metadata.gz: 1223687fb266b9451f2d5008993e2464fed49da053d78a058dc16d74420c08f545fc15627cfe6197e2d99511ccb764be6e2ba74c0a8a27970c3bcdda5fbca37b
7
+ data.tar.gz: 5f71c822cd8c11ac4d73b47b6cd36689c8373f536ca2638af07dee05679cdb54c9a2a82c3ee7ac956ed2caf701cd10d546dfc5b3fe85804d490d6bf72a9c6be0
@@ -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: BigDecimal("1"))
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 amount * conversion
57
+ return new_amount
57
58
  else
58
- result = traverse(from: name, to: to, unit_names: unit_names, amount: amount * conversion)
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
- if conversion_amount.is_a?(Rational)
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
@@ -1,3 +1,3 @@
1
1
  module Measured
2
- VERSION = "0.0.11"
2
+ VERSION = "0.0.12"
3
3
  end
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
@@ -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
- assert_conversion Measured::Length, "2000 cm", "2000 cm"
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
- assert_conversion Measured::Length, "2000 cm", "20 m"
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
- assert_conversion Measured::Length, "2000 cm", "20000 mm"
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
- assert_conversion Measured::Length, "2000 ft", "2000 ft"
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
- skip "returns 0.23999999999904E5"
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
- assert_conversion Measured::Length, "2000 ft", "609.6 m"
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
- assert_conversion Measured::Length, "2000 in", "2000 in"
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
- assert_conversion Measured::Length, "2000 m", "2000 m"
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
- assert_conversion Measured::Length, "2000 m", "2000000 mm"
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
- assert_conversion Measured::Length, "2000 mm", "200 cm"
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
- assert_conversion Measured::Length, "2000 mm", "2 m"
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
- assert_conversion Measured::Length, "2000 mm", "2000 mm"
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
- skip "returns 0.5999999999976E4"
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
- skip "returns 0.71999999999712E5"
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
- assert_conversion Measured::Length, "2000 yd", "2000 yd"
162
+ assert_exact_conversion Measured::Length, "2000 yd", "2000 yd"
179
163
  end
180
164
 
181
165
  end
@@ -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
- assert_conversion Measured::Weight, "2000 g", "2000 g"
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
- assert_conversion Measured::Weight, "2000 g", "2 kg"
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
- assert_conversion Measured::Weight, "2000 kg", "2000000 g"
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
- assert_conversion Measured::Weight, "2000 kg", "2000 kg"
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
- skip
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
- skip
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
- assert_conversion Measured::Weight, "2000 lb", "907184.74 g"
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
- skip
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
- assert_conversion Measured::Weight, "2000 lb", "2000 lb"
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
- assert_conversion Measured::Weight, "2000 lb", "32000 oz"
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
- assert_conversion Measured::Weight, "2000 oz", "125 lb"
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
- assert_conversion Measured::Weight, "2000 oz", "2000 oz"
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.11
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-08 00:00:00.000000000 Z
11
+ date: 2015-07-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport