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