sy 2.0.7 → 2.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/sy.rb +46 -10
- data/lib/sy/absolute_magnitude.rb +4 -0
- data/lib/sy/expressible_in_units.rb +20 -6
- data/lib/sy/magnitude.rb +6 -4
- data/lib/sy/quantity.rb +9 -5
- data/lib/sy/signed_magnitude.rb +4 -1
- data/lib/sy/unit.rb +53 -88
- data/lib/sy/version.rb +1 -1
- data/test/sy_test.rb +39 -5
- 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: fbbae1ea1d66b6976a9dbff702b83e891d0a2e71
|
4
|
+
data.tar.gz: 45b1ac5ddb4e8394d96ae22ad4a2e9946e23ec11
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 61cd30896408251b6611e1d616476e3666fd6d1c006140b4f9472ce15f11dfb29cf47b59a631614b9a8d1c5c74d282562ef70d588abacd3571aba063312ed5bb
|
7
|
+
data.tar.gz: 2c6553261eebeacdf3ab6f9a29094bc855800845d2cf44a3c9d62b19dd86b09c25ce796ad4a50a7de9cc5f070b484c20b2a1a53ec2a6241b7a17ab9f67933d50
|
data/lib/sy.rb
CHANGED
@@ -66,7 +66,9 @@ module SY
|
|
66
66
|
# of the constant "UNIT" implies, via YSupport's NameMagic mixin, that the
|
67
67
|
# name of the object becomes :unit and that it is possible to use syntax
|
68
68
|
# such as 42.unit to create magnitudes of SY::Amount.
|
69
|
+
puts "About to construct UNIT." if SY::DEBUG
|
69
70
|
UNIT = Unit.standard of: Amount
|
71
|
+
puts "UNIT constructed. SY::Unit instances are #{SY::Unit.instance_names}" if SY::DEBUG
|
70
72
|
|
71
73
|
# AVOGADRO_CONSTANT (Nᴀ) is a certain well-known amount of things:
|
72
74
|
Nᴀ = AVOGADRO_CONSTANT = 6.02214e23
|
@@ -75,7 +77,10 @@ module SY
|
|
75
77
|
MoleAmount = Quantity.dimensionless coerces: Amount
|
76
78
|
|
77
79
|
# And let SY::MOLE be its standard unit, related to SY::Amount via Nᴀ:
|
80
|
+
puts "About to construct MOLE." if SY::DEBUG
|
78
81
|
MOLE = Unit.standard of: MoleAmount, short: "mol", amount: Nᴀ.unit
|
82
|
+
puts SY::Unit.__instances__ if SY::DEBUG
|
83
|
+
puts "MOLE constructed. SY::Unit instances are #{SY::Unit.instance_names}" if SY::DEBUG
|
79
84
|
|
80
85
|
# === Basic dimension L (length)
|
81
86
|
|
@@ -141,18 +146,49 @@ module SY
|
|
141
146
|
CELSIUS = Unit.standard( of: CelsiusTemperature,
|
142
147
|
short: '°C', measure: CELSIUS_MEASURE )
|
143
148
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
149
|
+
module CelsiusMagnitude
|
150
|
+
def + m2
|
151
|
+
puts "CelsiusMagnitude#+ method with #{m2}" # FIXME: This message doesn't show.
|
152
|
+
return magnitude amount + m2.amount if
|
153
|
+
m2.quantity == SY::Temperature ||
|
154
|
+
m2.quantity.colleague == SY::Temperature
|
155
|
+
raise QuantityError, "Addition of Celsius temepratures is ambiguous!" if
|
156
|
+
m2.quantity == SY::CelsiusTemperature
|
157
|
+
super
|
158
|
+
end
|
159
|
+
|
160
|
+
def - m2
|
161
|
+
puts "CelsiusMagnitude#- method with #{m2}" # FIXME: This message doesn't show.
|
162
|
+
return magnitude amount - m2.amount if
|
163
|
+
m2.quantity == SY::Temperature ||
|
164
|
+
m2.quantity.colleague == SY::Temperature
|
165
|
+
return super.( SY::Temperature ) if m2.quantity == SY::CelsiusTemperature
|
166
|
+
super
|
167
|
+
end
|
168
|
+
|
169
|
+
# FIXME: #% method etc
|
154
170
|
end
|
155
171
|
|
172
|
+
# Making sure that for Celsius temperature, #°C returns absolute magnitude.
|
173
|
+
#
|
174
|
+
class Numeric
|
175
|
+
def °C
|
176
|
+
SY::CelsiusTemperature.absolute.magnitude self
|
177
|
+
end
|
178
|
+
end
|
179
|
+
# FIXME: Make this more systematic.
|
180
|
+
# FIXME: Make sure that SI prefixes may not be used with Celsius
|
181
|
+
# FIXME: Make sure that highly unusual SI prefixes may not be used
|
182
|
+
|
183
|
+
class << CelsiusTemperature.send( :Magnitude )
|
184
|
+
include SY::CelsiusMagnitude
|
185
|
+
end
|
186
|
+
|
187
|
+
class << CelsiusTemperature.relative.send( :Magnitude )
|
188
|
+
include SY::CelsiusMagnitude
|
189
|
+
end
|
190
|
+
|
191
|
+
|
156
192
|
# alias :°C :celsius # with U+00B0 DEGREE SIGN
|
157
193
|
# alias :˚C :celsius # with U+02DA RING ABOVE
|
158
194
|
# alias :℃ :celsius # U+2103 DEGREE CELSIUS
|
@@ -43,6 +43,8 @@ module SY::AbsoluteMagnitude
|
|
43
43
|
# For absolute magnitudes, #+ method always returns a result framed in
|
44
44
|
# corresponding relative quantity.
|
45
45
|
#
|
46
|
+
# TODO: Figure out which module comes on the top in Quantity@Magnitude, whether Magnitude
|
47
|
+
# or SignedMagnitude, and therefore, whether it is necessary to adjust this method.
|
46
48
|
def + m2
|
47
49
|
return magnitude amount + m2.amount if m2.quantity == quantity.relative
|
48
50
|
return quantity.relative.magnitude( amount + m2.amount ) if
|
@@ -67,6 +69,8 @@ module SY::AbsoluteMagnitude
|
|
67
69
|
# For absolute magnitudes, #- method always returns a result framed in
|
68
70
|
# corresponding relative quantity.
|
69
71
|
#
|
72
|
+
# TODO: Figure out which module comes on the top in Quantity@Magnitude, whether Magnitude
|
73
|
+
# or SignedMagnitude, and therefore, whether it is necessary to adjust this method.
|
70
74
|
def - m2
|
71
75
|
return magnitude amount - m2.amount if m2.quantity == quantity.relative
|
72
76
|
return quantity.relative.magnitude( amount - m2.amount ) if
|
@@ -68,19 +68,24 @@ module SY::ExpressibleInUnits
|
|
68
68
|
@included_in ||= []
|
69
69
|
end
|
70
70
|
|
71
|
+
# Unit namespace.
|
72
|
+
#
|
73
|
+
def unit_namespace
|
74
|
+
begin
|
75
|
+
SY::Unit
|
76
|
+
rescue NameError # no SY::Unit defined yet
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
71
80
|
# Currently defined unit instances, if any.
|
72
81
|
#
|
73
82
|
def known_units
|
74
|
-
unit_namespace = begin
|
75
|
-
SY::Unit
|
76
|
-
rescue NameError
|
77
|
-
return [] # no SY::Unit yet
|
78
|
-
end
|
79
83
|
begin
|
80
84
|
unit_namespace.instances
|
81
85
|
rescue NoMethodError
|
82
86
|
[] # no #instances method defined yet
|
83
87
|
end
|
88
|
+
.tap { |r| puts "Known units are #{r}" if SY::DEBUG }
|
84
89
|
end
|
85
90
|
|
86
91
|
# All methods defined by this mixin.
|
@@ -92,7 +97,12 @@ module SY::ExpressibleInUnits
|
|
92
97
|
# Find unit based on name / abbreviation.
|
93
98
|
#
|
94
99
|
def find_unit ς
|
95
|
-
|
100
|
+
puts "searching for unit #{ς}" if SY::DEBUG
|
101
|
+
known_units.find do |u|
|
102
|
+
u.name.to_s.downcase == ς.downcase &&
|
103
|
+
( ς == ς.downcase || ς == ς.upcase ) ||
|
104
|
+
u.short.to_s == ς
|
105
|
+
end
|
96
106
|
end
|
97
107
|
|
98
108
|
# Return prefix method or empty string, if prefix method not necessary.
|
@@ -121,6 +131,7 @@ module SY::ExpressibleInUnits
|
|
121
131
|
# I'D HAVE TO PERFORM THE COLLISION CHECK HERE
|
122
132
|
# IF NO COLLISION, INFORM THE SUBSEQUENT METHOD DEFINED CALL ON
|
123
133
|
# SELF.CLASS
|
134
|
+
puts "parsed" if SY::DEBUG
|
124
135
|
self.class.instance_variable_set "@no_collision", ß # FIXME: This is too clumsy
|
125
136
|
self.class.module_eval write_unit_method( ß, prefixes, units, exps )
|
126
137
|
SY::ExpressibleInUnits.method_family << self.class.instance_method( ß )
|
@@ -155,6 +166,7 @@ module SY::ExpressibleInUnits
|
|
155
166
|
# figures out which SY units it represents, along with prefixes and exponents.
|
156
167
|
#
|
157
168
|
def parse_unit_symbol ß
|
169
|
+
puts "About to parse #{ß} using all prefixes" if SY::DEBUG
|
158
170
|
SY::Unit.parse_sps_using_all_prefixes( ß ) # rely on SY::Unit
|
159
171
|
end
|
160
172
|
|
@@ -163,10 +175,12 @@ module SY::ExpressibleInUnits
|
|
163
175
|
# Arrays must be of equal length. (Note: 'ß' is 'symbol', 'ς' is 'string')
|
164
176
|
#
|
165
177
|
def write_unit_method ß, prefixes, units, exponents
|
178
|
+
puts "writing unit method #{ß}" if SY::DEBUG
|
166
179
|
# Prepare prefix / unit / exponent triples for making factor strings:
|
167
180
|
triples = [ prefixes, units, exponents ].transpose
|
168
181
|
# A procedure for triple processing before use:
|
169
182
|
process_triple = lambda do |pfx, unit_ς, exp|
|
183
|
+
puts "Processing triple #{pfx}, #{unit_ς}, #{exp}." if SY::DEBUG
|
170
184
|
[ ::SY::ExpressibleInUnits.find_unit( unit_ς ).name.to_s.upcase,
|
171
185
|
::SY::ExpressibleInUnits.prefix_method_string( pfx ),
|
172
186
|
::SY::ExpressibleInUnits.exponentiation_string( exp ) ]
|
data/lib/sy/magnitude.rb
CHANGED
@@ -157,14 +157,16 @@ module SY::Magnitude
|
|
157
157
|
|
158
158
|
# Same magnitudes <em>and</em> same (#eql) quantities.
|
159
159
|
#
|
160
|
-
def eql other
|
161
|
-
|
160
|
+
def eql? other
|
161
|
+
quantity == other.quantity && amount == other.amount
|
162
162
|
end
|
163
163
|
|
164
164
|
# Percent operator (remainder after division)
|
165
165
|
#
|
166
|
-
def %
|
167
|
-
|
166
|
+
def % m2
|
167
|
+
return magnitude amount % m2.amount if quantity == m2.quantity
|
168
|
+
return self % m2.( quantity ) if quantity.coerces? m2.quantity
|
169
|
+
apply_through_coerce :%, m2
|
168
170
|
end
|
169
171
|
|
170
172
|
# Type coercion for magnitudes.
|
data/lib/sy/quantity.rb
CHANGED
@@ -261,7 +261,7 @@ class SY::Quantity
|
|
261
261
|
Unit().standard
|
262
262
|
end
|
263
263
|
|
264
|
-
# Constructs a
|
264
|
+
# Constructs a absolute magnitude of this quantity.
|
265
265
|
#
|
266
266
|
def magnitude amount
|
267
267
|
puts "Constructing #{self}#magnitude with amount #{amount}." if SY::DEBUG
|
@@ -436,8 +436,8 @@ class SY::Quantity
|
|
436
436
|
qnt = self
|
437
437
|
ɴλ = -> { name ? "#{name}@%s" : "#<Quantity:#{object_id}@%s>" }
|
438
438
|
|
439
|
-
Class.new Magnitude() do
|
440
|
-
include SY::Unit
|
439
|
+
Class.new Magnitude() do puts "Creating @Unit class!" if SY::DEBUG
|
440
|
+
include SY::Unit; puts "Included SY::Unit" if SY::DEBUG
|
441
441
|
|
442
442
|
singleton_class.class_exec do
|
443
443
|
define_method :standard do |**nn| # Customized #standard.
|
@@ -449,8 +449,12 @@ class SY::Quantity
|
|
449
449
|
ɴλ.call % "Unit" # as for @Magnitude applies.)
|
450
450
|
end
|
451
451
|
end
|
452
|
-
end
|
453
|
-
end )
|
452
|
+
end.namespace! SY::Unit
|
453
|
+
end ).tap do |u|
|
454
|
+
puts "@Unit constructed, its namespace is #{u.namespace}" if SY::DEBUG
|
455
|
+
puts "its instances are #{u.namespace.instances}" if SY::DEBUG
|
456
|
+
puts "its instance names are #{u.namespace.instance_names}" if SY::DEBUG
|
457
|
+
end
|
454
458
|
end
|
455
459
|
|
456
460
|
private
|
data/lib/sy/signed_magnitude.rb
CHANGED
@@ -29,6 +29,8 @@ module SY::SignedMagnitude
|
|
29
29
|
|
30
30
|
# Addition.
|
31
31
|
#
|
32
|
+
# TODO: Figure out which module comes on the top in Quantity@Magnitude, whether Magnitude
|
33
|
+
# or SignedMagnitude, and therefore, whether it is necessary to adjust this method.
|
32
34
|
def + m2
|
33
35
|
return magnitude( amount + m2.amount ) if quantity == m2.quantity
|
34
36
|
return quantity.absolute.magnitude( amount + m2.amount ) if
|
@@ -38,7 +40,8 @@ module SY::SignedMagnitude
|
|
38
40
|
end
|
39
41
|
|
40
42
|
# Subtraction.
|
41
|
-
#
|
43
|
+
#
|
44
|
+
# TODO: ditto
|
42
45
|
def - m2
|
43
46
|
return magnitude( amount - m2.amount ) if m2.quantity == quantity.relative
|
44
47
|
return quantity.relative.magnitude( amount - m2.amount ) if
|
data/lib/sy/unit.rb
CHANGED
@@ -6,86 +6,61 @@
|
|
6
6
|
module SY::Unit
|
7
7
|
PROTECTED_NAMES = [ "kilogram" ]
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
begin
|
26
|
-
super # let's first try the original method
|
27
|
-
.tap { puts "original #instance method provided by NameMagic succeeded" if SY::DEBUG }
|
28
|
-
rescue NameError # if we fail...
|
29
|
-
puts "original #instance method provided by NameMagic returned NameError" if SY::DEBUG
|
30
|
-
begin # second in order, let's try whether it's an abbreviation
|
31
|
-
puts "trying whether the argument is an abbreviation" if SY::DEBUG
|
32
|
-
rslt = instances.find { |unit_inst|
|
33
|
-
if unit_inst.abbreviation then
|
34
|
-
if unit_inst.abbreviation.to_s == arg.to_s then
|
35
|
-
puts "For supplied argument #{arg} (#{arg.class}), it seems that " +
|
36
|
-
"unit #{unit_inst} of quantity #{unit_inst.quantity} has abbreviation " +
|
37
|
-
"#{unit_inst.abbreviation} matching it." if SY::DEBUG
|
38
|
-
true
|
39
|
-
else
|
40
|
-
false
|
41
|
-
end
|
9
|
+
class << self
|
10
|
+
# Make Unit#instance ignore capitalization and accept abbreviations.
|
11
|
+
#
|
12
|
+
def instance arg
|
13
|
+
begin
|
14
|
+
super # let's first try the original method
|
15
|
+
rescue NameError # if we fail...
|
16
|
+
begin # ... let's try the abbreviation
|
17
|
+
super instances.find { |unit_inst|
|
18
|
+
unit_inst.short.to_s == arg.to_s if unit_inst.short
|
19
|
+
}.tap { |rslt| fail NameError if rslt.nil? } # fail if nothing found
|
20
|
+
rescue NameError, TypeError
|
21
|
+
begin # Let's to try upcase if we have all-downcase arg
|
22
|
+
super arg.to_s.upcase
|
23
|
+
rescue NameError # if not, tough luck
|
24
|
+
raise NameError, "Unknown unit symbol: #{arg}"
|
42
25
|
end
|
43
|
-
# inst.abbreviation.to_s == arg.to_s if inst.abbreviation
|
44
|
-
}
|
45
|
-
fail NameError if rslt.nil? # if nothing found, super need not be called
|
46
|
-
super rslt
|
47
|
-
rescue NameError, TypeError
|
48
|
-
puts "failed, we'll now try to upcase the argument in case of all-downcase argument" if SY::DEBUG
|
49
|
-
begin # finally, let's try upcase if we have all-downcase arg
|
50
|
-
super arg.to_s.upcase
|
51
|
-
rescue NameError # if not, tough luck
|
52
|
-
raise NameError, "Unknown unit symbol: #{which}"
|
53
26
|
end
|
54
27
|
end
|
55
28
|
end
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
29
|
+
|
30
|
+
def included target
|
31
|
+
target.class_exec do
|
32
|
+
# Let's set up the naming hook for NameMagic:
|
33
|
+
name_set_closure do |name, new_instance, old_name|
|
34
|
+
ɴ = name.to_s
|
35
|
+
up, down = ɴ.upcase, ɴ.downcase
|
36
|
+
|
37
|
+
# Check case (only all-upper or all-lower is acceptable).
|
38
|
+
msg = "Unit must be either all-upper or all-lower case!"
|
39
|
+
fail NameError, msg unless ɴ == up || ɴ = down
|
40
|
+
|
41
|
+
# Reject the names starting with a full prefix.
|
42
|
+
conflicter = SY::PREFIX_TABLE.full_prefixes
|
43
|
+
.find { |prefix| down.starts_with? prefix unless prefix.empty? }
|
44
|
+
fail NameError, "Name #{ɴ} starts with #{conflicter}- prefix!" unless
|
45
|
+
SY::Unit::PROTECTED_NAMES.include? down if conflicter
|
46
|
+
|
47
|
+
# Warn about method name conflicts in the target module(s), where
|
48
|
+
# SY::ExpressibleInUnits mixin is included.
|
49
|
+
if new_instance.warns? then
|
50
|
+
w = ::SY::ExpressibleInUnits::COLLISION_WARNING
|
51
|
+
::SY::ExpressibleInUnits.included_in.each do |ɱ|
|
52
|
+
im = ɱ.instance_methods
|
53
|
+
# puts ɱ, "class: #{ɱ.class}"
|
54
|
+
# puts im.size
|
55
|
+
# puts down
|
56
|
+
# puts im.include? down
|
57
|
+
warn w % [down, ɱ] if im.include? down
|
58
|
+
abbrev = new_instance.abbreviation
|
59
|
+
warn w % [abbrev, ɱ] if im.include? abbrev
|
60
|
+
end
|
86
61
|
end
|
62
|
+
up.to_sym
|
87
63
|
end
|
88
|
-
up.to_sym
|
89
64
|
end
|
90
65
|
|
91
66
|
# name_get_closure { |name| name.to_s.downcase.to_sym }
|
@@ -108,10 +83,10 @@ module SY::Unit
|
|
108
83
|
end
|
109
84
|
end
|
110
85
|
end
|
111
|
-
end #
|
112
|
-
end #
|
86
|
+
end # def included
|
87
|
+
end # class << self
|
113
88
|
|
114
|
-
include NameMagic
|
89
|
+
include NameMagic # it respects prefiously defined self.included
|
115
90
|
|
116
91
|
class << self
|
117
92
|
# Constructor of units of a given quantity.
|
@@ -144,14 +119,13 @@ module SY::Unit
|
|
144
119
|
# Full list of known unit names and unit abbreviations.
|
145
120
|
#
|
146
121
|
def known_symbols
|
147
|
-
instance_names + abbreviations.keys
|
122
|
+
instance_names.map( &:downcase ) + abbreviations.keys
|
148
123
|
end
|
149
124
|
|
150
125
|
# Parses an SPS, curring it with known unit names and abbreviations,
|
151
126
|
# and all known full and short prefixes.
|
152
127
|
#
|
153
128
|
def parse_sps_using_all_prefixes sps
|
154
|
-
puts "Unit about to sps parse (#{sps})" if SY::DEBUG
|
155
129
|
SY::PREFIX_TABLE.parse_sps( sps, known_symbols )
|
156
130
|
end
|
157
131
|
end # class << self
|
@@ -178,15 +152,6 @@ module SY::Unit
|
|
178
152
|
def short= unit_abbreviation
|
179
153
|
@abbreviation = unit_abbreviation.to_sym
|
180
154
|
end
|
181
|
-
|
182
|
-
# Unit name. While named units are typically introduced as constants in
|
183
|
-
# all-upper case, their names are then presented in all-lower case.
|
184
|
-
#
|
185
|
-
def name
|
186
|
-
ɴ = super
|
187
|
-
return ɴ ? ɴ.to_s.downcase.to_sym : nil
|
188
|
-
end
|
189
|
-
alias ɴ name
|
190
155
|
|
191
156
|
# Constructor of units provides support for one additional named argument:
|
192
157
|
# :abbreviation, alias :short. (This is in addition to :name, alias :ɴ named
|
data/lib/sy/version.rb
CHANGED
data/test/sy_test.rb
CHANGED
@@ -241,7 +241,7 @@ describe SY::Quantity, SY::Magnitude do
|
|
241
241
|
1.Mt.must_equal 1000.kiloton
|
242
242
|
1.mm.quantity.name.must_equal :Length±
|
243
243
|
SY::Length.standard_unit.must_equal SY::METRE
|
244
|
-
SY::Length.standard_unit.name.must_equal :
|
244
|
+
SY::Length.standard_unit.name.must_equal :METRE
|
245
245
|
SY::Length.standard_unit.must_equal SY::METRE
|
246
246
|
SY.Quantity( :Length ).object_id.must_equal SY::Length.object_id
|
247
247
|
SY::Length.relative.object_id.must_equal SY.Quantity( :Length± ).object_id
|
@@ -250,7 +250,7 @@ describe SY::Quantity, SY::Magnitude do
|
|
250
250
|
SY.Quantity( :Length± ).colleague.object_id.must_equal SY::Length.object_id
|
251
251
|
SY.Quantity( :Length± ).send( :Unit ).object_id
|
252
252
|
.must_equal SY::Length.send( :Unit ).object_id
|
253
|
-
1.mm.quantity.standard_unit.name.must_equal :
|
253
|
+
1.mm.quantity.standard_unit.name.must_equal :METRE
|
254
254
|
1.mm.to_s.must_equal "0.001.m"
|
255
255
|
1.mm.inspect.must_equal "#<±Magnitude: 0.001.m >"
|
256
256
|
1.µs.inspect.must_equal "#<±Magnitude: 1e-06.s >"
|
@@ -258,12 +258,12 @@ describe SY::Quantity, SY::Magnitude do
|
|
258
258
|
SY::Area.dimension.must_equal SY.Dimension( :L² )
|
259
259
|
SY::Area.composition.must_equal SY::Composition[ SY::Length => 2 ]
|
260
260
|
|
261
|
-
SY::AMPERE.name.must_equal :
|
261
|
+
SY::AMPERE.name.must_equal :AMPERE
|
262
262
|
SY::AMPERE.abbreviation.must_equal :A
|
263
263
|
SY::AMPERE.dimension.must_equal 1.A.dimension
|
264
264
|
SY.Magnitude( of: SY::ElectricCurrent, amount: 1 ).must_equal 1.A.absolute
|
265
265
|
1.A.quantity.must_equal SY::ElectricCurrent.relative
|
266
|
-
1.A.quantity.standard_unit.name.must_equal :
|
266
|
+
1.A.quantity.standard_unit.name.must_equal :AMPERE
|
267
267
|
1.A.to_s( SY::AMPERE ).must_equal "1.A"
|
268
268
|
1.A.to_s.must_equal "1.A"
|
269
269
|
1.A.amount.must_equal 1
|
@@ -313,7 +313,7 @@ describe SY::Quantity, SY::Magnitude do
|
|
313
313
|
rescue
|
314
314
|
end
|
315
315
|
end.must_include :M
|
316
|
-
SY::Unit.instance_names.must_include :
|
316
|
+
SY::Unit.instance_names.must_include :MOLE
|
317
317
|
# Avogadro's number is defined directly in SY
|
318
318
|
1.mol.quantity.object_id.must_equal SY::Nᴀ.unit.( SY::MoleAmount ).quantity.object_id
|
319
319
|
SY::Nᴀ.unit.( SY::MoleAmount ).must_equal 1.mol
|
@@ -392,6 +392,40 @@ describe SY::Quantity, SY::Magnitude do
|
|
392
392
|
assert_equal 273.15, 0.°C.in( :K )
|
393
393
|
assert_equal SY::Unit.instance( :SECOND ), SY::Unit.instance( :second )
|
394
394
|
assert_equal SY::TRIPLE_POINT_OF_WATER, 0.°C # coercion behavior
|
395
|
+
assert 2.°C.eql?( 1.°C + 1.K )
|
396
|
+
assert ( 1.°C - 1.°C ).eql?( 0.K )
|
397
|
+
assert_equal :raised, begin
|
398
|
+
1.°C + 1.°C
|
399
|
+
:nothing_raised
|
400
|
+
rescue QuantityError
|
401
|
+
:raised
|
402
|
+
end
|
403
|
+
assert_equal :raised, begin
|
404
|
+
1.K + 1.°C
|
405
|
+
:nothing_raised
|
406
|
+
rescue QuantityError
|
407
|
+
:raised
|
408
|
+
end
|
409
|
+
assert_equal :raised, begin
|
410
|
+
1.K - 1.°C
|
411
|
+
:nothing_raised
|
412
|
+
rescue QuantityError
|
413
|
+
:raised
|
414
|
+
end
|
415
|
+
assert 1.mm.K⁻¹.eql?( 1.mm.°C⁻¹ )
|
416
|
+
assert 1.mm.K.eql?( 1.mm.°C )
|
417
|
+
assert_equal :raised, begin
|
418
|
+
1.mm / 1.°C
|
419
|
+
:nothing_raised
|
420
|
+
rescue QuantityError
|
421
|
+
:raised
|
422
|
+
end
|
423
|
+
assert_equal :raised, begin
|
424
|
+
1.mm * 1.°C
|
425
|
+
:nothing_raised
|
426
|
+
rescue QuantityError
|
427
|
+
:raised
|
428
|
+
end
|
395
429
|
end
|
396
430
|
end
|
397
431
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- boris
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-06-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|