quantify 1.0.4 → 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/quantify/core_extensions.rb +1 -1
- data/lib/quantify/dimensions.rb +5 -6
- data/lib/quantify/quantify.rb +2 -0
- data/lib/quantify/quantity.rb +21 -8
- data/lib/quantify/unit/base_unit.rb +69 -35
- data/lib/quantify/unit/compound_base_unit.rb +12 -11
- data/lib/quantify/unit/compound_unit.rb +4 -0
- data/lib/quantify/unit/non_si_unit.rb +5 -2
- data/lib/quantify/unit/unit.rb +8 -0
- data/spec/quantity_spec.rb +69 -0
- data/spec/unit_spec.rb +83 -6
- metadata +4 -4
data/lib/quantify/dimensions.rb
CHANGED
@@ -318,7 +318,7 @@ module Quantify
|
|
318
318
|
#
|
319
319
|
def si_base_units(by=nil)
|
320
320
|
self.to_hash.map do |dimension,index|
|
321
|
-
Unit.
|
321
|
+
Unit.base_quantity_si_units.select do |unit|
|
322
322
|
unit.measures == dimension.standardize
|
323
323
|
end.first.clone ** index
|
324
324
|
end.map(&by)
|
@@ -383,6 +383,8 @@ module Quantify
|
|
383
383
|
def multiply(other)
|
384
384
|
Dimensions.new(self.to_hash).multiply! other
|
385
385
|
end
|
386
|
+
alias :times :multiply
|
387
|
+
alias :* :multiply
|
386
388
|
|
387
389
|
# Similar to #multiply! but performs a division of self by the specified
|
388
390
|
# Dimensions object.
|
@@ -399,6 +401,7 @@ module Quantify
|
|
399
401
|
def divide(other)
|
400
402
|
Dimensions.new(self.to_hash).divide! other
|
401
403
|
end
|
404
|
+
alias :/ :divide
|
402
405
|
|
403
406
|
# Raises self to the power provided. As with multiply and divide, the
|
404
407
|
# #get_description method is invoked to attempt to find a suitable
|
@@ -422,6 +425,7 @@ module Quantify
|
|
422
425
|
def pow(power)
|
423
426
|
Dimensions.new(self.to_hash).pow!(power)
|
424
427
|
end
|
428
|
+
alias :** :pow
|
425
429
|
|
426
430
|
# Inverts self, returning a representation of 1/self. This is equivalent to
|
427
431
|
# raising to the power -1. The #get_description method is invoked to attempt
|
@@ -443,11 +447,6 @@ module Quantify
|
|
443
447
|
Dimensions.new(self.to_hash).reciprocalize!
|
444
448
|
end
|
445
449
|
|
446
|
-
alias :times :multiply
|
447
|
-
alias :* :multiply
|
448
|
-
alias :/ :divide
|
449
|
-
alias :** :pow
|
450
|
-
|
451
450
|
protected
|
452
451
|
|
453
452
|
# Returns an array containing the names of the instance variables which
|
data/lib/quantify/quantify.rb
CHANGED
data/lib/quantify/quantity.rb
CHANGED
@@ -3,6 +3,8 @@
|
|
3
3
|
module Quantify
|
4
4
|
class Quantity
|
5
5
|
|
6
|
+
include Comparable
|
7
|
+
|
6
8
|
# The quantity class represents quantities. Quantities are represented by a
|
7
9
|
# numeric value - of class Numeric - and a unit - of class Unit::Base.
|
8
10
|
#
|
@@ -174,9 +176,9 @@ module Quantify
|
|
174
176
|
end
|
175
177
|
|
176
178
|
def convert_compound_unit_to_si!
|
177
|
-
until self.unit.
|
179
|
+
until self.unit.is_base_quantity_si_unit? do
|
178
180
|
unit = self.unit.base_units.find do |base|
|
179
|
-
!base.
|
181
|
+
!base.is_base_quantity_si_unit?
|
180
182
|
end.unit
|
181
183
|
self.convert_compound_unit_to_non_equivalent_unit!(unit.si_unit)
|
182
184
|
end
|
@@ -241,28 +243,27 @@ module Quantify
|
|
241
243
|
def add(other)
|
242
244
|
Quantity.new(value,unit).add!(other)
|
243
245
|
end
|
246
|
+
alias :+ :add
|
244
247
|
|
245
248
|
def subtract(other)
|
246
249
|
Quantity.new(value,unit).subtract!(other)
|
247
250
|
end
|
251
|
+
alias :- :subtract
|
248
252
|
|
249
253
|
def multiply(other)
|
250
254
|
Quantity.new(value,unit).multiply!(other)
|
251
255
|
end
|
256
|
+
alias :times :multiply
|
257
|
+
alias :* :multiply
|
252
258
|
|
253
259
|
def divide(other)
|
254
260
|
Quantity.new(value,unit).divide!(other)
|
255
261
|
end
|
262
|
+
alias :/ :divide
|
256
263
|
|
257
264
|
def pow(power)
|
258
265
|
Quantity.new(value,unit).pow!(power)
|
259
266
|
end
|
260
|
-
|
261
|
-
alias :times :multiply
|
262
|
-
alias :* :multiply
|
263
|
-
alias :+ :add
|
264
|
-
alias :- :subtract
|
265
|
-
alias :/ :divide
|
266
267
|
alias :** :pow
|
267
268
|
|
268
269
|
def rationalize_units
|
@@ -300,6 +301,18 @@ module Quantify
|
|
300
301
|
rounded_quantity.round! decimal_places
|
301
302
|
end
|
302
303
|
|
304
|
+
def <=>(other)
|
305
|
+
raise Exceptions::InvalidArgumentError unless other.is_a? Quantity
|
306
|
+
raise Exceptions::InvalidArgumentError unless other.unit.is_alternative_for?(unit)
|
307
|
+
other = other.to unit
|
308
|
+
value.to_f <=> other.value.to_f
|
309
|
+
end
|
310
|
+
|
311
|
+
def ===(range)
|
312
|
+
raise Exceptions::InvalidArgumentError unless range.is_a? Range
|
313
|
+
range.include? self
|
314
|
+
end
|
315
|
+
|
303
316
|
# Enables shorthand for reciprocal of quantity, e.g.
|
304
317
|
#
|
305
318
|
# quantity = 2.m
|
@@ -11,9 +11,8 @@ module Quantify
|
|
11
11
|
# Create a new instance of self (i.e. Base or an inherited class) and load
|
12
12
|
# into the system of known units. See initialize for details of options
|
13
13
|
#
|
14
|
-
def self.load(options)
|
15
|
-
|
16
|
-
unit.load
|
14
|
+
def self.load(options=nil,&block)
|
15
|
+
self.new(options,&block).load
|
17
16
|
end
|
18
17
|
|
19
18
|
def self.construct_and_load(unit,&block)
|
@@ -50,8 +49,8 @@ module Quantify
|
|
50
49
|
return new_unit
|
51
50
|
end
|
52
51
|
|
53
|
-
# Syntactic sugar for defining the known
|
54
|
-
# associated units to be loaded at runtime, e.g.
|
52
|
+
# Syntactic sugar for defining the units known to the system, enabling the
|
53
|
+
# required associated units to be loaded at runtime, e.g.
|
55
54
|
#
|
56
55
|
# Unit::[Base|SI|NonSI].configure do |config|
|
57
56
|
#
|
@@ -65,9 +64,9 @@ module Quantify
|
|
65
64
|
class_eval &block if block
|
66
65
|
end
|
67
66
|
|
68
|
-
attr_accessor :name, :symbol, :label
|
69
|
-
|
70
|
-
|
67
|
+
attr_accessor :name, :symbol, :label, :factor
|
68
|
+
attr_reader :dimensions
|
69
|
+
attr_reader :acts_as_alternative_unit, :acts_as_equivalent_unit
|
71
70
|
|
72
71
|
# Create a new Unit::Base instance.
|
73
72
|
#
|
@@ -101,52 +100,69 @@ module Quantify
|
|
101
100
|
# representation in the Dimensions class. This dimensions attribute is to
|
102
101
|
# provide much of the unit functionality
|
103
102
|
#
|
104
|
-
def initialize(options=nil)
|
103
|
+
def initialize(options=nil)
|
104
|
+
@acts_as_alternative_unit = true
|
105
|
+
@acts_as_equivalent_unit = false
|
106
|
+
@factor = 1.0
|
107
|
+
@symbol = nil
|
108
|
+
@label = nil
|
105
109
|
if options.is_a? Hash
|
110
|
+
self.dimensions = options[:dimensions] || options[:physical_quantity]
|
106
111
|
@name = options[:name].standardize.singularize.downcase
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
elsif options[:dimensions].is_a? String or options[:dimensions].is_a? Symbol
|
111
|
-
@dimensions = Dimensions.for options[:dimensions]
|
112
|
-
else
|
113
|
-
raise Exceptions::InvalidArgumentError, "Unknown physical_quantity specified"
|
114
|
-
end
|
115
|
-
@factor = options[:factor].nil? ? 1.0 : options[:factor].to_f
|
116
|
-
@symbol = options[:symbol].nil? ? nil : options[:symbol].standardize
|
117
|
-
@label = options[:label].nil? ? nil : options[:label].to_s
|
118
|
-
@acts_as_alternative_unit = true
|
119
|
-
@acts_as_equivalent_unit = false
|
112
|
+
@factor = options[:factor].to_f if options[:factor]
|
113
|
+
@symbol = options[:symbol].standardize if options[:symbol]
|
114
|
+
@label = options[:label].to_s if options[:label]
|
120
115
|
end
|
121
116
|
yield self if block_given?
|
122
117
|
valid?
|
123
118
|
end
|
124
119
|
|
120
|
+
def dimensions=(dimensions)
|
121
|
+
if dimensions.is_a? Dimensions
|
122
|
+
@dimensions = dimensions
|
123
|
+
elsif dimensions.is_a? String or dimensions.is_a? Symbol
|
124
|
+
@dimensions = Dimensions.for dimensions
|
125
|
+
else
|
126
|
+
raise Exceptions::InvalidArgumentError, "Unknown physical_quantity specified"
|
127
|
+
end
|
128
|
+
end
|
129
|
+
alias :physical_quantity= :dimensions=
|
130
|
+
|
125
131
|
# Permits a block to be used, operating on self. This is useful for modifying
|
126
132
|
# the attributes of an already instantiated unit, especially when defining
|
127
133
|
# units on the basis of operation on existing units for adding specific
|
128
134
|
# (rather than derived) names or symbols, e.g.
|
129
135
|
#
|
130
|
-
# (Unit.pound_force/(Unit.in**2)).
|
136
|
+
# (Unit.pound_force/(Unit.in**2)).configure do |unit|
|
131
137
|
# unit.symbol = 'psi'
|
132
138
|
# unit.label = 'psi'
|
133
139
|
# unit.name = 'pound per square inch'
|
134
140
|
# end
|
135
141
|
#
|
136
|
-
def
|
142
|
+
def configure
|
137
143
|
yield self if block_given?
|
138
144
|
return self if valid?
|
139
145
|
end
|
140
146
|
|
147
|
+
# Similar to #configure but makes the new unit configuration the canonical
|
148
|
+
# unit for self.label
|
149
|
+
#
|
150
|
+
def configure_as_canonical &block
|
151
|
+
unload if loaded?
|
152
|
+
configure &block if block_given?
|
153
|
+
make_canonical
|
154
|
+
end
|
155
|
+
|
141
156
|
# Load an initialized Unit into the system of known units.
|
142
157
|
#
|
143
|
-
# If a block is given, the unit can be
|
144
|
-
# similar to way to the #
|
158
|
+
# If a block is given, the unit can be configured prior to loading, in a
|
159
|
+
# similar to way to the #configure method.
|
145
160
|
#
|
146
161
|
def load
|
147
162
|
yield self if block_given?
|
148
163
|
raise Exceptions::InvalidArgumentError, "A unit with the same label: #{self.name}) already exists" if loaded?
|
149
164
|
Quantify::Unit.units << self if valid?
|
165
|
+
return self
|
150
166
|
end
|
151
167
|
|
152
168
|
# Remove from system of known units.
|
@@ -159,8 +175,16 @@ module Quantify
|
|
159
175
|
Unit.units.any? { |unit| self.has_same_identity_as? unit }
|
160
176
|
end
|
161
177
|
|
178
|
+
# Make self the canonical representation of the unit defined by self#label
|
162
179
|
def make_canonical
|
163
|
-
unload
|
180
|
+
unload if loaded?
|
181
|
+
load
|
182
|
+
end
|
183
|
+
|
184
|
+
# Set the canonical unit label - the unique unit identifier - to a new value
|
185
|
+
def canonical_label=(new_label)
|
186
|
+
unload if loaded?
|
187
|
+
self.label = new_label
|
164
188
|
load
|
165
189
|
end
|
166
190
|
|
@@ -203,11 +227,21 @@ module Quantify
|
|
203
227
|
self.name.pluralize
|
204
228
|
end
|
205
229
|
|
206
|
-
|
230
|
+
# Determine if the unit represents one of the base quantities, length,
|
231
|
+
# mass, time, temperature, etc.
|
232
|
+
#
|
207
233
|
def is_base_unit?
|
208
234
|
Dimensions::BASE_QUANTITIES.map(&:standardize).include? self.measures
|
209
235
|
end
|
210
236
|
|
237
|
+
# Determine if the unit is THE canonical SI unit for a base quantity (length,
|
238
|
+
# mass, time, etc.). This method ignores prefixed versions of SI base units,
|
239
|
+
# returning true only for metre, kilogram, second, Kelvin, etc.
|
240
|
+
#
|
241
|
+
def is_base_quantity_si_unit?
|
242
|
+
is_si_unit? and is_base_unit? and is_benchmark_unit?
|
243
|
+
end
|
244
|
+
|
211
245
|
# Determine is the unit is a derived unit - that is, a unit made up of more
|
212
246
|
# than one of the base quantities
|
213
247
|
#
|
@@ -225,7 +259,8 @@ module Quantify
|
|
225
259
|
# Determine if the unit is one of the units against which all other units
|
226
260
|
# of the same physical quantity are defined. These units are almost entirely
|
227
261
|
# equivalent to the non-prefixed, SI units, but the one exception is the
|
228
|
-
# kilogram,
|
262
|
+
# kilogram, which is an oddity in being THE canonical SI unit for mass, yet
|
263
|
+
# containing a prefix. This oddity makes this method useful/necessary.
|
229
264
|
#
|
230
265
|
def is_benchmark_unit?
|
231
266
|
self.factor == 1.0
|
@@ -277,7 +312,7 @@ module Quantify
|
|
277
312
|
self.send(attr) == other.send(attr)
|
278
313
|
end
|
279
314
|
end
|
280
|
-
|
315
|
+
|
281
316
|
alias :== :is_same_as?
|
282
317
|
|
283
318
|
# Check if unit has the identity as another, i.e. the same label. This is
|
@@ -375,6 +410,8 @@ module Quantify
|
|
375
410
|
other.instance_of?(Unit::Compound) ? options += other.base_units : options << other
|
376
411
|
Unit::Compound.new(*options)
|
377
412
|
end
|
413
|
+
alias :times :multiply
|
414
|
+
alias :* :multiply
|
378
415
|
|
379
416
|
# Divide one unit by another. This results in the generation of a compound
|
380
417
|
# unit.
|
@@ -393,6 +430,7 @@ module Quantify
|
|
393
430
|
end
|
394
431
|
Unit::Compound.new(*options)
|
395
432
|
end
|
433
|
+
alias :/ :divide
|
396
434
|
|
397
435
|
# Raise a unit to a power. This results in the generation of a compound
|
398
436
|
# unit, e.g. m^3.
|
@@ -412,17 +450,13 @@ module Quantify
|
|
412
450
|
end
|
413
451
|
return new_unit
|
414
452
|
end
|
453
|
+
alias :** :pow
|
415
454
|
|
416
455
|
# Return new unit representing the reciprocal of self, i.e. 1/self
|
417
456
|
def reciprocalize
|
418
457
|
Unit.unity / self
|
419
458
|
end
|
420
459
|
|
421
|
-
alias :times :multiply
|
422
|
-
alias :* :multiply
|
423
|
-
alias :/ :divide
|
424
|
-
alias :** :pow
|
425
|
-
|
426
460
|
# Apply a prefix to self. Returns new unit according to the prefixed version
|
427
461
|
# of self, complete with modified name, symbol, factor, etc..
|
428
462
|
#
|
@@ -67,20 +67,21 @@ module Quantify
|
|
67
67
|
@index < 0
|
68
68
|
end
|
69
69
|
|
70
|
-
|
71
|
-
|
70
|
+
# The following methods refer only to the unit of the CompoundBaseUnit
|
71
|
+
# object, rather than the unit *together with its index*
|
72
|
+
|
73
|
+
Unit_Methods = [ :base_quantity_si_unit, :base_unit, :benchmark_unit, :si_unit,
|
74
|
+
:non_si_unit, :prefixed_unit, :derived_unit ]
|
75
|
+
|
76
|
+
Unit_Methods.each do |method|
|
77
|
+
method = "is_#{method.to_s}?"
|
78
|
+
define_method(method) do
|
79
|
+
@unit.send method.to_sym
|
80
|
+
end
|
72
81
|
end
|
73
82
|
|
74
|
-
def is_non_si_unit?
|
75
|
-
@unit.is_non_si_unit?
|
76
|
-
end
|
77
|
-
|
78
|
-
# Physical quantity represented by self. This refers only to the unit, rather
|
79
|
-
# than the unit together with the index. Is used to match base units with
|
80
|
-
# similar units of same physical quantity
|
81
|
-
#
|
82
83
|
def measures
|
83
|
-
@unit.
|
84
|
+
@unit.measures
|
84
85
|
end
|
85
86
|
|
86
87
|
def initialize_copy(source)
|
@@ -131,6 +131,10 @@ module Quantify
|
|
131
131
|
@base_units.any? { |base| base.is_non_si_unit? }
|
132
132
|
end
|
133
133
|
|
134
|
+
def is_base_quantity_si_unit?
|
135
|
+
@base_units.all? { |base| base.is_base_quantity_si_unit? }
|
136
|
+
end
|
137
|
+
|
134
138
|
# Consolidate base units. A 'full' consolidation is performed, i.e.
|
135
139
|
# consolidation across numerator and denominator. This is equivalent to the
|
136
140
|
# automatic partial consolidation AND a cancelling of units (i.e.
|
@@ -10,8 +10,11 @@ module Quantify
|
|
10
10
|
# These are required in order to perform conversion, e.g. kelvin => celsius
|
11
11
|
# and therefore become and additional attribute to NonSI units
|
12
12
|
#
|
13
|
-
def initialize(options)
|
14
|
-
@scaling =
|
13
|
+
def initialize(options=nil)
|
14
|
+
@scaling = 0.0
|
15
|
+
if options.is_a? Hash and options[:scaling]
|
16
|
+
@scaling = options.delete(:scaling).to_f
|
17
|
+
end
|
15
18
|
super(options)
|
16
19
|
end
|
17
20
|
|
data/lib/quantify/unit/unit.rb
CHANGED
@@ -187,6 +187,14 @@ module Quantify
|
|
187
187
|
end
|
188
188
|
end
|
189
189
|
|
190
|
+
# This returns the suite of units which represents THE SI units for each of
|
191
|
+
# the base dimensions, i.e. metre, kilogram, second, etc. but not prefixed
|
192
|
+
# versions of the same unit
|
193
|
+
#
|
194
|
+
def self.base_quantity_si_units
|
195
|
+
@units.select {|unit| unit.is_base_quantity_si_unit? }
|
196
|
+
end
|
197
|
+
|
190
198
|
# This can be replicated by method missing approach, but explicit method provided
|
191
199
|
# given importance in #match (and #for) methods regexen
|
192
200
|
#
|
data/spec/quantity_spec.rb
CHANGED
@@ -200,6 +200,11 @@ describe Quantity do
|
|
200
200
|
speed.to_si.to_s(:name).should == "44.704 metres per second"
|
201
201
|
end
|
202
202
|
|
203
|
+
it "should convert compound units to SI correctly" do
|
204
|
+
speed = Quantity.new 100, (Unit.km/Unit.h)
|
205
|
+
speed.to_si.to_s(:name).should == "27.7777777777778 metres per second"
|
206
|
+
end
|
207
|
+
|
203
208
|
it "should convert compound units to SI correctly" do
|
204
209
|
pressure = Quantity.new 100, (Unit.pound_force_per_square_inch)
|
205
210
|
pressure.to_si.round.to_s(:name).should == "689476 pascals"
|
@@ -261,5 +266,69 @@ describe Quantity do
|
|
261
266
|
quantity.rationalize_units!
|
262
267
|
quantity.to_s.should eql "144.0 yd^2"
|
263
268
|
end
|
269
|
+
|
270
|
+
it "should be greater than" do
|
271
|
+
(20.ft > 1.m).should be_true
|
272
|
+
end
|
273
|
+
|
274
|
+
it "should be greater than" do
|
275
|
+
(20.ft > 7.m).should be_false
|
276
|
+
end
|
277
|
+
|
278
|
+
it "should be less than" do
|
279
|
+
(20.ft/1.h < 8.yd/60.min).should be_true
|
280
|
+
end
|
281
|
+
|
282
|
+
it "should be equal" do
|
283
|
+
(1.yd == 3.ft).should be_true
|
284
|
+
end
|
285
|
+
|
286
|
+
it "should be between with same units" do
|
287
|
+
(25.ft.between? 1.ft,30.ft).should be_true
|
288
|
+
end
|
289
|
+
|
290
|
+
it "should be between even with different units" do
|
291
|
+
(25.ft.between? 1.ft,10.m).should be_true
|
292
|
+
end
|
293
|
+
|
294
|
+
it "comparison with non quantity should raise error" do
|
295
|
+
lambda{20.ft > 3}.should raise_error
|
296
|
+
end
|
297
|
+
|
298
|
+
it "comparison with non compatible quantity should raise error" do
|
299
|
+
lambda{20.ft > 4.K}.should raise_error
|
300
|
+
end
|
301
|
+
|
302
|
+
it "should be range" do
|
303
|
+
(2.ft..20.ft).should be_a Range
|
304
|
+
end
|
305
|
+
|
306
|
+
it "should return between value from range" do
|
307
|
+
(2.ft..20.ft).include?(3.ft).should be_true
|
308
|
+
end
|
309
|
+
|
310
|
+
it "should return between value from range with different units" do
|
311
|
+
(2.ft..4.m).include?(200.cm).should be_true
|
312
|
+
(1.ly..1.parsec).include?(2.ly).should be_true
|
313
|
+
(1.ly..1.parsec).include?(2.in).should be_false
|
314
|
+
end
|
315
|
+
|
316
|
+
it "should return between value from range using === operator" do
|
317
|
+
(3.ft === (2.ft..20.ft)).should be_true
|
318
|
+
end
|
319
|
+
|
320
|
+
it "should return between value from range with different units using === operator" do
|
321
|
+
(200.cm === (2.ft..4.m)).should be_true
|
322
|
+
(2.ly === (1.ly..1.parsec)).should be_true
|
323
|
+
(2.in === (1.ly..1.parsec)).should be_false
|
324
|
+
end
|
325
|
+
|
326
|
+
it "range comparison with non compatible quantity should raise error" do
|
327
|
+
lambda{20.ft === (1.ft..3.K)}.should raise_error
|
328
|
+
end
|
329
|
+
|
330
|
+
it "range comparison with non quantity should raise error" do
|
331
|
+
lambda{20.ft === (1.ft..3)}.should raise_error
|
332
|
+
end
|
264
333
|
end
|
265
334
|
|
data/spec/unit_spec.rb
CHANGED
@@ -168,16 +168,16 @@ describe Unit do
|
|
168
168
|
end}.should raise_error
|
169
169
|
end
|
170
170
|
|
171
|
-
it "should modify unit attributes with block and #
|
172
|
-
unit = (Unit.kg/Unit.kWh).
|
171
|
+
it "should modify unit attributes with block and #configure" do
|
172
|
+
unit = (Unit.kg/Unit.kWh).configure do |u|
|
173
173
|
u.name = 'electricity emissions factor'
|
174
174
|
end
|
175
175
|
unit.class.should == Quantify::Unit::Compound
|
176
176
|
unit.name = 'electricity emissions factor'
|
177
177
|
end
|
178
178
|
|
179
|
-
it "should raise error with block and #
|
180
|
-
lambda{(Unit.kg/Unit.kWh).
|
179
|
+
it "should raise error with block and #configure which removes name" do
|
180
|
+
lambda{(Unit.kg/Unit.kWh).configure do |u|
|
181
181
|
u.name = ""
|
182
182
|
end}.should raise_error
|
183
183
|
end
|
@@ -286,15 +286,65 @@ describe Unit do
|
|
286
286
|
it "should make new unit configuration canonical" do
|
287
287
|
unit = Unit.psi
|
288
288
|
unit.name.should == 'pound force per square inch'
|
289
|
-
unit.
|
289
|
+
unit.configure {|unit| unit.name = 'PSI'}
|
290
290
|
unit.name.should == 'PSI'
|
291
291
|
Unit.psi.name.should == 'pound force per square inch'
|
292
292
|
unit.make_canonical
|
293
293
|
Unit.psi.name.should == 'PSI'
|
294
|
-
unit.
|
294
|
+
unit.configure {|unit| unit.name = 'pound force per square inch'}
|
295
295
|
unit.make_canonical
|
296
296
|
end
|
297
297
|
|
298
|
+
it "should change the label of canonical unit representation" do
|
299
|
+
unit = Unit.cubic_metre
|
300
|
+
unit.label.should eql "m^3"
|
301
|
+
unit.canonical_label = "m3"
|
302
|
+
unit.label.should eql "m3"
|
303
|
+
Unit.cubic_metre.label.should eql "m3"
|
304
|
+
end
|
305
|
+
|
306
|
+
it "should configure on canonical unit" do
|
307
|
+
unit = Unit.kg.configure_as_canonical do |unit|
|
308
|
+
unit.name = 'killogram'
|
309
|
+
end
|
310
|
+
unit.name.should eql 'killogram'
|
311
|
+
unit.symbol.should eql 'kg'
|
312
|
+
Unit.kg.name.should eql 'killogram'
|
313
|
+
(Unit.killogram).should be_a Unit::Base
|
314
|
+
|
315
|
+
unit = Unit.kg.configure_as_canonical do |unit|
|
316
|
+
unit.name = 'kilogram'
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
320
|
+
it "should configure on canonical unit even if changing label" do
|
321
|
+
unit = Unit.barn.configure_as_canonical do |unit|
|
322
|
+
unit.label = 'BARN'
|
323
|
+
end
|
324
|
+
unit.label.should eql 'BARN'
|
325
|
+
unit.symbol.should eql 'b'
|
326
|
+
Unit.barn.label.should eql 'BARN'
|
327
|
+
(Unit.BARN).should be_a Unit::Base
|
328
|
+
|
329
|
+
unit = Unit.barn.configure_as_canonical do |unit|
|
330
|
+
unit.label = 'b'
|
331
|
+
end
|
332
|
+
end
|
333
|
+
|
334
|
+
it "should configure on canonical unit even if changing label using canonical_label=" do
|
335
|
+
unit = Unit.barn.configure_as_canonical do |unit|
|
336
|
+
unit.canonical_label = 'BARN'
|
337
|
+
end
|
338
|
+
unit.label.should eql 'BARN'
|
339
|
+
unit.symbol.should eql 'b'
|
340
|
+
Unit.barn.label.should eql 'BARN'
|
341
|
+
(Unit.BARN).should be_a Unit::Base
|
342
|
+
|
343
|
+
unit = Unit.barn.configure_as_canonical do |unit|
|
344
|
+
unit.label = 'b'
|
345
|
+
end
|
346
|
+
end
|
347
|
+
|
298
348
|
end
|
299
349
|
|
300
350
|
describe "unit initialization" do
|
@@ -322,6 +372,33 @@ describe Unit do
|
|
322
372
|
it "should load unit into module array with class method" do
|
323
373
|
unit = Unit::NonSI.load :name => 'a name', :physical_quantity => :energy, :factor => 10, :symbol => 'anm', :label => 'a_name'
|
324
374
|
Unit.non_si_units_by_name.should include 'a name'
|
375
|
+
Unit.unload(unit)
|
376
|
+
end
|
377
|
+
|
378
|
+
it "should load unit into module array with class method and block" do
|
379
|
+
Unit::NonSI.load do |unit|
|
380
|
+
unit.name = 'a name'
|
381
|
+
unit.physical_quantity = :energy
|
382
|
+
unit.factor = 10
|
383
|
+
unit.symbol = 'anm'
|
384
|
+
unit.label = 'a_name'
|
385
|
+
end
|
386
|
+
Unit.non_si_units_by_name.should include 'a name'
|
387
|
+
Unit.a_name.measures.should eql 'energy'
|
388
|
+
Unit.unload('a_name')
|
389
|
+
end
|
390
|
+
|
391
|
+
it "should load unit into module array with class method and block and #dimensions method" do
|
392
|
+
Unit::NonSI.load do |unit|
|
393
|
+
unit.name = 'a name'
|
394
|
+
unit.dimensions = :energy
|
395
|
+
unit.factor = 10
|
396
|
+
unit.symbol = 'anm'
|
397
|
+
unit.label = 'a_name'
|
398
|
+
end
|
399
|
+
Unit.non_si_units_by_name.should include 'a name'
|
400
|
+
Unit.a_name.measures.should eql 'energy'
|
401
|
+
Unit.unload('a_name')
|
325
402
|
end
|
326
403
|
|
327
404
|
it "should derive compound unit correctly" do
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quantify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 29
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 5
|
10
|
+
version: 1.0.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Andrew Berkeley
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-06-21 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|