money 6.13.4 → 6.13.5
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 +5 -5
- data/CHANGELOG.md +8 -0
- data/README.md +3 -1
- data/config/currency_backwards_compatible.json +16 -0
- data/config/currency_iso.json +4 -4
- data/lib/money/bank/variable_exchange.rb +5 -1
- data/lib/money/currency.rb +1 -1
- data/lib/money/money.rb +35 -13
- data/lib/money/rates_store/memory.rb +22 -23
- data/lib/money/version.rb +1 -1
- metadata +3 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: d517e06943977328b7ad20b73554269088b01b947c280cc454f87ef88dfb8e2d
|
|
4
|
+
data.tar.gz: 2c7c5ba4c19a5ff2413273cb64443b5628468b083f260f8cdf49c133e3b7319e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f1cbd0d2e7f790a00528531b3f325bffb4ee8aef98917cc1c17232684eeb5ffb66ce56ebd0618146302468e1259cb284d3a96e576c4592fc67db41cddfb14a64
|
|
7
|
+
data.tar.gz: 1d3c22cde9570f93dba5f86952b35a952b0dbfc95262c051e36f0829f8ac06669181cf0b10524d0df44123ae2095c60e8301af999f89a1119ac6d252fddcb6dc
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 6.13.5
|
|
4
|
+
- Raise warning on using Money.default_currency
|
|
5
|
+
- Raise warning on using default Money.rounding_mode
|
|
6
|
+
- Add Second Ouguiya MRU 929 to currency iso file
|
|
7
|
+
- Add symbol for UZS
|
|
8
|
+
- Use monitor for recursive mutual exclusion in RatesStore::Memory
|
|
9
|
+
- Allow passing store as a string to Money::Bank::VariableExchange (to support Rails 6)
|
|
10
|
+
|
|
3
11
|
## 6.13.4
|
|
4
12
|
- Update currency config for Zambian Kwacha (ZMW)
|
|
5
13
|
- Do not modify options passed to FormattingRules
|
data/README.md
CHANGED
|
@@ -21,7 +21,7 @@ A Ruby Library for dealing with money and currency conversion.
|
|
|
21
21
|
|
|
22
22
|
### Features
|
|
23
23
|
|
|
24
|
-
- Provides a `Money` class which encapsulates all information about
|
|
24
|
+
- Provides a `Money` class which encapsulates all information about a certain
|
|
25
25
|
amount of money, such as its value and its currency.
|
|
26
26
|
- Provides a `Money::Currency` class which encapsulates all information about
|
|
27
27
|
a monetary unit.
|
|
@@ -334,6 +334,8 @@ end
|
|
|
334
334
|
Now you can use it with the default bank.
|
|
335
335
|
|
|
336
336
|
```ruby
|
|
337
|
+
# For Rails 6 pass model name as a string to make it compatible with zeitwerk
|
|
338
|
+
# Money.default_bank = Money::Bank::VariableExchange.new("ExchangeRate")
|
|
337
339
|
Money.default_bank = Money::Bank::VariableExchange.new(ExchangeRate)
|
|
338
340
|
|
|
339
341
|
# Add to the underlying store
|
|
@@ -60,6 +60,22 @@
|
|
|
60
60
|
"iso_numeric": "428",
|
|
61
61
|
"smallest_denomination": 1
|
|
62
62
|
},
|
|
63
|
+
"mro": {
|
|
64
|
+
"priority": 100,
|
|
65
|
+
"iso_code": "MRO",
|
|
66
|
+
"name": "Mauritanian Ouguiya",
|
|
67
|
+
"symbol": "UM",
|
|
68
|
+
"disambiguate_symbol": "A-UM",
|
|
69
|
+
"alternate_symbols": [],
|
|
70
|
+
"subunit": "Khoums",
|
|
71
|
+
"subunit_to_unit": 5,
|
|
72
|
+
"symbol_first": false,
|
|
73
|
+
"html_entity": "",
|
|
74
|
+
"decimal_mark": ".",
|
|
75
|
+
"thousands_separator": ",",
|
|
76
|
+
"iso_numeric": "478",
|
|
77
|
+
"smallest_denomination": 1
|
|
78
|
+
},
|
|
63
79
|
"mtl": {
|
|
64
80
|
"priority": 100,
|
|
65
81
|
"iso_code": "MTL",
|
data/config/currency_iso.json
CHANGED
|
@@ -1412,9 +1412,9 @@
|
|
|
1412
1412
|
"iso_numeric": "446",
|
|
1413
1413
|
"smallest_denomination": 10
|
|
1414
1414
|
},
|
|
1415
|
-
"
|
|
1415
|
+
"mru": {
|
|
1416
1416
|
"priority": 100,
|
|
1417
|
-
"iso_code": "
|
|
1417
|
+
"iso_code": "MRU",
|
|
1418
1418
|
"name": "Mauritanian Ouguiya",
|
|
1419
1419
|
"symbol": "UM",
|
|
1420
1420
|
"alternate_symbols": [],
|
|
@@ -1424,7 +1424,7 @@
|
|
|
1424
1424
|
"html_entity": "",
|
|
1425
1425
|
"decimal_mark": ".",
|
|
1426
1426
|
"thousands_separator": ",",
|
|
1427
|
-
"iso_numeric": "
|
|
1427
|
+
"iso_numeric": "929",
|
|
1428
1428
|
"smallest_denomination": 1
|
|
1429
1429
|
},
|
|
1430
1430
|
"mur": {
|
|
@@ -2260,7 +2260,7 @@
|
|
|
2260
2260
|
"priority": 100,
|
|
2261
2261
|
"iso_code": "UZS",
|
|
2262
2262
|
"name": "Uzbekistan Som",
|
|
2263
|
-
"symbol": "",
|
|
2263
|
+
"symbol": "so'm",
|
|
2264
2264
|
"alternate_symbols": ["so‘m", "сўм", "сум", "s", "с"],
|
|
2265
2265
|
"subunit": "Tiyin",
|
|
2266
2266
|
"subunit_to_unit": 100,
|
|
@@ -42,7 +42,7 @@ class Money
|
|
|
42
42
|
# bank.get_rate 'USD', 'CAD'
|
|
43
43
|
class VariableExchange < Base
|
|
44
44
|
|
|
45
|
-
attr_reader :mutex
|
|
45
|
+
attr_reader :mutex
|
|
46
46
|
|
|
47
47
|
# Available formats for importing/exporting rates.
|
|
48
48
|
RATE_FORMATS = [:json, :ruby, :yaml].freeze
|
|
@@ -61,6 +61,10 @@ class Money
|
|
|
61
61
|
super(&block)
|
|
62
62
|
end
|
|
63
63
|
|
|
64
|
+
def store
|
|
65
|
+
@store.is_a?(String) ? Object.const_get(@store) : @store
|
|
66
|
+
end
|
|
67
|
+
|
|
64
68
|
def marshal_dump
|
|
65
69
|
[store.marshal_dump, @rounding_method]
|
|
66
70
|
end
|
data/lib/money/currency.rb
CHANGED
|
@@ -414,7 +414,7 @@ class Money
|
|
|
414
414
|
|
|
415
415
|
# Returns the relation between subunit and unit as a base 10 exponent.
|
|
416
416
|
#
|
|
417
|
-
# Note that MGA and
|
|
417
|
+
# Note that MGA and MRU are exceptions and are rounded to 1
|
|
418
418
|
# @see https://en.wikipedia.org/wiki/ISO_4217#Active_codes
|
|
419
419
|
#
|
|
420
420
|
# @return [Integer]
|
data/lib/money/money.rb
CHANGED
|
@@ -123,19 +123,19 @@ class Money
|
|
|
123
123
|
attr_accessor :default_bank, :default_formatting_rules,
|
|
124
124
|
:use_i18n, :infinite_precision, :conversion_precision,
|
|
125
125
|
:locale_backend
|
|
126
|
-
|
|
127
|
-
# @attr_writer rounding_mode Use this to specify the rounding mode
|
|
128
|
-
#
|
|
129
|
-
# @!attribute default_currency
|
|
130
|
-
# @return [Money::Currency] The default currency, which is used when
|
|
131
|
-
# +Money.new+ is called without an explicit currency argument. The
|
|
132
|
-
# default value is Currency.new("USD"). The value must be a valid
|
|
133
|
-
# +Money::Currency+ instance.
|
|
134
|
-
attr_writer :rounding_mode, :default_currency
|
|
135
|
-
|
|
136
126
|
end
|
|
137
127
|
|
|
128
|
+
# @!attribute default_currency
|
|
129
|
+
# @return [Money::Currency] The default currency, which is used when
|
|
130
|
+
# +Money.new+ is called without an explicit currency argument. The
|
|
131
|
+
# default value is Currency.new("USD"). The value must be a valid
|
|
132
|
+
# +Money::Currency+ instance.
|
|
138
133
|
def self.default_currency
|
|
134
|
+
if @using_deprecated_default_currency
|
|
135
|
+
warn '[WARNING] The default currency will change to `nil` in the next major release. Make ' \
|
|
136
|
+
'sure to set it explicitly using `Money.default_currency=` to avoid potential issues'
|
|
137
|
+
end
|
|
138
|
+
|
|
139
139
|
if @default_currency.respond_to?(:call)
|
|
140
140
|
Money::Currency.new(@default_currency.call)
|
|
141
141
|
else
|
|
@@ -143,10 +143,21 @@ class Money
|
|
|
143
143
|
end
|
|
144
144
|
end
|
|
145
145
|
|
|
146
|
+
def self.default_currency=(currency)
|
|
147
|
+
@using_deprecated_default_currency = false
|
|
148
|
+
@default_currency = currency
|
|
149
|
+
end
|
|
150
|
+
|
|
146
151
|
def self.locale_backend=(value)
|
|
147
152
|
@locale_backend = value ? LocaleBackend.find(value) : nil
|
|
148
153
|
end
|
|
149
154
|
|
|
155
|
+
# @attr_writer rounding_mode Use this to specify the rounding mode
|
|
156
|
+
def self.rounding_mode=(new_rounding_mode)
|
|
157
|
+
@using_deprecated_default_rounding_mode = false
|
|
158
|
+
@rounding_mode = new_rounding_mode
|
|
159
|
+
end
|
|
160
|
+
|
|
150
161
|
def self.use_i18n=(value)
|
|
151
162
|
if value
|
|
152
163
|
warn '[DEPRECATION] `use_i18n` is deprecated - use `Money.locale_backend = :i18n` instead for locale based formatting'
|
|
@@ -163,6 +174,7 @@ class Money
|
|
|
163
174
|
|
|
164
175
|
# Set the default currency for creating new +Money+ object.
|
|
165
176
|
self.default_currency = Currency.new("USD")
|
|
177
|
+
@using_deprecated_default_currency = true
|
|
166
178
|
|
|
167
179
|
# Default to using i18n
|
|
168
180
|
@use_i18n = true
|
|
@@ -175,6 +187,7 @@ class Money
|
|
|
175
187
|
|
|
176
188
|
# Default to bankers rounding
|
|
177
189
|
self.rounding_mode = BigDecimal::ROUND_HALF_EVEN
|
|
190
|
+
@using_deprecated_default_rounding_mode = true
|
|
178
191
|
|
|
179
192
|
# Default the conversion of Rationals precision to 16
|
|
180
193
|
self.conversion_precision = 16
|
|
@@ -192,10 +205,19 @@ class Money
|
|
|
192
205
|
#
|
|
193
206
|
# @return [BigDecimal::ROUND_MODE] rounding mode
|
|
194
207
|
def self.rounding_mode(mode = nil)
|
|
195
|
-
|
|
208
|
+
if mode
|
|
209
|
+
warn "[DEPRECATION] calling `rounding_mode` with a block is deprecated. Please use `.with_rounding_mode` instead."
|
|
210
|
+
return with_rounding_mode(mode) { yield }
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
return Thread.current[:money_rounding_mode] if Thread.current[:money_rounding_mode]
|
|
214
|
+
|
|
215
|
+
if @using_deprecated_default_rounding_mode
|
|
216
|
+
warn '[WARNING] The default rounding mode will change to `ROUND_HALF_UP` in the next major ' \
|
|
217
|
+
'release. Set it explicitly using `Money.rounding_mode=` to avoid potential problems.'
|
|
218
|
+
end
|
|
196
219
|
|
|
197
|
-
|
|
198
|
-
with_rounding_mode(mode) { yield }
|
|
220
|
+
@rounding_mode
|
|
199
221
|
end
|
|
200
222
|
|
|
201
223
|
# This method temporarily changes the rounding mode. It will then return the
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require 'monitor'
|
|
2
|
+
|
|
1
3
|
class Money
|
|
2
4
|
module RatesStore
|
|
3
5
|
|
|
@@ -18,10 +20,10 @@ class Money
|
|
|
18
20
|
# @param [Hash] opts Optional store options.
|
|
19
21
|
# @option opts [Boolean] :without_mutex disables the usage of a mutex
|
|
20
22
|
# @param [Hash] rt Optional initial exchange rate data.
|
|
21
|
-
def initialize(opts = {},
|
|
22
|
-
@
|
|
23
|
-
@
|
|
24
|
-
@
|
|
23
|
+
def initialize(opts = {}, rates = {})
|
|
24
|
+
@rates = rates
|
|
25
|
+
@options = opts
|
|
26
|
+
@guard = Monitor.new
|
|
25
27
|
end
|
|
26
28
|
|
|
27
29
|
# Registers a conversion rate and returns it. Uses +Mutex+ to synchronize data access.
|
|
@@ -37,7 +39,9 @@ class Money
|
|
|
37
39
|
# store.add_rate("USD", "CAD", 1.24515)
|
|
38
40
|
# store.add_rate("CAD", "USD", 0.803115)
|
|
39
41
|
def add_rate(currency_iso_from, currency_iso_to, rate)
|
|
40
|
-
|
|
42
|
+
@guard.synchronize do
|
|
43
|
+
@rates[rate_key_for(currency_iso_from, currency_iso_to)] = rate
|
|
44
|
+
end
|
|
41
45
|
end
|
|
42
46
|
|
|
43
47
|
# Retrieve the rate for the given currencies. Uses +Mutex+ to synchronize data access.
|
|
@@ -54,24 +58,21 @@ class Money
|
|
|
54
58
|
#
|
|
55
59
|
# store.get_rate("USD", "CAD") #=> 1.24515
|
|
56
60
|
def get_rate(currency_iso_from, currency_iso_to)
|
|
57
|
-
|
|
61
|
+
@guard.synchronize do
|
|
62
|
+
@rates[rate_key_for(currency_iso_from, currency_iso_to)]
|
|
63
|
+
end
|
|
58
64
|
end
|
|
59
65
|
|
|
60
66
|
def marshal_dump
|
|
61
|
-
|
|
67
|
+
@guard.synchronize do
|
|
68
|
+
return [self.class, @options, @rates.dup]
|
|
69
|
+
end
|
|
62
70
|
end
|
|
63
71
|
|
|
64
72
|
# Wraps block execution in a thread-safe transaction
|
|
65
73
|
def transaction(&block)
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
else
|
|
69
|
-
@mutex.synchronize do
|
|
70
|
-
@in_transaction = true
|
|
71
|
-
result = block.call
|
|
72
|
-
@in_transaction = false
|
|
73
|
-
result
|
|
74
|
-
end
|
|
74
|
+
@guard.synchronize do
|
|
75
|
+
yield
|
|
75
76
|
end
|
|
76
77
|
end
|
|
77
78
|
|
|
@@ -88,20 +89,18 @@ class Money
|
|
|
88
89
|
# puts [iso_from, iso_to, rate].join
|
|
89
90
|
# end
|
|
90
91
|
def each_rate(&block)
|
|
91
|
-
|
|
92
|
-
|
|
92
|
+
return to_enum(:each_rate) unless block_given?
|
|
93
|
+
|
|
94
|
+
@guard.synchronize do
|
|
95
|
+
@rates.each do |key, rate|
|
|
93
96
|
iso_from, iso_to = key.split(INDEX_KEY_SEPARATOR)
|
|
94
|
-
|
|
97
|
+
yield iso_from, iso_to, rate
|
|
95
98
|
end
|
|
96
99
|
end
|
|
97
|
-
|
|
98
|
-
block_given? ? enum.each(&block) : enum
|
|
99
100
|
end
|
|
100
101
|
|
|
101
102
|
private
|
|
102
103
|
|
|
103
|
-
attr_reader :index, :options
|
|
104
|
-
|
|
105
104
|
# Return the rate hashkey for the given currencies.
|
|
106
105
|
#
|
|
107
106
|
# @param [String] currency_iso_from The currency to exchange from.
|
data/lib/money/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: money
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 6.13.
|
|
4
|
+
version: 6.13.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Shane Emmons
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2019-
|
|
12
|
+
date: 2019-12-01 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: i18n
|
|
@@ -159,8 +159,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
159
159
|
- !ruby/object:Gem::Version
|
|
160
160
|
version: '0'
|
|
161
161
|
requirements: []
|
|
162
|
-
|
|
163
|
-
rubygems_version: 2.6.8
|
|
162
|
+
rubygems_version: 3.0.3
|
|
164
163
|
signing_key:
|
|
165
164
|
specification_version: 4
|
|
166
165
|
summary: A Ruby Library for dealing with money and currency conversion.
|