money 6.13.2 → 6.13.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,17 +0,0 @@
1
- # Contribution Guidelines
2
-
3
- ## Steps
4
-
5
- 1. Fork [the repo](https://github.com/RubyMoney/money)
6
- 2. Grab dependencies: `bundle install`
7
- 3. Make sure everything is working: `bundle exec rake spec`
8
- 4. Make your changes
9
- 5. Test your changes
10
- 5. Create a Pull Request
11
- 6. Celebrate!!!!!
12
-
13
- ## Notes
14
-
15
- When contributing, please make sure to update the CHANGELOG and AUTHORS files
16
- when you submit your pull request. Upon merging of your first pull request,
17
- you will be given commit access to the repository.
data/Gemfile DELETED
@@ -1,17 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gem 'coveralls', '>= 0.8.17', require: false
4
- gem 'pry', require: false
5
-
6
- # JSON gem no longer supports ruby < 2.0.0
7
- if defined?(JRUBY_VERSION)
8
- gem 'json'
9
- elsif RUBY_VERSION =~ /^1/
10
- # Legacy gem locks for ruby 1.9.x
11
- gem 'json', '~> 1.8.3'
12
- gem 'tins', '~> 1.6.0'
13
- gem 'term-ansicolor', '< 1.4'
14
- end
15
- gem 'i18n', '<= 1.2.0' if RUBY_VERSION < '2.3'
16
-
17
- gemspec
data/Rakefile DELETED
@@ -1,17 +0,0 @@
1
- require "bundler/gem_tasks"
2
- require "rake/clean"
3
- require "rspec/core/rake_task"
4
-
5
- CLOBBER.include('doc', '.yardoc')
6
-
7
- require "yard"
8
-
9
- YARD::Rake::YardocTask.new do |t|
10
- t.options << "--files" << "CHANGELOG.md,LICENSE"
11
- end
12
-
13
- RSpec::Core::RakeTask.new(:spec) do |t|
14
- t.fail_on_error = false
15
- end
16
-
17
- task default: :spec
@@ -1,79 +0,0 @@
1
- class Money
2
- module Bank
3
- describe Base do
4
-
5
- describe ".instance" do
6
- it "is local to one class" do
7
- klass = Base
8
- subclass = Class.new(Base)
9
- expect(klass.instance).not_to eq subclass.instance
10
- end
11
- end
12
-
13
- describe "#initialize" do
14
- it "accepts a block and stores @rounding_method" do
15
- proc = Proc.new { |n| n.ceil }
16
- bank = Base.new(&proc)
17
- expect(bank.rounding_method).to eq proc
18
- end
19
- end
20
-
21
- describe "#setup" do
22
- it "calls #setup after #initialize" do
23
- class MyBank < Base
24
- attr_reader :setup_called
25
-
26
- def setup
27
- @setup_called = true
28
- end
29
- end
30
-
31
- bank = MyBank.new
32
- expect(bank.setup_called).to eq true
33
- end
34
- end
35
-
36
- describe "#exchange_with" do
37
- it "is not implemented" do
38
- expect { subject.exchange_with(Money.new(100, 'USD'), 'EUR') }.to raise_exception(NotImplementedError)
39
- end
40
- end
41
-
42
- describe "#same_currency?" do
43
- it "accepts str/str" do
44
- expect { subject.send(:same_currency?, 'USD', 'EUR') }.to_not raise_exception
45
- end
46
-
47
- it "accepts currency/str" do
48
- expect { subject.send(:same_currency?, Currency.wrap('USD'), 'EUR') }.to_not raise_exception
49
- end
50
-
51
- it "accepts str/currency" do
52
- expect { subject.send(:same_currency?, 'USD', Currency.wrap('EUR')) }.to_not raise_exception
53
- end
54
-
55
- it "accepts currency/currency" do
56
- expect { subject.send(:same_currency?, Currency.wrap('USD'), Currency.wrap('EUR')) }.to_not raise_exception
57
- end
58
-
59
- it "returns true when currencies match" do
60
- expect(subject.send(:same_currency?, 'USD', 'USD')).to be true
61
- expect(subject.send(:same_currency?, Currency.wrap('USD'), 'USD')).to be true
62
- expect(subject.send(:same_currency?, 'USD', Currency.wrap('USD'))).to be true
63
- expect(subject.send(:same_currency?, Currency.wrap('USD'), Currency.wrap('USD'))).to be true
64
- end
65
-
66
- it "returns false when currencies do not match" do
67
- expect(subject.send(:same_currency?, 'USD', 'EUR')).to be false
68
- expect(subject.send(:same_currency?, Currency.wrap('USD'), 'EUR')).to be false
69
- expect(subject.send(:same_currency?, 'USD', Currency.wrap('EUR'))).to be false
70
- expect(subject.send(:same_currency?, Currency.wrap('USD'), Currency.wrap('EUR'))).to be false
71
- end
72
-
73
- it "raises an UnknownCurrency exception when an unknown currency is passed" do
74
- expect { subject.send(:same_currency?, 'AAA', 'BBB') }.to raise_exception(Currency::UnknownCurrency)
75
- end
76
- end
77
- end
78
- end
79
- end
@@ -1,13 +0,0 @@
1
- class Money
2
- module Bank
3
- describe SingleCurrency do
4
- describe "#exchange_with" do
5
- it "raises when called" do
6
- expect {
7
- subject.exchange_with(Money.new(100, 'USD'), 'EUR')
8
- }.to raise_exception(DifferentCurrencyError, "No exchanging of currencies allowed: 1.00 USD to EUR")
9
- end
10
- end
11
- end
12
- end
13
- end
@@ -1,265 +0,0 @@
1
- require 'json'
2
- require 'yaml'
3
-
4
- class Money
5
- module Bank
6
- describe VariableExchange do
7
-
8
- describe "#initialize" do
9
- context "without &block" do
10
- let(:bank) {
11
- VariableExchange.new.tap do |bank|
12
- bank.add_rate('USD', 'EUR', 1.33)
13
- end
14
- }
15
-
16
- describe '#store' do
17
- it 'defaults to Memory store' do
18
- expect(bank.store).to be_a(Money::RatesStore::Memory)
19
- end
20
- end
21
-
22
- describe 'custom store' do
23
- let(:custom_store) { Object.new }
24
-
25
- let(:bank) { VariableExchange.new(custom_store) }
26
-
27
- it 'sets #store to be custom store' do
28
- expect(bank.store).to eql(custom_store)
29
- end
30
- end
31
-
32
- describe "#exchange_with" do
33
- it "accepts str" do
34
- expect { bank.exchange_with(Money.new(100, 'USD'), 'EUR') }.to_not raise_exception
35
- end
36
-
37
- it "accepts currency" do
38
- expect { bank.exchange_with(Money.new(100, 'USD'), Currency.wrap('EUR')) }.to_not raise_exception
39
- end
40
-
41
- it "exchanges one currency to another" do
42
- expect(bank.exchange_with(Money.new(100, 'USD'), 'EUR')).to eq Money.new(133, 'EUR')
43
- end
44
-
45
- it "truncates extra digits" do
46
- expect(bank.exchange_with(Money.new(10, 'USD'), 'EUR')).to eq Money.new(13, 'EUR')
47
- end
48
-
49
- it "raises an UnknownCurrency exception when an unknown currency is requested" do
50
- expect { bank.exchange_with(Money.new(100, 'USD'), 'BBB') }.to raise_exception(Currency::UnknownCurrency)
51
- end
52
-
53
- it "raises an UnknownRate exception when an unknown rate is requested" do
54
- expect { bank.exchange_with(Money.new(100, 'USD'), 'JPY') }.to raise_exception(UnknownRate)
55
- end
56
-
57
- #it "rounds the exchanged result down" do
58
- # bank.add_rate("USD", "EUR", 0.788332676)
59
- # bank.add_rate("EUR", "YEN", 122.631477)
60
- # expect(bank.exchange_with(Money.new(10_00, "USD"), "EUR")).to eq Money.new(788, "EUR")
61
- # expect(bank.exchange_with(Money.new(500_00, "EUR"), "YEN")).to eq Money.new(6131573, "YEN")
62
- #end
63
-
64
- it "accepts a custom truncation method" do
65
- proc = Proc.new { |n| n.ceil }
66
- expect(bank.exchange_with(Money.new(10, 'USD'), 'EUR', &proc)).to eq Money.new(14, 'EUR')
67
- end
68
-
69
- it 'works with big numbers' do
70
- amount = 10**20
71
- expect(bank.exchange_with(Money.usd(amount), :EUR)).to eq Money.eur(1.33 * amount)
72
- end
73
-
74
- it "preserves the class in the result when given a subclass of Money" do
75
- special_money_class = Class.new(Money)
76
- expect(bank.exchange_with(special_money_class.new(100, 'USD'), 'EUR')).to be_a special_money_class
77
- end
78
-
79
- it "doesn't loose precision when handling larger amounts" do
80
- expect(bank.exchange_with(Money.new(100_000_000_000_000_01, 'USD'), 'EUR')).to eq Money.new(133_000_000_000_000_01, 'EUR')
81
- end
82
- end
83
- end
84
-
85
- context "with &block" do
86
- let(:bank) {
87
- proc = Proc.new { |n| n.ceil }
88
- VariableExchange.new(&proc).tap do |bank|
89
- bank.add_rate('USD', 'EUR', 1.33)
90
- end
91
- }
92
-
93
- describe "#exchange_with" do
94
- it "uses the stored truncation method" do
95
- expect(bank.exchange_with(Money.new(10, 'USD'), 'EUR')).to eq Money.new(14, 'EUR')
96
- end
97
-
98
- it "accepts a custom truncation method" do
99
- proc = Proc.new { |n| n.ceil + 1 }
100
- expect(bank.exchange_with(Money.new(10, 'USD'), 'EUR', &proc)).to eq Money.new(15, 'EUR')
101
- end
102
- end
103
- end
104
- end
105
-
106
- describe "#add_rate" do
107
- it 'delegates to store#add_rate' do
108
- expect(subject.store).to receive(:add_rate).with('USD', 'EUR', 1.25).and_return 1.25
109
- expect(subject.add_rate('USD', 'EUR', 1.25)).to eql 1.25
110
- end
111
-
112
- it "adds rates with correct ISO codes" do
113
- expect(subject.store).to receive(:add_rate).with('USD', 'EUR', 0.788332676)
114
- subject.add_rate("USD", "EUR", 0.788332676)
115
-
116
- expect(subject.store).to receive(:add_rate).with('EUR', 'JPY', 122.631477)
117
- subject.add_rate("EUR", "YEN", 122.631477)
118
- end
119
-
120
- it "treats currency names case-insensitively" do
121
- subject.add_rate("usd", "eur", 1)
122
- expect(subject.get_rate('USD', 'EUR')).to eq 1
123
- end
124
- end
125
-
126
- describe "#set_rate" do
127
- it 'delegates to store#add_rate' do
128
- expect(subject.store).to receive(:add_rate).with('USD', 'EUR', 1.25).and_return 1.25
129
- expect(subject.set_rate('USD', 'EUR', 1.25)).to eql 1.25
130
- end
131
-
132
- it "sets a rate" do
133
- subject.set_rate('USD', 'EUR', 1.25)
134
- expect(subject.store.get_rate('USD', 'EUR')).to eq 1.25
135
- end
136
-
137
- it "raises an UnknownCurrency exception when an unknown currency is passed" do
138
- expect { subject.set_rate('AAA', 'BBB', 1.25) }.to raise_exception(Currency::UnknownCurrency)
139
- end
140
- end
141
-
142
- describe "#get_rate" do
143
- it "returns a rate" do
144
- subject.set_rate('USD', 'EUR', 1.25)
145
- expect(subject.get_rate('USD', 'EUR')).to eq 1.25
146
- end
147
-
148
- it "raises an UnknownCurrency exception when an unknown currency is passed" do
149
- expect { subject.get_rate('AAA', 'BBB') }.to raise_exception(Currency::UnknownCurrency)
150
- end
151
-
152
- it "delegates options to store, options are a no-op" do
153
- expect(subject.store).to receive(:get_rate).with('USD', 'EUR')
154
- subject.get_rate('USD', 'EUR', without_mutex: true)
155
- end
156
- end
157
-
158
- describe "#export_rates" do
159
- before :each do
160
- subject.set_rate('USD', 'EUR', 1.25)
161
- subject.set_rate('USD', 'JPY', 2.55)
162
-
163
- @rates = { "USD_TO_EUR" => 1.25, "USD_TO_JPY" => 2.55 }
164
- end
165
-
166
- context "with format == :json" do
167
- it "should return rates formatted as json" do
168
- json = subject.export_rates(:json)
169
- expect(JSON.load(json)).to eq @rates
170
- end
171
- end
172
-
173
- context "with format == :ruby" do
174
- it "should return rates formatted as ruby objects" do
175
- expect(Marshal.load(subject.export_rates(:ruby))).to eq @rates
176
- end
177
- end
178
-
179
- context "with format == :yaml" do
180
- it "should return rates formatted as yaml" do
181
- yaml = subject.export_rates(:yaml)
182
- expect(YAML.load(yaml)).to eq @rates
183
- end
184
- end
185
-
186
- context "with unknown format" do
187
- it "raises Money::Bank::UnknownRateFormat" do
188
- expect { subject.export_rates(:foo)}.to raise_error UnknownRateFormat
189
- end
190
- end
191
-
192
- context "with :file provided" do
193
- it "writes rates to file" do
194
- f = double('IO')
195
- expect(File).to receive(:open).with('null', 'w').and_yield(f)
196
- expect(f).to receive(:write).with(JSON.dump(@rates))
197
-
198
- subject.export_rates(:json, 'null')
199
- end
200
- end
201
-
202
- it "delegates execution to store, options are a no-op" do
203
- expect(subject.store).to receive(:transaction)
204
- subject.export_rates(:yaml, nil, foo: 1)
205
- end
206
-
207
- end
208
-
209
- describe "#import_rates" do
210
- context "with format == :json" do
211
- it "loads the rates provided" do
212
- s = '{"USD_TO_EUR":1.25,"USD_TO_JPY":2.55}'
213
- subject.import_rates(:json, s)
214
- expect(subject.get_rate('USD', 'EUR')).to eq 1.25
215
- expect(subject.get_rate('USD', 'JPY')).to eq 2.55
216
- end
217
- end
218
-
219
- context "with format == :ruby" do
220
- it "loads the rates provided" do
221
- s = Marshal.dump({"USD_TO_EUR"=>1.25,"USD_TO_JPY"=>2.55})
222
- subject.import_rates(:ruby, s)
223
- expect(subject.get_rate('USD', 'EUR')).to eq 1.25
224
- expect(subject.get_rate('USD', 'JPY')).to eq 2.55
225
- end
226
- end
227
-
228
- context "with format == :yaml" do
229
- it "loads the rates provided" do
230
- s = "--- \nUSD_TO_EUR: 1.25\nUSD_TO_JPY: 2.55\n"
231
- subject.import_rates(:yaml, s)
232
- expect(subject.get_rate('USD', 'EUR')).to eq 1.25
233
- expect(subject.get_rate('USD', 'JPY')).to eq 2.55
234
- end
235
- end
236
-
237
- context "with unknown format" do
238
- it "raises Money::Bank::UnknownRateFormat" do
239
- expect { subject.import_rates(:foo, "")}.to raise_error UnknownRateFormat
240
- end
241
- end
242
-
243
- it "delegates execution to store#transaction" do
244
- expect(subject.store).to receive(:transaction)
245
- s = "--- \nUSD_TO_EUR: 1.25\nUSD_TO_JPY: 2.55\n"
246
- subject.import_rates(:yaml, s, foo: 1)
247
- end
248
-
249
- end
250
-
251
- describe "#marshal_dump" do
252
- it "does not raise an error" do
253
- expect { Marshal.dump(subject) }.to_not raise_error
254
- end
255
-
256
- it "works with Marshal.load" do
257
- bank = Marshal.load(Marshal.dump(subject))
258
-
259
- expect(bank.rates).to eq subject.rates
260
- expect(bank.rounding_method).to eq subject.rounding_method
261
- end
262
- end
263
- end
264
- end
265
- end
@@ -1,11 +0,0 @@
1
- # encoding: utf-8
2
-
3
- describe Money::Currency::Heuristics do
4
- describe "#analyze_string" do
5
- let(:it) { Money::Currency }
6
-
7
- it "it raises deprecation error" do
8
- expect{ it.analyze('123') }.to raise_error(StandardError, 'Heuristics deprecated, add `gem "money-heuristics"` to Gemfile')
9
- end
10
- end
11
- end
@@ -1,19 +0,0 @@
1
- # encoding: utf-8
2
-
3
- describe Money::Currency::Loader do
4
- class CurrencyLoader
5
- include Money::Currency::Loader
6
- end
7
-
8
- let(:loader) { CurrencyLoader.new }
9
-
10
- it "returns a currency table hash" do
11
- expect(loader.load_currencies).to be_a Hash
12
- end
13
-
14
- it "parse currency_iso.json & currency_non_iso.json & currency_backwards_compatible.json" do
15
- expect(loader).to receive(:parse_currency_file).exactly(3).times.and_return({})
16
-
17
- loader.load_currencies
18
- end
19
- end