danconia 0.2.5 → 0.3.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +104 -0
- data/.travis.yml +4 -0
- data/Gemfile.lock +40 -17
- data/README.md +16 -2
- data/bin/console +7 -0
- data/danconia.gemspec +5 -1
- data/examples/bna.rb +35 -0
- data/examples/currency_layer.rb +8 -4
- data/examples/fixed_rates.rb +1 -3
- data/examples/single_currency.rb +2 -3
- data/lib/danconia.rb +6 -4
- data/lib/danconia/currency.rb +2 -2
- data/lib/danconia/exchange.rb +47 -0
- data/lib/danconia/exchanges/bna.rb +61 -0
- data/lib/danconia/exchanges/currency_layer.rb +14 -2
- data/lib/danconia/exchanges/fixed_rates.rb +2 -4
- data/lib/danconia/integrations/active_record.rb +13 -14
- data/lib/danconia/money.rb +25 -24
- data/lib/danconia/pair.rb +15 -0
- data/lib/danconia/stores/active_record.rb +29 -6
- data/lib/danconia/stores/in_memory.rb +4 -9
- data/lib/danconia/version.rb +1 -1
- data/spec/danconia/exchanges/bna_spec.rb +36 -0
- data/spec/danconia/exchanges/currency_layer_spec.rb +28 -33
- data/spec/danconia/exchanges/exchange_spec.rb +54 -0
- data/spec/danconia/exchanges/fixtures/bna/home.html +124 -0
- data/spec/danconia/exchanges/fixtures/currency_layer/failure.json +7 -0
- data/spec/danconia/exchanges/fixtures/currency_layer/success.json +8 -0
- data/spec/danconia/integrations/active_record_spec.rb +25 -5
- data/spec/danconia/money_spec.rb +57 -15
- data/spec/danconia/stores/active_record_spec.rb +81 -15
- data/spec/danconia/stores/in_memory_spec.rb +18 -0
- data/spec/spec_helper.rb +2 -1
- metadata +67 -9
- data/lib/danconia/exchanges/exchange.rb +0 -31
- data/spec/danconia/exchanges/fixed_rates_spec.rb +0 -30
@@ -0,0 +1,18 @@
|
|
1
|
+
module Danconia
|
2
|
+
module Stores
|
3
|
+
describe InMemory do
|
4
|
+
context 'rates' do
|
5
|
+
it 'filters rates by type' do
|
6
|
+
subject.save_rates [
|
7
|
+
{pair: 'USDARS', rate: 3, rate_type: 'divisas'},
|
8
|
+
{pair: 'USDARS', rate: 4, rate_type: 'billetes'}
|
9
|
+
]
|
10
|
+
|
11
|
+
expect(subject.rates(rate_type: 'divisas')).to match [include(rate: 3)]
|
12
|
+
expect(subject.rates(rate_type: 'billetes')).to match [include(rate: 4)]
|
13
|
+
expect(subject.rates).to match [include(rate: 3), include(rate: 4)]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
require 'danconia'
|
2
2
|
require 'danconia/test_helpers'
|
3
|
+
require 'danconia/integrations/active_record'
|
3
4
|
require 'webmock/rspec'
|
4
5
|
|
5
|
-
Dir["#{__dir__}/support/*.rb"].each { |f| require f }
|
6
|
+
Dir["#{__dir__}/support/*.rb"].sort.each { |f| require f }
|
6
7
|
|
7
8
|
RSpec.configure do |config|
|
8
9
|
config.filter_run_when_matching :focus
|
metadata
CHANGED
@@ -1,29 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: danconia
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Emmanuel Nicolau
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-09-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: activesupport
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: '4.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: '4.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activerecord
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '4.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '4.0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: sqlite3
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,14 +122,44 @@ dependencies:
|
|
108
122
|
- - ">="
|
109
123
|
- !ruby/object:Gem::Version
|
110
124
|
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: nokogiri
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rubocop
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 0.80.0
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 0.80.0
|
111
153
|
description: Multi-currency money library backed by BigDecimal
|
112
154
|
email: emmanicolau@gmail.com
|
113
|
-
executables:
|
155
|
+
executables:
|
156
|
+
- console
|
114
157
|
extensions: []
|
115
158
|
extra_rdoc_files: []
|
116
159
|
files:
|
117
160
|
- ".gitignore"
|
118
161
|
- ".rspec"
|
162
|
+
- ".rubocop.yml"
|
119
163
|
- ".ruby-version"
|
120
164
|
- ".travis.yml"
|
121
165
|
- Gemfile
|
@@ -124,7 +168,9 @@ files:
|
|
124
168
|
- LICENSE.txt
|
125
169
|
- README.md
|
126
170
|
- Rakefile
|
171
|
+
- bin/console
|
127
172
|
- danconia.gemspec
|
173
|
+
- examples/bna.rb
|
128
174
|
- examples/currency_layer.rb
|
129
175
|
- examples/fixed_rates.rb
|
130
176
|
- examples/single_currency.rb
|
@@ -133,21 +179,28 @@ files:
|
|
133
179
|
- lib/danconia/currency.rb
|
134
180
|
- lib/danconia/errors/api_error.rb
|
135
181
|
- lib/danconia/errors/exchange_rate_not_found.rb
|
182
|
+
- lib/danconia/exchange.rb
|
183
|
+
- lib/danconia/exchanges/bna.rb
|
136
184
|
- lib/danconia/exchanges/currency_layer.rb
|
137
|
-
- lib/danconia/exchanges/exchange.rb
|
138
185
|
- lib/danconia/exchanges/fixed_rates.rb
|
139
186
|
- lib/danconia/integrations/active_record.rb
|
140
187
|
- lib/danconia/kernel.rb
|
141
188
|
- lib/danconia/money.rb
|
189
|
+
- lib/danconia/pair.rb
|
142
190
|
- lib/danconia/stores/active_record.rb
|
143
191
|
- lib/danconia/stores/in_memory.rb
|
144
192
|
- lib/danconia/test_helpers.rb
|
145
193
|
- lib/danconia/version.rb
|
194
|
+
- spec/danconia/exchanges/bna_spec.rb
|
146
195
|
- spec/danconia/exchanges/currency_layer_spec.rb
|
147
|
-
- spec/danconia/exchanges/
|
196
|
+
- spec/danconia/exchanges/exchange_spec.rb
|
197
|
+
- spec/danconia/exchanges/fixtures/bna/home.html
|
198
|
+
- spec/danconia/exchanges/fixtures/currency_layer/failure.json
|
199
|
+
- spec/danconia/exchanges/fixtures/currency_layer/success.json
|
148
200
|
- spec/danconia/integrations/active_record_spec.rb
|
149
201
|
- spec/danconia/money_spec.rb
|
150
202
|
- spec/danconia/stores/active_record_spec.rb
|
203
|
+
- spec/danconia/stores/in_memory_spec.rb
|
151
204
|
- spec/spec_helper.rb
|
152
205
|
- spec/support/database.rb
|
153
206
|
homepage: https://github.com/eeng/danconia
|
@@ -175,10 +228,15 @@ signing_key:
|
|
175
228
|
specification_version: 4
|
176
229
|
summary: Multi-currency money library backed by BigDecimal
|
177
230
|
test_files:
|
231
|
+
- spec/danconia/exchanges/bna_spec.rb
|
178
232
|
- spec/danconia/exchanges/currency_layer_spec.rb
|
179
|
-
- spec/danconia/exchanges/
|
233
|
+
- spec/danconia/exchanges/exchange_spec.rb
|
234
|
+
- spec/danconia/exchanges/fixtures/bna/home.html
|
235
|
+
- spec/danconia/exchanges/fixtures/currency_layer/failure.json
|
236
|
+
- spec/danconia/exchanges/fixtures/currency_layer/success.json
|
180
237
|
- spec/danconia/integrations/active_record_spec.rb
|
181
238
|
- spec/danconia/money_spec.rb
|
182
239
|
- spec/danconia/stores/active_record_spec.rb
|
240
|
+
- spec/danconia/stores/in_memory_spec.rb
|
183
241
|
- spec/spec_helper.rb
|
184
242
|
- spec/support/database.rb
|
@@ -1,31 +0,0 @@
|
|
1
|
-
module Danconia
|
2
|
-
module Exchanges
|
3
|
-
class Exchange
|
4
|
-
attr_reader :store
|
5
|
-
|
6
|
-
def initialize store: Stores::InMemory.new
|
7
|
-
@store = store
|
8
|
-
end
|
9
|
-
|
10
|
-
def rate from, to
|
11
|
-
if from == 'USD' and direct_rate = @store.direct_rate(from, to)
|
12
|
-
direct_rate
|
13
|
-
elsif to == 'USD' and inverse_rate = @store.direct_rate(to, from)
|
14
|
-
(1.0 / inverse_rate).round 6
|
15
|
-
elsif from != 'USD' and to != 'USD' and from_in_usd = rate(from, 'USD') and to_per_usd = rate('USD', to)
|
16
|
-
(from_in_usd * to_per_usd).round 6
|
17
|
-
else
|
18
|
-
raise Errors::ExchangeRateNotFound.new(from, to)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def rates
|
23
|
-
@store.rates
|
24
|
-
end
|
25
|
-
|
26
|
-
def update_rates!
|
27
|
-
@store.save_rates fetch_rates
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Danconia
|
4
|
-
module Exchanges
|
5
|
-
describe FixedRates do
|
6
|
-
context 'rate' do
|
7
|
-
it 'returns the exchange rate value for the supplied currencies' do
|
8
|
-
exchange = FixedRates.new rates: {'USDEUR' => 3, 'USDARS' => 4}
|
9
|
-
expect(exchange.rate 'USD', 'EUR').to eq 3
|
10
|
-
expect(exchange.rate 'USD', 'ARS').to eq 4
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'returns nil if not found' do
|
14
|
-
expect { subject.rate 'USD', 'EUR' }.to raise_error Errors::ExchangeRateNotFound
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'if the direct conversion is not found, tries to find the inverse' do
|
18
|
-
exchange = FixedRates.new rates: {'USDEUR' => 3}
|
19
|
-
expect(exchange.rate 'EUR', 'USD').to eq (1.0 / 3).round 6
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'if not direct nor inverse conversion is found and both are different than USD, tries to convert through USD' do
|
23
|
-
exchange = FixedRates.new rates: {'USDEUR' => 3, 'USDARS' => 6}
|
24
|
-
expect(exchange.rate 'EUR', 'ARS').to be_within(0.00001).of 2
|
25
|
-
expect(exchange.rate 'ARS', 'EUR').to be_within(0.00001).of 0.5
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|