currency-rate 0.4.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -4
  3. data/README.md +41 -53
  4. data/VERSION +1 -1
  5. data/currency-rate.gemspec +92 -78
  6. data/lib/adapter.rb +37 -83
  7. data/lib/adapters/crypto/bitfinex_adapter.rb +17 -0
  8. data/lib/adapters/crypto/bitpay_adapter.rb +14 -0
  9. data/lib/adapters/crypto/bitstamp_adapter.rb +19 -0
  10. data/lib/adapters/crypto/btc_china_adapter.rb +11 -0
  11. data/lib/adapters/crypto/btc_e_adapter.rb +18 -0
  12. data/lib/adapters/crypto/coinbase_adapter.rb +14 -0
  13. data/lib/adapters/crypto/huobi_adapter.rb +17 -0
  14. data/lib/adapters/crypto/kraken_adapter.rb +29 -0
  15. data/lib/adapters/crypto/localbitcoins_adapter.rb +14 -0
  16. data/lib/adapters/crypto/okcoin_adapter.rb +19 -0
  17. data/lib/adapters/fiat/fixer_adapter.rb +16 -0
  18. data/lib/adapters/fiat/forge_adapter.rb +23 -0
  19. data/lib/adapters/fiat/yahoo_adapter.rb +35 -0
  20. data/lib/configuration.rb +21 -0
  21. data/lib/currency_rate.rb +52 -48
  22. data/lib/fetcher.rb +71 -0
  23. data/lib/storage/file_storage.rb +29 -0
  24. data/lib/storage/serializers/yaml_serializer.rb +15 -0
  25. data/lib/synchronizer.rb +31 -0
  26. data/spec/fixtures/adapters/bitfinex_adapter.yml +18 -0
  27. data/spec/fixtures/adapters/bitpay_adapter.yml +486 -0
  28. data/spec/fixtures/adapters/bitstamp_adapter.yml +30 -0
  29. data/spec/fixtures/adapters/btc_china_adapter.yml +11 -0
  30. data/spec/fixtures/adapters/btce_adapter.yml +60 -0
  31. data/spec/fixtures/adapters/coinbase_adapter.yml +680 -0
  32. data/spec/fixtures/adapters/fixer_adapter.yml +34 -0
  33. data/spec/fixtures/adapters/forge_adapter.yml +75 -0
  34. data/spec/fixtures/adapters/huobi_adapter.yml +22 -0
  35. data/spec/fixtures/adapters/kraken_adapter.yml +124 -0
  36. data/spec/fixtures/adapters/localbitcoins_adapter.yml +381 -0
  37. data/spec/fixtures/adapters/normalized/bitfinex_adapter.yml +2 -0
  38. data/spec/fixtures/adapters/normalized/bitpay_adapter.yml +161 -0
  39. data/spec/fixtures/adapters/normalized/bitstamp_adapter.yml +3 -0
  40. data/spec/fixtures/adapters/normalized/btc_china_adapter.yml +1 -0
  41. data/spec/fixtures/adapters/normalized/btce_adapter.yml +5 -0
  42. data/spec/fixtures/adapters/normalized/coinbase_adapter.yml +680 -0
  43. data/spec/fixtures/adapters/normalized/fixer_adapter.yml +32 -0
  44. data/spec/fixtures/adapters/normalized/forge_adapter.yml +16 -0
  45. data/spec/fixtures/adapters/normalized/huobi_adapter.yml +2 -0
  46. data/spec/fixtures/adapters/normalized/kraken_adapter.yml +4 -0
  47. data/spec/fixtures/adapters/normalized/localbitcoins_adapter.yml +57 -0
  48. data/spec/fixtures/adapters/normalized/okcoin_adapter.yml +4 -0
  49. data/spec/fixtures/adapters/normalized/yahoo_adapter.yml +160 -0
  50. data/spec/fixtures/adapters/okcoin_adapter.yml +40 -0
  51. data/spec/fixtures/adapters/yahoo_adapter.yml +1119 -0
  52. data/spec/lib/adapter_spec.rb +54 -0
  53. data/spec/lib/adapters/crypto/bitfinex_adapter_spec.rb +13 -0
  54. data/spec/lib/adapters/crypto/bitpay_adapter_spec.rb +13 -0
  55. data/spec/lib/adapters/crypto/bitstamp_adapter_spec.rb +13 -0
  56. data/spec/lib/adapters/crypto/btc_china_adapter_spec.rb +13 -0
  57. data/spec/lib/adapters/crypto/btc_e_adapter_spec.rb +13 -0
  58. data/spec/lib/adapters/crypto/coinbase_adapter_spec.rb +13 -0
  59. data/spec/lib/adapters/crypto/huobi_adapter_spec.rb +13 -0
  60. data/spec/lib/adapters/crypto/kraken_adapter_spec.rb +13 -0
  61. data/spec/lib/adapters/crypto/localbitcoins_adapter_spec.rb +13 -0
  62. data/spec/lib/adapters/crypto/okcoin_adapter_spec.rb +13 -0
  63. data/spec/lib/adapters/fiat/fixer_adapter_spec.rb +13 -0
  64. data/spec/lib/adapters/fiat/forge_adapter_spec.rb +23 -0
  65. data/spec/lib/adapters/fiat/yahoo_adapter_spec.rb +13 -0
  66. data/spec/lib/currency_rate_spec.rb +9 -0
  67. data/spec/lib/fetcher_spec.rb +156 -0
  68. data/spec/lib/storage/file_storage_spec.rb +38 -0
  69. data/spec/lib/synchronizer_spec.rb +65 -0
  70. data/spec/spec_helper.rb +23 -8
  71. data/spec/support/matchers/eq_any_of.rb +3 -0
  72. metadata +67 -64
  73. data/Gemfile.lock +0 -93
  74. data/lib/core_ext/deep_get.rb +0 -11
  75. data/lib/crypto_adapter.rb +0 -19
  76. data/lib/crypto_adapters/average_rate_adapter.rb +0 -54
  77. data/lib/crypto_adapters/bitfinex_adapter.rb +0 -40
  78. data/lib/crypto_adapters/bitpay_adapter.rb +0 -33
  79. data/lib/crypto_adapters/bitstamp_adapter.rb +0 -44
  80. data/lib/crypto_adapters/btcchina_adapter.rb +0 -19
  81. data/lib/crypto_adapters/btce_adapter.rb +0 -44
  82. data/lib/crypto_adapters/coinbase_adapter.rb +0 -23
  83. data/lib/crypto_adapters/huobi_adapter.rb +0 -40
  84. data/lib/crypto_adapters/kraken_adapter.rb +0 -42
  85. data/lib/crypto_adapters/localbitcoins_adapter.rb +0 -30
  86. data/lib/crypto_adapters/okcoin_adapter.rb +0 -43
  87. data/lib/fiat_adapter.rb +0 -17
  88. data/lib/fiat_adapters/fixer_adapter.rb +0 -38
  89. data/lib/fiat_adapters/yahoo_adapter.rb +0 -51
  90. data/lib/storage.rb +0 -20
  91. data/spec/currency_rate_spec.rb +0 -52
  92. data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/average_rate_adapter.yml +0 -567
  93. data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/bitfinex_adapter.yml +0 -121
  94. data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/bitpay_adapter.yml +0 -272
  95. data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/btcchina_adapter.yml +0 -55
  96. data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/btce_adapter.yml +0 -223
  97. data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/coinbase_adapter.yml +0 -96
  98. data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/huobi_adapter.yml +0 -83
  99. data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/kraken_adapter.yml +0 -179
  100. data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/localbitcoins_adapter.yml +0 -133
  101. data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/okcoin_adapter.yml +0 -223
  102. data/spec/fixtures/vcr/exchange_rate_adapters/fiat_adapters/fixer_adapter.yml +0 -85
  103. data/spec/fixtures/vcr/exchange_rate_adapters/fiat_adapters/yahoo_adapter.yml +0 -48
  104. data/spec/lib/crypto_adapter_spec.rb +0 -56
  105. data/spec/lib/crypto_adapters/average_rate_adapter_spec.rb +0 -46
  106. data/spec/lib/crypto_adapters/bitfinex_adapter_spec.rb +0 -38
  107. data/spec/lib/crypto_adapters/bitpay_adapter_spec.rb +0 -40
  108. data/spec/lib/crypto_adapters/bitstamp_adapter_spec.rb +0 -44
  109. data/spec/lib/crypto_adapters/btcchina_adapter_spec.rb +0 -36
  110. data/spec/lib/crypto_adapters/btce_adapter_spec.rb +0 -42
  111. data/spec/lib/crypto_adapters/coinbase_adapter_spec.rb +0 -39
  112. data/spec/lib/crypto_adapters/huobi_adapter_spec.rb +0 -38
  113. data/spec/lib/crypto_adapters/kraken_adapter_spec.rb +0 -38
  114. data/spec/lib/crypto_adapters/localbitcoins_adapter_spec.rb +0 -36
  115. data/spec/lib/crypto_adapters/okcoin_adapter_spec.rb +0 -43
  116. data/spec/lib/fiat_adapters/fixer_adapter_spec.rb +0 -25
  117. data/spec/lib/fiat_adapters/yahoo_adapter_spec.rb +0 -25
  118. data/spec/lib/storage_spec.rb +0 -32
@@ -1,40 +0,0 @@
1
- module CurrencyRate
2
- class BitfinexAdapter < CryptoAdapter
3
-
4
- FETCH_URL = {
5
- 'btc_usd' => 'https://api.bitfinex.com/v1/pubticker/btcusd',
6
- 'ltc_usd' => 'https://api.bitfinex.com/v1/pubticker/ltcusd'
7
- }
8
- DEFAULT_CURRENCIES = ["USD", "BTC"]
9
- SUPPORTED_CRYPTO_CURRENCIES = ["BTC", "LTC"]
10
-
11
- def rate_for(from,to)
12
- super
13
- rate = rate_to_f(currency_pair_rate(to,from))
14
- invert_rate(from,to,rate)
15
- end
16
-
17
- def currency_pair_rate(currency1, currency2)
18
- rate = @rates["#{currency1.downcase}_#{currency2.downcase}"] || @rates["#{currency2.downcase}_#{currency1.downcase}"]
19
- raise CurrencyNotSupported unless rate
20
- rate['last_price']
21
- end
22
-
23
- def invert_rate(from,to,rate)
24
- if self.class::SUPPORTED_CRYPTO_CURRENCIES.include?(to)
25
- _invert_rate(rate)
26
- else
27
- rate
28
- end
29
- end
30
-
31
- def supported_currency_pairs
32
- cache_supported_currency_pairs do
33
- @rates.each do |k,v|
34
- @supported_currency_pairs << k.sub("_", "/").upcase
35
- end
36
- end
37
- end
38
-
39
- end
40
- end
@@ -1,33 +0,0 @@
1
- module CurrencyRate
2
- class BitpayAdapter < CryptoAdapter
3
-
4
- FETCH_URL = 'https://bitpay.com/api/rates'
5
- DEFAULT_CURRENCIES = ["USD", "BTC"]
6
- SUPPORTED_CRYPTO_CURRENCIES = ["BTC"]
7
-
8
- def rate_for(from,to)
9
- super
10
- rate = nil
11
- @rates.each do |rt|
12
- if rt['code'] == to
13
- rate = invert_rate(from,to, currency_pair_rate(to,from,rt))
14
- return rate_to_f(rate)
15
- end
16
- end
17
- end
18
-
19
- def currency_pair_rate(currency1, currency2, rt)
20
- rate = rt['rate'] if [currency1, currency2].include?(rt['code'])
21
- rate
22
- end
23
-
24
- def supported_currency_pairs
25
- cache_supported_currency_pairs do
26
- @rates.each do |r|
27
- @supported_currency_pairs << "#{r["code"]}/BTC"
28
- end
29
- end
30
- end
31
-
32
- end
33
- end
@@ -1,44 +0,0 @@
1
- module CurrencyRate
2
- class BitstampAdapter < CryptoAdapter
3
-
4
- FETCH_URL = {
5
- 'btc_usd' => 'https://www.bitstamp.net/api/v2/ticker/btcusd/',
6
- 'btc_eur' => 'https://www.bitstamp.net/api/v2/ticker/btceur/',
7
- 'ltc_usd' => 'https://www.bitstamp.net/api/v2/ticker/ltcusd/',
8
- 'ltc_eur' => 'https://www.bitstamp.net/api/v2/ticker/ltceur/',
9
- 'eur_usd' => 'https://www.bitstamp.net/api/v2/ticker/eurusd/'
10
- }
11
- DEFAULT_CURRENCIES = ["USD", "BTC"]
12
- SUPPORTED_CRYPTO_CURRENCIES = ["BTC", "LTC"]
13
-
14
- def rate_for(from,to)
15
- super
16
- rate = rate_to_f(currency_pair_rate(to,from))
17
- invert_rate(from,to,rate)
18
- end
19
-
20
- # Because Bitstamp has USD/EUR pair
21
- def invert_rate(from,to,rate)
22
- if self.class::SUPPORTED_CRYPTO_CURRENCIES.include?(to) || (from == 'USD' && to == 'EUR')
23
- _invert_rate(rate)
24
- else
25
- rate
26
- end
27
- end
28
-
29
- def currency_pair_rate(currency1, currency2)
30
- rate = @rates["#{currency1.downcase}_#{currency2.downcase}"] || @rates["#{currency2.downcase}_#{currency1.downcase}"]
31
- raise CurrencyNotSupported unless rate
32
- rate['last']
33
- end
34
-
35
- def supported_currency_pairs
36
- cache_supported_currency_pairs do
37
- @rates.each do |k,v|
38
- @supported_currency_pairs << k.sub("_", "/").upcase
39
- end
40
- end
41
- end
42
-
43
- end
44
- end
@@ -1,19 +0,0 @@
1
- module CurrencyRate
2
- class BTCChinaAdapter < CryptoAdapter
3
-
4
- FETCH_URL = 'https://data.btcchina.com/data/ticker'
5
- DEFAULT_CURRENCIES = ["CNY", "BTC"]
6
- SUPPORTED_CRYPTO_CURRENCIES = ["BTC"]
7
-
8
- def rate_for(from,to)
9
- super
10
- rate = rate_to_f(@rates['ticker'] && @rates['ticker']['last'])
11
- invert_rate(from,to,rate)
12
- end
13
-
14
- def supported_currency_pairs
15
- ["BTC/CNY"]
16
- end
17
-
18
- end
19
- end
@@ -1,44 +0,0 @@
1
- module CurrencyRate
2
- class BtceAdapter < CryptoAdapter
3
-
4
- FETCH_URL = {
5
- 'btc_usd' => 'https://btc-e.com/api/2/btc_usd/ticker',
6
- 'btc_eur' => 'https://btc-e.com/api/2/btc_eur/ticker',
7
- 'btc_rub' => 'https://btc-e.com/api/2/btc_rur/ticker',
8
- 'usd_rub' => 'https://btc-e.com/api/2/usd_rur/ticker',
9
- 'eur_rub' => 'https://btc-e.com/api/2/eur_rur/ticker'
10
- }
11
- DEFAULT_CURRENCIES = ["USD", "BTC"]
12
- SUPPORTED_CRYPTO_CURRENCIES = ["BTC"]
13
-
14
-
15
- def rate_for(from,to)
16
- super
17
- rate = rate_to_f(currency_pair_rate(to,from))
18
- invert_rate(from,to,rate)
19
- end
20
-
21
- def currency_pair_rate(currency1, currency2)
22
- rate = @rates["#{currency1.downcase}_#{currency2.downcase}"] || @rates["#{currency2.downcase}_#{currency1.downcase}"]
23
- raise CurrencyNotSupported unless rate
24
- rate['ticker']['last']
25
- end
26
-
27
- def invert_rate(from,to,rate)
28
- if self.class::SUPPORTED_CRYPTO_CURRENCIES.include?(to) || (from == 'RUB' && to == 'USD') || (from == 'RUB' && to == 'EUR')
29
- _invert_rate(rate)
30
- else
31
- rate
32
- end
33
- end
34
-
35
- def supported_currency_pairs
36
- cache_supported_currency_pairs do
37
- @rates.each do |k,v|
38
- @supported_currency_pairs << k.sub("_", "/").upcase
39
- end
40
- end
41
- end
42
-
43
- end
44
- end
@@ -1,23 +0,0 @@
1
- module CurrencyRate
2
- class CoinbaseAdapter < CryptoAdapter
3
-
4
- FETCH_URL = 'https://coinbase.com/api/v1/currencies/exchange_rates'
5
- DEFAULT_CURRENCIES = ["USD", "BTC"]
6
- SUPPORTED_CRYPTO_CURRENCIES = ["BTC", "LTC"]
7
-
8
- def rate_for(from,to)
9
- super
10
- rate = @rates["#{from.downcase}_to_#{to.downcase}"]
11
- rate_to_f(rate)
12
- end
13
-
14
- def supported_currency_pairs
15
- cache_supported_currency_pairs do
16
- @rates.each do |k,v|
17
- @supported_currency_pairs << k.sub("_to_", "/").upcase
18
- end
19
- end
20
- end
21
-
22
- end
23
- end
@@ -1,40 +0,0 @@
1
- module CurrencyRate
2
- class HuobiAdapter < CryptoAdapter
3
-
4
- FETCH_URL = {
5
- 'btc_cny' => 'http://api.huobi.com/staticmarket/ticker_btc_json.js',
6
- 'ltc_cny' => 'http://api.huobi.com/staticmarket/ticker_ltc_json.js'
7
- }
8
- DEFAULT_CURRENCIES = ["CNY", "BTC"]
9
- SUPPORTED_CRYPTO_CURRENCIES = ["BTC", "LTC"]
10
-
11
- def rate_for(from,to)
12
- super
13
- rate = rate_to_f(currency_pair_rate(to,from))
14
- invert_rate(from,to,rate)
15
- end
16
-
17
- def currency_pair_rate(currency1, currency2)
18
- rate = @rates["#{currency1.downcase}_#{currency2.downcase}"] || @rates["#{currency2.downcase}_#{currency1.downcase}"]
19
- raise CurrencyNotSupported unless rate
20
- rate["ticker"]['last']
21
- end
22
-
23
- def invert_rate(from,to,rate)
24
- if self.class::SUPPORTED_CRYPTO_CURRENCIES.include?(to)
25
- _invert_rate(rate)
26
- else
27
- rate
28
- end
29
- end
30
-
31
- def supported_currency_pairs
32
- cache_supported_currency_pairs do
33
- @rates.each do |k,v|
34
- @supported_currency_pairs << k.sub("_", "/").upcase
35
- end
36
- end
37
- end
38
-
39
- end
40
- end
@@ -1,42 +0,0 @@
1
- module CurrencyRate
2
- class KrakenAdapter < CryptoAdapter
3
-
4
- FETCH_URL = {
5
- "usd_btc" => 'https://api.kraken.com/0/public/Ticker?pair=xbtusd',
6
- "eur_btc" => 'https://api.kraken.com/0/public/Ticker?pair=xbteur',
7
- "usd_ltc" => 'https://api.kraken.com/0/public/Ticker?pair=ltcusd',
8
- "eur_ltc" => 'https://api.kraken.com/0/public/Ticker?pair=ltceur',
9
- }
10
- DEFAULT_CURRENCIES = ["USD", "BTC"]
11
- SUPPORTED_CRYPTO_CURRENCIES = ["BTC", "LTC"]
12
- ASSET_MAP = {
13
- "BTC" => "XBT",
14
- }
15
-
16
- def rate_for(to,from)
17
- super
18
- rate = rate_to_f(currency_pair_rate(to,from))
19
- invert_rate(to,from,rate)
20
- end
21
-
22
- def currency_pair_rate(currency1, currency2)
23
- rate = @rates["#{currency1.downcase}_#{currency2.downcase}"] || @rates["#{currency2.downcase}_#{currency1.downcase}"]
24
- raise CurrencyNotSupported unless rate || ([currency1, currency2] & self.class::SUPPORTED_CRYPTO_CURRENCIES).any?
25
- fiat, crypto = self.class::SUPPORTED_CRYPTO_CURRENCIES.include?(currency1) ? [currency2, currency1] : [currency1, currency2]
26
- rate['result']["X#{ta(crypto)}Z#{ta(fiat)}"]['c'].first
27
- end
28
-
29
- def supported_currency_pairs
30
- cache_supported_currency_pairs do
31
- @rates.each do |k,v|
32
- @supported_currency_pairs << k.sub("_", "/").upcase
33
- end
34
- end
35
- end
36
-
37
- def translate_asset(asset)
38
- ASSET_MAP[asset] || asset
39
- end
40
- alias_method :ta, :translate_asset
41
- end
42
- end
@@ -1,30 +0,0 @@
1
- module CurrencyRate
2
- class LocalbitcoinsAdapter < CryptoAdapter
3
-
4
- FETCH_URL = 'https://localbitcoins.com/bitcoinaverage/ticker-all-currencies/'
5
- DEFAULT_CURRENCIES = ["USD", "BTC"]
6
- SUPPORTED_CRYPTO_CURRENCIES = ["BTC"]
7
-
8
- def rate_for(from,to)
9
- super
10
- rate = currency_pair_rate(to,from)
11
- rate = rate_to_f(rate)
12
- invert_rate(from,to,rate)
13
- end
14
-
15
- def currency_pair_rate(currency1, currency2)
16
- rate = @rates[currency1] || @rates[currency2]
17
- raise CurrencyNotSupported if !rate || !([currency1, currency2] & self.class::SUPPORTED_CRYPTO_CURRENCIES).any?
18
- rate['rates']['last']
19
- end
20
-
21
- def supported_currency_pairs
22
- cache_supported_currency_pairs do
23
- @rates.each do |k,v|
24
- @supported_currency_pairs << "#{k}/BTC"
25
- end
26
- end
27
- end
28
-
29
- end
30
- end
@@ -1,43 +0,0 @@
1
- module CurrencyRate
2
- class OkcoinAdapter < CryptoAdapter
3
-
4
- FETCH_URL = {
5
- 'ltc_usd' => 'https://www.okcoin.com/api/v1/ticker.do?symbol=ltc_usd',
6
- 'btc_usd' => 'https://www.okcoin.com/api/v1/ticker.do?symbol=btc_usd',
7
- 'ltc_cny' => 'https://www.okcoin.cn/api/ticker.do?symbol=ltc_cny',
8
- 'btc_cny' => 'https://www.okcoin.cn/api/ticker.do?symbol=btc_cny'
9
- }
10
- DEFAULT_CURRENCIES = ["CNY", "BTC"]
11
- SUPPORTED_CRYPTO_CURRENCIES = ["BTC", "LTC"]
12
-
13
- def rate_for(from,to)
14
- super
15
- rate = rate_to_f(currency_pair_rate(to,from))
16
- invert_rate(from,to,rate)
17
- end
18
-
19
- def currency_pair_rate(currency1, currency2)
20
- rate = @rates["#{currency1.downcase}_#{currency2.downcase}"] || @rates["#{currency2.downcase}_#{currency1.downcase}"]
21
- raise CurrencyNotSupported unless rate
22
- rate['ticker']['last']
23
- end
24
-
25
- # Because OKCoin has LTC
26
- def invert_rate(from,to,rate)
27
- if self.class::SUPPORTED_CRYPTO_CURRENCIES.include?(to)
28
- _invert_rate(rate)
29
- else
30
- rate
31
- end
32
- end
33
-
34
- def supported_currency_pairs
35
- cache_supported_currency_pairs do
36
- @rates.each do |k,v|
37
- @supported_currency_pairs << k.sub("_", "/").upcase
38
- end
39
- end
40
- end
41
-
42
- end
43
- end
data/lib/fiat_adapter.rb DELETED
@@ -1,17 +0,0 @@
1
- module CurrencyRate
2
-
3
- class FiatAdapter < Adapter
4
-
5
- BigDecimal.mode BigDecimal::ROUND_MODE, :banker
6
-
7
- DECIMAL_PRECISION = 2
8
-
9
- def rate_for(from,to)
10
- super
11
- rate = currency_pair_rate(to,from)
12
- invert_rate(from,to,rate)
13
- end
14
-
15
- end
16
-
17
- end
@@ -1,38 +0,0 @@
1
- module CurrencyRate
2
- class FixerAdapter < FiatAdapter
3
-
4
- FETCH_URL = {
5
- "eur" => "http://api.fixer.io/latest?base=eur",
6
- "usd" => "http://api.fixer.io/latest?base=usd"
7
- }
8
- SUPPORTED_CURRENCIES = %w(USD EUR)
9
-
10
- def currency_pair_rate(currency1, currency2)
11
- rates = @rates[currency1.downcase] || @rates[currency2.downcase]
12
- raise CurrencyNotSupported unless rates
13
- rate = rates["rates"][currency1] || rates["rates"][currency2]
14
- raise CurrencyNotSupported unless rate
15
- BigDecimal.new(rate.to_s).round(self.class::DECIMAL_PRECISION)
16
- end
17
-
18
- def invert_rate(from,to,rate)
19
- if SUPPORTED_CURRENCIES.include?(to)
20
- _invert_rate(rate)
21
- else
22
- rate
23
- end
24
- end
25
-
26
- def supported_currency_pairs
27
- cache_supported_currency_pairs do
28
- @rates.each do |base_name, content|
29
- currency1 = content["base"]
30
- content["rates"].each do |currency2, rate|
31
- @supported_currency_pairs << "#{currency1}/#{currency2}"
32
- end
33
- end
34
- end
35
- end
36
-
37
- end
38
- end
@@ -1,51 +0,0 @@
1
- require 'uri'
2
-
3
- module CurrencyRate
4
-
5
- class YahooAdapter < FiatAdapter
6
-
7
- SUPPORTED_CURRENCIES = %w(
8
- AFN EUR ALL DZD USD AOA XCD ARS AMD AWG AUD AZN BSD BHD BDT BBD BYR BZD XOF BMD BTN INR BAM BWP NOK BRL BND BGN BIF KHR XAF CAD CVE KYD CLF CLP CNY COP KMF NZD CRC HRK CUC CUP ANG CZK DKK DJF DOP EGP SVC ERN ETB FKP FJD XPF GMD GEL GHS GIP GTQ GBP GNF GYD HTG HNL HKD HUF ISK IDR XDR IQD ILS JMD JPY JOD KZT KES KWD KGS LAK LBP LSL ZAR LRD LYD CHF LTL MOP MGA MWK MYR MVR MRO MUR MXN MXV MNT MAD MZN MMK NAD NPR NIO NGN OMR PKR PAB PGK PYG PEN PHP PLN QAR RON RUB RWF WST STD SAR RSD SCR SLL SGD SBD SOS LKR SDG SRD SZL SEK SYP TJS THB TOP TTD TND TRY TMT UGX UAH AED UYU UZS VUV VND YER ZMW ZWL XAU XPD XPT XAG FRF CYP ECS DEM ITL IEP LVL
9
- )
10
-
11
- CROSS_RATE_CURRENCY = 'USD'
12
-
13
- # Example URL (follow to un-shorten): http://goo.gl/62Aedt
14
- FETCH_URL = "http://query.yahooapis.com/v1/public/yql?" + URI.encode_www_form(
15
- format: 'json',
16
- env: "store://datatables.org/alltableswithkeys",
17
- q: "SELECT * FROM yahoo.finance.xchange WHERE pair IN" +
18
- # The following line is building array string in SQL: '("USDJPY", "USDRUB", ...)'
19
- "(#{SUPPORTED_CURRENCIES.map{|x| '"' + CROSS_RATE_CURRENCY + x.upcase + '"'}.join(',')})"
20
- )
21
-
22
- def invert_rate(from,to,rate)
23
- if to == 'USD'
24
- _invert_rate(rate)
25
- else
26
- rate
27
- end
28
- end
29
-
30
- def currency_pair_rate(currency1, currency2)
31
- rates = @rates.deep_get('query', 'results', 'rate')
32
- rate = if CROSS_RATE_CURRENCY == currency1.upcase
33
- rates.find { |x| x['id'] == "#{CROSS_RATE_CURRENCY}#{currency2.upcase}" }
34
- else
35
- rates.find { |x| x['id'] == "#{CROSS_RATE_CURRENCY}#{currency1.upcase}" }
36
- end
37
- raise CurrencyNotSupported unless rate
38
- rate = BigDecimal.new(rate['Rate'])
39
- rate.round(self.class::DECIMAL_PRECISION)
40
- end
41
-
42
- def supported_currency_pairs
43
- cache_supported_currency_pairs do
44
- @rates["query"]["results"]["rate"].each do |r|
45
- @supported_currency_pairs << r["Name"]
46
- end
47
- end
48
- end
49
-
50
- end
51
- end