general_units 0.0.2 → 0.0.3
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/lib/general_units/derivatives/box.rb +14 -3
- data/lib/general_units/helpers/action_view_extension.rb +8 -0
- data/lib/general_units/models/active_record_extension.rb +194 -0
- data/lib/general_units/units/length.rb +25 -17
- data/lib/general_units/units/weight.rb +24 -16
- data/lib/general_units/version.rb +1 -1
- 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: ba43bb6e8b19eba9b18fccc0c5d40fdebbc26c31
|
4
|
+
data.tar.gz: dee3ce3ab9873f719d6e4fc09707ef3a89d99562
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6229d7a83ac3f0f58fc7177d3461323849ae609e4178121c1cadd9df72a86511e81c22a8d41cb85b0725cc5559cc311d81e66935776c0d4773e781b9c08c6e26
|
7
|
+
data.tar.gz: c8d68aec598958c1633f5b64b56124050c889d72ad80deaed48453e2c6dd21300907ba512bd0eabfa58862a0843a8ceb2d0349185feecdc757ffdc28e96eb842
|
@@ -8,11 +8,18 @@ module GeneralUnits
|
|
8
8
|
|
9
9
|
attr_reader *VALUES, :unit
|
10
10
|
|
11
|
+
delegate :to_f, :to => :amount
|
12
|
+
delegate :hash, :to => :attributes
|
13
|
+
|
11
14
|
def initialize(length = 0, width = 0, height = 0, unit)
|
12
15
|
VALUES.each {|v| instance_variable_set(:"@#{v}", validate_value(eval(v), unit))}
|
13
16
|
@unit = @height.unit
|
14
17
|
end
|
15
18
|
|
19
|
+
def attributes
|
20
|
+
{:length => length, :width => width, :height => height, :unit => unit}
|
21
|
+
end
|
22
|
+
|
16
23
|
def values
|
17
24
|
VALUES.map {|v| self.send(v)}
|
18
25
|
end
|
@@ -25,8 +32,12 @@ module GeneralUnits
|
|
25
32
|
Box.new(*values.map {|v| v.convert_to(unit).amount}, unit)
|
26
33
|
end
|
27
34
|
|
28
|
-
def to_s(round =
|
29
|
-
|
35
|
+
def to_s(round = nil)
|
36
|
+
values.map {|d| d.to_s(round)}.join("x")
|
37
|
+
end
|
38
|
+
|
39
|
+
def formatted(round = nil)
|
40
|
+
"#{to_s(round)} #{unit.short}"
|
30
41
|
end
|
31
42
|
|
32
43
|
def accommodates?(*boxes)
|
@@ -59,7 +70,7 @@ module GeneralUnits
|
|
59
70
|
self == other_object
|
60
71
|
end
|
61
72
|
|
62
|
-
def <=>(
|
73
|
+
def <=>(other_object)
|
63
74
|
other_object = validate_capacity_or_length(other_object)
|
64
75
|
amount <=> case other_object
|
65
76
|
when Length then other_object
|
@@ -4,6 +4,200 @@ module GeneralUnits
|
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
6
|
module ClassMethods
|
7
|
+
|
8
|
+
def has_weight(*args)
|
9
|
+
options = args.extract_options!
|
10
|
+
prefix = args.first||:weight
|
11
|
+
|
12
|
+
class_attribute :_has_weight unless defined?(_has_weight)
|
13
|
+
self._has_weight = {prefix => {}}
|
14
|
+
|
15
|
+
self._has_weight[prefix][:amount_field] = amount_field = options[:amount]||:"#{prefix}_amount"
|
16
|
+
self._has_weight[prefix][:unit_field] = unit_field = options[:unit]||:"#{prefix}_unit"
|
17
|
+
self._has_weight[prefix][:default_unit] = default_unit = options[:default_unit]||:kilogram
|
18
|
+
self._has_weight[prefix][:default_unit_method] = default_unit_method = options[:default_unit_method]||:"deafult_#{prefix}_unit"
|
19
|
+
|
20
|
+
validates_inclusion_of unit_field, :in => Weight::UNITS.map {|u| u.code.to_s}, :if => Proc.new {|o| o.send(amount_field).present?}
|
21
|
+
|
22
|
+
class_eval <<-EOV
|
23
|
+
|
24
|
+
def #{unit_field}=(value)
|
25
|
+
if value.to_sym.in?(GeneralUnits::Weight::UNITS.map(&:code))
|
26
|
+
super(value.to_s)
|
27
|
+
else
|
28
|
+
raise ArgumentError, "Unprocessable unit: \#{value.inspect\}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def #{prefix}
|
33
|
+
begin
|
34
|
+
if @_#{prefix}.nil? || #{amount_field}_changed? || #{unit_field}_changed?
|
35
|
+
@_#{prefix} = GeneralUnits::Weight.new(#{amount_field}, #{unit_field})
|
36
|
+
else
|
37
|
+
@_#{prefix}
|
38
|
+
end
|
39
|
+
rescue ArgumentError, TypeError
|
40
|
+
nil
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def #{prefix}=(value)
|
45
|
+
case value
|
46
|
+
when GeneralUnits::Weight
|
47
|
+
self.#{amount_field} = value.amount
|
48
|
+
self.#{unit_field} = value.unit.code
|
49
|
+
when Array then
|
50
|
+
self.#{amount_field} = value[0]
|
51
|
+
self.#{unit_field} = value[1]||try(:#{default_unit_method})||:#{default_unit}
|
52
|
+
when Hash then
|
53
|
+
value = value.with_indifferent_access
|
54
|
+
self.#{amount_field} = value[:amount]
|
55
|
+
self.#{unit_field} = value[:unit]||try(:#{default_unit_method})||:#{default_unit}
|
56
|
+
when Numeric then
|
57
|
+
self.#{amount_field} = value
|
58
|
+
self.#{unit_field} = try(:#{default_unit_method})||:#{default_unit}
|
59
|
+
when nil then
|
60
|
+
self.#{amount_field} = nil
|
61
|
+
self.#{unit_field} = nil
|
62
|
+
end
|
63
|
+
#{prefix}
|
64
|
+
end
|
65
|
+
EOV
|
66
|
+
end
|
67
|
+
|
68
|
+
def has_length(*args)
|
69
|
+
options = args.extract_options!
|
70
|
+
prefix = args.first||:length
|
71
|
+
|
72
|
+
class_attribute :_has_length unless defined?(_has_length)
|
73
|
+
self._has_length = {prefix => {}}
|
74
|
+
|
75
|
+
self._has_length[prefix][:amount_field] = amount_field = options[:amount]||:"#{prefix}_amount"
|
76
|
+
self._has_length[prefix][:unit_field] = unit_field = options[:unit]||:"#{prefix}_unit"
|
77
|
+
self._has_length[prefix][:default_unit] = default_unit = options[:default_unit]||:centimeter
|
78
|
+
self._has_length[prefix][:default_unit_method] = default_unit_method = options[:default_unit_method]||:"deafult_#{prefix}_unit"
|
79
|
+
|
80
|
+
validates_inclusion_of unit_field, :in => Length::UNITS.map {|u| u.code.to_s}, :if => Proc.new {|o| o.send(amount_field).present?}
|
81
|
+
|
82
|
+
class_eval <<-EOV
|
83
|
+
|
84
|
+
def #{unit_field}=(value)
|
85
|
+
if value.to_sym.in?(GeneralUnits::Length::UNITS.map(&:code))
|
86
|
+
super(value.to_s)
|
87
|
+
else
|
88
|
+
raise ArgumentError, "Unprocessable unit: \#{value.inspect\}"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def #{prefix}
|
93
|
+
begin
|
94
|
+
if @_#{prefix}.nil? || #{amount_field}_changed? || #{unit_field}_changed?
|
95
|
+
@_#{prefix} = GeneralUnits::Length.new(#{amount_field}, #{unit_field})
|
96
|
+
else
|
97
|
+
@_#{prefix}
|
98
|
+
end
|
99
|
+
rescue ArgumentError, TypeError
|
100
|
+
nil
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def #{prefix}=(value)
|
105
|
+
case value
|
106
|
+
when GeneralUnits::Length
|
107
|
+
self.#{amount_field} = value.amount
|
108
|
+
self.#{unit_field} = value.unit.code
|
109
|
+
when Array then
|
110
|
+
self.#{amount_field} = value[0]
|
111
|
+
self.#{unit_field} = value[1]||try(:#{default_unit_method})||:#{default_unit}
|
112
|
+
when Hash then
|
113
|
+
value = value.with_indifferent_access
|
114
|
+
self.#{amount_field} = value[:amount]
|
115
|
+
self.#{unit_field} = value[:unit]||try(:#{default_unit_method})||:#{default_unit}
|
116
|
+
when Numeric then
|
117
|
+
self.#{amount_field} = value
|
118
|
+
self.#{unit_field} = try(:#{default_unit_method})||:#{default_unit}
|
119
|
+
when nil then
|
120
|
+
self.#{amount_field} = nil
|
121
|
+
self.#{unit_field} = nil
|
122
|
+
end
|
123
|
+
#{prefix}
|
124
|
+
end
|
125
|
+
EOV
|
126
|
+
end
|
127
|
+
|
128
|
+
def has_box(*args)
|
129
|
+
options = args.extract_options!
|
130
|
+
prefix = args.first||:box
|
131
|
+
|
132
|
+
class_attribute :_has_box unless defined?(_has_box)
|
133
|
+
self._has_box = {prefix => {}}
|
134
|
+
|
135
|
+
self._has_box[prefix][:length_field] = length_field = options[:length]||:"#{prefix}_length"
|
136
|
+
self._has_box[prefix][:width_field] = width_field = options[:width]||:"#{prefix}_width"
|
137
|
+
self._has_box[prefix][:height_field] = height_field = options[:height]||:"#{prefix}_height"
|
138
|
+
|
139
|
+
self._has_box[prefix][:unit_field] = unit_field = options[:unit]||:"#{prefix}_unit"
|
140
|
+
self._has_box[prefix][:default_unit] = default_unit = options[:default_unit]||:centimeter
|
141
|
+
self._has_box[prefix][:default_unit_method] = default_unit_method = options[:default_unit_method]||:"deafult_#{prefix}_unit"
|
142
|
+
|
143
|
+
validates_inclusion_of unit_field, :in => Length::UNITS.map {|u| u.code.to_s}, :if => Proc.new {|o| o.send(length_field).present? || o.send(width_field).present? || o.send(height_field).present?}
|
144
|
+
|
145
|
+
class_eval <<-EOV
|
146
|
+
|
147
|
+
def #{unit_field}=(value)
|
148
|
+
if value.to_sym.in?(GeneralUnits::Length::UNITS.map(&:code))
|
149
|
+
super(value.to_s)
|
150
|
+
else
|
151
|
+
raise ArgumentError, "Unprocessable unit: \#{value.inspect\}"
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
def #{prefix}
|
156
|
+
begin
|
157
|
+
if @_#{prefix}.nil? || #{length_field}_changed? || #{width_field}_changed? || #{height_field}_changed? || #{unit_field}_changed?
|
158
|
+
@_#{prefix} = GeneralUnits::Box.new(#{length_field}, #{width_field}, #{height_field}, #{unit_field})
|
159
|
+
else
|
160
|
+
@_#{prefix}
|
161
|
+
end
|
162
|
+
rescue ArgumentError, TypeError
|
163
|
+
nil
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def #{prefix}=(value)
|
168
|
+
case value
|
169
|
+
when GeneralUnits::Box then
|
170
|
+
self.#{length_field} = value.length
|
171
|
+
self.#{width_field} = value.width
|
172
|
+
self.#{height_field} = value.height
|
173
|
+
self.#{unit_field} = value.unit.code
|
174
|
+
when Array then
|
175
|
+
self.#{length_field} = value[0]
|
176
|
+
self.#{width_field} = value[1]
|
177
|
+
self.#{height_field} = value[2]
|
178
|
+
self.#{unit_field} = value[3]||try(:#{default_unit_method})||:#{default_unit}
|
179
|
+
when Hash then
|
180
|
+
value = value.with_indifferent_access
|
181
|
+
self.#{length_field} = value[:length]
|
182
|
+
self.#{width_field} = value[:width]
|
183
|
+
self.#{height_field} = value[:height]
|
184
|
+
self.#{unit_field} = value[:unit]||try(:#{default_unit_method})||:#{default_unit}
|
185
|
+
when Numeric then
|
186
|
+
self.#{length_field} = value
|
187
|
+
self.#{width_field} = value
|
188
|
+
self.#{height_field} = value
|
189
|
+
self.#{unit_field} = try(:#{default_unit_method})||:#{default_unit}
|
190
|
+
when nil then
|
191
|
+
self.#{length_field} = nil
|
192
|
+
self.#{width_field} = nil
|
193
|
+
self.#{height_field} = nil
|
194
|
+
self.#{unit_field} = nil
|
195
|
+
end
|
196
|
+
#{prefix}
|
197
|
+
end
|
198
|
+
EOV
|
199
|
+
end
|
200
|
+
|
7
201
|
end
|
8
202
|
|
9
203
|
end
|
@@ -5,9 +5,10 @@ module GeneralUnits
|
|
5
5
|
::GeneralUnits::Arithmetics.extend_class(self)
|
6
6
|
|
7
7
|
class Unit
|
8
|
-
attr_reader :name, :short, :millimeters
|
8
|
+
attr_reader :code, :name, :short, :millimeters
|
9
9
|
|
10
|
-
def initialize(name, short, millimeters)
|
10
|
+
def initialize(code, name, short, millimeters)
|
11
|
+
@code = code
|
11
12
|
@name = name.to_s
|
12
13
|
@short = short.to_s
|
13
14
|
@millimeters = millimeters.to_d
|
@@ -18,22 +19,23 @@ module GeneralUnits
|
|
18
19
|
end
|
19
20
|
|
20
21
|
def inspect
|
21
|
-
|
22
|
+
code
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
25
|
-
UNITS =
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
26
|
+
UNITS = [Unit.new(:mile_nautical, "Mile (nautical)", "mln.", 1852000.0),
|
27
|
+
Unit.new(:mile, "Mile", "ml.", 1609344.0),
|
28
|
+
Unit.new(:yard, "Yard", "yrd.", 914.4),
|
29
|
+
Unit.new(:foot, "Foot", "ft.", 304.8),
|
30
|
+
Unit.new(:inch, "Inch", "in.", 25.4),
|
31
|
+
Unit.new(:kilometer, "Kilometer", "km.", 1000000.0),
|
32
|
+
Unit.new(:meter, "Meter", "m.", 1000.0),
|
33
|
+
Unit.new(:centimeter, "Centimeter", "cm.", 10.0),
|
34
|
+
Unit.new(:millimeter, "Millimeter", "mm.", 1.0)]
|
34
35
|
|
35
36
|
attr_reader :amount, :unit
|
36
37
|
delegate :to_f, :to => :amount
|
38
|
+
delegate :hash, :to => :attributes
|
37
39
|
|
38
40
|
def initialize(amount = 0, unit)
|
39
41
|
if unit = valid_unit?(unit)
|
@@ -41,6 +43,10 @@ module GeneralUnits
|
|
41
43
|
@unit = unit
|
42
44
|
end
|
43
45
|
end
|
46
|
+
|
47
|
+
def attributes
|
48
|
+
{:amount => amount, :unit => unit}
|
49
|
+
end
|
44
50
|
|
45
51
|
def convert_to(unit)
|
46
52
|
if convert_unit = valid_unit?(unit)
|
@@ -49,8 +55,12 @@ module GeneralUnits
|
|
49
55
|
end
|
50
56
|
end
|
51
57
|
|
52
|
-
def to_s(round =
|
53
|
-
"#{to_f.round(round)}
|
58
|
+
def to_s(round = nil)
|
59
|
+
"#{to_f.round(round||2)}"
|
60
|
+
end
|
61
|
+
|
62
|
+
def formatted(round = nil)
|
63
|
+
"#{to_s(round)} #{unit.short}"
|
54
64
|
end
|
55
65
|
|
56
66
|
def to_length
|
@@ -61,10 +71,8 @@ module GeneralUnits
|
|
61
71
|
|
62
72
|
def valid_unit?(unit)
|
63
73
|
unit_object = case unit
|
64
|
-
when String then UNITS
|
65
|
-
when Symbol then UNITS[unit]
|
74
|
+
when String, Symbol then UNITS.find {|u| u.code.to_s == unit.to_s}
|
66
75
|
when Unit then unit
|
67
|
-
else UNITS[unit.to_s.to_sym]
|
68
76
|
end
|
69
77
|
unit_object || raise(TypeError, "Unprocessable unit #{unit.inspect}")
|
70
78
|
end
|
@@ -5,9 +5,10 @@ module GeneralUnits
|
|
5
5
|
::GeneralUnits::Arithmetics.extend_class(self)
|
6
6
|
|
7
7
|
class Unit
|
8
|
-
attr_reader :name, :short, :grams
|
8
|
+
attr_reader :code, :name, :short, :grams
|
9
9
|
|
10
|
-
def initialize(name, short, grams)
|
10
|
+
def initialize(code, name, short, grams)
|
11
|
+
@code = code
|
11
12
|
@name = name.to_s
|
12
13
|
@short = short.to_s
|
13
14
|
@grams = grams.to_d
|
@@ -18,21 +19,22 @@ module GeneralUnits
|
|
18
19
|
end
|
19
20
|
|
20
21
|
def inspect
|
21
|
-
|
22
|
+
code
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
25
|
-
UNITS =
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
26
|
+
UNITS = [Unit.new(:short_ton_us, "Short ton (US)", "Sht.", 907184.74),
|
27
|
+
Unit.new(:pound_us, "Pound (US)", "Pnd.", 453.59237),
|
28
|
+
Unit.new(:ounce_us, "Ounce (US)", "Ounce", 28.349523),
|
29
|
+
Unit.new(:stone, "Stone", "Stn", 6350.2932),
|
30
|
+
Unit.new(:long_ton_uk, "Long Ton (UK)", "Lngt.", 1016046.9),
|
31
|
+
Unit.new(:metric_ton, "Metric Ton", "Ton", 1000000.0),
|
32
|
+
Unit.new(:kilogram, "Kilogram", "Kg.", 1000.0),
|
33
|
+
Unit.new(:gram, "Gram", "g.", 1.0)]
|
33
34
|
|
34
35
|
attr_reader :amount, :unit
|
35
36
|
delegate :to_f, :to => :amount
|
37
|
+
delegate :hash, :to => :attributes
|
36
38
|
|
37
39
|
def initialize(amount = 0, unit)
|
38
40
|
if unit = valid_unit?(unit)
|
@@ -40,6 +42,10 @@ module GeneralUnits
|
|
40
42
|
@unit = unit
|
41
43
|
end
|
42
44
|
end
|
45
|
+
|
46
|
+
def attributes
|
47
|
+
{:amount => amount, :unit => unit}
|
48
|
+
end
|
43
49
|
|
44
50
|
def convert_to(unit)
|
45
51
|
if convert_unit = valid_unit?(unit)
|
@@ -48,8 +54,12 @@ module GeneralUnits
|
|
48
54
|
end
|
49
55
|
end
|
50
56
|
|
51
|
-
def to_s(round =
|
52
|
-
"#{to_f.round(round)}
|
57
|
+
def to_s(round = nil)
|
58
|
+
"#{to_f.round(round||2)}"
|
59
|
+
end
|
60
|
+
|
61
|
+
def formatted(round = nil)
|
62
|
+
"#{to_s(round)} #{unit.short}"
|
53
63
|
end
|
54
64
|
|
55
65
|
def to_weight
|
@@ -60,10 +70,8 @@ module GeneralUnits
|
|
60
70
|
|
61
71
|
def valid_unit?(unit)
|
62
72
|
unit_object = case unit
|
63
|
-
when String then UNITS
|
64
|
-
when Symbol then UNITS[unit]
|
73
|
+
when String, Symbol then UNITS.find {|u| u.code.to_s == unit.to_s}
|
65
74
|
when Unit then unit
|
66
|
-
else UNITS[unit.to_s.to_sym]
|
67
75
|
end
|
68
76
|
unit_object || raise(TypeError, "Unprocessable unit #{unit.inspect}")
|
69
77
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: general_units
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Valery Kvon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: i18n
|