money 6.9.0 → 6.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec +2 -1
- data/.travis.yml +5 -3
- data/CHANGELOG.md +10 -0
- data/README.md +11 -11
- data/config/currency_iso.json +5 -5
- data/config/currency_non_iso.json +16 -0
- data/lib/money/money.rb +1 -1
- data/lib/money/money/arithmetic.rb +1 -0
- data/lib/money/rates_store/memory.rb +1 -2
- data/lib/money/version.rb +1 -1
- data/money.gemspec +1 -1
- data/spec/money/arithmetic_spec.rb +33 -2
- data/spec/money_spec.rb +16 -0
- data/spec/rates_store/memory_spec.rb +11 -0
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 19c937d927f70901c2a2deda19899ec893b567b1
|
4
|
+
data.tar.gz: 213e8242c26aadfb1030453815547765ea030022
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0bb443e04dccacd832fd53fad627eb4076b895a79da97adb29c32407689ddb53a95e3dc4e36ab8e9e5b5f764a13a3a579ea887a53ee748e2c60dea05ef882596
|
7
|
+
data.tar.gz: dce49cc4288a72a187ca03d709abd9659d9dab3965ade09fe5f86c69034a09a5106f4da57da2d3201233f256c1353a2661d95b70f2deb19cede3a6d4ac022ec4
|
data/.rspec
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
--require spec_helper
|
1
|
+
--require spec_helper
|
2
|
+
--color
|
data/.travis.yml
CHANGED
@@ -4,9 +4,9 @@ rvm:
|
|
4
4
|
- 1.9.3
|
5
5
|
- 2.0.0
|
6
6
|
- 2.1.10
|
7
|
-
- 2.2.
|
8
|
-
- 2.3.
|
9
|
-
- 2.4.
|
7
|
+
- 2.2.7
|
8
|
+
- 2.3.4
|
9
|
+
- 2.4.1
|
10
10
|
- rbx-2
|
11
11
|
- jruby-9.0.5.0
|
12
12
|
- jruby-9.1.2.0
|
@@ -18,6 +18,8 @@ matrix:
|
|
18
18
|
- rvm: jruby-head
|
19
19
|
- rvm: rbx-2
|
20
20
|
fast_finish: true
|
21
|
+
before_install:
|
22
|
+
- gem update bundler
|
21
23
|
script: bundle exec rspec spec
|
22
24
|
notifications:
|
23
25
|
email:
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 6.10.0
|
4
|
+
- Added support for i18n version 0.9
|
5
|
+
- Disabled rounding when verifying allocation splits
|
6
|
+
- Added Chinese Yuan Offshore (CNH)
|
7
|
+
- Fixed html_entity for ARS
|
8
|
+
- Fixed KZT symbol
|
9
|
+
- Allowed comparing cross currency when both are zero
|
10
|
+
- Fixed memory rate store
|
11
|
+
- Corrected HUF subunit and thousands separator config
|
12
|
+
|
3
13
|
## 6.9.0
|
4
14
|
- Extracted heuristics into money-heuristics gem
|
5
15
|
|
data/README.md
CHANGED
@@ -119,15 +119,15 @@ below.
|
|
119
119
|
|
120
120
|
``` ruby
|
121
121
|
curr = {
|
122
|
-
:priority
|
123
|
-
:iso_code
|
124
|
-
:iso_numeric
|
125
|
-
:name
|
126
|
-
:symbol
|
127
|
-
:subunit
|
128
|
-
:subunit_to_unit
|
129
|
-
:
|
130
|
-
:
|
122
|
+
:priority => 1,
|
123
|
+
:iso_code => "USD",
|
124
|
+
:iso_numeric => "840",
|
125
|
+
:name => "United States Dollar",
|
126
|
+
:symbol => "$",
|
127
|
+
:subunit => "Cent",
|
128
|
+
:subunit_to_unit => 100,
|
129
|
+
:decimal_mark => ".",
|
130
|
+
:thousands_separator => ","
|
131
131
|
}
|
132
132
|
|
133
133
|
Money::Currency.register(curr)
|
@@ -142,8 +142,8 @@ The pre-defined set of attributes includes:
|
|
142
142
|
- `:symbol` the currency symbol (UTF-8 encoded)
|
143
143
|
- `:subunit` the name of the fractional monetary unit
|
144
144
|
- `:subunit_to_unit` the proportion between the unit and the subunit
|
145
|
-
- `:
|
146
|
-
- `:
|
145
|
+
- `:decimal_mark` character between the whole and fraction amounts
|
146
|
+
- `:thousands_separator` character between each thousands place
|
147
147
|
|
148
148
|
All attributes except `:iso_code` are optional. Some attributes, such as
|
149
149
|
`:symbol`, are used by the Money class to print out a representation of the
|
data/config/currency_iso.json
CHANGED
@@ -100,7 +100,7 @@
|
|
100
100
|
"subunit": "Centavo",
|
101
101
|
"subunit_to_unit": 100,
|
102
102
|
"symbol_first": true,
|
103
|
-
"html_entity": "
|
103
|
+
"html_entity": "$",
|
104
104
|
"decimal_mark": ",",
|
105
105
|
"thousands_separator": ".",
|
106
106
|
"iso_numeric": "032",
|
@@ -931,12 +931,12 @@
|
|
931
931
|
"name": "Hungarian Forint",
|
932
932
|
"symbol": "Ft",
|
933
933
|
"alternate_symbols": [],
|
934
|
-
"subunit": "
|
934
|
+
"subunit": "",
|
935
935
|
"subunit_to_unit": 1,
|
936
936
|
"symbol_first": false,
|
937
937
|
"html_entity": "",
|
938
938
|
"decimal_mark": ",",
|
939
|
-
"thousands_separator": "
|
939
|
+
"thousands_separator": " ",
|
940
940
|
"iso_numeric": "348",
|
941
941
|
"smallest_denomination": 5
|
942
942
|
},
|
@@ -1202,7 +1202,7 @@
|
|
1202
1202
|
"priority": 100,
|
1203
1203
|
"iso_code": "KZT",
|
1204
1204
|
"name": "Kazakhstani Tenge",
|
1205
|
-
"symbol": "
|
1205
|
+
"symbol": "₸",
|
1206
1206
|
"alternate_symbols": [],
|
1207
1207
|
"subunit": "Tiyn",
|
1208
1208
|
"subunit_to_unit": 100,
|
@@ -2561,7 +2561,7 @@
|
|
2561
2561
|
},
|
2562
2562
|
"xts": {
|
2563
2563
|
"priority": 100,
|
2564
|
-
"iso_code": "
|
2564
|
+
"iso_code": "XTS",
|
2565
2565
|
"name": "Codes specifically reserved for testing purposes",
|
2566
2566
|
"symbol": "",
|
2567
2567
|
"alternate_symbols": [],
|
@@ -93,5 +93,21 @@
|
|
93
93
|
"thousands_separator": ",",
|
94
94
|
"iso_numeric": "",
|
95
95
|
"smallest_denomination": 1
|
96
|
+
},
|
97
|
+
"cnh": {
|
98
|
+
"priority": 100,
|
99
|
+
"iso_code": "CNH",
|
100
|
+
"name": "Chinese Renminbi Yuan Offshore",
|
101
|
+
"symbol": "¥",
|
102
|
+
"disambiguate_symbol": "CNH",
|
103
|
+
"alternate_symbols": ["CN¥", "元", "CN元"],
|
104
|
+
"subunit": "Fen",
|
105
|
+
"subunit_to_unit": 100,
|
106
|
+
"symbol_first": true,
|
107
|
+
"html_entity": "¥",
|
108
|
+
"decimal_mark": ".",
|
109
|
+
"thousands_separator": ",",
|
110
|
+
"iso_numeric": "",
|
111
|
+
"smallest_denomination": 1
|
96
112
|
}
|
97
113
|
}
|
data/lib/money/money.rb
CHANGED
@@ -57,6 +57,7 @@ class Money
|
|
57
57
|
return unless other.respond_to?(:zero?) && other.zero?
|
58
58
|
return other.is_a?(CoercedNumeric) ? 0 <=> fractional : fractional <=> 0
|
59
59
|
end
|
60
|
+
return 0 if zero? && other.zero?
|
60
61
|
other = other.exchange_to(currency)
|
61
62
|
fractional <=> other.fractional
|
62
63
|
rescue Money::Bank::UnknownRate
|
data/lib/money/version.rb
CHANGED
data/money.gemspec
CHANGED
@@ -14,7 +14,7 @@ Gem::Specification.new do |s|
|
|
14
14
|
s.description = "A Ruby Library for dealing with money and currency conversion."
|
15
15
|
s.license = "MIT"
|
16
16
|
|
17
|
-
s.add_dependency 'i18n', [
|
17
|
+
s.add_dependency 'i18n', [">= 0.6.4", '< 1.0']
|
18
18
|
|
19
19
|
s.add_development_dependency "bundler", "~> 1.3"
|
20
20
|
s.add_development_dependency "rake"
|
@@ -23,7 +23,6 @@ describe Money do
|
|
23
23
|
end
|
24
24
|
|
25
25
|
it "returns true if both amounts are zero, even if currency differs" do
|
26
|
-
allow_any_instance_of(Money).to receive(:exchange_to) { Money.usd(0) }
|
27
26
|
expect(Money.new(0, "USD")).to eq Money.new(0, "USD")
|
28
27
|
expect(Money.new(0, "USD")).to eq Money.new(0, "EUR")
|
29
28
|
expect(Money.new(0, "USD")).to eq Money.new(0, "AUD")
|
@@ -69,6 +68,12 @@ describe Money do
|
|
69
68
|
expect(Money.new(1_00, "USD").eql?(Money.new(99_00, "EUR"))).to be false
|
70
69
|
end
|
71
70
|
|
71
|
+
it "returns true when their amounts are zero and currencies differ" do
|
72
|
+
expect(Money.new(0, "USD").eql?(Money.new(0, "EUR"))).to be true
|
73
|
+
expect(Money.new(0, "USD").eql?(Money.new(0, "USD"))).to be true
|
74
|
+
expect(Money.new(0, "AUD").eql?(Money.new(0, "EUR"))).to be true
|
75
|
+
end
|
76
|
+
|
72
77
|
it "returns false if used to compare with an object that doesn't inherit from Money" do
|
73
78
|
expect(Money.new(1_00, "USD").eql?(Object.new)).to be false
|
74
79
|
expect(Money.new(1_00, "USD").eql?(Class)).to be false
|
@@ -130,6 +135,32 @@ describe Money do
|
|
130
135
|
expect(Money.new(1_00) <=> /foo/).to be_nil
|
131
136
|
end
|
132
137
|
|
138
|
+
context 'when conversions disallowed' do
|
139
|
+
around do |example|
|
140
|
+
begin
|
141
|
+
old_default_bank = Money.default_bank
|
142
|
+
Money.disallow_currency_conversion!
|
143
|
+
example.run
|
144
|
+
ensure
|
145
|
+
Money.default_bank = old_default_bank
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
context 'when currencies differ' do
|
150
|
+
context 'when both values are 1_00' do
|
151
|
+
it 'raises currency error' do
|
152
|
+
expect { Money.usd(1_00) <=> Money.gbp(1_00) }.to raise_error Money::Bank::DifferentCurrencyError
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
context 'when both values are 0' do
|
157
|
+
it 'considers them equal' do
|
158
|
+
expect(Money.usd(0) <=> Money.gbp(0)).to eq(0)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
133
164
|
it 'compares with numeric 0' do
|
134
165
|
expect(Money.usd(1) < 0).to eq false
|
135
166
|
expect(Money.usd(1) > 0.0).to eq true
|
@@ -661,7 +692,7 @@ describe Money do
|
|
661
692
|
end
|
662
693
|
end
|
663
694
|
|
664
|
-
%w(+ - /
|
695
|
+
%w(+ - / divmod remainder).each do |op|
|
665
696
|
describe "##{op}" do
|
666
697
|
subject { ->(other = self.other) { instance.send(op, other) } }
|
667
698
|
let(:instance) { Money.usd(1) }
|
data/spec/money_spec.rb
CHANGED
@@ -598,6 +598,22 @@ YAML
|
|
598
598
|
expect(moneys[2].cents).to eq 33
|
599
599
|
end
|
600
600
|
|
601
|
+
it "does not round rationals" do
|
602
|
+
splits = 7.times.map { Rational(950, 6650) }
|
603
|
+
moneys = Money.us_dollar(6650).allocate(splits)
|
604
|
+
moneys.each do |money|
|
605
|
+
expect(money.cents).to eq 950
|
606
|
+
end
|
607
|
+
end
|
608
|
+
|
609
|
+
it "handles mixed split types" do
|
610
|
+
splits = [Rational(1, 4), 0.25, 0.25, BigDecimal.new('0.25')]
|
611
|
+
moneys = Money.us_dollar(100).allocate(splits)
|
612
|
+
moneys.each do |money|
|
613
|
+
expect(money.cents).to eq 25
|
614
|
+
end
|
615
|
+
end
|
616
|
+
|
601
617
|
context "negative amount" do
|
602
618
|
it "does not lose pennies" do
|
603
619
|
moneys = Money.us_dollar(-100).allocate([0.333, 0.333, 0.333])
|
@@ -66,4 +66,15 @@ describe Money::RatesStore::Memory do
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
end
|
69
|
+
|
70
|
+
describe '#marshal_dump' do
|
71
|
+
let(:subject) { Money::RatesStore::Memory.new(:optional => true) }
|
72
|
+
|
73
|
+
it 'can reload' do
|
74
|
+
bank = Money::Bank::VariableExchange.new(subject)
|
75
|
+
bank = Marshal.load(Marshal.dump(bank))
|
76
|
+
expect(bank.store.instance_variable_get(:@options)).to eq subject.instance_variable_get(:@options)
|
77
|
+
expect(bank.store.instance_variable_get(:@index)).to eq subject.instance_variable_get(:@index)
|
78
|
+
end
|
79
|
+
end
|
69
80
|
end
|
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.
|
4
|
+
version: 6.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shane Emmons
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-04
|
11
|
+
date: 2017-11-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: i18n
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
version: 0.6.4
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '0
|
22
|
+
version: '1.0'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
version: 0.6.4
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '0
|
32
|
+
version: '1.0'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: bundler
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|