README.md in measured-1.6.0 vs README.md in measured-2.0.0.pre1
- old
+ new
@@ -1,10 +1,10 @@
# Measured [![Build Status](https://travis-ci.org/Shopify/measured.svg)](https://travis-ci.org/Shopify/measured) [![Gem Version](https://badge.fury.io/rb/measured.svg)](http://badge.fury.io/rb/measured)
Encapsulates measurements with their units. Provides easy conversion between units.
-Light weight and easily extensible to include other units and conversions. Conversions done with `BigDecimal` for precision.
+Lightweight and easily extensible to include other units and conversions. Conversions done with `Rational` for precision.
The adapter to integrate `measured` with Ruby on Rails is in a separate [`measured-rails`](https://github.com/Shopify/measured-rails) gem.
## Installation
@@ -14,11 +14,13 @@
gem 'measured'
```
Or stand alone:
- $ gem install measured
+```
+$ gem install measured
+```
## Usage
Initialize a measurement:
@@ -30,16 +32,10 @@
```ruby
Measured::Weight.new("12", "g").convert_to("kg")
```
-Or convert inline:
-
-```ruby
-Measured::Weight.new("12", "g").convert_to!("kg")
-```
-
Agnostic to symbols/strings:
```ruby
Measured::Weight.new(1, "kg") == Measured::Weight.new(1, :kg)
```
@@ -48,59 +44,45 @@
```ruby
Measured::Weight.new(12, :oz) == Measured::Weight.new("12", :ounce)
```
-Comparison with zero works without the need to specify units, useful for validations:
-```ruby
-Measured::Weight.new(0.001, :kg) > 0
-> true
-
-Measured::Length.new(-1, :m) < 0
-> true
-
-Measured::Weight.new(0, :oz) == 0
-> true
-```
-
Raises on unknown units:
```ruby
begin
Measured::Weight.new(1, :stone)
rescue Measured::UnitError
puts "Unknown unit"
end
```
-Perform mathematical operations against other units, all represented internally as `BigDecimal`:
+Perform addition / subtraction against other units, all represented internally as `Rational` or `BigDecimal`:
```ruby
Measured::Weight.new(1, :g) + Measured::Weight.new(2, :g)
> #<Measured::Weight 3 g>
-Measured::Weight.new(2, :g) - Measured::Weight.new(1, :g)
-> #<Measured::Weight 1 g>
-Measured::Weight.new(10, :g) / Measured::Weight.new(2, :g)
+Measured::Weight.new("2.1", :g) - Measured::Weight.new(1, :g)
+> #<Measured::Weight 1.1 g>
+```
+
+Multiplication and division by units is not supported, but the actual value can be scaled by a scalar:
+
+```ruby
+Measured::Weight.new(10, :g).scale(0.5)
> #<Measured::Weight 5 g>
-Measured::Weight.new(2, :g) * Measured::Weight.new(3, :g)
+Measured::Weight.new(2, :g).scale(3)
> #<Measured::Weight 6 g>
```
In cases of differing units, the left hand side takes precedence:
```ruby
Measured::Weight.new(1000, :g) + Measured::Weight.new(1, :kg)
> #<Measured::Weight 2000 g>
```
-Also perform mathematical operations against `Numeric` things:
-
-```ruby
-Measured::Weight.new(3, :g) * 2
-> #<Measured::Weight 6 g>
-```
-
Converts units only as needed for equality comparison:
```ruby
> Measured::Weight.new(1000, :g) == Measured::Weight.new(1, :kg)
true
@@ -172,50 +154,35 @@
Measured::Weight(1, :g)
```
### Adding new units
-Extending this library to support other units is simple. To add a new conversion, subclass `Measured::Measurable`, define your base units, then add your conversion units.
+Extending this library to support other units is simple. To add a new conversion, use `Measured.build` to define your base unit and conversion units:
```ruby
-class Measured::Thing < Measured::Measurable
- conversion.set_base :base_unit, # Define the basic unit for the system
- aliases: [:bu] # Allow it to be aliased to other names/symbols
+Measured::Thing = Measured.build do
+ unit :base_unit, # Add a unit to the system
+ aliases: [:bu] # Allow it to be aliased to other names/symbols
- conversion.add :another_unit, # Add a second unit to the system
- aliases: [:au], # All units allow aliases, as long as they are unique
- value: ["1.5 base_unit"] # The conversion rate to another unit
-
- conversion.add :different_unit
- aliases: [:du],
- value: [Rational(2,3), "another_unit"] # Conversion rate can be Rational, otherwise it is coerced to BigDecimal
+ unit :another_unit, # Add a second unit to the system
+ aliases: [:au], # All units allow aliases, as long as they are unique
+ value: ["1.5 bu"] # The conversion rate to another unit
end
```
-By default all names and aliases and case insensitive. If you would like to create a new unit with names and aliases that are case sensitive, you should subclass `Measured::CaseSensitiveMeasurable` instead. Other than case sensitivity, both classes are identical to each other.
+By default all names and aliases are case insensitive. If you would like to create a new unit with names and aliases that are case sensitive, specify the case sensitive flag when building your unit:
```ruby
-class Measured::Thing < Measured::CaseSensitiveMeasurable
- conversion.set_base :base_unit,
- aliases: [:bu]
+Measured::Thing = Measured.build(case_sensitive: true) do
+ unit :base_unit, aliases: [:bu]
end
```
-The base unit takes no value. Values for conversion units can be defined as a string with two tokens `"number unit"` or as an array with two elements. The numbers must be `Rational` or `BigDecimal`, else they will be coerced to `BigDecimal`. Conversion paths don't have to be direct as a conversion table will be built for all possible conversions using tree traversal.
+Other than case sensitivity, both classes are identical to each other. The `case_sensitive` flag, which is false by default, gets taken into account any time you attempt to reference a unit by name or alias.
-The `case_sensitive` flag, which is false by default, gets taken into account any time you attempt to reference a unit by name or alias.
+Values for conversion units can be defined as a string with two tokens `"number unit"` or as an array with two elements. All values will be parsed as / coerced to `Rational`. Conversion paths don't have to be direct as a conversion table will be built for all possible conversions.
-You can also open up the existing classes and add a new conversion:
-
-```ruby
-class Measured::Length
- conversion.add :dm,
- aliases: [:decimeter, :decimetre, :decimeters, :decimetres],
- value: "0.1 m"
-end
-```
-
### Namespaces
All units and classes are namespaced by default, but can be aliased in your application.
```ruby
@@ -236,10 +203,10 @@
* Lots of code to solve a relatively simple problem.
* No ActiveRecord adapter.
### Gem: [quantified](https://github.com/Shopify/quantified)
* **Pros**
- * Light weight.
+ * Lightweight.
* Included with ActiveShipping/ActiveUtils.
* **Cons**
* All math done with floats making it highly lossy.
* All units assumed to be pluralized, meaning using unit abbreviations is not possible.
* Not actively maintained.