Measurb
Handle units of measurment with ease! Measurb is a Ruby library for creating and managing units of measurements, or dimensions. Create your own units and define how to convert amongst them. Measurb also comes with a few default dimensions: inches, feet, and yards, but you don't have to use them. Measurb takes care of the tediousness of adding, subtracting, and comparing different measurements, especially between different units of measurement.
Build Status
Installation
Add this line to your application's Gemfile:
gem 'measurb'
And then execute:
$ bundle
Or install it yourself as:
$ gem install measurb
Defining Dimensions
Measurb has a straightforward interface to defining dimensions. Just give Measurb.define
a dimension name and optional block to define conversions.
# Without conversions
Measurb.define :inches
# With conversion
Measurb.define :inches do
feet value / 12.0
yards value / 36.0
end
Measurb.define :feet do
inches value * 12.0
yards value / 3.0
end
Measurb.define :yards do
feet value * 3.0
inches value * 36.0
end
You can specify an abbreviation for a dimension too.
Measurb.define :ft, abbrev: 'ft'
Using Dimensions
When you define a dimension, Measurb creates a dimension class that can be instantiated.
Measurb.define :inches
forty_two_inches = Measurb::Inches.new(42)
Merb also defines a singleton method on itself and a method on Numeric
, both of the same dimension name.
two_inches = Measurb.inches(2) # singleton method
three_inches = 3.inches # Numeric method
If you defined an abbreviation, you can use it on Numeric
as well.
Measurb.define :ft, abbrev: 'ft'
5.feet == 5.ft #=> true
Converting
To convert a dimension, you must have set up at least two dimensions, including the appropriate conversion formulas.
Measurb.define :inches do
feet value / 12.0
end
Measurb.define :feet do
inches value * 12.0
end
For every conversion you set up in the definition block, Measurb will add a to_*
method for that conversion.
24.inches.to_feet == 2.feet
3.feet.to_inches == 36.inches
Arithmetic
Measurb supports addition and subtraction currently. You can perform operations amongst all the defined dimension classes. Make sure you've define your conversions beforehand, though! The resulting value will use the class of the leftmost operand.
2.feet + 12.inches == 3.feet
3.feet - 6.inches == 2.5.feet
3.yards - 1.feet == 2.yards
Equality and Comparisons
Measurb also supports all the typical equality and inequality checks ==
!=
<
>
<=
>=
<=>
. They work correctly with other dimension classes too.
42.feet == 42.feet #=> true
2.feet < 26.inches #=> true
3.feet > 2.yards #=> false
24.inches <= 2.feet #=> true
5.feet <=> 2.yards #=> -1
24.inches != 2.feet #=> false
eql?
is also implemented, but it DOES depend on the same dimension class to be true
2.feet.eql? 2.feet #=> true
2.feet.eql? 24.inches #=> false
Contributing
- Fork it ( http://github.com/jfairbank/measurb/fork )
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request