measurement 0.2.3.1 → 0.2.4
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.
- data/CHANGELOG +2 -0
- data/lib/measurement/length.rb +3 -3
- data/lib/measurement/unit_group.rb +13 -0
- data/lib/measurement/weight.rb +2 -2
- data/lib/measurement.rb +8 -4
- data/measurement.gemspec +1 -1
- data/spec/lib/measurement_spec.rb +28 -0
- metadata +1 -1
data/CHANGELOG
CHANGED
data/lib/measurement/length.rb
CHANGED
@@ -22,9 +22,9 @@ require File.join(File.dirname(__FILE__), '..', 'measurement')
|
|
22
22
|
#
|
23
23
|
class Length < Measurement::Base
|
24
24
|
base :metre, :metres, :suffix => 'm', :group => :metric
|
25
|
-
unit 1000, :kilometre, :kilometres, :km, :suffix => 'km'
|
26
|
-
unit 0.01, :centimetre, :centimetres, :cm, :suffix => 'cm'
|
27
|
-
unit 0.001, :millimetre, :mm, :suffix => 'mm'
|
25
|
+
unit 1000, :kilometre, :kilometres, :km, :suffix => 'km'
|
26
|
+
unit 0.01, :centimetre, :centimetres, :cm, :suffix => 'cm'
|
27
|
+
unit 0.001, :millimetre, :mm, :suffix => 'mm'
|
28
28
|
|
29
29
|
unit 0.0254, :inch, :inches, :suffix => '"', :group => :imperial
|
30
30
|
unit 0.3048, :feet, :foot, :suffix => "'", :group => :imperial
|
@@ -6,9 +6,14 @@ module Measurement
|
|
6
6
|
@units = units.sort.reverse
|
7
7
|
end
|
8
8
|
|
9
|
+
def base
|
10
|
+
@units.first
|
11
|
+
end
|
12
|
+
|
9
13
|
def format(amount, precision = 0)
|
10
14
|
units = @units.dup
|
11
15
|
strs = []
|
16
|
+
precision = 0 if units.size > 1
|
12
17
|
|
13
18
|
while unit = units.shift
|
14
19
|
n_in = unit.to(amount)
|
@@ -20,5 +25,13 @@ module Measurement
|
|
20
25
|
|
21
26
|
strs.join(' ')
|
22
27
|
end
|
28
|
+
|
29
|
+
def from(amount)
|
30
|
+
@units.first.from(amount)
|
31
|
+
end
|
32
|
+
|
33
|
+
def to(amount)
|
34
|
+
@units.first.to(amount)
|
35
|
+
end
|
23
36
|
end
|
24
37
|
end
|
data/lib/measurement/weight.rb
CHANGED
@@ -16,10 +16,10 @@ require File.join(File.dirname(__FILE__), '..', 'measurement')
|
|
16
16
|
# puts Length.parse('100kg').in_lbs_and_oz => 220lbs 7oz
|
17
17
|
#
|
18
18
|
class Weight < Measurement::Base
|
19
|
-
base :gram, :grams, :suffix => 'g'
|
19
|
+
base :gram, :grams, :suffix => 'g'
|
20
20
|
unit 1000.0, :kilogram, :kilograms, :kg, :kgs, :suffix => 'kg', :group => :metric
|
21
21
|
|
22
|
-
unit 453.59236, :pounds, :pound, :lbs, :suffix => '
|
22
|
+
unit 453.59236, :pounds, :pound, :lbs, :suffix => 'lb', :group => [:imperial, :us]
|
23
23
|
unit 28.3495231, :ounces, :ounce, :oz, :suffix => 'oz', :group => :us
|
24
24
|
unit 6350.29318, :stone, :st, :suffix => 'st', :group => :imperial
|
25
25
|
end
|
data/lib/measurement.rb
CHANGED
@@ -145,7 +145,7 @@ module Measurement
|
|
145
145
|
units.detect do |unit|
|
146
146
|
unit.has_name?(scale.to_sym) ||
|
147
147
|
unit.suffix == scale.to_s
|
148
|
-
end
|
148
|
+
end || fetch_group(scale)
|
149
149
|
end
|
150
150
|
|
151
151
|
def self.from(amount, unit) # :nodoc:
|
@@ -169,13 +169,17 @@ module Measurement
|
|
169
169
|
# Length.parse("180cm").in_cm => 180
|
170
170
|
# Length.parse("10m 11cm 12mm").in_metres => 10.122
|
171
171
|
#
|
172
|
+
# If the string does not specify the unit then the base
|
173
|
+
# unit will be used unless a unit is suggested.
|
174
|
+
#
|
172
175
|
# If a valid unit cannot be found an error is raised:
|
173
176
|
#
|
174
177
|
# Weight.parse("180cm") => Measurement::NoUnitFoundException
|
175
178
|
#
|
176
|
-
def self.parse(string)
|
177
|
-
string = string.dup
|
179
|
+
def self.parse(string, suggested_unit = nil)
|
180
|
+
string = string.to_s.dup # Make sure we have a string and duplicate it
|
178
181
|
base_amount = 0.0
|
182
|
+
suggested_unit = suggested_unit ? find_scale(suggested_unit) : base
|
179
183
|
|
180
184
|
while string =~ /(\d+(\.\d+)?)([^\d]*)/
|
181
185
|
amount = $1.to_f
|
@@ -190,7 +194,7 @@ module Measurement
|
|
190
194
|
base_amount += unit.from(amount)
|
191
195
|
end
|
192
196
|
else
|
193
|
-
base_amount += amount
|
197
|
+
base_amount += suggested_unit.from(amount)
|
194
198
|
end
|
195
199
|
|
196
200
|
string.sub!(/(\d+(\.\d+)?)([^\d]*)/, '')
|
data/measurement.gemspec
CHANGED
@@ -40,6 +40,14 @@ describe Measurement::Base do
|
|
40
40
|
Length.parse('113').to_f.should == 113.0
|
41
41
|
end
|
42
42
|
|
43
|
+
it 'should parse in the suggest unit if no unit is in the text' do
|
44
|
+
Length.parse('113', :inches).to_f.should == 2.8702
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should parse the group base unit if the suggest unit is a group and no unit is in the text' do
|
48
|
+
Length.parse('113', :metric).to_f.should == 113.0
|
49
|
+
end
|
50
|
+
|
43
51
|
it 'should parse floating point numbers' do
|
44
52
|
Length.parse('113.43').to_f.should == 113.43
|
45
53
|
end
|
@@ -67,6 +75,26 @@ describe Measurement::Base do
|
|
67
75
|
end
|
68
76
|
end
|
69
77
|
|
78
|
+
describe '#initialize' do
|
79
|
+
before do
|
80
|
+
@klass = Class.new(Measurement::Base)
|
81
|
+
@klass.base :grams
|
82
|
+
@klass.unit 1000, :kilograms, :group => :metric
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'should initialize to the base value' do
|
86
|
+
@klass.new(1000).to_f.should == 1000.0
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should initialize to the specified unit' do
|
90
|
+
@klass.new(1000, :kilograms).to_f.should == 1000000.0
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'should initialize to the base unit of the specified group' do
|
94
|
+
@klass.new(1000, :metric).to_f.should == 1000000.0
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
70
98
|
describe 'operators' do
|
71
99
|
before do
|
72
100
|
@length_1 = Length.new(1)
|