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