currency 0.1.0 → 0.1.1
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/ChangeLog +4 -1
- data/README +8 -1
- data/Rakefile +15 -7
- data/Releases +4 -0
- data/examples/ex1.rb +1 -1
- data/examples/xe1.rb +2 -2
- data/lib/currency.rb +1 -2
- data/lib/currency/currency.rb +15 -3
- data/lib/currency/exception.rb +8 -3
- data/lib/currency/exchange.rb +24 -0
- data/lib/currency/{currency_exchange.rb → exchange/base.rb} +13 -13
- data/lib/currency/{exchange_rate.rb → exchange/rate.rb} +6 -3
- data/lib/currency/{currency_exchange_test.rb → exchange/test.rb} +13 -6
- data/lib/currency/{currency_exchange_xe.rb → exchange/xe.rb} +10 -5
- data/lib/currency/money.rb +8 -4
- data/test/money_test.rb +1 -1
- data/test/test_base.rb +3 -3
- data/test/xe_test.rb +3 -3
- metadata +7 -28
- data.tar.gz.sig +0 -1
- metadata.gz.sig +0 -0
data/ChangeLog
CHANGED
data/README
CHANGED
|
@@ -8,7 +8,14 @@ gem install currency
|
|
|
8
8
|
|
|
9
9
|
== For User Documentation, see
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
http://rubyforge.org/projects/currency/
|
|
12
|
+
|
|
13
|
+
The RubyForge package currency
|
|
14
|
+
implements an object-oriented representation of currencies, monetary values, foreign exchanges and rates.
|
|
15
|
+
|
|
16
|
+
Currency::Money uses a scaled integer representation of the monetary value and performs accurate conversions from string values.
|
|
17
|
+
|
|
18
|
+
See: http://umleta.com/node/5 for more details.
|
|
12
19
|
|
|
13
20
|
== Home page
|
|
14
21
|
|
data/Rakefile
CHANGED
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
# Adapted from RubyGems/Rakefile
|
|
3
3
|
# upload_package NOT WORKING YET
|
|
4
4
|
|
|
5
|
+
#################################################################
|
|
6
|
+
|
|
7
|
+
PKG_Name = 'Currency'
|
|
8
|
+
def package_version
|
|
9
|
+
'0.1.1'
|
|
10
|
+
end
|
|
11
|
+
def package_description
|
|
12
|
+
%{Currency models currencies, monetary values, foreign exchanges.}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
#################################################################
|
|
16
|
+
|
|
5
17
|
#require 'rubygems'
|
|
6
18
|
require 'rake/clean'
|
|
7
19
|
require 'rake/testtask'
|
|
@@ -9,18 +21,15 @@ require 'rake/packagetask'
|
|
|
9
21
|
require 'rake/gempackagetask'
|
|
10
22
|
require 'rake/rdoctask'
|
|
11
23
|
|
|
24
|
+
#################################################################
|
|
25
|
+
|
|
12
26
|
def announce(msg='')
|
|
13
27
|
STDERR.puts msg
|
|
14
28
|
end
|
|
15
29
|
|
|
16
|
-
PKG_Name = 'Currency'
|
|
17
30
|
PKG_NAME = PKG_Name.gsub(/[a-z][A-Z]/) {|x| "#{x[0,1]}_#{x[1,1]}"}.downcase
|
|
18
31
|
RUBY_FORGE_PROJECT = PKG_NAME
|
|
19
32
|
|
|
20
|
-
def package_version
|
|
21
|
-
'0.1.0'
|
|
22
|
-
end
|
|
23
|
-
|
|
24
33
|
if ENV['REL']
|
|
25
34
|
PKG_VERSION = ENV['REL']
|
|
26
35
|
CURRENT_VERSION = package_version
|
|
@@ -250,8 +259,7 @@ Spec = Gem::Specification.new do |s|
|
|
|
250
259
|
s.name = PKG_NAME
|
|
251
260
|
s.version = PKG_VERSION
|
|
252
261
|
s.summary = "#{PKG_Name} GEM"
|
|
253
|
-
s.description =
|
|
254
|
-
}
|
|
262
|
+
s.description = package_description
|
|
255
263
|
s.files = PKG_FILES.to_a
|
|
256
264
|
s.require_path = 'lib'
|
|
257
265
|
s.author = "Kurt Stephens"
|
data/Releases
CHANGED
data/examples/ex1.rb
CHANGED
data/examples/xe1.rb
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
2
2
|
|
|
3
3
|
require 'currency'
|
|
4
|
-
require 'currency/
|
|
4
|
+
require 'currency/exchange/xe'
|
|
5
5
|
|
|
6
|
-
ex = Currency::
|
|
6
|
+
ex = Currency::Exchange::Xe.new()
|
|
7
7
|
|
|
8
8
|
puts ex.inspect
|
|
9
9
|
puts ex.parse_page_rates.inspect
|
data/lib/currency.rb
CHANGED
|
@@ -7,7 +7,6 @@ require 'currency/money'
|
|
|
7
7
|
require 'currency/currency_factory'
|
|
8
8
|
require 'currency/currency'
|
|
9
9
|
require 'currency/money'
|
|
10
|
-
require 'currency/
|
|
11
|
-
require 'currency/currency_exchange'
|
|
10
|
+
require 'currency/exchange'
|
|
12
11
|
require 'currency/core_extensions'
|
|
13
12
|
|
data/lib/currency/currency.rb
CHANGED
|
@@ -4,9 +4,9 @@ module Currency
|
|
|
4
4
|
class Currency
|
|
5
5
|
# Create a new currency
|
|
6
6
|
def initialize(code, symbol = nil, scale = 100)
|
|
7
|
-
self.code= code
|
|
8
|
-
self.symbol= symbol
|
|
9
|
-
self.scale= scale
|
|
7
|
+
self.code = code
|
|
8
|
+
self.symbol = symbol
|
|
9
|
+
self.scale = scale
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def self.get(code)
|
|
@@ -19,6 +19,18 @@ module Currency
|
|
|
19
19
|
x
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
+
def hash
|
|
23
|
+
@code.hash
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def eql?(x)
|
|
27
|
+
self.class == x.class && @code == x.code
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def ==(x)
|
|
31
|
+
self.class == x.class && @code == x.code
|
|
32
|
+
end
|
|
33
|
+
|
|
22
34
|
# Accessors
|
|
23
35
|
def code
|
|
24
36
|
@code
|
data/lib/currency/exception.rb
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
module Currency
|
|
2
|
-
class
|
|
2
|
+
class Error < Exception; end
|
|
3
|
+
|
|
4
|
+
class InvalidMoneyString < Error
|
|
3
5
|
end
|
|
4
6
|
|
|
5
|
-
class InvalidCurrencyCode <
|
|
7
|
+
class InvalidCurrencyCode < Error
|
|
6
8
|
end
|
|
7
9
|
|
|
8
|
-
class IncompatibleCurrency <
|
|
10
|
+
class IncompatibleCurrency < Error
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class UndefinedExchange < Error
|
|
9
14
|
end
|
|
10
15
|
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module Currency
|
|
2
|
+
module Exchange
|
|
3
|
+
|
|
4
|
+
@@default = nil
|
|
5
|
+
def self.default
|
|
6
|
+
@@default ||= Base.new
|
|
7
|
+
end
|
|
8
|
+
def self.default=(x)
|
|
9
|
+
@@default = x
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
@@current = nil
|
|
13
|
+
def self.current
|
|
14
|
+
@@current || self.default || (raise UndefinedExchange, "Currency::Exchange.current not defined")
|
|
15
|
+
end
|
|
16
|
+
def self.current=(x)
|
|
17
|
+
@@current = x
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
require 'currency/exchange/base'
|
|
24
|
+
require 'currency/exchange/rate'
|
|
@@ -1,18 +1,12 @@
|
|
|
1
1
|
module Currency
|
|
2
|
+
module Exchange
|
|
3
|
+
|
|
2
4
|
# Represents a method of converting between two currencies
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
# Create an ExchangeRateLoader subclass that interfaces to xe.com or other FX quote source.
|
|
6
|
-
class CurrencyExchange
|
|
7
|
-
@@default = nil
|
|
8
|
-
def self.default
|
|
9
|
-
@@default ||= self.new
|
|
10
|
-
end
|
|
11
|
-
def self.default=(x)
|
|
12
|
-
@@default = x
|
|
13
|
-
end
|
|
5
|
+
class Base
|
|
6
|
+
attr_accessor :name
|
|
14
7
|
|
|
15
8
|
def initialize(*opt)
|
|
9
|
+
@name = nil
|
|
16
10
|
@exchange_rate = { }
|
|
17
11
|
end
|
|
18
12
|
|
|
@@ -43,8 +37,14 @@ module Currency
|
|
|
43
37
|
def load_exchange_rate(c1, c2)
|
|
44
38
|
raise "Subclass responsibility: load_exchange_rate"
|
|
45
39
|
end
|
|
40
|
+
|
|
41
|
+
def to_s
|
|
42
|
+
"#<#{self.class.name} #{self.name && self.name.inspect}>"
|
|
43
|
+
end
|
|
44
|
+
|
|
46
45
|
end
|
|
47
46
|
|
|
48
|
-
|
|
49
|
-
end
|
|
47
|
+
|
|
48
|
+
end # module
|
|
49
|
+
end # module
|
|
50
50
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
module Currency
|
|
2
|
+
module Exchange
|
|
2
3
|
# Represents a convertion rate between two currencies
|
|
3
|
-
class
|
|
4
|
+
class Rate
|
|
4
5
|
def initialize(c1, c2, c1_to_c2_rate, source = "UNKNOWN", date = nil, recip = true)
|
|
5
6
|
@c1 = c1
|
|
6
7
|
@c2 = c2
|
|
@@ -42,6 +43,8 @@ module Currency
|
|
|
42
43
|
end
|
|
43
44
|
end
|
|
44
45
|
|
|
45
|
-
|
|
46
|
-
end
|
|
46
|
+
|
|
47
|
+
end # module
|
|
48
|
+
end # module
|
|
49
|
+
|
|
47
50
|
|
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
module Currency
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
module Exchange
|
|
3
|
+
|
|
4
|
+
# This class is a text Exchange.
|
|
5
|
+
# It can convert only between USD and CAD
|
|
6
|
+
class Test < Base
|
|
4
7
|
@@instance = nil
|
|
5
8
|
def self.instance(*opts)
|
|
6
9
|
@@instance ||= self.new(*opts)
|
|
7
10
|
end
|
|
8
11
|
|
|
12
|
+
def initialize(*opts)
|
|
13
|
+
super(*opts)
|
|
14
|
+
end
|
|
15
|
+
|
|
9
16
|
# Sample constant.
|
|
10
17
|
def self.USD_CAD; 1.1708; end
|
|
11
18
|
|
|
@@ -15,13 +22,13 @@ module Currency
|
|
|
15
22
|
if ( c1.code == :USD && c2.code == :CAD )
|
|
16
23
|
rate = self.class.USD_CAD
|
|
17
24
|
end
|
|
18
|
-
rate > 0 ?
|
|
25
|
+
rate > 0 ? Rate.new(c1, c2, rate, self) : nil
|
|
19
26
|
end
|
|
20
27
|
end
|
|
21
28
|
|
|
22
|
-
|
|
23
|
-
end
|
|
29
|
+
end # module
|
|
30
|
+
end # module
|
|
24
31
|
|
|
25
32
|
# Install as current
|
|
26
|
-
Currency::
|
|
33
|
+
Currency::Exchange.default = Currency::Exchange::Test.instance
|
|
27
34
|
|
|
@@ -2,15 +2,19 @@ require 'net/http'
|
|
|
2
2
|
require 'open-uri'
|
|
3
3
|
|
|
4
4
|
module Currency
|
|
5
|
+
module Exchange
|
|
5
6
|
# Represents connects to http://xe.com and groks "XE.com Quick Cross Rates"
|
|
6
7
|
|
|
7
|
-
class
|
|
8
|
+
class Xe < Base
|
|
8
9
|
@@instance = nil
|
|
9
10
|
def self.instance(*opts)
|
|
10
11
|
@@instance ||= self.new(*opts)
|
|
11
12
|
end
|
|
12
13
|
|
|
13
14
|
attr_accessor :uri
|
|
15
|
+
def name
|
|
16
|
+
uri
|
|
17
|
+
end
|
|
14
18
|
|
|
15
19
|
def initialize(*opt)
|
|
16
20
|
super(*opt)
|
|
@@ -128,13 +132,14 @@ module Currency
|
|
|
128
132
|
|
|
129
133
|
# $stderr.puts "XE Rate: #{c1.code} / #{c2.code} = #{rate}"
|
|
130
134
|
|
|
131
|
-
rate > 0 ?
|
|
135
|
+
rate > 0 ? Rate.new(c1, c2, rate, self, @rate_timestamp) : nil
|
|
132
136
|
end
|
|
133
137
|
end
|
|
134
138
|
|
|
135
|
-
|
|
136
|
-
end
|
|
139
|
+
end # module
|
|
140
|
+
end # module
|
|
141
|
+
|
|
137
142
|
|
|
138
143
|
# Install as current
|
|
139
|
-
Currency::
|
|
144
|
+
Currency::Exchange.default = Currency::Exchange::Xe.instance
|
|
140
145
|
|
data/lib/currency/money.rb
CHANGED
|
@@ -76,11 +76,15 @@ module Currency
|
|
|
76
76
|
if @currency == currency
|
|
77
77
|
self
|
|
78
78
|
else
|
|
79
|
-
|
|
79
|
+
Exchange.current.convert(self, currency)
|
|
80
80
|
end
|
|
81
81
|
end
|
|
82
82
|
|
|
83
83
|
# Relational operations on Money values.
|
|
84
|
+
def hash
|
|
85
|
+
@rep.hash ^ @currency.hash
|
|
86
|
+
end
|
|
87
|
+
|
|
84
88
|
def eql?(x)
|
|
85
89
|
@rep == x.rep && @currency == x.currency
|
|
86
90
|
end
|
|
@@ -184,7 +188,7 @@ module Currency
|
|
|
184
188
|
#def inspect_deep(*opts)
|
|
185
189
|
# self.class.superclass.instance_method(:inspect).bind(self).call
|
|
186
190
|
#end
|
|
187
|
-
end
|
|
188
191
|
|
|
189
|
-
#
|
|
190
|
-
|
|
192
|
+
end # class
|
|
193
|
+
|
|
194
|
+
end # module
|
data/test/money_test.rb
CHANGED
data/test/test_base.rb
CHANGED
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
require 'test/unit'
|
|
4
4
|
require 'currency'
|
|
5
|
-
require 'currency/
|
|
5
|
+
require 'currency/exchange/test'
|
|
6
6
|
|
|
7
7
|
module Currency
|
|
8
8
|
|
|
9
9
|
class TestBase < Test::Unit::TestCase
|
|
10
10
|
def setup
|
|
11
11
|
super
|
|
12
|
-
# Force
|
|
13
|
-
|
|
12
|
+
# Force Test Exchange.
|
|
13
|
+
Exchange.default = Exchange::Test.instance
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
# Avoid "No test were specified" error.
|
data/test/xe_test.rb
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
require 'test/test_base'
|
|
5
5
|
require 'currency' # For :type => :money
|
|
6
|
-
require 'currency/
|
|
6
|
+
require 'currency/exchange/xe'
|
|
7
7
|
|
|
8
8
|
module Currency
|
|
9
9
|
|
|
@@ -11,11 +11,11 @@ class XeTest < TestBase
|
|
|
11
11
|
def setup
|
|
12
12
|
super
|
|
13
13
|
# Force XE Exchange.
|
|
14
|
-
|
|
14
|
+
Exchange.default = Exchange::Xe.instance
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def test_xe_usd_cad
|
|
18
|
-
assert_not_nil rates =
|
|
18
|
+
assert_not_nil rates = Exchange.default.rates
|
|
19
19
|
assert_not_nil rates[:USD]
|
|
20
20
|
assert_not_nil usd_cad = rates[:USD][:CAD]
|
|
21
21
|
|
metadata
CHANGED
|
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
|
3
3
|
specification_version: 1
|
|
4
4
|
name: currency
|
|
5
5
|
version: !ruby/object:Gem::Version
|
|
6
|
-
version: 0.1.
|
|
7
|
-
date: 2006-10-
|
|
6
|
+
version: 0.1.1
|
|
7
|
+
date: 2006-10-30 00:00:00 -05:00
|
|
8
8
|
summary: Currency GEM
|
|
9
9
|
require_paths:
|
|
10
10
|
- lib
|
|
@@ -25,28 +25,6 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
|
|
|
25
25
|
platform: ruby
|
|
26
26
|
signing_key:
|
|
27
27
|
cert_chain:
|
|
28
|
-
- |
|
|
29
|
-
-----BEGIN CERTIFICATE-----
|
|
30
|
-
MIIDNDCCAhygAwIBAgIBADANBgkqhkiG9w0BAQUFADBAMREwDwYDVQQDDAhydWJ5
|
|
31
|
-
Z2VtczEWMBQGCgmSJomT8ixkARkWBnVtbGV0YTETMBEGCgmSJomT8ixkARkWA2Nv
|
|
32
|
-
bTAeFw0wNjEwMjkxMjQwMTFaFw0wNzEwMjkxMjQwMTFaMEAxETAPBgNVBAMMCHJ1
|
|
33
|
-
YnlnZW1zMRYwFAYKCZImiZPyLGQBGRYGdW1sZXRhMRMwEQYKCZImiZPyLGQBGRYD
|
|
34
|
-
Y29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuFJ/j1P9qdyQ0yDn
|
|
35
|
-
M3a2D0OY/48fMtYnHRMBw77VVe1r0fh3K6mHQ4KMhokq+tYmpLZA6R7zDPyqgmq+
|
|
36
|
-
MLIjgm3BG/4MRMwMDjQpAlMUzhivhEUbi/3TwDGzm0BKAwx1QZJGxX5hBuNT0IC4
|
|
37
|
-
39UrfF6Rp3JYO2V3315VNhRnTzSy7mTywMvcdFDHtqJMwS7dxog3Zk0GEwFOpgSh
|
|
38
|
-
YZWpRtxEyNkFZFhzu2f6Ay+W8KICTDoKZLXWuih7WLeZ+jjMmcuw+fMmAgK5twel
|
|
39
|
-
NedBtKBIddWwFYdSWUY0aM8llCUSF2K0DlMCf5MIa/KU9SFCEvPFgyL0mhp7J4rM
|
|
40
|
-
8iZvpQIDAQABozkwNzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU
|
|
41
|
-
hF6+rNXLnYshcQYq5+OZ5ymAepMwDQYJKoZIhvcNAQEFBQADggEBAIQeOwoJ8119
|
|
42
|
-
sq6gSomz4hlmn/UKChxhl2dvv3LaHO1n2O537+9rVs6rvUZ4kANaZVzsclptovsS
|
|
43
|
-
k8H52y5nv4KXhd5IYVIin8q4rL15CYuRE/F2axWVtXBev1g24qyrIDOPhXNruG5q
|
|
44
|
-
CCmbkyVneSonHVJ5/aEqCK3NHTzxV3uM9gWjUjX1QoKLMV3tIm3umPFxmcq45YPZ
|
|
45
|
-
anMAtfW19iRYBV2iaage8GmLFbc8zl3GuTHYYHDKMVfOGRWgam36a95kXvkHI403
|
|
46
|
-
lXIJO2glhnPbub1eX+KnUMK3iocqB1qAC3hCk3Qgul+Q9mrTPyuSrOPHJB4aU1wk
|
|
47
|
-
+Wg1asFvX0E=
|
|
48
|
-
-----END CERTIFICATE-----
|
|
49
|
-
|
|
50
28
|
authors:
|
|
51
29
|
- Kurt Stephens
|
|
52
30
|
files:
|
|
@@ -66,10 +44,11 @@ files:
|
|
|
66
44
|
- lib/currency/money.rb
|
|
67
45
|
- lib/currency/active_record.rb
|
|
68
46
|
- lib/currency/currency.rb
|
|
69
|
-
- lib/currency/
|
|
70
|
-
- lib/currency/
|
|
71
|
-
- lib/currency/
|
|
72
|
-
- lib/currency/
|
|
47
|
+
- lib/currency/exchange.rb
|
|
48
|
+
- lib/currency/exchange/base.rb
|
|
49
|
+
- lib/currency/exchange/test.rb
|
|
50
|
+
- lib/currency/exchange/xe.rb
|
|
51
|
+
- lib/currency/exchange/rate.rb
|
|
73
52
|
- scripts/gemdoc.rb
|
|
74
53
|
- test/xe_test.rb
|
|
75
54
|
- test/money_test.rb
|
data.tar.gz.sig
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
)͍�����[�����֕�p|z;���&����ЃV1tD����B��PF�b���&�该0w��%[P�����uy��G��M-���J��D���4`"곮��m{QM4O�Uv�D��]_
|
metadata.gz.sig
DELETED
|
Binary file
|