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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +104 -0
  3. data/.travis.yml +4 -0
  4. data/Gemfile.lock +40 -17
  5. data/README.md +16 -2
  6. data/bin/console +7 -0
  7. data/danconia.gemspec +5 -1
  8. data/examples/bna.rb +35 -0
  9. data/examples/currency_layer.rb +8 -4
  10. data/examples/fixed_rates.rb +1 -3
  11. data/examples/single_currency.rb +2 -3
  12. data/lib/danconia.rb +6 -4
  13. data/lib/danconia/currency.rb +2 -2
  14. data/lib/danconia/exchange.rb +47 -0
  15. data/lib/danconia/exchanges/bna.rb +61 -0
  16. data/lib/danconia/exchanges/currency_layer.rb +14 -2
  17. data/lib/danconia/exchanges/fixed_rates.rb +2 -4
  18. data/lib/danconia/integrations/active_record.rb +13 -14
  19. data/lib/danconia/money.rb +25 -24
  20. data/lib/danconia/pair.rb +15 -0
  21. data/lib/danconia/stores/active_record.rb +29 -6
  22. data/lib/danconia/stores/in_memory.rb +4 -9
  23. data/lib/danconia/version.rb +1 -1
  24. data/spec/danconia/exchanges/bna_spec.rb +36 -0
  25. data/spec/danconia/exchanges/currency_layer_spec.rb +28 -33
  26. data/spec/danconia/exchanges/exchange_spec.rb +54 -0
  27. data/spec/danconia/exchanges/fixtures/bna/home.html +124 -0
  28. data/spec/danconia/exchanges/fixtures/currency_layer/failure.json +7 -0
  29. data/spec/danconia/exchanges/fixtures/currency_layer/success.json +8 -0
  30. data/spec/danconia/integrations/active_record_spec.rb +25 -5
  31. data/spec/danconia/money_spec.rb +57 -15
  32. data/spec/danconia/stores/active_record_spec.rb +81 -15
  33. data/spec/danconia/stores/in_memory_spec.rb +18 -0
  34. data/spec/spec_helper.rb +2 -1
  35. metadata +67 -9
  36. data/lib/danconia/exchanges/exchange.rb +0 -31
  37. 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
@@ -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.2.5
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: 2018-07-26 00:00:00.000000000 Z
11
+ date: 2020-09-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: activerecord
14
+ name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 3.0.0
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: 3.0.0
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/fixed_rates_spec.rb
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/fixed_rates_spec.rb
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