money 3.1.0.pre3 → 3.1.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/CHANGELOG.md +196 -0
- data/README.md +217 -0
- data/lib/money/bank/base.rb +73 -32
- data/lib/money/bank/variable_exchange.rb +128 -27
- data/lib/money/core_extensions.rb +39 -18
- data/lib/money/currency.rb +146 -53
- data/lib/money/defaults.rb +8 -2
- data/lib/money/deprecations.rb +8 -5
- data/lib/money/money.rb +363 -170
- metadata +45 -54
- data/.document +0 -5
- data/.gitignore +0 -21
- data/CHANGELOG.rdoc +0 -68
- data/README.rdoc +0 -212
- data/Rakefile +0 -49
- data/VERSION +0 -1
- data/money.gemspec +0 -77
- data/spec/bank/base_spec.rb +0 -78
- data/spec/bank/variable_exchange_spec.rb +0 -311
- data/spec/core_extensions_spec.rb +0 -111
- data/spec/currency_spec.rb +0 -126
- data/spec/deprecations_spec.rb +0 -16
- data/spec/money_spec.rb +0 -799
- data/spec/spec_helper.rb +0 -8
@@ -1,44 +1,77 @@
|
|
1
1
|
require 'money/bank/base'
|
2
|
-
|
3
|
-
|
2
|
+
autoload :JSON, 'json'
|
3
|
+
autoload :YAML, 'yaml'
|
4
4
|
|
5
5
|
class Money
|
6
6
|
module Bank
|
7
|
-
# Thrown
|
8
|
-
# when an unknown rate format is requested.
|
7
|
+
# Thrown when an unknown rate format is requested.
|
9
8
|
class UnknownRateFormat < StandardError; end
|
10
9
|
|
11
|
-
# Class for aiding in exchanging money between different currencies.
|
12
|
-
#
|
13
|
-
# Money#bank) for performing currency exchanges.
|
10
|
+
# Class for aiding in exchanging money between different currencies. By
|
11
|
+
# default, the +Money+ class uses an object of this class (accessible
|
12
|
+
# through +Money#bank+) for performing currency exchanges.
|
14
13
|
#
|
15
|
-
# By default, Bank::VariableExchange has no knowledge about
|
16
|
-
# One must manually specify them with +add_rate+, after
|
17
|
-
# exchanges with
|
14
|
+
# By default, +Money::Bank::VariableExchange+ has no knowledge about
|
15
|
+
# conversion rates. One must manually specify them with +add_rate+, after
|
16
|
+
# which one can perform exchanges with +#exchange_with+.
|
18
17
|
#
|
18
|
+
# @example
|
19
19
|
# bank = Money::Bank::VariableExchange.new
|
20
20
|
# bank.add_rate("USD", "CAD", 1.24515)
|
21
21
|
# bank.add_rate("CAD", "USD", 0.803115)
|
22
22
|
#
|
23
|
-
#
|
24
|
-
#
|
23
|
+
# c1 = 100_00.to_money("USD")
|
24
|
+
# c2 = 100_00.to_money("CAD")
|
25
|
+
#
|
25
26
|
# # Exchange 100 USD to CAD:
|
26
|
-
# bank.
|
27
|
+
# bank.exchange_with(c1, "CAD") #=> #<Money @cents=1245150>
|
27
28
|
#
|
29
|
+
# # Exchange 100 CAD to USD:
|
30
|
+
# bank.exchange_with(c2, "USD") #=> #<Money @cents=803115>
|
28
31
|
class VariableExchange < Base
|
29
32
|
|
33
|
+
# Available formats for importing/exporting rates.
|
30
34
|
RATE_FORMATS = [:json, :ruby, :yaml]
|
31
35
|
|
36
|
+
# Setup rates hash and mutex for rates locking
|
37
|
+
#
|
38
|
+
# @return [self]
|
32
39
|
def setup
|
33
40
|
@rates = {}
|
34
41
|
@mutex = Mutex.new
|
42
|
+
self
|
35
43
|
end
|
36
44
|
|
37
|
-
|
38
45
|
# Exchanges the given +Money+ object to a new +Money+ object in
|
39
|
-
# +to_currency+.
|
46
|
+
# +to_currency+.
|
47
|
+
#
|
48
|
+
# @param [Money] from The +Money+ object to exchange.
|
49
|
+
# @param [Currency, String, Symbol] to_currency The currency to exchange
|
50
|
+
# to.
|
51
|
+
#
|
52
|
+
# @yield [n] Optional block to use when rounding after exchanging one
|
53
|
+
# currency for another.
|
54
|
+
# @yieldparam [Float] n The resulting float after exchanging one currency
|
55
|
+
# for another.
|
56
|
+
# @yieldreturn [Integer]
|
57
|
+
#
|
58
|
+
# @return [Money]
|
59
|
+
#
|
60
|
+
# @raise +Money::Bank::UnknownRate+ if the conversion rate is unknown.
|
40
61
|
#
|
41
|
-
#
|
62
|
+
# @example
|
63
|
+
# bank = Money::Bank::VariableExchange.new
|
64
|
+
# bank.add_rate("USD", "CAD", 1.24515)
|
65
|
+
# bank.add_rate("CAD", "USD", 0.803115)
|
66
|
+
#
|
67
|
+
# c1 = 100_00.to_money("USD")
|
68
|
+
# c2 = 100_00.to_money("CAD")
|
69
|
+
#
|
70
|
+
# # Exchange 100 USD to CAD:
|
71
|
+
# bank.exchange_with(c1, "CAD") #=> #<Money @cents=1245150>
|
72
|
+
#
|
73
|
+
# # Exchange 100 CAD to USD:
|
74
|
+
# bank.exchange_with(c2, "USD") #=> #<Money @cents=803115>
|
42
75
|
def exchange_with(from, to_currency, &block)
|
43
76
|
return from if same_currency?(from.currency, to_currency)
|
44
77
|
|
@@ -61,19 +94,54 @@ class Money
|
|
61
94
|
Money.new(ex, _to_currency_)
|
62
95
|
end
|
63
96
|
|
64
|
-
|
65
|
-
#
|
66
|
-
#
|
97
|
+
# Registers a conversion rate and returns it (uses +#set_rate+).
|
98
|
+
#
|
99
|
+
# @param [Currency, String, Symbol] from Currency to exchange from.
|
100
|
+
# @param [Currency, String, Symbol] to Currency to exchange to.
|
101
|
+
# @param [Numeric] rate Rate to use when exchanging currencies.
|
102
|
+
#
|
103
|
+
# @return [Numeric]
|
104
|
+
#
|
105
|
+
# @example
|
106
|
+
# bank = Money::Bank::VariableExchange.new
|
107
|
+
# bank.add_rate("USD", "CAD", 1.24515)
|
108
|
+
# bank.add_rate("CAD", "USD", 0.803115)
|
67
109
|
def add_rate(from, to, rate)
|
68
110
|
set_rate(from, to, rate)
|
69
111
|
end
|
70
112
|
|
71
|
-
# Set the rate for the given currencies.
|
113
|
+
# Set the rate for the given currencies. Uses +Mutex+ to synchronize data
|
114
|
+
# access.
|
115
|
+
#
|
116
|
+
# @param [Currency, String, Symbol] from Currency to exchange from.
|
117
|
+
# @param [Currency, String, Symbol] to Currency to exchange to.
|
118
|
+
# @param [Numeric] rate Rate to use when exchanging currencies.
|
119
|
+
#
|
120
|
+
# @return [Numeric]
|
121
|
+
#
|
122
|
+
# @example
|
123
|
+
# bank = Money::Bank::VariableExchange.new
|
124
|
+
# bank.set_rate("USD", "CAD", 1.24515)
|
125
|
+
# bank.set_rate("CAD", "USD", 0.803115)
|
72
126
|
def set_rate(from, to, rate)
|
73
127
|
@mutex.synchronize { @rates[rate_key_for(from, to)] = rate }
|
74
128
|
end
|
75
129
|
|
76
|
-
# Retrieve the rate for the given currencies.
|
130
|
+
# Retrieve the rate for the given currencies. Uses +Mutex+ to synchronize
|
131
|
+
# data access.
|
132
|
+
#
|
133
|
+
# @param [Currency, String, Symbol] from Currency to exchange from.
|
134
|
+
# @param [Currency, String, Symbol] to Currency to exchange to.
|
135
|
+
#
|
136
|
+
# @return [Numeric]
|
137
|
+
#
|
138
|
+
# @example
|
139
|
+
# bank = Money::Bank::VariableExchange.new
|
140
|
+
# bank.set_rate("USD", "CAD", 1.24515)
|
141
|
+
# bank.set_rate("CAD", "USD", 0.803115)
|
142
|
+
#
|
143
|
+
# bank.get_rate("USD", "CAD") #=> 1.24515
|
144
|
+
# bank.get_rate("CAD", "USD") #=> 0.803115
|
77
145
|
def get_rate(from, to)
|
78
146
|
@mutex.synchronize { @rates[rate_key_for(from, to)] }
|
79
147
|
end
|
@@ -82,7 +150,21 @@ class Money
|
|
82
150
|
# is given will also write the string out to the file specified.
|
83
151
|
# Available formats are +:json+, +:ruby+ and +:yaml+.
|
84
152
|
#
|
85
|
-
#
|
153
|
+
# @param [Symbol] format Request format for the resulting string.
|
154
|
+
# @param [optional, String] file Optional file location to write the
|
155
|
+
# rates to.
|
156
|
+
#
|
157
|
+
# @return [String]
|
158
|
+
#
|
159
|
+
# @raise +Money::Bank::UnknownRateFormat+ if format is unknown.
|
160
|
+
#
|
161
|
+
# @example
|
162
|
+
# bank = Money::Bank::VariableExchange.new
|
163
|
+
# bank.set_rate("USD", "CAD", 1.24515)
|
164
|
+
# bank.set_rate("CAD", "USD", 0.803115)
|
165
|
+
#
|
166
|
+
# s = bank.export_rates(:json)
|
167
|
+
# s #=> "{\"USD_TO_CAD\":1.24515,\"CAD_TO_USD\":0.803115}"
|
86
168
|
def export_rates(format, file=nil)
|
87
169
|
raise Money::Bank::UnknownRateFormat unless
|
88
170
|
RATE_FORMATS.include? format
|
@@ -91,11 +173,11 @@ class Money
|
|
91
173
|
@mutex.synchronize {
|
92
174
|
s = case format
|
93
175
|
when :json
|
94
|
-
@rates
|
176
|
+
JSON.dump(@rates)
|
95
177
|
when :ruby
|
96
178
|
Marshal.dump(@rates)
|
97
179
|
when :yaml
|
98
|
-
@rates
|
180
|
+
YAML.dump(@rates)
|
99
181
|
end
|
100
182
|
|
101
183
|
unless file.nil?
|
@@ -108,7 +190,20 @@ class Money
|
|
108
190
|
# Loads rates provided in +s+ given the specified format. Available
|
109
191
|
# formats are +:json+, +:ruby+ and +:yaml+.
|
110
192
|
#
|
111
|
-
#
|
193
|
+
# @param [Symbol] format The format of +s+.
|
194
|
+
# @param [String] s The rates string.
|
195
|
+
#
|
196
|
+
# @return [self]
|
197
|
+
#
|
198
|
+
# @raise +Money::Bank::UnknownRateFormat+ if format is unknown.
|
199
|
+
#
|
200
|
+
# @example
|
201
|
+
# s = "{\"USD_TO_CAD\":1.24515,\"CAD_TO_USD\":0.803115}"
|
202
|
+
# bank = Money::Bank::VariableExchange.new
|
203
|
+
# bank.import_rates(:json, s)
|
204
|
+
#
|
205
|
+
# bank.get_rate("USD", "CAD") #=> 1.24515
|
206
|
+
# bank.get_rate("CAD", "USD") #=> 0.803115
|
112
207
|
def import_rates(format, s)
|
113
208
|
raise Money::Bank::UnknownRateFormat unless
|
114
209
|
RATE_FORMATS.include? format
|
@@ -129,11 +224,17 @@ class Money
|
|
129
224
|
private
|
130
225
|
|
131
226
|
# Return the rate hashkey for the given currencies.
|
227
|
+
#
|
228
|
+
# @param [Currency, String, Symbol] from The currency to exchange from.
|
229
|
+
# @param [Currency, String, Symbol] to The currency to exchange to.
|
230
|
+
#
|
231
|
+
# @return [String]
|
232
|
+
#
|
233
|
+
# @example
|
234
|
+
# rate_key_for("USD", "CAD") #=> "USD_TO_CAD"
|
132
235
|
def rate_key_for(from, to)
|
133
236
|
"#{Currency.wrap(from).iso_code}_TO_#{Currency.wrap(to).iso_code}".upcase
|
134
237
|
end
|
135
|
-
|
136
238
|
end
|
137
|
-
|
138
239
|
end
|
139
240
|
end
|
@@ -1,11 +1,17 @@
|
|
1
|
+
# Open +Numeric+ to add new method.
|
1
2
|
class Numeric
|
2
|
-
# Converts this numeric to a Money object in the default currency.
|
3
|
-
# multiplies the numeric value by 100 and treats that as cents.
|
3
|
+
# Converts this numeric to a +Money+ object in the default currency.
|
4
4
|
#
|
5
|
-
#
|
6
|
-
#
|
5
|
+
# @param [optional, Money::Currency, String, Symbol] currency The currency to
|
6
|
+
# set the resulting +Money+ object to.
|
7
|
+
#
|
8
|
+
# @return [Money]
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
# 100.to_money #=> #<Money @cents=10000>
|
12
|
+
# 100.37.to_money #=> #<Money @cents=10037>
|
7
13
|
# require 'bigdecimal'
|
8
|
-
# BigDecimal.new('100').to_money
|
14
|
+
# BigDecimal.new('100').to_money #=> #<Money @cents=10000>
|
9
15
|
def to_money(currency = Money.default_currency)
|
10
16
|
currency = Money::Currency.new(currency) unless currency.is_a?(Money::Currency)
|
11
17
|
amt = self * currency.subunit_to_unit
|
@@ -19,22 +25,28 @@ class Numeric
|
|
19
25
|
end
|
20
26
|
end
|
21
27
|
|
28
|
+
# Open +String+ to add new methods.
|
22
29
|
class String
|
23
|
-
|
24
|
-
#
|
25
|
-
# Excess characters will be discarded.
|
30
|
+
# Parses the current string and converts it to a +Money+ object. Excess
|
31
|
+
# characters will be discarded.
|
26
32
|
#
|
27
|
-
#
|
28
|
-
#
|
29
|
-
#
|
30
|
-
#
|
31
|
-
#
|
32
|
-
#
|
33
|
+
# @param [optional, Money::Currency, String, Symbol] currency The currency to
|
34
|
+
# set the resulting +Money+ object to.
|
35
|
+
#
|
36
|
+
# @return [Money]
|
37
|
+
#
|
38
|
+
# @example
|
39
|
+
# '100'.to_money #=> #<Money @cents=10000>
|
40
|
+
# '100.37'.to_money #=> #<Money @cents=10037>
|
41
|
+
# '100 USD'.to_money #=> #<Money @cents=10000, @currency=#<Money::Currency id: usd>>
|
42
|
+
# 'USD 100'.to_money #=> #<Money @cents=10000, @currency=#<Money::Currency id: usd>>
|
43
|
+
# '$100 USD'.to_money #=> #<Money @cents=10000, @currency=#<Money::Currency id: usd>>
|
44
|
+
# 'hello 2000 world'.to_money #=> #<Money @cents=200000 @currency=#<Money::Currency id: usd>>
|
33
45
|
def to_money(currency = nil)
|
34
46
|
# Get the currency.
|
35
47
|
matches = scan /([A-Z]{2,3})/
|
36
48
|
_currency_ = matches[0] ? matches[0][0] : nil
|
37
|
-
|
49
|
+
|
38
50
|
# check that currency passed and embedded currency are the same, or only
|
39
51
|
# one or the other is present.
|
40
52
|
if currency.nil? and _currency_.nil?
|
@@ -46,18 +58,28 @@ class String
|
|
46
58
|
elsif currency != _currency_
|
47
59
|
raise "mismatching currencies"
|
48
60
|
end
|
49
|
-
|
61
|
+
|
50
62
|
cents = calculate_cents(self)
|
51
63
|
Money.new(cents, currency)
|
52
64
|
end
|
53
65
|
|
54
|
-
# Parses the current string and converts it to a Currency object.
|
66
|
+
# Parses the current string and converts it to a +Currency+ object.
|
67
|
+
#
|
68
|
+
# @return [Money::Currency]
|
69
|
+
#
|
70
|
+
# @example
|
71
|
+
# "USD".to_currency #=> #<Money::Currency id: usd>
|
55
72
|
def to_currency
|
56
73
|
Money::Currency.new(self)
|
57
74
|
end
|
58
75
|
|
59
76
|
private
|
60
77
|
|
78
|
+
# Takes a number string and attempts to massage out the number.
|
79
|
+
#
|
80
|
+
# @param [String] number The string containing a potential number.
|
81
|
+
#
|
82
|
+
# @return [Integer]
|
61
83
|
def calculate_cents(number)
|
62
84
|
# remove anything that's not a number, potential delimiter, or minus sign
|
63
85
|
num = number.gsub(/[^\d|\.|,|\'|\s|\-]/, '').strip
|
@@ -163,5 +185,4 @@ class String
|
|
163
185
|
# if negative, multiply by -1; otherwise, return positive cents
|
164
186
|
negative ? cents * -1 : cents
|
165
187
|
end
|
166
|
-
|
167
188
|
end
|
data/lib/money/currency.rb
CHANGED
@@ -6,26 +6,23 @@ class Money
|
|
6
6
|
class Currency
|
7
7
|
include Comparable
|
8
8
|
|
9
|
+
# Thrown when an unknown currency is requested.
|
9
10
|
class UnknownCurrency < StandardError; end
|
10
11
|
|
11
12
|
# List of attributes applicable to a currency object.
|
12
|
-
# * priority: a numerical value you can use to sort/group the currency list
|
13
|
-
# * iso_code: the international 3-letter code as defined by the ISO 4217 standard
|
14
|
-
# * name: the currency name
|
15
|
-
# * symbol: the currency symbol (UTF-8 encoded)
|
16
|
-
# * subunit: the name of the fractional monetary unit
|
17
|
-
# * subunit_to_unit: the proportion between the unit and the subunit
|
18
13
|
ATTRIBUTES = [ :priority, :iso_code, :name, :symbol, :subunit, :subunit_to_unit, :separator, :delimiter ]
|
19
14
|
|
15
|
+
# List of known currencies.
|
16
|
+
#
|
17
|
+
# == monetary unit
|
18
|
+
# The standard unit of value of a currency, as the dollar in the United States or the peso in Mexico.
|
19
|
+
# http://www.answers.com/topic/monetary-unit
|
20
|
+
# == fractional monetary unit, subunit
|
21
|
+
# A monetary unit that is valued at a fraction (usually one hundredth) of the basic monetary unit
|
22
|
+
# http://www.answers.com/topic/fractional-monetary-unit-subunit
|
23
|
+
#
|
24
|
+
# See http://en.wikipedia.org/wiki/List_of_circulating_currencies
|
20
25
|
TABLE = {
|
21
|
-
# monetary unit
|
22
|
-
# The standard unit of value of a currency, as the dollar in the United States or the peso in Mexico.
|
23
|
-
# http://www.answers.com/topic/monetary-unit
|
24
|
-
# fractional monetary unit, subunit
|
25
|
-
# A monetary unit that is valued at a fraction (usually one hundredth) of the basic monetary unit
|
26
|
-
# http://www.answers.com/topic/fractional-monetary-unit-subunit
|
27
|
-
#
|
28
|
-
# See http://en.wikipedia.org/wiki/List_of_circulating_currencies
|
29
26
|
:aed => { :priority => 100, :iso_code => "AED", :name => "United Arab Emirates Dirham", :symbol => "د.إ", :subunit => "Fils", :subunit_to_unit => 100, :separator => ".", :delimiter => "," },
|
30
27
|
:afn => { :priority => 100, :iso_code => "AFN", :name => "Afghan Afghani", :symbol => "؋", :subunit => "Pul", :subunit_to_unit => 100, :separator => ".", :delimiter => "," },
|
31
28
|
:all => { :priority => 100, :iso_code => "ALL", :name => "Albanian Lek", :symbol => "L", :subunit => "Qintar", :subunit_to_unit => 100, :separator => ".", :delimiter => "," },
|
@@ -76,7 +73,7 @@ class Money
|
|
76
73
|
:fkp => { :priority => 100, :iso_code => "FKP", :name => "Falkland Pound", :symbol => "£", :subunit => "Penny", :subunit_to_unit => 100, :separator => ".", :delimiter => "," },
|
77
74
|
:gbp => { :priority => 3, :iso_code => "GBP", :name => "British Pound", :symbol => "£", :subunit => "Penny", :subunit_to_unit => 100, :separator => ".", :delimiter => "," },
|
78
75
|
:gel => { :priority => 100, :iso_code => "GEL", :name => "Georgian Lari", :symbol => "ლ", :subunit => "Tetri", :subunit_to_unit => 100, :separator => ".", :delimiter => "," },
|
79
|
-
:
|
76
|
+
:ghs => { :priority => 100, :iso_code => "GHS", :name => "Ghanaian Cedi", :symbol => "₵", :subunit => "Pesewa", :subunit_to_unit => 100, :separator => ".", :delimiter => "," },
|
80
77
|
:gip => { :priority => 100, :iso_code => "GIP", :name => "Gibraltar Pound", :symbol => "£", :subunit => "Penny", :subunit_to_unit => 100, :separator => ".", :delimiter => "," },
|
81
78
|
:gmd => { :priority => 100, :iso_code => "GMD", :name => "Gambian Dalasi", :symbol => "D", :subunit => "Butut", :subunit_to_unit => 100, :separator => ".", :delimiter => "," },
|
82
79
|
:gnf => { :priority => 100, :iso_code => "GNF", :name => "Guinean Franc", :symbol => "Fr", :subunit => "Centime", :subunit_to_unit => 100, :separator => ".", :delimiter => "," },
|
@@ -192,10 +189,66 @@ class Money
|
|
192
189
|
|
193
190
|
# aliases for BC with documentation before Currency
|
194
191
|
:yen => { :priority => 100, :iso_code => "JPY", :name => "Japanese Yen", :symbol => "¥", :subunit => "Sen", :subunit_to_unit => 100, :separator => ".", :delimiter => "," },
|
192
|
+
|
193
|
+
# kept for backwards compatibility, real entry is :ghs
|
194
|
+
:ghc => { :priority => 100, :iso_code => "GHS", :name => "Ghanaian Cedi", :symbol => "₵", :subunit => "Pesewa", :subunit_to_unit => 100, :separator => ".", :delimiter => "," },
|
195
195
|
}
|
196
196
|
|
197
|
-
|
197
|
+
# The symbol used to identify the currency, usually the lowercase
|
198
|
+
# +iso_code+ attribute.
|
199
|
+
#
|
200
|
+
# @return [Symbol]
|
201
|
+
attr_reader :id
|
202
|
+
|
203
|
+
# A numerical value you can use to sort/group the currency list.
|
204
|
+
#
|
205
|
+
# @return [Integer]
|
206
|
+
attr_reader :priority
|
207
|
+
|
208
|
+
# The international 3-letter code as defined by the ISO 4217 standard.
|
209
|
+
#
|
210
|
+
# @return [String]
|
211
|
+
attr_reader :iso_code
|
212
|
+
|
213
|
+
# The currency name.
|
214
|
+
#
|
215
|
+
# @return [String]
|
216
|
+
attr_reader :name
|
217
|
+
|
218
|
+
# The currency symbol (UTF-8 encoded).
|
219
|
+
#
|
220
|
+
# @return [String]
|
221
|
+
attr_reader :symbol
|
222
|
+
|
223
|
+
# The name of the fractional monetary unit.
|
224
|
+
#
|
225
|
+
# @return [String]
|
226
|
+
attr_reader :subunit
|
227
|
+
|
228
|
+
# The proportion between the unit and the subunit
|
229
|
+
#
|
230
|
+
# @return [Integer]
|
231
|
+
attr_reader :subunit_to_unit
|
232
|
+
|
233
|
+
# The character used to separate the whole unit from the subunit.
|
234
|
+
#
|
235
|
+
# @return [String]
|
236
|
+
attr_reader :separator
|
237
|
+
|
238
|
+
# The character used to separate thousands grouping of the whole unit.
|
239
|
+
#
|
240
|
+
# @return [String]
|
241
|
+
attr_reader :delimiter
|
198
242
|
|
243
|
+
# Create a new +Currency+ object.
|
244
|
+
#
|
245
|
+
# @param [String, Symbol, #to_s] id Used to look into +TABLE+ and retrieve
|
246
|
+
# the applicable attributes.
|
247
|
+
#
|
248
|
+
# @return [Money::Currency]
|
249
|
+
#
|
250
|
+
# @example
|
251
|
+
# Money::Currency.new(:usd) #=> #<Money::Currency id: usd ...>
|
199
252
|
def initialize(id)
|
200
253
|
@id = id.to_s.downcase.to_sym
|
201
254
|
data = TABLE[@id] || raise(UnknownCurrency, "Unknown currency `#{id}'")
|
@@ -204,74 +257,112 @@ class Money
|
|
204
257
|
end
|
205
258
|
end
|
206
259
|
|
207
|
-
# Compares
|
208
|
-
#
|
260
|
+
# Compares +self+ with +other_currency+ against the value of +priority+
|
261
|
+
# attribute.
|
262
|
+
#
|
263
|
+
# @param [Money::Currency] other_currency The currency to compare to.
|
264
|
+
#
|
265
|
+
# @return [-1,0,1] -1 if less than, 0 is equal to, 1 if greater than
|
266
|
+
#
|
267
|
+
# @example
|
268
|
+
# c1 = Money::Currency.new(:usd)
|
269
|
+
# c2 = Money::Currency.new(:jpy)
|
270
|
+
# c1 <=> c2 #=> 1
|
271
|
+
# c2 <=> c1 #=> -1
|
272
|
+
# c1 <=> c1 #=> 0
|
209
273
|
def <=>(other_currency)
|
210
274
|
self.priority <=> other_currency.priority
|
211
275
|
end
|
212
276
|
|
213
|
-
#
|
214
|
-
#
|
277
|
+
# Compares +self+ with +other_currency+ and returns +true+ if the are the
|
278
|
+
# same or if their +id+ attributes match.
|
279
|
+
#
|
280
|
+
# @param [Money::Currency] other_currency The currency to compare to.
|
281
|
+
#
|
282
|
+
# @return [Boolean]
|
283
|
+
#
|
284
|
+
# @example
|
285
|
+
# c1 = Money::Currency.new(:usd)
|
286
|
+
# c2 = Money::Currency.new(:jpy)
|
287
|
+
# c1 == c1 #=> true
|
288
|
+
# c1 == c2 #=> false
|
215
289
|
def ==(other_currency)
|
216
290
|
self.equal?(other_currency) ||
|
217
291
|
self.id == other_currency.id
|
218
292
|
end
|
219
293
|
|
220
|
-
#
|
294
|
+
# Compares +self+ with +other_currency+ and returns +true+ if the are the
|
295
|
+
# same or if their +id+ attributes match.
|
296
|
+
#
|
297
|
+
# @param [Money::Currency] other_currency The currency to compare to.
|
298
|
+
#
|
299
|
+
# @return [Boolean]
|
300
|
+
#
|
301
|
+
# @example
|
302
|
+
# c1 = Money::Currency.new(:usd)
|
303
|
+
# c2 = Money::Currency.new(:jpy)
|
304
|
+
# c1.eql? c1 #=> true
|
305
|
+
# c1.eql? c2 #=> false
|
221
306
|
def eql?(other_currency)
|
222
307
|
self == other_currency
|
223
308
|
end
|
224
309
|
|
225
|
-
# Returns a Fixnum hash value based on the
|
226
|
-
#
|
310
|
+
# Returns a Fixnum hash value based on the +id+ attribute in order to use
|
311
|
+
# functions like & (intersection), group_by, etc.
|
227
312
|
#
|
228
|
-
#
|
229
|
-
# # => [Currency.new(:usd)]
|
313
|
+
# @return [Fixnum]
|
230
314
|
#
|
315
|
+
# @example
|
316
|
+
# Money::Currency.new(:usd).hash #=> 428936
|
231
317
|
def hash
|
232
318
|
id.hash
|
233
319
|
end
|
234
320
|
|
235
|
-
# Returns a string representation
|
236
|
-
#
|
237
|
-
#
|
238
|
-
# Currency.new(:usd).to_s
|
239
|
-
# # => "USD"
|
240
|
-
# Currency.new(:eur).to_s
|
241
|
-
# # => "EUR"
|
321
|
+
# Returns a string representation corresponding to the upcase +id+
|
322
|
+
# attribute.
|
242
323
|
#
|
243
324
|
# -–
|
244
|
-
# DEV: id.to_s.upcase corresponds to iso_code
|
245
|
-
#
|
325
|
+
# DEV: id.to_s.upcase corresponds to iso_code but don't use ISO_CODE for consistency.
|
326
|
+
#
|
327
|
+
# @return [String]
|
328
|
+
#
|
329
|
+
# @example
|
330
|
+
# Money::Currency.new(:usd).to_s #=> "USD"
|
331
|
+
# Money::Currency.new(:eur).to_s #=> "EUR"
|
246
332
|
def to_s
|
247
333
|
id.to_s.upcase
|
248
334
|
end
|
249
335
|
|
250
336
|
# Returns a human readable representation.
|
251
337
|
#
|
252
|
-
#
|
338
|
+
# @return [String]
|
253
339
|
#
|
340
|
+
# @example
|
341
|
+
# Money::Currency.new(:usd) #=> #<Currency id: usd ...>
|
254
342
|
def inspect
|
255
343
|
"#<#{self.class.name} id: #{id} #{ATTRIBUTES.map { |a| "#{a}: #{send(a)}" }.join(", ")}>"
|
256
344
|
end
|
257
345
|
|
258
|
-
|
346
|
+
# Catches deprecated uses of currency.
|
259
347
|
def method_missing(method, *args, &block)
|
260
|
-
Money.deprecate "`currency
|
348
|
+
Money.deprecate "`currency` is now a `Currency` instance. Call `currency.to_s.#{method}' instead."
|
261
349
|
iso_code.send(method, *args, &block)
|
262
350
|
end
|
263
351
|
|
352
|
+
# Class Methods
|
264
353
|
class << self
|
265
354
|
|
266
|
-
# Lookup a
|
267
|
-
#
|
268
|
-
#
|
355
|
+
# Lookup a currency with given +id+ an returns a +Currency+ instance on
|
356
|
+
# success, +nil+ otherwise.
|
357
|
+
#
|
358
|
+
# @param [String, Symbol, #to_s] id Used to look into +TABLE+ and
|
359
|
+
# retrieve the applicable attributes.
|
269
360
|
#
|
270
|
-
#
|
271
|
-
# # => <#Currency id: eur ...>
|
272
|
-
# Currency.find(:foo)
|
273
|
-
# # => nil
|
361
|
+
# @return [Money::Currency]
|
274
362
|
#
|
363
|
+
# @example
|
364
|
+
# Money::Currency.find(:eur) #=> #<Money::Currency id: eur ...>
|
365
|
+
# Money::Currency.find(:foo) #=> nil
|
275
366
|
def find(id)
|
276
367
|
id = id.to_s.downcase.to_sym
|
277
368
|
if data = self::TABLE[id]
|
@@ -279,15 +370,19 @@ class Money
|
|
279
370
|
end
|
280
371
|
end
|
281
372
|
|
282
|
-
# Wraps the object in a Currency unless it's a Currency
|
373
|
+
# Wraps the object in a +Currency+ unless it's already a +Currency+
|
374
|
+
# object.
|
375
|
+
#
|
376
|
+
# @param [Object] object The object to attempt and wrap as a +Currency+
|
377
|
+
# object.
|
283
378
|
#
|
284
|
-
#
|
285
|
-
# # => nil
|
286
|
-
# Currency.wrap(Currency.new(:usd))
|
287
|
-
# # => <#Currency id: usd ...>
|
288
|
-
# Currency.wrap("usd")
|
289
|
-
# # => <#Currency id: usd ...>
|
379
|
+
# @return [Money::Currency]
|
290
380
|
#
|
381
|
+
# @example
|
382
|
+
# c1 = Money::Currency.new(:usd)
|
383
|
+
# Money::Currency.wrap(nil) #=> nil
|
384
|
+
# Money::Currency.wrap(c1) #=> #<Money::Currency id: usd ...>
|
385
|
+
# Money::Currency.wrap("usd") #=> #<Money::Currency id: usd ...>
|
291
386
|
def wrap(object)
|
292
387
|
if object.nil?
|
293
388
|
nil
|
@@ -297,8 +392,6 @@ class Money
|
|
297
392
|
Currency.new(object)
|
298
393
|
end
|
299
394
|
end
|
300
|
-
|
301
395
|
end
|
302
|
-
|
303
396
|
end
|
304
397
|
end
|