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.
- checksums.yaml +4 -4
- data/Gemfile +3 -4
- data/README.md +41 -53
- data/VERSION +1 -1
- data/currency-rate.gemspec +92 -78
- data/lib/adapter.rb +37 -83
- data/lib/adapters/crypto/bitfinex_adapter.rb +17 -0
- data/lib/adapters/crypto/bitpay_adapter.rb +14 -0
- data/lib/adapters/crypto/bitstamp_adapter.rb +19 -0
- data/lib/adapters/crypto/btc_china_adapter.rb +11 -0
- data/lib/adapters/crypto/btc_e_adapter.rb +18 -0
- data/lib/adapters/crypto/coinbase_adapter.rb +14 -0
- data/lib/adapters/crypto/huobi_adapter.rb +17 -0
- data/lib/adapters/crypto/kraken_adapter.rb +29 -0
- data/lib/adapters/crypto/localbitcoins_adapter.rb +14 -0
- data/lib/adapters/crypto/okcoin_adapter.rb +19 -0
- data/lib/adapters/fiat/fixer_adapter.rb +16 -0
- data/lib/adapters/fiat/forge_adapter.rb +23 -0
- data/lib/adapters/fiat/yahoo_adapter.rb +35 -0
- data/lib/configuration.rb +21 -0
- data/lib/currency_rate.rb +52 -48
- data/lib/fetcher.rb +71 -0
- data/lib/storage/file_storage.rb +29 -0
- data/lib/storage/serializers/yaml_serializer.rb +15 -0
- data/lib/synchronizer.rb +31 -0
- data/spec/fixtures/adapters/bitfinex_adapter.yml +18 -0
- data/spec/fixtures/adapters/bitpay_adapter.yml +486 -0
- data/spec/fixtures/adapters/bitstamp_adapter.yml +30 -0
- data/spec/fixtures/adapters/btc_china_adapter.yml +11 -0
- data/spec/fixtures/adapters/btce_adapter.yml +60 -0
- data/spec/fixtures/adapters/coinbase_adapter.yml +680 -0
- data/spec/fixtures/adapters/fixer_adapter.yml +34 -0
- data/spec/fixtures/adapters/forge_adapter.yml +75 -0
- data/spec/fixtures/adapters/huobi_adapter.yml +22 -0
- data/spec/fixtures/adapters/kraken_adapter.yml +124 -0
- data/spec/fixtures/adapters/localbitcoins_adapter.yml +381 -0
- data/spec/fixtures/adapters/normalized/bitfinex_adapter.yml +2 -0
- data/spec/fixtures/adapters/normalized/bitpay_adapter.yml +161 -0
- data/spec/fixtures/adapters/normalized/bitstamp_adapter.yml +3 -0
- data/spec/fixtures/adapters/normalized/btc_china_adapter.yml +1 -0
- data/spec/fixtures/adapters/normalized/btce_adapter.yml +5 -0
- data/spec/fixtures/adapters/normalized/coinbase_adapter.yml +680 -0
- data/spec/fixtures/adapters/normalized/fixer_adapter.yml +32 -0
- data/spec/fixtures/adapters/normalized/forge_adapter.yml +16 -0
- data/spec/fixtures/adapters/normalized/huobi_adapter.yml +2 -0
- data/spec/fixtures/adapters/normalized/kraken_adapter.yml +4 -0
- data/spec/fixtures/adapters/normalized/localbitcoins_adapter.yml +57 -0
- data/spec/fixtures/adapters/normalized/okcoin_adapter.yml +4 -0
- data/spec/fixtures/adapters/normalized/yahoo_adapter.yml +160 -0
- data/spec/fixtures/adapters/okcoin_adapter.yml +40 -0
- data/spec/fixtures/adapters/yahoo_adapter.yml +1119 -0
- data/spec/lib/adapter_spec.rb +54 -0
- data/spec/lib/adapters/crypto/bitfinex_adapter_spec.rb +13 -0
- data/spec/lib/adapters/crypto/bitpay_adapter_spec.rb +13 -0
- data/spec/lib/adapters/crypto/bitstamp_adapter_spec.rb +13 -0
- data/spec/lib/adapters/crypto/btc_china_adapter_spec.rb +13 -0
- data/spec/lib/adapters/crypto/btc_e_adapter_spec.rb +13 -0
- data/spec/lib/adapters/crypto/coinbase_adapter_spec.rb +13 -0
- data/spec/lib/adapters/crypto/huobi_adapter_spec.rb +13 -0
- data/spec/lib/adapters/crypto/kraken_adapter_spec.rb +13 -0
- data/spec/lib/adapters/crypto/localbitcoins_adapter_spec.rb +13 -0
- data/spec/lib/adapters/crypto/okcoin_adapter_spec.rb +13 -0
- data/spec/lib/adapters/fiat/fixer_adapter_spec.rb +13 -0
- data/spec/lib/adapters/fiat/forge_adapter_spec.rb +23 -0
- data/spec/lib/adapters/fiat/yahoo_adapter_spec.rb +13 -0
- data/spec/lib/currency_rate_spec.rb +9 -0
- data/spec/lib/fetcher_spec.rb +156 -0
- data/spec/lib/storage/file_storage_spec.rb +38 -0
- data/spec/lib/synchronizer_spec.rb +65 -0
- data/spec/spec_helper.rb +23 -8
- data/spec/support/matchers/eq_any_of.rb +3 -0
- metadata +67 -64
- data/Gemfile.lock +0 -93
- data/lib/core_ext/deep_get.rb +0 -11
- data/lib/crypto_adapter.rb +0 -19
- data/lib/crypto_adapters/average_rate_adapter.rb +0 -54
- data/lib/crypto_adapters/bitfinex_adapter.rb +0 -40
- data/lib/crypto_adapters/bitpay_adapter.rb +0 -33
- data/lib/crypto_adapters/bitstamp_adapter.rb +0 -44
- data/lib/crypto_adapters/btcchina_adapter.rb +0 -19
- data/lib/crypto_adapters/btce_adapter.rb +0 -44
- data/lib/crypto_adapters/coinbase_adapter.rb +0 -23
- data/lib/crypto_adapters/huobi_adapter.rb +0 -40
- data/lib/crypto_adapters/kraken_adapter.rb +0 -42
- data/lib/crypto_adapters/localbitcoins_adapter.rb +0 -30
- data/lib/crypto_adapters/okcoin_adapter.rb +0 -43
- data/lib/fiat_adapter.rb +0 -17
- data/lib/fiat_adapters/fixer_adapter.rb +0 -38
- data/lib/fiat_adapters/yahoo_adapter.rb +0 -51
- data/lib/storage.rb +0 -20
- data/spec/currency_rate_spec.rb +0 -52
- data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/average_rate_adapter.yml +0 -567
- data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/bitfinex_adapter.yml +0 -121
- data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/bitpay_adapter.yml +0 -272
- data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/btcchina_adapter.yml +0 -55
- data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/btce_adapter.yml +0 -223
- data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/coinbase_adapter.yml +0 -96
- data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/huobi_adapter.yml +0 -83
- data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/kraken_adapter.yml +0 -179
- data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/localbitcoins_adapter.yml +0 -133
- data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/okcoin_adapter.yml +0 -223
- data/spec/fixtures/vcr/exchange_rate_adapters/fiat_adapters/fixer_adapter.yml +0 -85
- data/spec/fixtures/vcr/exchange_rate_adapters/fiat_adapters/yahoo_adapter.yml +0 -48
- data/spec/lib/crypto_adapter_spec.rb +0 -56
- data/spec/lib/crypto_adapters/average_rate_adapter_spec.rb +0 -46
- data/spec/lib/crypto_adapters/bitfinex_adapter_spec.rb +0 -38
- data/spec/lib/crypto_adapters/bitpay_adapter_spec.rb +0 -40
- data/spec/lib/crypto_adapters/bitstamp_adapter_spec.rb +0 -44
- data/spec/lib/crypto_adapters/btcchina_adapter_spec.rb +0 -36
- data/spec/lib/crypto_adapters/btce_adapter_spec.rb +0 -42
- data/spec/lib/crypto_adapters/coinbase_adapter_spec.rb +0 -39
- data/spec/lib/crypto_adapters/huobi_adapter_spec.rb +0 -38
- data/spec/lib/crypto_adapters/kraken_adapter_spec.rb +0 -38
- data/spec/lib/crypto_adapters/localbitcoins_adapter_spec.rb +0 -36
- data/spec/lib/crypto_adapters/okcoin_adapter_spec.rb +0 -43
- data/spec/lib/fiat_adapters/fixer_adapter_spec.rb +0 -25
- data/spec/lib/fiat_adapters/yahoo_adapter_spec.rb +0 -25
- 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
|