quantitymanager 0.9.0 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/quantity.rb +1 -0
- data/lib/unitmanager/calculator.rb +6 -7
- data/lib/unitmanager/simple_unit.rb +11 -68
- data/lib/unitmanager/unit_composition.rb +17 -20
- data/lib/unitmanager/utils.rb +63 -0
- metadata +3 -2
data/lib/quantity.rb
CHANGED
@@ -2,7 +2,6 @@ module Quantity
|
|
2
2
|
|
3
3
|
class Calculator
|
4
4
|
include Quantifiable
|
5
|
-
include Unit::SymbolConverter
|
6
5
|
|
7
6
|
attr_reader :units, :conversions
|
8
7
|
|
@@ -87,9 +86,9 @@ module Quantity
|
|
87
86
|
|
88
87
|
unit = Unit::ComposedUnit.new({
|
89
88
|
:dividends =>
|
90
|
-
|
89
|
+
@units.collect_for(first_operand[:dividends] + second_operand[:dividends]),
|
91
90
|
:divisors =>
|
92
|
-
|
91
|
+
@units.collect_for(first_operand[:divisors] + second_operand[:divisors])
|
93
92
|
})
|
94
93
|
|
95
94
|
Quantity.new(self, {:value => value, :unit => unit})
|
@@ -100,9 +99,9 @@ module Quantity
|
|
100
99
|
|
101
100
|
unit = Unit::ComposedUnit.new({
|
102
101
|
:dividends =>
|
103
|
-
|
102
|
+
@units.collect_for(first_operand[:dividends] + second_operand[:divisors]),
|
104
103
|
:divisors =>
|
105
|
-
|
104
|
+
@units.collect_for(first_operand[:divisors] + second_operand[:dividends])
|
106
105
|
})
|
107
106
|
|
108
107
|
Quantity.new(self, {:value => value, :unit => unit})
|
@@ -156,8 +155,8 @@ module Quantity
|
|
156
155
|
from, to = params[:from], params[:to]
|
157
156
|
|
158
157
|
target = Unit::ComposedUnit.new({
|
159
|
-
:dividends =>
|
160
|
-
:divisors =>
|
158
|
+
:dividends => @units.collect_for(to[:dividends] + from[:divisors]),
|
159
|
+
:divisors => @units.collect_for(to[:divisors] + from[:dividends])
|
161
160
|
})
|
162
161
|
|
163
162
|
if (conversion = direct_conversion(target))
|
@@ -1,64 +1,5 @@
|
|
1
|
-
#Extension to standard Array class.
|
2
|
-
#Added functionality to compare array content regardless element order.
|
3
|
-
class Array
|
4
|
-
def contains?(other_array)
|
5
|
-
copy = dup
|
6
|
-
other_array.each {|item|
|
7
|
-
return false unless i = copy.index(item)
|
8
|
-
copy[i] = nil
|
9
|
-
}
|
10
|
-
true
|
11
|
-
end
|
12
|
-
|
13
|
-
def same?(other_array)
|
14
|
-
length == other_array.length &&
|
15
|
-
contains?(other_array)
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
1
|
module Unit
|
21
2
|
|
22
|
-
class BaseUnit
|
23
|
-
|
24
|
-
class << self
|
25
|
-
|
26
|
-
def once (*methods) #:nodoc:
|
27
|
-
methods.each {|method|
|
28
|
-
|
29
|
-
module_eval <<-"end;"
|
30
|
-
alias_method :__#{method.to_i}__ , :#{method.to_s}
|
31
|
-
|
32
|
-
def #{method.to_s}(*args, &block)
|
33
|
-
|
34
|
-
def self.#{method.to_s}(*args, &block)
|
35
|
-
@__#{method.to_i}__
|
36
|
-
end
|
37
|
-
|
38
|
-
@__#{method.to_i}__ = __#{method.to_i}__(*args, &block)
|
39
|
-
end
|
40
|
-
private :__#{method.to_i}__
|
41
|
-
|
42
|
-
end;
|
43
|
-
|
44
|
-
}
|
45
|
-
end
|
46
|
-
|
47
|
-
private :once
|
48
|
-
end
|
49
|
-
|
50
|
-
# This method allows to retrieve symbolic portions of the unit definition.
|
51
|
-
# Supported values are:
|
52
|
-
# :dividends - returns an array of symbols representing dividend part of
|
53
|
-
# unit definition.
|
54
|
-
# :divisors - returns an array of symbols representing divisor part of
|
55
|
-
# unit definition.
|
56
|
-
# :string - string representation of the unit of measure.
|
57
|
-
def [] (symbol)
|
58
|
-
unit_sym[symbol]
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
3
|
# Adds comparing capabilities to unit implementations
|
63
4
|
module Comparable
|
64
5
|
|
@@ -87,7 +28,7 @@ module Unit
|
|
87
28
|
# simple unit with linear coefficient.
|
88
29
|
# Example: :cm is based on :mm with coefficient equal 10.
|
89
30
|
# In other words X cm = 10 * Y mm.
|
90
|
-
class SimpleUnit
|
31
|
+
class SimpleUnit
|
91
32
|
|
92
33
|
include Unit::Comparable
|
93
34
|
|
@@ -99,17 +40,16 @@ module Unit
|
|
99
40
|
@unit = args[:unit]
|
100
41
|
@based_on = args[:based_on] || nil
|
101
42
|
@coefficient = args[:coefficient] || 1
|
43
|
+
@unit_sym = {:dividends => [@unit], :divisors => [], :string => @unit.to_s}
|
102
44
|
end
|
103
45
|
|
104
46
|
def to_base(value)
|
105
47
|
value = @based_on.to_base(value) if derived?
|
106
|
-
|
107
48
|
value *= @coefficient
|
108
49
|
end
|
109
50
|
|
110
51
|
def from_base(value)
|
111
52
|
value = @based_on.from_base(value) if derived?
|
112
|
-
|
113
53
|
value /= @coefficient
|
114
54
|
end
|
115
55
|
|
@@ -140,16 +80,19 @@ module Unit
|
|
140
80
|
self == other
|
141
81
|
end
|
142
82
|
|
83
|
+
# This method allows to retrieve symbolic portions of the unit definition.
|
84
|
+
# Supported values are:
|
85
|
+
# :dividends - returns an array of symbols representing dividend part of
|
86
|
+
# unit definition.
|
87
|
+
# :string - string representation of the unit of measure.
|
88
|
+
def [] (symbol)
|
89
|
+
@unit_sym[symbol]
|
90
|
+
end
|
91
|
+
|
143
92
|
private
|
144
93
|
def derived?
|
145
94
|
@based_on != nil
|
146
95
|
end
|
147
|
-
|
148
|
-
def unit_sym
|
149
|
-
{:dividends => [@unit], :divisors => [], :string => @unit.to_s}
|
150
|
-
end
|
151
|
-
|
152
|
-
once :unit_sym
|
153
96
|
end
|
154
97
|
|
155
98
|
end
|
@@ -1,27 +1,14 @@
|
|
1
1
|
module Unit
|
2
2
|
|
3
|
-
module SymbolConverter
|
4
|
-
|
5
|
-
def convert(symbols)
|
6
|
-
units = []
|
7
|
-
symbols.each {|symbol|
|
8
|
-
unit = @units[symbol]
|
9
|
-
raise "Invalid Unit Name: #{symbol.to_s}" if unit.nil?
|
10
|
-
units << unit
|
11
|
-
}
|
12
|
-
return units
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|
16
|
-
|
17
|
-
|
18
3
|
# Implementation of what is called ‘composed unit of measure’.
|
19
4
|
# This is a result of performing multiplication or division of
|
20
5
|
# quantities with simple units.
|
21
6
|
# Example: 1 lb per in or 70 mi per hour
|
22
|
-
class ComposedUnit
|
7
|
+
class ComposedUnit
|
23
8
|
|
24
9
|
include Unit::Comparable
|
10
|
+
|
11
|
+
self.extend ExecControl
|
25
12
|
|
26
13
|
attr_reader :dividends, :divisors, :coefficient
|
27
14
|
|
@@ -82,9 +69,20 @@ module Unit
|
|
82
69
|
self == other
|
83
70
|
end
|
84
71
|
|
72
|
+
# This method allows to retrieve symbolic portions of the unit definition.
|
73
|
+
# Supported values are:
|
74
|
+
# :dividends - returns an array of symbols representing dividend part of
|
75
|
+
# unit definition.
|
76
|
+
# :divisors - returns an array of symbols representing divisor part of
|
77
|
+
# unit definition.
|
78
|
+
# :string - string representation of the unit of measure.
|
79
|
+
def [] (symbol)
|
80
|
+
unit_sym[symbol]
|
81
|
+
end
|
82
|
+
|
85
83
|
private
|
86
84
|
|
87
|
-
def collect(array)
|
85
|
+
def collect(array, &block)
|
88
86
|
result = []
|
89
87
|
|
90
88
|
array.each {|item| result += (yield(item) || []) }
|
@@ -151,7 +149,6 @@ module Unit
|
|
151
149
|
|
152
150
|
|
153
151
|
class Parser
|
154
|
-
include SymbolConverter
|
155
152
|
|
156
153
|
def initialize(units)
|
157
154
|
@units = units
|
@@ -163,8 +160,8 @@ module Unit
|
|
163
160
|
raise "Invalid Number of Operands in : #{unit_spec}" if operands.size > 2
|
164
161
|
|
165
162
|
{
|
166
|
-
:dividends =>
|
167
|
-
:divisors =>
|
163
|
+
:dividends => @units.collect_for(parse_operand_symbols(operands[0])),
|
164
|
+
:divisors => @units.collect_for(parse_operand_symbols(operands[1]))
|
168
165
|
}
|
169
166
|
end
|
170
167
|
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module ExecControl
|
2
|
+
|
3
|
+
def once (*methods) #:nodoc:
|
4
|
+
methods.each {|method|
|
5
|
+
|
6
|
+
module_eval <<-"end;"
|
7
|
+
alias_method :__#{method.to_i}__ , :#{method.to_s}
|
8
|
+
|
9
|
+
def #{method.to_s}(*args, &block)
|
10
|
+
|
11
|
+
def self.#{method.to_s}(*args, &block)
|
12
|
+
@__#{method.to_i}__
|
13
|
+
end
|
14
|
+
|
15
|
+
@__#{method.to_i}__ = __#{method.to_i}__(*args, &block)
|
16
|
+
end
|
17
|
+
private :__#{method.to_i}__
|
18
|
+
|
19
|
+
end;
|
20
|
+
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
private :once
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
class Hash
|
30
|
+
|
31
|
+
def collect_for(keys)
|
32
|
+
results = []
|
33
|
+
|
34
|
+
keys.each {|key|
|
35
|
+
value = self[key]
|
36
|
+
raise "Invalid Key : #{key.to_s}" if value.nil?
|
37
|
+
results << value
|
38
|
+
}
|
39
|
+
results
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
#Extension to standard Array class.
|
46
|
+
#Added functionality to compare array content regardless element order.
|
47
|
+
class Array
|
48
|
+
def contains?(other_array)
|
49
|
+
copy = dup
|
50
|
+
other_array.each {|item|
|
51
|
+
return false unless i = copy.index(item)
|
52
|
+
copy[i] = nil
|
53
|
+
}
|
54
|
+
true
|
55
|
+
end
|
56
|
+
|
57
|
+
def same?(other_array)
|
58
|
+
length == other_array.length &&
|
59
|
+
contains?(other_array)
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: quantitymanager
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.9.
|
7
|
-
date: 2006-
|
6
|
+
version: 0.9.1
|
7
|
+
date: 2006-07-19 00:00:00 -05:00
|
8
8
|
summary: "Unit of measure, quantity framework"
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -34,6 +34,7 @@ files:
|
|
34
34
|
- lib/quantity.rb
|
35
35
|
- lib/config/default_configuration.rb
|
36
36
|
- lib/unitmanager/configuration.rb
|
37
|
+
- lib/unitmanager/utils.rb
|
37
38
|
- lib/unitmanager/quantity.rb
|
38
39
|
- lib/unitmanager/simple_unit.rb
|
39
40
|
- lib/unitmanager/unit_composition.rb
|