daily_exchange_rates_bank 1.0.1 → 1.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a3fbfb1ca303a121bcb22b5a7d1c7302d65ad17ea36fc44660928cee4ddda9ae
4
- data.tar.gz: 88f957f73a6ab21624a82ec9457b0bb18131f39fbe506158593fac7ec6aee680
3
+ metadata.gz: 626e118d401aec1e2da2ed5dd5794aa593f5dbe044fc86e2b3782920f09e2b40
4
+ data.tar.gz: 8c69771e2be6fec05fc0911dfe904793c9af5f79322528d2a43c42ab0c556997
5
5
  SHA512:
6
- metadata.gz: f8846f5ce45adf7158b54d02e84af708a0e569085e29c15e80bd4064166f22d62feff17a63005ea3ed13a9469bb64372fa06e2b1dafab00cb6451303210f6d2c
7
- data.tar.gz: b3163e9a220b8ae7a232e47462238a57cdb3c1fce5af2d5f4b44f3cd878e9fa581bc6c880d44085d2a86ae23dc4cf1e7e1dfa75198265a26f9213885476131bb
6
+ metadata.gz: ba518774e92dab5e196ca0f0b68810f7a32487f598e71b799ce83511480c59f29a387574ec2b679ae3ec4679063f7f259112aad4861b94f7d3d238c1d3b3d039
7
+ data.tar.gz: 9a8e350d33fd688c416ecd29a74de3f7c2bbb8d0603fd54ecec5b9e52768ccf67b2278cef9ca6f9f425effe0169b4dd0fe87f93a6f2b4357cd3101378fb0f40f
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # daily_exchange_rates_bank changelog
2
2
 
3
- ## 1.0.0 (20.9.2019)
3
+ ## 1.0.2 (22.04.2021)
4
+
5
+ * Switch to api.frankfurter.app to fetch historic exchange rates
6
+
7
+ ## 1.0.1 (09.02.2021)
8
+
9
+ * Loosen dependency on money gem version
10
+
11
+ ## 1.0.0 (20.09.2019)
4
12
 
5
13
  * Initial gem release
data/README.md CHANGED
@@ -3,7 +3,8 @@
3
3
  [![Codeship Status for gapfish/daily_exchange_rates_bank](https://app.codeship.com/projects/4d5d2f00-c367-0137-d12d-621d2c7e26d1/status?branch=master)](https://app.codeship.com/projects/366592)
4
4
 
5
5
  A bank for the money gem that determines exchange rates for any desired date.
6
- Missing exchange rates are fetched from exchangeratesapi.io
6
+ Missing exchange rates are fetched from api.frankfurter.app. This is
7
+ configurable with the `RATES_API_URL` environment variable.
7
8
 
8
9
  ## Installation
9
10
 
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'money'
4
+ require 'money/rates_store/store_with_date_support'
5
+ require 'daily_exchange_rates_bank/exchange_rates_api_client'
6
+
7
+ # Class for aiding in exchanging money between different currencies.
8
+ class DailyExchangeRatesBank < Money::Bank::VariableExchange
9
+ SERIALIZER_DATE_SEPARATOR = '_ON_'
10
+
11
+ def initialize(store = Money::RatesStore::StoreWithDateSupport.new, &block)
12
+ super(store, &block)
13
+ end
14
+
15
+ def get_rate(from, to, date = nil)
16
+ store.get_rate(::Money::Currency.wrap(from).iso_code,
17
+ ::Money::Currency.wrap(to).iso_code,
18
+ date)
19
+ end
20
+
21
+ def set_rate(from, to, rate, date = nil)
22
+ store.add_rate(::Money::Currency.wrap(from).iso_code,
23
+ ::Money::Currency.wrap(to).iso_code,
24
+ rate,
25
+ date)
26
+ end
27
+
28
+ def rates
29
+ store.each_rate.each_with_object({}) do |(from, to, rate, date), hash|
30
+ key = [from, to].join(SERIALIZER_SEPARATOR)
31
+ key = [key, date.to_s].join(SERIALIZER_DATE_SEPARATOR) if date
32
+ hash[key] = rate
33
+ end
34
+ end
35
+
36
+ def exchange(cents, from_currency, to_currency, date = nil)
37
+ exchange_with(Money.new(cents, from_currency), to_currency, date)
38
+ end
39
+
40
+ def exchange_with(from, to_currency, date = nil)
41
+ to_currency = ::Money::Currency.wrap(to_currency)
42
+ return from if from.currency == to_currency
43
+
44
+ rate = get_rate(from.currency, to_currency, date)
45
+
46
+ rate ||= rate_from_exchange_rates_api(from.currency, to_currency, date)
47
+
48
+ fractional = calculate_fractional(from, to_currency, rate)
49
+ Money.new(fractional, to_currency)
50
+ end
51
+
52
+ private
53
+
54
+ def rate_from_exchange_rates_api(from_currency, to_currency, date)
55
+ puts from_currency
56
+ puts to_currency
57
+ puts date
58
+ api_client = DailyExchangeRatesBank::ExchangeRatesApiClient.new
59
+ rates = api_client.exchange_rates(from: from_currency.iso_code,
60
+ to: [to_currency.iso_code],
61
+ date: date)
62
+ rate = rates[to_currency.iso_code]
63
+
64
+ set_rate(from_currency, to_currency, rate, date)
65
+
66
+ rate
67
+ end
68
+
69
+ def calculate_fractional(from, to_currency, rate)
70
+ BigDecimal(rate.to_s) * BigDecimal(from.fractional.to_s) / (
71
+ BigDecimal(from.currency.subunit_to_unit.to_s) /
72
+ BigDecimal(to_currency.subunit_to_unit.to_s)
73
+ )
74
+ end
75
+ end
@@ -3,10 +3,11 @@
3
3
  require 'open-uri'
4
4
 
5
5
  class DailyExchangeRatesBank < Money::Bank::VariableExchange
6
- # Access exchangeratesapi.io to fetch historic exchange rates
6
+ # Access api.frankfurter.app to fetch historic exchange rates
7
7
  class ExchangeRatesApiClient
8
8
  def exchange_rates(from: 'EUR', to: %w[USD GBP CHF], date: Date.today)
9
- uri = URI.parse('https://api.exchangeratesapi.io/')
9
+ api_url = ENV.fetch('RATES_API_URL', 'https://api.frankfurter.app/')
10
+ uri = URI.parse(api_url)
10
11
  uri.path = "/#{date}/"
11
12
  uri.query = "base=#{from}&symbols=#{to.join(',')}"
12
13
  json_response = uri.read
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'open-uri'
4
+
5
+ class DailyExchangeRatesBank < Money::Bank::VariableExchange
6
+ # Access api.frankfurter.app to fetch historic exchange rates
7
+ class ExchangeRatesApiClient
8
+ def exchange_rates(from: 'EUR', to: %w[USD GBP CHF], date: Date.today)
9
+ uri = URI.parse('https://api.frankfurter.app/')
10
+ uri.path = "/#{date}/"
11
+ uri.query = "base=#{from}&symbols=#{to.join(',')}"
12
+ json_response = uri.read
13
+ JSON.parse(json_response)['rates']
14
+ end
15
+ end
16
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: daily_exchange_rates_bank
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Aschenbrenner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-20 00:00:00.000000000 Z
11
+ date: 2021-04-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: money
@@ -101,7 +101,7 @@ dependencies:
101
101
  - !ruby/object:Gem::Version
102
102
  version: '3.7'
103
103
  description: This gem supports money conversions with historic exchange rates. Missing
104
- exchange rates are fetched from exchangeratesapi.io
104
+ exchange rates are fetched from api.frankfurter.app
105
105
  email:
106
106
  executables: []
107
107
  extensions: []
@@ -111,7 +111,9 @@ files:
111
111
  - LICENSE
112
112
  - README.md
113
113
  - lib/daily_exchange_rates_bank.rb
114
+ - lib/daily_exchange_rates_bank.rb~
114
115
  - lib/daily_exchange_rates_bank/exchange_rates_api_client.rb
116
+ - lib/daily_exchange_rates_bank/exchange_rates_api_client.rb~
115
117
  - lib/money/rates_store/store_with_date_support.rb
116
118
  homepage: https://github.com/gapfish/daily_exchange_rates_bank
117
119
  licenses:
@@ -132,7 +134,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
132
134
  - !ruby/object:Gem::Version
133
135
  version: '0'
134
136
  requirements: []
135
- rubygems_version: 3.1.4
137
+ rubygems_version: 3.2.3
136
138
  signing_key:
137
139
  specification_version: 4
138
140
  summary: A bank for the money gem that determines exchange rates for any desired date.