vanunits 1.5.0
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.
- data/HISTORY +16 -0
- data/HOWITWORKS.rdoc +72 -0
- data/LICENSE +23 -0
- data/README.rdoc +68 -0
- data/lib/van/units.rb +116 -0
- data/lib/van/units/base.rb +991 -0
- data/lib/van/units/constants.rb +2 -0
- data/lib/van/units/constants/cgs.rb +122 -0
- data/lib/van/units/constants/math.rb +3 -0
- data/lib/van/units/constants/math/cgs.rb +125 -0
- data/lib/van/units/constants/math/mks.rb +126 -0
- data/lib/van/units/constants/math/natural.rb +33 -0
- data/lib/van/units/constants/mks.rb +122 -0
- data/lib/van/units/currency.rb +160 -0
- data/lib/van/units/data/binary/base.rb +4 -0
- data/lib/van/units/data/cex.rb +5 -0
- data/lib/van/units/data/currency-default.rb +5 -0
- data/lib/van/units/data/currency-standard.rb +2 -0
- data/lib/van/units/data/currency/base.rb +89 -0
- data/lib/van/units/data/iec.rb +5 -0
- data/lib/van/units/data/iec_binary/base.rb +6 -0
- data/lib/van/units/data/si.rb +8 -0
- data/lib/van/units/data/si/base.rb +11 -0
- data/lib/van/units/data/si/constants.rb +88 -0
- data/lib/van/units/data/si/derived.rb +33 -0
- data/lib/van/units/data/si/extra.rb +35 -0
- data/lib/van/units/data/si/misc.rb +10 -0
- data/lib/van/units/data/uk.rb +10 -0
- data/lib/van/units/data/uk/base.rb +25 -0
- data/lib/van/units/data/units-default.rb +12 -0
- data/lib/van/units/data/units-standard.rb +5 -0
- data/lib/van/units/data/us.rb +10 -0
- data/lib/van/units/data/us/base.rb +47 -0
- data/lib/van/units/data/xmethods.rb +5 -0
- data/lib/van/units/data/xmethods/cached.rb +84 -0
- data/lib/van/units/data/xmethods/mapping.rb +87 -0
- data/lib/van/units/loaders.rb +100 -0
- data/lib/van/units/units.rb +111 -0
- data/lib/van/units_currency.rb +12 -0
- data/meta/author +1 -0
- data/meta/collection +1 -0
- data/meta/contact +1 -0
- data/meta/created +1 -0
- data/meta/description +5 -0
- data/meta/homepage +1 -0
- data/meta/name +1 -0
- data/meta/summary +1 -0
- data/meta/title +1 -0
- data/meta/version +1 -0
- data/qed/conversion.rdoc +14 -0
- data/qed/equality.rdoc +150 -0
- data/qed/operations.rdoc +74 -0
- data/test/test_constants.rb +12 -0
- data/test/test_currency.rb +26 -0
- data/test/test_units.rb +205 -0
- metadata +123 -0
@@ -0,0 +1,160 @@
|
|
1
|
+
require 'van/units/base'
|
2
|
+
require 'soap/wsdlDriver'
|
3
|
+
|
4
|
+
module Van
|
5
|
+
module Units
|
6
|
+
|
7
|
+
class CurrencyLoader < Loader
|
8
|
+
THREAD_REFERENCE = 'Units::ce_service'.to_sym
|
9
|
+
|
10
|
+
handles 'ce_service', 'currency_unit'
|
11
|
+
|
12
|
+
def ce_service(converter, name, &blk)
|
13
|
+
old_service = Thread.current[THREAD_REFERENCE]
|
14
|
+
Thread.current[THREAD_REFERENCE] = Units::Converter::ExchangeRate.const_get(name)
|
15
|
+
yield
|
16
|
+
ensure
|
17
|
+
Thread.current[THREAD_REFERENCE] = old_service
|
18
|
+
end
|
19
|
+
|
20
|
+
def currency_unit(converter, name)
|
21
|
+
service = Thread.current[THREAD_REFERENCE] || Units::Config::DEFAULT_CURRENCY_SERVICE
|
22
|
+
converter.send(:register_unit, name, :equals => service.create_conversion(name, converter))
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class Converter
|
27
|
+
|
28
|
+
# Encapsulates a service for retrieving exchange rates.
|
29
|
+
# This is used by Converter.register_currency.
|
30
|
+
# An instance of this class behaves like a Numeric when used
|
31
|
+
# in calculations. This class is used to look up exchange rates
|
32
|
+
# lazily.
|
33
|
+
#
|
34
|
+
# This class is not supposed to be instantiated by itself. Instead a
|
35
|
+
# subclass should be created that defines the method +get_rate+.
|
36
|
+
# The only subclasses provided are currently XMethods and CachedXMethods.
|
37
|
+
#
|
38
|
+
# To be found automatically from YAML files, exchange services should
|
39
|
+
# be located under Units::Converter::ExchangeRate.
|
40
|
+
class ExchangeRate
|
41
|
+
|
42
|
+
def self.create_conversion(curr, converter) # :nodoc:
|
43
|
+
{:unit => Units::Unit.new({'--base-currency--'.to_sym => 1}, converter), :multiplier => self.new(curr)}
|
44
|
+
end
|
45
|
+
|
46
|
+
def initialize(curr) # :nodoc:
|
47
|
+
@curr = curr
|
48
|
+
end
|
49
|
+
|
50
|
+
# This method should be overridden in subclasses to return the
|
51
|
+
# exchange rate represented by this object. The unit in question
|
52
|
+
# is available as a String in the instance variable <code>@curr</code>.
|
53
|
+
# The rate should be calculated against an arbitrary but fixed base currency.
|
54
|
+
# The rate should be such that the following would be true
|
55
|
+
# 1 * curr = rate * base_curr
|
56
|
+
# This function should return +nil+ if the currency is not supported by this
|
57
|
+
# retrieval service. It should <em>not</em> raise an exception.
|
58
|
+
def get_rate
|
59
|
+
raise NoMethodError, "undefined method `get_rate' for #{to_s}:#{self.class}"
|
60
|
+
end
|
61
|
+
|
62
|
+
def value # :nodoc:
|
63
|
+
@value ||= get_rate or raise TypeError, "currency not supported by current service: #{@curr.to_s.dump}"
|
64
|
+
end
|
65
|
+
|
66
|
+
def coerce(other) # :nodoc:
|
67
|
+
[value, other]
|
68
|
+
end
|
69
|
+
|
70
|
+
def *(other) # :nodoc:
|
71
|
+
value * other
|
72
|
+
end
|
73
|
+
|
74
|
+
def /(other) # :nodoc:
|
75
|
+
value / other
|
76
|
+
end
|
77
|
+
|
78
|
+
def +(other) # :nodoc:
|
79
|
+
value + other
|
80
|
+
end
|
81
|
+
|
82
|
+
def -(other) # :nodoc:
|
83
|
+
value - other
|
84
|
+
end
|
85
|
+
|
86
|
+
def **(other) # :nodoc:
|
87
|
+
value ** other
|
88
|
+
end
|
89
|
+
|
90
|
+
# Exchange rate retrieval service that uses a service from http://www.xmethods.com.
|
91
|
+
# See http://rubyurl.com/7uq.
|
92
|
+
class XMethods < ExchangeRate
|
93
|
+
|
94
|
+
# This is the only method that a subclass of ExchangeRate
|
95
|
+
# needs to implement. This is a good example to follow.
|
96
|
+
def get_rate
|
97
|
+
driver.getRate(country_mapping[@curr], country_mapping[base])
|
98
|
+
rescue
|
99
|
+
p $!
|
100
|
+
puts $!.backtrace
|
101
|
+
nil
|
102
|
+
end
|
103
|
+
|
104
|
+
private
|
105
|
+
|
106
|
+
def data
|
107
|
+
@@data ||= eval(File.read(File.join(Units::Config::CONFIGDIR, 'xmethods', 'mapping.rb')))
|
108
|
+
end
|
109
|
+
|
110
|
+
def country_mapping
|
111
|
+
@@country_mapping ||= data[:mapping]
|
112
|
+
end
|
113
|
+
|
114
|
+
def base
|
115
|
+
@@base ||= data[:base]
|
116
|
+
end
|
117
|
+
|
118
|
+
def driver
|
119
|
+
@@driver ||= SOAP::WSDLDriverFactory.new("http://www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl").create_rpc_driver
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
# Cached values for the XMethods exchange rate service.
|
125
|
+
class CachedXMethods < ExchangeRate
|
126
|
+
|
127
|
+
# This is the only method that a subclass of ExchangeRate
|
128
|
+
# needs to implement. This is a good example to follow.
|
129
|
+
def get_rate
|
130
|
+
data[@curr]
|
131
|
+
end
|
132
|
+
|
133
|
+
private
|
134
|
+
|
135
|
+
def data
|
136
|
+
@@data ||= eval(File.read(File.join(Units::Config::CONFIGDIR, 'xmethods', 'cached.rb')))
|
137
|
+
end
|
138
|
+
|
139
|
+
end #class CachedXMethods
|
140
|
+
end
|
141
|
+
|
142
|
+
private
|
143
|
+
|
144
|
+
#--
|
145
|
+
# Trans: What is --base-currency-- all about?
|
146
|
+
#++
|
147
|
+
def conversions(unit)
|
148
|
+
@conversions[unit] || (unit == '--base-currency--'.to_sym ? :none : nil)
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
152
|
+
|
153
|
+
# Contains some configuration related constants
|
154
|
+
module Config
|
155
|
+
# The standard service used for looking up currency exchange rates
|
156
|
+
DEFAULT_CURRENCY_SERVICE = Units::Converter::ExchangeRate::XMethods
|
157
|
+
end
|
158
|
+
|
159
|
+
end
|
160
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
currency_unit "aed"
|
2
|
+
currency_unit "afa"
|
3
|
+
currency_unit "all"
|
4
|
+
currency_unit "ars"
|
5
|
+
currency_unit "ats"
|
6
|
+
currency_unit "aud"
|
7
|
+
currency_unit "bbd"
|
8
|
+
currency_unit "bdt"
|
9
|
+
currency_unit "bef"
|
10
|
+
currency_unit "bgn"
|
11
|
+
currency_unit "bhd"
|
12
|
+
currency_unit "bmd"
|
13
|
+
currency_unit "brl"
|
14
|
+
currency_unit "bsd"
|
15
|
+
currency_unit "cad"
|
16
|
+
currency_unit "chf"
|
17
|
+
currency_unit "clp"
|
18
|
+
currency_unit "cny"
|
19
|
+
currency_unit "cop"
|
20
|
+
currency_unit "crc"
|
21
|
+
currency_unit "cyp"
|
22
|
+
currency_unit "czk"
|
23
|
+
currency_unit "dem"
|
24
|
+
currency_unit "dkk"
|
25
|
+
currency_unit "dop"
|
26
|
+
currency_unit "dzd"
|
27
|
+
currency_unit "eek"
|
28
|
+
currency_unit "egp"
|
29
|
+
currency_unit "esp"
|
30
|
+
currency_unit "eur"
|
31
|
+
currency_unit "fim"
|
32
|
+
currency_unit "fjd"
|
33
|
+
currency_unit "frf"
|
34
|
+
currency_unit "gbp"
|
35
|
+
currency_unit "grd"
|
36
|
+
currency_unit "hkd"
|
37
|
+
currency_unit "hrk"
|
38
|
+
currency_unit "huf"
|
39
|
+
currency_unit "idr"
|
40
|
+
currency_unit "iep"
|
41
|
+
currency_unit "ils"
|
42
|
+
currency_unit "inr"
|
43
|
+
currency_unit "iqd"
|
44
|
+
currency_unit "irr"
|
45
|
+
currency_unit "isk"
|
46
|
+
currency_unit "itl"
|
47
|
+
currency_unit "jmd"
|
48
|
+
currency_unit "jod"
|
49
|
+
currency_unit "jpy"
|
50
|
+
currency_unit "kes"
|
51
|
+
currency_unit "krw"
|
52
|
+
currency_unit "kwd"
|
53
|
+
currency_unit "lbp"
|
54
|
+
currency_unit "lkr"
|
55
|
+
currency_unit "luf"
|
56
|
+
currency_unit "mad"
|
57
|
+
currency_unit "mtl"
|
58
|
+
currency_unit "mur"
|
59
|
+
currency_unit "mxn"
|
60
|
+
currency_unit "myr"
|
61
|
+
currency_unit "nlg"
|
62
|
+
currency_unit "nok"
|
63
|
+
currency_unit "nzd"
|
64
|
+
currency_unit "omr"
|
65
|
+
currency_unit "pen"
|
66
|
+
currency_unit "php"
|
67
|
+
currency_unit "pkr"
|
68
|
+
currency_unit "pln"
|
69
|
+
currency_unit "pte"
|
70
|
+
currency_unit "qar"
|
71
|
+
currency_unit "ron"
|
72
|
+
currency_unit "rub"
|
73
|
+
currency_unit "sar"
|
74
|
+
currency_unit "sdd"
|
75
|
+
currency_unit "sek"
|
76
|
+
currency_unit "sgd"
|
77
|
+
currency_unit "sit"
|
78
|
+
currency_unit "skk"
|
79
|
+
currency_unit "thb"
|
80
|
+
currency_unit "tnd"
|
81
|
+
currency_unit "try"
|
82
|
+
currency_unit "ttd"
|
83
|
+
currency_unit "twd"
|
84
|
+
currency_unit "usd"
|
85
|
+
currency_unit "veb"
|
86
|
+
currency_unit "vnd"
|
87
|
+
currency_unit "xcd"
|
88
|
+
currency_unit "zar"
|
89
|
+
currency_unit "zmk"
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'si/extra'
|
2
|
+
|
3
|
+
# TODO: Some of these arn't natural constants, and should be put in a separate converter.
|
4
|
+
|
5
|
+
converter "si_constants" do
|
6
|
+
unit :gravitational_constant, :G do "6.673e-11 si_base::m**3 / si_base:kg si_base:s**2" end
|
7
|
+
|
8
|
+
# TODO: name? earth_nominal_gravity
|
9
|
+
#unit :gravitational_acceleration = 9.80665e0.m/s**2 # m / s^2
|
10
|
+
|
11
|
+
unit(:lightspeed, :c, :speed_of_light){ "2.99792458e8 si_base:m / si_base:s" }
|
12
|
+
|
13
|
+
unit :lightyear do "9.46053620707e15 si_base:m" end
|
14
|
+
|
15
|
+
#unit :astronomical_unit, :au do "1.49597870691e11 si_base:m" end
|
16
|
+
unit :parsec do "3.08567758135e16 si_base:m" end
|
17
|
+
|
18
|
+
unit :planks_constant, :h do "6.62606876e-34 si_base:kg si_base:m**2 / si_base:s" end
|
19
|
+
unit :planks_constant_bar, :hbar do "1.05457159642e-34 si_base:kg si_base:m**2 / si_base:s" end
|
20
|
+
|
21
|
+
unit :vacuum_permeability do "1.25663706144e-6 si_base:kg si_base:m / si_base:A**2 * si_base:s**2" end
|
22
|
+
unit :vacuum_permittivity do "8.854187817e-12 A**2 s**4 / kg m**3" end
|
23
|
+
|
24
|
+
#unit :electronvolt, :eV do "1.602176462e-19 si_derived:J" end
|
25
|
+
unit :electroncharge do "1.602176462e-19 A * s" end
|
26
|
+
|
27
|
+
unit "electronmass" do "9.10938188e-31 kg" end
|
28
|
+
unit "muonmass" do "1.88353109e-28 kg" end
|
29
|
+
unit "protonmass" do "1.67262158e-27 kg" end
|
30
|
+
unit "neutronmass" do "1.67492716e-27 kg" end
|
31
|
+
|
32
|
+
unit "rydberg" do "2.17987190389e-18 kg * m**2 / s**2" end
|
33
|
+
unit "boltzmann" do "1.3806503e-23 kg m**2 / K s**2" end
|
34
|
+
|
35
|
+
unit "bohr_magneton" do "9.27400899e-24 A m**2" end
|
36
|
+
unit "nuclear_magneton" do "5.05078317e-27 A m**2" end
|
37
|
+
unit :electron_magnetic_moment do "9.28476362e-24 A m**2" end
|
38
|
+
unit :proton_magnetic_moment do "1.410606633e-26 A m**2" end
|
39
|
+
|
40
|
+
unit :bohr_radius, [], "bohr_radii" do "5.291772083e-11 m" end
|
41
|
+
|
42
|
+
#unit :unified_atomic_mass, "1.66053873e-27 si_base:kg", :abbrev => "u"
|
43
|
+
#unit :atomic_mass "1.66053873e-27 si_base:kg"
|
44
|
+
#unit :angstrom, "100.0 si_derived:kPa"
|
45
|
+
|
46
|
+
unit :molar_gas do "8.314472e0 kg m**2 / K mol s**2" end
|
47
|
+
unit :standard_gas_volume do "2.2710981e-2 m**3 / mol" end
|
48
|
+
|
49
|
+
unit :solar_mass do "1.98892e30 kg" end
|
50
|
+
|
51
|
+
unit :carat do "2e-4 si_base:kg" end
|
52
|
+
|
53
|
+
unit :fathom do "1.8288e0 m" end
|
54
|
+
unit :mil do "2.54e-5 m" end
|
55
|
+
unit :point do "3.52777777778e-4 m" end
|
56
|
+
unit :texpoint do "3.51459803515e-4 m" end
|
57
|
+
|
58
|
+
unit :micron do "1e-6 m" end
|
59
|
+
|
60
|
+
unit :ton do "9.0718474e2 kg" end
|
61
|
+
unit :troy_ounce do "3.1103475e-2 kg" end
|
62
|
+
|
63
|
+
unit :gram_force do "9.80665e-3 kg m / s**2" end
|
64
|
+
unit :poundal do "1.38255e-1 kg m / s**2" end
|
65
|
+
unit :calorie do "4.1868e0 kg m**2 / s**2" end
|
66
|
+
unit :btu do "1.05505585262e3 kg m**2 / s**2" end
|
67
|
+
unit :therm do "1.05506e8 kg m**2 / s**2" end
|
68
|
+
|
69
|
+
unit :horsepower do "7.457e2 kg m**2 / s**3" end
|
70
|
+
unit :standard_atmosphere do "1.01325e5 kg / m s**2" end
|
71
|
+
unit :torr do "1.33322368421e2 kg / m s**2" end
|
72
|
+
unit :meter_of_mercury do "1.33322368421e5 kg / m s**2" end
|
73
|
+
|
74
|
+
unit :poise do "1e-1 kg m**-1 s**-1" end
|
75
|
+
unit :stokes do "1e-4 m**2 / s" end
|
76
|
+
unit :faraday do "9.6485341472e4 A s / mol" end
|
77
|
+
|
78
|
+
unit :stilb do "1e4 cd / m**2" end # cd / m^2
|
79
|
+
unit :phot do "1e4 cd * sr / m**2" end # cd sr / m^2
|
80
|
+
#unit :lumen do "1e0 cd * sr" end # cd sr
|
81
|
+
#unit :lux do "1e0 cd * sr / m**2" end # cd sr / m^2
|
82
|
+
|
83
|
+
unit :dyne do "1e-5 kg m / s**2" end
|
84
|
+
unit :gauss do "1e-4 kg / A s**2" end
|
85
|
+
unit :erg do "1e-7 kg m**2 / s**2" end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# http://physics.nist.gov/cuu/Units/units.html
|
2
|
+
|
3
|
+
require 'si/base'
|
4
|
+
|
5
|
+
converter 'si_derived' do
|
6
|
+
si_unit( :radian, :rad ){ "" }
|
7
|
+
si_unit( :steradian, :sr ){ "" }
|
8
|
+
|
9
|
+
si_unit( :hertz, :Hz ){ "1 / si_base:s" }
|
10
|
+
si_unit( :newton, :N ){ "si_base:kg si_base:m / si_base:s**2" }
|
11
|
+
si_unit( :pascal, :Pa ){ "N / si_base:m**2" }
|
12
|
+
si_unit( :joule, :J ){ "N * si_base:m" }
|
13
|
+
si_unit( :watt, :W ){ "J / si_base:s" }
|
14
|
+
si_unit( :coulomb, :C ){ "si_base:A * si_base:s" }
|
15
|
+
si_unit( :volt, :V ){ "W / si_base:A" }
|
16
|
+
si_unit( :farad, :F ){ "C / V" }
|
17
|
+
si_unit( :ohm ){ "V / si_base:A" }
|
18
|
+
si_unit( :siemens, :S ){ "si_base:A / V" }
|
19
|
+
si_unit( :weber, :Wb ){ "V * si_base:s" }
|
20
|
+
si_unit( :tesla, :T ){ "Wb / si_base:m**2" }
|
21
|
+
|
22
|
+
si_unit( :henry, :H , :henries ){ "Wb / si_base:A" }
|
23
|
+
si_unit( :lumen, :lm ){ "si_base:cd sr" }
|
24
|
+
si_unit( :lux, :lx , :luxen ){ "lm / si_base:m**2" }
|
25
|
+
|
26
|
+
si_unit( :becquerel, :Bq ){ "1 / si_base:s" }
|
27
|
+
si_unit( :gray, :Gy ){ "J / si_base:kg" }
|
28
|
+
si_unit( :sievert, :Sv ){ "J / si_base:kg" }
|
29
|
+
si_unit( :katal, :kat ){ "si_base:mol / si_base:s" }
|
30
|
+
|
31
|
+
si_unit( :bar ){ "100.0 kPa" } # TODO: should this be in si_extra ?
|
32
|
+
end
|
33
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# http://physics.nist.gov/cuu/Units/outside.html
|
2
|
+
|
3
|
+
require 'si/derived'
|
4
|
+
|
5
|
+
converter "si_extra" do
|
6
|
+
unit(:minute, :min){ "60.0 si_base:s" }
|
7
|
+
unit(:hour, :hr ){ "60.0 min" }
|
8
|
+
unit(:day, :d ){ "24.0 hr" }
|
9
|
+
unit(:liter, :L ){ "si_base:dm**3" }
|
10
|
+
|
11
|
+
unit(:neper, :Np ){ "" }
|
12
|
+
#unit( :bel, :B { "(1/2) ln 10 Np" }
|
13
|
+
#unit( :decibel, :dB ){ "10 B" }
|
14
|
+
|
15
|
+
unit(:are, :a ){ "si_base:dam**2" }
|
16
|
+
unit(:hectare, :ha ){ "si_base:hm**2" }
|
17
|
+
#unit(:bar ){ "100.0 si_derived:kPa" }
|
18
|
+
unit(:barn ){ "100.0 si_base:fm**2" }
|
19
|
+
unit(:curie, :Ci ){ "3.7e10 si_derived:Bq" }
|
20
|
+
unit(:roentgen, :R ){ "2.58e-4 si_derived:C / si_base:kg" }
|
21
|
+
|
22
|
+
unit(:metric_ton, :t ){ "1000.0 si_base:kg" }
|
23
|
+
unit(:nautical_mile ){ "1852.0 si_base:m" }
|
24
|
+
unit(:knot ){ "nautical_mile / hr" }
|
25
|
+
|
26
|
+
unit(:rad){ "1e-2 si_derived:Gy" }
|
27
|
+
unit(:rem){ "1e-2 si_derived:Sv" }
|
28
|
+
|
29
|
+
unit(:degree){ "0.0174532925199433 si_derived:rad" }
|
30
|
+
unit(:angstrom){ "10e-10 m" }
|
31
|
+
unit(:electronvolt, :eV){ "1.60218e-19 si_derived:J" }
|
32
|
+
unit(:astronomical_unit, :ua){ "1.49598e11 si_base:m" }
|
33
|
+
unit(:unified_atomic_mass_unit, :u){ "1.66054e-27 si_base:kg" }
|
34
|
+
end
|
35
|
+
|