sy 2.0.7 → 2.0.9
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/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
|