money 6.13.1 → 6.13.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/CHANGELOG.md +8 -0
- data/Gemfile +1 -0
- data/README.md +29 -0
- data/config/currency_iso.json +2 -2
- data/lib/money/locale_backend/i18n.rb +2 -1
- data/lib/money/money.rb +4 -1
- data/lib/money/money/allocation.rb +5 -2
- data/lib/money/money/formatting_rules.rb +6 -4
- data/lib/money/version.rb +1 -1
- data/money.gemspec +1 -1
- data/spec/locale_backend/i18n_spec.rb +9 -1
- data/spec/money/allocation_spec.rb +5 -0
- data/spec/money_spec.rb +14 -0
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7913c2be69c77f43c10cb0a6262dadeccbbc9a9f
|
4
|
+
data.tar.gz: bb7de5d50d2a8e7185ebb4a87e5a60a637602e62
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f92d1aef2013a80abb618b49ce72d07406a93678b0ce183ce2c6051c397ccc24dd121d21eda707fab2dae042b369e83cf1deb6e45db15770b1a417b989014fe6
|
7
|
+
data.tar.gz: eeb2491fca41a8a3c858bad2314c4c8d3a29384f7f0da9e836b871071110f321c76ea697222f6b47903839f344bfbdcf85e0636b59a80dca1381bfa29aaa1b59
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 6.13.2
|
4
|
+
- Prevent Money initialization with non-finite amounts
|
5
|
+
- Convert the fractional value of a Money object to BigDecimal when initializing
|
6
|
+
- Offer replacements for currency position deprecations
|
7
|
+
- Fix Peruvian Sol symbol
|
8
|
+
- Lock i18n to <= 1.2.0 for older (< 2.3) rubies
|
9
|
+
- Prevent Divide By Zero in `Money#allocate`
|
10
|
+
|
3
11
|
## 6.13.1
|
4
12
|
- Add bolívar soberano (VES)
|
5
13
|
- Deprecate bolívar fuerte (VEF)
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -392,6 +392,35 @@ m = Money.new('123', :gbp) # => #<Money fractional:123 currency:GBP>
|
|
392
392
|
m.format(symbol: m.currency.to_s + ' ') # => "GBP 1.23"
|
393
393
|
```
|
394
394
|
|
395
|
+
## Rounding
|
396
|
+
|
397
|
+
By default, `Money` objects are rounded to the nearest cent and the additional precision is not preserved:
|
398
|
+
|
399
|
+
```ruby
|
400
|
+
Money.from_amount(2.34567).format #=> "$2.35"
|
401
|
+
```
|
402
|
+
|
403
|
+
To retain the additional precision, you will also need to set `infinite_precision` to `true`.
|
404
|
+
|
405
|
+
```ruby
|
406
|
+
Money.infinite_precision = true
|
407
|
+
Money.from_amount(2.34567).format #=> "$2.34567"
|
408
|
+
```
|
409
|
+
|
410
|
+
To round to the nearest cent (or anything more precise), you can use the `round` method. However, note that the `round` method on a `Money` object does not work the same way as a normal Ruby `Float` object. Money's `round` method accepts different arguments. The first argument to the round method is the rounding mode, while the second argument is the level of precision relative to the cent.
|
411
|
+
|
412
|
+
```
|
413
|
+
# Float
|
414
|
+
2.34567.round #=> 2
|
415
|
+
2.34567.round(2) #=> 2.35
|
416
|
+
|
417
|
+
# Money
|
418
|
+
Money.infinite_precision = true
|
419
|
+
Money.new(2.34567).format #=> "$0.0234567"
|
420
|
+
Money.new(2.34567).round.format #=> "$0.02"
|
421
|
+
Money.new(2.34567).round(BigDecimal::ROUND_HALF_UP, 2).format #=> "$0.0235"
|
422
|
+
```
|
423
|
+
|
395
424
|
## Ruby on Rails
|
396
425
|
|
397
426
|
To integrate money in a Rails application use [money-rails](https://github.com/RubyMoney/money-rails).
|
data/config/currency_iso.json
CHANGED
@@ -1647,12 +1647,12 @@
|
|
1647
1647
|
"priority": 100,
|
1648
1648
|
"iso_code": "PEN",
|
1649
1649
|
"name": "Peruvian Sol",
|
1650
|
-
"symbol": "S
|
1650
|
+
"symbol": "S/",
|
1651
1651
|
"alternate_symbols": [],
|
1652
1652
|
"subunit": "Céntimo",
|
1653
1653
|
"subunit_to_unit": 100,
|
1654
1654
|
"symbol_first": true,
|
1655
|
-
"html_entity": "S
|
1655
|
+
"html_entity": "S/",
|
1656
1656
|
"decimal_mark": ".",
|
1657
1657
|
"thousands_separator": ",",
|
1658
1658
|
"iso_numeric": "604",
|
data/lib/money/money.rb
CHANGED
@@ -276,10 +276,13 @@ class Money
|
|
276
276
|
# Money.new(100, "EUR") #=> #<Money @fractional=100 @currency="EUR">
|
277
277
|
#
|
278
278
|
def initialize(obj, currency = Money.default_currency, bank = Money.default_bank)
|
279
|
-
@fractional = obj.respond_to?(:fractional) ? obj.fractional :
|
279
|
+
@fractional = as_d(obj.respond_to?(:fractional) ? obj.fractional : obj)
|
280
280
|
@currency = obj.respond_to?(:currency) ? obj.currency : Currency.wrap(currency)
|
281
281
|
@currency ||= Money.default_currency
|
282
282
|
@bank = obj.respond_to?(:bank) ? obj.bank : bank
|
283
|
+
|
284
|
+
# BigDecimal can be Infinity and NaN, money of that amount does not make sense
|
285
|
+
raise ArgumentError, 'must be initialized with a finite value' unless @fractional.finite?
|
283
286
|
end
|
284
287
|
|
285
288
|
# Assuming using a currency using dollars:
|
@@ -24,8 +24,11 @@ class Money
|
|
24
24
|
parts_sum = parts.inject(0, :+)
|
25
25
|
part = parts.pop
|
26
26
|
|
27
|
-
current_split =
|
28
|
-
|
27
|
+
current_split = 0
|
28
|
+
if parts_sum > 0
|
29
|
+
current_split = remaining_amount * part / parts_sum
|
30
|
+
current_split = current_split.truncate if whole_amounts
|
31
|
+
end
|
29
32
|
|
30
33
|
result.unshift current_split
|
31
34
|
remaining_amount -= current_split
|
@@ -103,15 +103,18 @@ class Money
|
|
103
103
|
|
104
104
|
def warn_about_deprecated_rules(rules)
|
105
105
|
if rules.has_key?(:symbol_position)
|
106
|
-
|
106
|
+
position = rules[:symbol_position]
|
107
|
+
template = position == :before ? '%u %n' : '%n %u'
|
108
|
+
|
109
|
+
warn "[DEPRECATION] `symbol_position: :#{position}` is deprecated - you can replace it with `format: #{template}`"
|
107
110
|
end
|
108
111
|
|
109
112
|
if rules.has_key?(:symbol_before_without_space)
|
110
|
-
warn
|
113
|
+
warn "[DEPRECATION] `symbol_before_without_space:` option is deprecated - you can replace it with `format: '%u%n'`"
|
111
114
|
end
|
112
115
|
|
113
116
|
if rules.has_key?(:symbol_after_without_space)
|
114
|
-
warn
|
117
|
+
warn "[DEPRECATION] `symbol_after_without_space:` option is deprecated - you can replace it with `format: '%n%u'`"
|
115
118
|
end
|
116
119
|
|
117
120
|
if rules.has_key?(:html)
|
@@ -121,7 +124,6 @@ class Money
|
|
121
124
|
if rules.has_key?(:html_wrap_symbol)
|
122
125
|
warn "[DEPRECATION] `html_wrap_symbol` is deprecated - use `html_wrap` instead. Please note that `html_wrap` will wrap all parts of currency."
|
123
126
|
end
|
124
|
-
|
125
127
|
end
|
126
128
|
end
|
127
129
|
end
|
data/lib/money/version.rb
CHANGED
data/money.gemspec
CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
|
|
16
16
|
|
17
17
|
s.add_dependency 'i18n', [">= 0.6.4", '<= 2']
|
18
18
|
|
19
|
-
s.add_development_dependency "bundler"
|
19
|
+
s.add_development_dependency "bundler"
|
20
20
|
s.add_development_dependency "rake"
|
21
21
|
s.add_development_dependency "rspec", "~> 3.4"
|
22
22
|
s.add_development_dependency "yard", "~> 0.9.11"
|
@@ -21,7 +21,7 @@ describe Money::LocaleBackend::I18n do
|
|
21
21
|
before do
|
22
22
|
I18n.locale = :de
|
23
23
|
I18n.backend.store_translations(:de, number: {
|
24
|
-
currency: { format: { delimiter: '.', separator: ',' } }
|
24
|
+
currency: { format: { delimiter: '.', separator: ',', unit: '$' } }
|
25
25
|
})
|
26
26
|
end
|
27
27
|
|
@@ -32,6 +32,10 @@ describe Money::LocaleBackend::I18n do
|
|
32
32
|
it 'returns decimal_mark based on the current locale' do
|
33
33
|
expect(subject.lookup(:decimal_mark, nil)).to eq(',')
|
34
34
|
end
|
35
|
+
|
36
|
+
it 'returns symbol based on the current locale' do
|
37
|
+
expect(subject.lookup(:symbol, nil)).to eq('$')
|
38
|
+
end
|
35
39
|
end
|
36
40
|
|
37
41
|
context 'with number.format defined' do
|
@@ -57,6 +61,10 @@ describe Money::LocaleBackend::I18n do
|
|
57
61
|
it 'returns decimal_mark based on the current locale' do
|
58
62
|
expect(subject.lookup(:decimal_mark, nil)).to eq(nil)
|
59
63
|
end
|
64
|
+
|
65
|
+
it 'returns symbol based on the current locale' do
|
66
|
+
expect(subject.lookup(:symbol, nil)).to eq(nil)
|
67
|
+
end
|
60
68
|
end
|
61
69
|
end
|
62
70
|
end
|
@@ -87,6 +87,11 @@ describe Money::Allocation do
|
|
87
87
|
expect(described_class.generate(10, [1, 1, 2])).to eq([3, 2, 5])
|
88
88
|
expect(described_class.generate(100, [1, 1, 1])).to eq([34, 33, 33])
|
89
89
|
end
|
90
|
+
|
91
|
+
it 'handles zero arguments' do
|
92
|
+
expect(described_class.generate(100, [1, 1, 0])).to eq([50, 50, 0])
|
93
|
+
expect(described_class.generate(100, [0, 1, 1])).to eq([0, 50, 50])
|
94
|
+
end
|
90
95
|
end
|
91
96
|
|
92
97
|
context 'fractional amounts' do
|
data/spec/money_spec.rb
CHANGED
@@ -92,6 +92,20 @@ describe Money do
|
|
92
92
|
end
|
93
93
|
end
|
94
94
|
|
95
|
+
context 'non-finite value is given' do
|
96
|
+
let(:error) { 'must be initialized with a finite value' }
|
97
|
+
|
98
|
+
it 'raises an error when trying to initialize with Infinity' do
|
99
|
+
expect { Money.new('Infinity') }.to raise_error(ArgumentError, error)
|
100
|
+
expect { Money.new(BigDecimal('Infinity')) }.to raise_error(ArgumentError, error)
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'raises an error when trying to initialize with NaN' do
|
104
|
+
expect { Money.new('NaN') }.to raise_error(ArgumentError, error)
|
105
|
+
expect { Money.new(BigDecimal('NaN')) }.to raise_error(ArgumentError, error)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
95
109
|
context "with infinite_precision", :infinite_precision do
|
96
110
|
context 'given the initializing value is 1.50' do
|
97
111
|
let(:initializing_value) { 1.50 }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
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.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shane Emmons
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: i18n
|
@@ -34,16 +34,16 @@ dependencies:
|
|
34
34
|
name: bundler
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
|
-
- - "
|
37
|
+
- - ">="
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version: '
|
39
|
+
version: '0'
|
40
40
|
type: :development
|
41
41
|
prerelease: false
|
42
42
|
version_requirements: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
44
|
-
- - "
|
44
|
+
- - ">="
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version: '
|
46
|
+
version: '0'
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rake
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|