dimensional 2.0.1 → 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +2 -1
- data/TODO +3 -1
- data/lib/dimensional/metric.rb +2 -1
- data/lib/dimensional/version.rb +1 -1
- data/test/demo.rb +13 -13
- data/test/metric_test.rb +15 -0
- metadata +2 -2
data/CHANGELOG
CHANGED
@@ -4,4 +4,5 @@
|
|
4
4
|
1.0.0 Production Release 1.
|
5
5
|
1.0.1 Use Rationals for default values and avoid the dreaded integer division = 0 problem.
|
6
6
|
1.1.1 Add Metric.load constructor, improve docs and enhance scanner.
|
7
|
-
2.0.0 Introduce Dimensional::Locale
|
7
|
+
2.0.0 Introduce Dimensional::Locale
|
8
|
+
2.0.2 Allow loading of non-positive metrics, particularly in Ruby 1.8.6 where Math.log10
|
data/TODO
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
1. Fix parsing units like "6m3" for six cubic meters.
|
2
2
|
2. Allow locale-specific formatters and detectors.
|
3
3
|
3. Default format per dimension/system/metric.
|
4
|
-
4. Auto generation of metric prefix units.
|
4
|
+
4. Auto generation of metric prefix units.
|
5
|
+
5. Change Metric representation into a subclass of BasicObject instead of DelegateClasss
|
6
|
+
(http://codeidol.com/other/rubyckbk/Numbers/Simulating-a-Subclass-of-Fixnum/)
|
data/lib/dimensional/metric.rb
CHANGED
@@ -76,6 +76,7 @@ module Dimensional
|
|
76
76
|
|
77
77
|
# Create a new instance with the given value (assumed to be in the base unit) and convert it to the preferred unit.
|
78
78
|
def load(v)
|
79
|
+
raise "No base unit defined" unless base
|
79
80
|
new(v, base).preferred
|
80
81
|
end
|
81
82
|
end
|
@@ -104,8 +105,8 @@ module Dimensional
|
|
104
105
|
# Convert into the best unit for the given Locale. The first system of the given locale with units is elected the preferred system,
|
105
106
|
# and within the preferred system, preference is given to units yielding a metric whose order of magnitude is close to zero.
|
106
107
|
def localize(locale = Locale.default)
|
107
|
-
target_oom = Math.log10(self) + Math.log10(self.unit.factor)
|
108
108
|
preferred_system = self.class.systems(locale).detect{ |s| self.class.units[s].any? }
|
109
|
+
target_oom = Math.log10(self.abs) + Math.log10(self.unit.factor) rescue -(1.0/0.0) # Ruby 1.8.6 raises an exception on log10(0) instead of -Infinity
|
109
110
|
bu = self.class.best_fit(target_oom, preferred_system)
|
110
111
|
convert(bu)
|
111
112
|
end
|
data/lib/dimensional/version.rb
CHANGED
data/test/demo.rb
CHANGED
@@ -127,29 +127,29 @@ Configurator.start do
|
|
127
127
|
|
128
128
|
dimension(:A) do
|
129
129
|
system(:SI) do
|
130
|
-
combine('square meter', 'm2', {Unit[:L, :SI, :meter] => 2}, :detector => /\A(sq
|
130
|
+
combine('square meter', 'm2', {Unit[:L, :SI, :meter] => 2}, :detector => /\A(sq(uare|\.)?\s+met(er|re)s?|m2)\Z/) do
|
131
131
|
derive('hectare', 'ha', 10000, :format => "%.4f%U") do
|
132
132
|
end
|
133
133
|
end
|
134
134
|
end
|
135
135
|
system(:US) do # All measures below are approximations due to the difference between a survey foot and an international foot.
|
136
|
-
combine('square yard', 'yd2', {Unit[:L, :US, :yard] => 2}, :detector =>
|
136
|
+
combine('square yard', 'yd2', {Unit[:L, :US, :yard] => 2}, :detector => /\A(sq(uare|\.)?\s+y(ar)?d|yd2)\Z/) do
|
137
137
|
derive('acre', nil, 4840)
|
138
138
|
end
|
139
|
-
combine('square mile', nil, {Unit[:L, :US, :mile] => 2}, :detector => /\A(sq(uare|\.)?\s?
|
139
|
+
combine('square mile', nil, {Unit[:L, :US, :mile] => 2}, :detector => /\A(sq(uare|\.)?\s+mi(le)?s?|mi(le)?2)\Z/) do
|
140
140
|
self.alias('section', nil, :detector => /\Asections?\Z/) do
|
141
141
|
derive('township', 'twp', 36, :detector => /\Atownships?\Z/)
|
142
142
|
end
|
143
143
|
end
|
144
|
-
combine('square foot', 'ft2', {Unit[:L, :US, :ft] => 2}, :detector =>
|
145
|
-
combine('square inch', 'in2', {Unit[:L, :US, :in] => 2}, :detector =>
|
144
|
+
combine('square foot', 'ft2', {Unit[:L, :US, :ft] => 2}, :detector => /\A(sq(uare|\.)?\s+f(oo|ee)?t|ft2)\Z/)
|
145
|
+
combine('square inch', 'in2', {Unit[:L, :US, :in] => 2}, :detector => /\A(sq(uare|\.)?\s+(ch(es)?)?|in2)\Z/)
|
146
146
|
end
|
147
147
|
end
|
148
148
|
|
149
149
|
dimension(:V) do
|
150
150
|
system(:SI) do
|
151
|
-
combine('cubic meter', 'm3', {Unit[:L, :SI, :meter] => 3}, :detector => /\A(cubic
|
152
|
-
derive('cubic decimeter', 'dm3', Rational(1, 1000), :detector => /\A(cubic
|
151
|
+
combine('cubic meter', 'm3', {Unit[:L, :SI, :meter] => 3}, :detector => /\A(cubic\s+met(er|re)s?|m3)\Z/, :preference => -3) do
|
152
|
+
derive('cubic decimeter', 'dm3', Rational(1, 1000), :detector => /\A(cubic\s+decimet(er|re)s?|dm3)\Z/, :preference => -4) do
|
153
153
|
self.alias('liter', 'l', :detector => /\A(lit(er|re)s?|l|L)\Z/) do
|
154
154
|
derive('milliliter', 'ml', Rational(1, 1000), :detector => /\A(millilit(er|re)s?|ml|mL)\Z/)
|
155
155
|
end
|
@@ -157,12 +157,12 @@ Configurator.start do
|
|
157
157
|
end
|
158
158
|
end
|
159
159
|
system(:Imp) do
|
160
|
-
reference('ounce', 'fl oz', Unit[:V, :SI, 'milliliter'], 28.4130625, :detector => /\A((fluid
|
160
|
+
reference('ounce', 'fl oz', Unit[:V, :SI, 'milliliter'], 28.4130625, :detector => /\A((fluid\s+)?ounces?|oz)\Z/) do
|
161
161
|
derive('gill', 'gi', 5, :detector => /\A(gills?|gis?)\Z/) do
|
162
162
|
derive('cup', 'cp', 2, :detector => /\A(cups?|cps?)\Z/) do
|
163
163
|
derive('pint', 'pt', 2, :detector => /\A(pints?|pts?)\Z/) do
|
164
164
|
derive('quart', 'qt', 2, :detector => /\A(quarts?|qts?)\Z/) do
|
165
|
-
derive('gallon', 'gal', 4, :detector => /\A(gallons?|
|
165
|
+
derive('gallon', 'gal', 4, :detector => /\A(gallons?|gal)\Z/)
|
166
166
|
end
|
167
167
|
end
|
168
168
|
end
|
@@ -170,14 +170,14 @@ Configurator.start do
|
|
170
170
|
end
|
171
171
|
end
|
172
172
|
system(:US) do
|
173
|
-
combine('cubic inch', 'in3', {Unit[:L, :US, :inch] => 3}, :detector => /\A(cubic
|
174
|
-
derive('gallon', 'gal', 231, :detector => /\A(gallons?|
|
173
|
+
combine('cubic inch', 'in3', {Unit[:L, :US, :inch] => 3}, :detector => /\A(cubic\s+in(ch(es)?)?|in3)\Z/ ) do
|
174
|
+
derive('gallon', 'gal', 231, :detector => /\A(gallons?|gal)\Z/) do
|
175
175
|
derive('quart', 'qt', Rational(1,4), :detector => /\A(quarts?|qts?)\Z/) do
|
176
176
|
derive('pint', 'pt', Rational(1,2), :detector => /\A(pints?|pts?)\Z/) do
|
177
177
|
derive('cup', nil, Rational(1,2), :detector => /\Acups?\Z/) do
|
178
178
|
derive('gill', 'gi', Rational(1,2), :detector => /\A(gills?|gis?)\Z/) do
|
179
|
-
derive('fluid ounce', 'fl oz', Rational(1, 4), :detector => /\A((fluid
|
180
|
-
derive('dram', 'dr', Rational(1, 8), :detector => /\A((fluid
|
179
|
+
derive('fluid ounce', 'fl oz', Rational(1, 4), :detector => /\A((fluid\s+)?ounces?|oz)\Z/) do
|
180
|
+
derive('dram', 'dr', Rational(1, 8), :detector => /\A((fluid\s+)?dra(ch)?ms?|(fl\s+)?drs?)\Z/) do
|
181
181
|
derive('minim', '♏', Rational(1, 60))
|
182
182
|
end
|
183
183
|
end
|
data/test/metric_test.rb
CHANGED
@@ -306,4 +306,19 @@ class MetricTest < Test::Unit::TestCase
|
|
306
306
|
assert_equal "1.8600nm", distance.parse('1.8565454 nm', Locale::BA).strfmeasure("%.4f%U")
|
307
307
|
assert_equal "1.86", distance.parse('1.8565454 nm', Locale::BA).strfmeasure("%s")
|
308
308
|
end
|
309
|
+
|
310
|
+
# A "true" metric (for some values of true) with negative magnitude has dubious semantics, but we try to support it.
|
311
|
+
def test_load_negative
|
312
|
+
distance = Class.new(Metric)
|
313
|
+
distance.dimension = Dimension::L
|
314
|
+
distance.base = @meter
|
315
|
+
assert_equal distance.new(-1, @meter), distance.load(-1)
|
316
|
+
end
|
317
|
+
|
318
|
+
def test_load_zero
|
319
|
+
distance = Class.new(Metric)
|
320
|
+
distance.dimension = Dimension::L
|
321
|
+
distance.base = @meter
|
322
|
+
assert_equal distance.new(0, @meter), distance.load(0)
|
323
|
+
end
|
309
324
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dimensional
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Hapgood
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-02-
|
12
|
+
date: 2010-02-17 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|