daily_exchange_rates_bank 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
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.