sequel-units 0.0.1 → 0.1.0
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.
- checksums.yaml +4 -4
- data/README.md +57 -10
- data/lib/sequel/plugins/units/class_methods.rb +8 -5
- data/lib/sequel/plugins/units/instance_methods.rb +8 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5515c1978e06ae6b1bebc2b5201f0321fbc1eb8d
|
4
|
+
data.tar.gz: baa3796f2a314d0669eef73c01fe9422457fd6bf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 55d223bb200ea28b7c73c993787dd07131608a671bd5c34e0f0857f00fd8a979a5ab0f4bd9203185b5ed7190e71dfc79e991cb1856df6c8d65b5e2483179793b
|
7
|
+
data.tar.gz: c1be598f4854a418f34cadbae87dd132a00eedf444f6a35b1eebea1c0a8ec5f5de5ea9225084285bd6cf102b99bef3b9c38570fec51ca0c8394b0ae53f9ef69d
|
data/README.md
CHANGED
@@ -1,15 +1,20 @@
|
|
1
1
|
# Sequel::Units
|
2
2
|
|
3
|
+

|
4
|
+
[](https://travis-ci.org/AkihikoITOH/sequel-units)
|
5
|
+
[](https://badge.fury.io/rb/sequel-units)
|
6
|
+
[](https://gemnasium.com/github.com/AkihikoITOH/sequel-units)
|
7
|
+
|
3
8
|
Sequel plugin for working with numeric values with unit.
|
4
9
|
|
5
10
|
## Basic usage
|
6
11
|
|
7
|
-
Let's say you have a Sequel model `
|
12
|
+
Let's say you have a Sequel model `Order` which has a numeric attribute called `quantity` with unit (e.g. "10 kg").
|
8
13
|
|
9
14
|
Your migration file would look like
|
10
15
|
|
11
16
|
```ruby
|
12
|
-
DB.create_table(:
|
17
|
+
DB.create_table(:orders) do
|
13
18
|
primary_key :id
|
14
19
|
column :quantity_scalar, Integer # "{attribute}_scalar" which stands for the scalar value ("10" in this case).
|
15
20
|
column :quantity_unit, String # "{attribute}_unit" which stands for the unit ("kg" in this case).
|
@@ -19,30 +24,72 @@ end
|
|
19
24
|
Your model definition then looks like
|
20
25
|
|
21
26
|
```ruby
|
22
|
-
class
|
27
|
+
class Order < Sequel::Model
|
23
28
|
plugin :units
|
24
29
|
|
25
30
|
value_with_unit :quantity
|
26
31
|
end
|
27
32
|
```
|
28
33
|
|
29
|
-
Now instances of the model
|
34
|
+
Now instances of the model Order have an instance method `#quantity`.
|
30
35
|
|
31
36
|
```ruby
|
32
|
-
|
33
|
-
# => #<
|
34
|
-
|
37
|
+
order = Order.new(quantity_scalar: 10, quantity_unit: 'kg')
|
38
|
+
# => #<Order @values={:quantity_scalar=>10, :quantity_unit=>"kg"}>
|
39
|
+
order.quantity
|
35
40
|
# => 10 kg
|
41
|
+
order.quantity(in_unit: 'gram')
|
42
|
+
# => 10000 gram
|
36
43
|
```
|
37
44
|
|
38
|
-
Note `
|
45
|
+
Note `order.quantity` here is an instance of `RubyUnits::Unit`, so you can get the original scalar value or the unit
|
39
46
|
by calling methods `#scalar` or `#units`.
|
40
47
|
See [Ruby Units](https://github.com/olbrich/ruby-units) for more details.
|
41
48
|
|
42
49
|
```ruby
|
43
|
-
quantity.scalar
|
50
|
+
order.quantity.scalar
|
44
51
|
# => 10
|
45
|
-
quantity.units
|
52
|
+
order.quantity.units
|
46
53
|
# => "kg"
|
47
54
|
```
|
48
55
|
|
56
|
+
### Custom name for scalar and unit
|
57
|
+
|
58
|
+
You can specify your own favorite names for scalar and unit.
|
59
|
+
|
60
|
+
```ruby
|
61
|
+
class Order < Sequel::Model
|
62
|
+
plugin :units
|
63
|
+
|
64
|
+
value_with_unit :quantity, scalar: :my_scalar, unit: :my_unit
|
65
|
+
end
|
66
|
+
|
67
|
+
order = Order.new(my_scalar: 10, my_unit: 'kg')
|
68
|
+
# => #<Order @values={:my_scalar=>10, :my_unit=>"kg"}>
|
69
|
+
order.quantity
|
70
|
+
# => 10 kg
|
71
|
+
```
|
72
|
+
|
73
|
+
### Inverse unit
|
74
|
+
|
75
|
+
Let's say you have a Sequel model `Product`.
|
76
|
+
You might want to have price with unit like "5 USD / kg" (price per weight),
|
77
|
+
but want to store the weight unit as "kg" instead of "1/kg", separate from the currency.
|
78
|
+
|
79
|
+
```ruby
|
80
|
+
class Product < Sequel::Model
|
81
|
+
plugin :units
|
82
|
+
|
83
|
+
value_with_unit :price, inverse_unit: :weight_unit
|
84
|
+
end
|
85
|
+
|
86
|
+
product = Product.new(price_scalar: 5, price_unit: 'USD', weight_unit: 'kg')
|
87
|
+
# => #<Product @values={:price_scalar=>5, :price_unit=>"USD", :weight_unit=>"kg"}>
|
88
|
+
product.price
|
89
|
+
# => 5 USD/kg
|
90
|
+
```
|
91
|
+
|
92
|
+
## TODO
|
93
|
+
|
94
|
+
- [ ] Specify attributes of associated models.
|
95
|
+
- [ ] Define calculations with multiple attributes using [Unit Math](https://github.com/olbrich/ruby-units#unit-math)
|
@@ -2,11 +2,14 @@
|
|
2
2
|
|
3
3
|
module Sequel::Plugins::Units
|
4
4
|
module ClassMethods
|
5
|
-
def value_with_unit(method_name)
|
6
|
-
define_method method_name do
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
def value_with_unit(method_name, scalar: nil, unit: nil, inverse_unit: nil)
|
6
|
+
define_method method_name do |in_unit: nil|
|
7
|
+
_generate_units(
|
8
|
+
scalar || "#{method_name}_scalar".to_sym,
|
9
|
+
unit || "#{method_name}_unit".to_sym,
|
10
|
+
inverse_unit,
|
11
|
+
in_unit
|
12
|
+
)
|
10
13
|
end
|
11
14
|
end
|
12
15
|
end
|
@@ -4,6 +4,14 @@ module Sequel::Plugins::Units
|
|
4
4
|
module InstanceMethods
|
5
5
|
private
|
6
6
|
|
7
|
+
def _generate_units(scalar_method, unit_method, inverse_unit_method, target_unit)
|
8
|
+
scalar = _validate_scalar(send(scalar_method))
|
9
|
+
unit = _validate_unit(send(unit_method))
|
10
|
+
inverse_unit = inverse_unit_method ? "#{send(inverse_unit_method)}^-1" : nil
|
11
|
+
new_units = Unit.new("#{scalar} #{unit} #{inverse_unit}".strip)
|
12
|
+
target_unit ? new_units.convert_to(target_unit) : new_units
|
13
|
+
end
|
14
|
+
|
7
15
|
def _validate_scalar(scalar)
|
8
16
|
raise ArgumentError, "#{scalar} is not a numeric value" unless scalar.is_a?(Numeric)
|
9
17
|
scalar
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sequel-units
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Akihiko Itoh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-10-
|
11
|
+
date: 2017-10-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sequel
|