currency-rate 0.3.8 → 0.3.9

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 (34) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/currency-rate.gemspec +25 -25
  4. data/lib/adapter.rb +3 -6
  5. data/lib/crypto_adapter.rb +19 -0
  6. data/lib/{btc_adapters → crypto_adapters}/average_rate_adapter.rb +2 -1
  7. data/lib/{btc_adapters → crypto_adapters}/bitfinex_adapter.rb +3 -2
  8. data/lib/{btc_adapters → crypto_adapters}/bitpay_adapter.rb +2 -1
  9. data/lib/{btc_adapters → crypto_adapters}/bitstamp_adapter.rb +3 -2
  10. data/lib/{btc_adapters → crypto_adapters}/btcchina_adapter.rb +2 -1
  11. data/lib/{btc_adapters → crypto_adapters}/btce_adapter.rb +3 -2
  12. data/lib/{btc_adapters → crypto_adapters}/coinbase_adapter.rb +2 -1
  13. data/lib/{btc_adapters → crypto_adapters}/huobi_adapter.rb +3 -2
  14. data/lib/{btc_adapters → crypto_adapters}/kraken_adapter.rb +4 -4
  15. data/lib/{btc_adapters → crypto_adapters}/localbitcoins_adapter.rb +3 -2
  16. data/lib/{btc_adapters → crypto_adapters}/okcoin_adapter.rb +3 -2
  17. data/lib/currency_rate.rb +18 -13
  18. data/lib/fiat_adapter.rb +2 -7
  19. data/lib/fiat_adapters/fixer_adapter.rb +3 -2
  20. data/lib/fiat_adapters/yahoo_adapter.rb +1 -1
  21. data/spec/lib/{btc_adapter_spec.rb → crypto_adapter_spec.rb} +5 -3
  22. data/spec/lib/{btc_adapters → crypto_adapters}/average_rate_adapter_spec.rb +0 -0
  23. data/spec/lib/{btc_adapters → crypto_adapters}/bitfinex_adapter_spec.rb +0 -0
  24. data/spec/lib/{btc_adapters → crypto_adapters}/bitpay_adapter_spec.rb +0 -0
  25. data/spec/lib/{btc_adapters → crypto_adapters}/bitstamp_adapter_spec.rb +0 -0
  26. data/spec/lib/{btc_adapters → crypto_adapters}/btcchina_adapter_spec.rb +0 -0
  27. data/spec/lib/{btc_adapters → crypto_adapters}/btce_adapter_spec.rb +0 -0
  28. data/spec/lib/{btc_adapters → crypto_adapters}/coinbase_adapter_spec.rb +0 -0
  29. data/spec/lib/{btc_adapters → crypto_adapters}/huobi_adapter_spec.rb +0 -0
  30. data/spec/lib/{btc_adapters → crypto_adapters}/kraken_adapter_spec.rb +0 -0
  31. data/spec/lib/{btc_adapters → crypto_adapters}/localbitcoins_adapter_spec.rb +0 -0
  32. data/spec/lib/{btc_adapters → crypto_adapters}/okcoin_adapter_spec.rb +0 -0
  33. metadata +26 -26
  34. data/lib/btc_adapter.rb +0 -21
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f90626ba2850871f4a11109c3325c0fb93eacfa2
4
- data.tar.gz: 1bdfde8354857ea4eb18c7bbc82df9cc6d57dacd
3
+ metadata.gz: dae4fdb70ee423c0951959f02d617c058c7db632
4
+ data.tar.gz: a63d7445c9ef171e55b9540272a43ab92645ed90
5
5
  SHA512:
6
- metadata.gz: b331ad6154585cfb839900aa2be697b6da4636967a2679bdc3cbf4c8062cb094b30300944908a1695681741cbf47a36dc04b746b4d64b59164fab511e82d4281
7
- data.tar.gz: a0f0b4a9b4b6281154619dd6e4d7ee10c8d99b9771840b7a21bdecc78c696ccd96bcad0cc3dd342d17d9c07d69f718521020807509e69651512243964c6546ad
6
+ metadata.gz: fdfcfc768c1b40fbd944f78ea1822c9254dc1385d63ff023f9fc4806c47c30a2021faf2e42648a9ee6bfabbd0062bd12c2b9bac6b67ebd2148d395f43161a44f
7
+ data.tar.gz: 3632250c161414a608933f067dd5325ebfb9cf7054727c7e064d1b833a09be7e31017e8e588c59c528731b664fecddeb07ec98c32e1b48807938948d053f15a5
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.8
1
+ 0.3.9
@@ -11,7 +11,7 @@ Gem::Specification.new do |s|
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["Roman Snitko"]
14
- s.date = "2017-07-26"
14
+ s.date = "2017-08-24"
15
15
  s.description = "Fetches exchange rates from various sources and does the conversion"
16
16
  s.email = "roman.snitko@gmail.com"
17
17
  s.extra_rdoc_files = [
@@ -29,19 +29,19 @@ Gem::Specification.new do |s|
29
29
  "VERSION",
30
30
  "currency-rate.gemspec",
31
31
  "lib/adapter.rb",
32
- "lib/btc_adapter.rb",
33
- "lib/btc_adapters/average_rate_adapter.rb",
34
- "lib/btc_adapters/bitfinex_adapter.rb",
35
- "lib/btc_adapters/bitpay_adapter.rb",
36
- "lib/btc_adapters/bitstamp_adapter.rb",
37
- "lib/btc_adapters/btcchina_adapter.rb",
38
- "lib/btc_adapters/btce_adapter.rb",
39
- "lib/btc_adapters/coinbase_adapter.rb",
40
- "lib/btc_adapters/huobi_adapter.rb",
41
- "lib/btc_adapters/kraken_adapter.rb",
42
- "lib/btc_adapters/localbitcoins_adapter.rb",
43
- "lib/btc_adapters/okcoin_adapter.rb",
44
32
  "lib/core_ext/deep_get.rb",
33
+ "lib/crypto_adapter.rb",
34
+ "lib/crypto_adapters/average_rate_adapter.rb",
35
+ "lib/crypto_adapters/bitfinex_adapter.rb",
36
+ "lib/crypto_adapters/bitpay_adapter.rb",
37
+ "lib/crypto_adapters/bitstamp_adapter.rb",
38
+ "lib/crypto_adapters/btcchina_adapter.rb",
39
+ "lib/crypto_adapters/btce_adapter.rb",
40
+ "lib/crypto_adapters/coinbase_adapter.rb",
41
+ "lib/crypto_adapters/huobi_adapter.rb",
42
+ "lib/crypto_adapters/kraken_adapter.rb",
43
+ "lib/crypto_adapters/localbitcoins_adapter.rb",
44
+ "lib/crypto_adapters/okcoin_adapter.rb",
45
45
  "lib/currency_rate.rb",
46
46
  "lib/fiat_adapter.rb",
47
47
  "lib/fiat_adapters/fixer_adapter.rb",
@@ -60,18 +60,18 @@ Gem::Specification.new do |s|
60
60
  "spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/okcoin_adapter.yml",
61
61
  "spec/fixtures/vcr/exchange_rate_adapters/fiat_adapters/fixer_adapter.yml",
62
62
  "spec/fixtures/vcr/exchange_rate_adapters/fiat_adapters/yahoo_adapter.yml",
63
- "spec/lib/btc_adapter_spec.rb",
64
- "spec/lib/btc_adapters/average_rate_adapter_spec.rb",
65
- "spec/lib/btc_adapters/bitfinex_adapter_spec.rb",
66
- "spec/lib/btc_adapters/bitpay_adapter_spec.rb",
67
- "spec/lib/btc_adapters/bitstamp_adapter_spec.rb",
68
- "spec/lib/btc_adapters/btcchina_adapter_spec.rb",
69
- "spec/lib/btc_adapters/btce_adapter_spec.rb",
70
- "spec/lib/btc_adapters/coinbase_adapter_spec.rb",
71
- "spec/lib/btc_adapters/huobi_adapter_spec.rb",
72
- "spec/lib/btc_adapters/kraken_adapter_spec.rb",
73
- "spec/lib/btc_adapters/localbitcoins_adapter_spec.rb",
74
- "spec/lib/btc_adapters/okcoin_adapter_spec.rb",
63
+ "spec/lib/crypto_adapter_spec.rb",
64
+ "spec/lib/crypto_adapters/average_rate_adapter_spec.rb",
65
+ "spec/lib/crypto_adapters/bitfinex_adapter_spec.rb",
66
+ "spec/lib/crypto_adapters/bitpay_adapter_spec.rb",
67
+ "spec/lib/crypto_adapters/bitstamp_adapter_spec.rb",
68
+ "spec/lib/crypto_adapters/btcchina_adapter_spec.rb",
69
+ "spec/lib/crypto_adapters/btce_adapter_spec.rb",
70
+ "spec/lib/crypto_adapters/coinbase_adapter_spec.rb",
71
+ "spec/lib/crypto_adapters/huobi_adapter_spec.rb",
72
+ "spec/lib/crypto_adapters/kraken_adapter_spec.rb",
73
+ "spec/lib/crypto_adapters/localbitcoins_adapter_spec.rb",
74
+ "spec/lib/crypto_adapters/okcoin_adapter_spec.rb",
75
75
  "spec/lib/fiat_adapters/fixer_adapter_spec.rb",
76
76
  "spec/lib/fiat_adapters/yahoo_adapter_spec.rb",
77
77
  "spec/lib/storage_spec.rb",
data/lib/adapter.rb CHANGED
@@ -5,6 +5,8 @@ module CurrencyRate
5
5
  class FetchingFailed < Exception; end
6
6
  class CurrencyNotSupported < Exception; end
7
7
 
8
+ DECIMAL_PRECISION = nil
9
+
8
10
  attr_accessor :try_storage_on_fetching_failed
9
11
  attr_reader :storage
10
12
 
@@ -97,13 +99,8 @@ module CurrencyRate
97
99
 
98
100
  def _invert_rate(rate)
99
101
  r = (BigDecimal.new('1')/BigDecimal.new(rate.to_s))
100
- r = r.round(decimal_precision) if decimal_precision
102
+ r = r.round(self.class::DECIMAL_PRECISION) if self.class::DECIMAL_PRECISION
101
103
  r
102
104
  end
103
-
104
- def decimal_precision
105
- nil
106
- end
107
-
108
105
  end
109
106
  end
@@ -0,0 +1,19 @@
1
+ module CurrencyRate
2
+
3
+ class CryptoAdapter < Adapter
4
+
5
+ SUPPORTED_CRYPTO_CURRENCIES = []
6
+
7
+ DECIMAL_PRECISION = 9
8
+
9
+ def rate_for(from,to)
10
+ super
11
+ end
12
+
13
+ def invert_rate(from,to,rate)
14
+ self.class::SUPPORTED_CRYPTO_CURRENCIES.include?(to) ? _invert_rate(rate) : rate
15
+ end
16
+
17
+ end
18
+
19
+ end
@@ -1,7 +1,8 @@
1
1
  module CurrencyRate
2
- class AverageRateAdapter < BtcAdapter
2
+ class AverageRateAdapter < CryptoAdapter
3
3
 
4
4
  DEFAULT_CURRENCIES = ["USD", "BTC"]
5
+ SUPPORTED_CRYPTO_CURRENCIES = ["BTC"]
5
6
 
6
7
  # Takes exchange rate adapters instances or classes as arguments
7
8
  def self.instance(*adapters)
@@ -1,11 +1,12 @@
1
1
  module CurrencyRate
2
- class BitfinexAdapter < BtcAdapter
2
+ class BitfinexAdapter < CryptoAdapter
3
3
 
4
4
  FETCH_URL = {
5
5
  'btc_usd' => 'https://api.bitfinex.com/v1/pubticker/btcusd',
6
6
  'ltc_usd' => 'https://api.bitfinex.com/v1/pubticker/ltcusd'
7
7
  }
8
8
  DEFAULT_CURRENCIES = ["USD", "BTC"]
9
+ SUPPORTED_CRYPTO_CURRENCIES = ["BTC", "LTC"]
9
10
 
10
11
  def rate_for(from,to)
11
12
  super
@@ -20,7 +21,7 @@ module CurrencyRate
20
21
  end
21
22
 
22
23
  def invert_rate(from,to,rate)
23
- if ['BTC', 'LTC'].include?(to)
24
+ if self.class::SUPPORTED_CRYPTO_CURRENCIES.include?(to)
24
25
  _invert_rate(rate)
25
26
  else
26
27
  rate
@@ -1,8 +1,9 @@
1
1
  module CurrencyRate
2
- class BitpayAdapter < BtcAdapter
2
+ class BitpayAdapter < CryptoAdapter
3
3
 
4
4
  FETCH_URL = 'https://bitpay.com/api/rates'
5
5
  DEFAULT_CURRENCIES = ["USD", "BTC"]
6
+ SUPPORTED_CRYPTO_CURRENCIES = ["BTC"]
6
7
 
7
8
  def rate_for(from,to)
8
9
  super
@@ -1,5 +1,5 @@
1
1
  module CurrencyRate
2
- class BitstampAdapter < BtcAdapter
2
+ class BitstampAdapter < CryptoAdapter
3
3
 
4
4
  FETCH_URL = {
5
5
  'btc_usd' => 'https://www.bitstamp.net/api/v2/ticker/btcusd/',
@@ -7,6 +7,7 @@ module CurrencyRate
7
7
  'eur_usd' => 'https://www.bitstamp.net/api/v2/ticker/eurusd/'
8
8
  }
9
9
  DEFAULT_CURRENCIES = ["USD", "BTC"]
10
+ SUPPORTED_CRYPTO_CURRENCIES = ["BTC"]
10
11
 
11
12
  def rate_for(from,to)
12
13
  super
@@ -16,7 +17,7 @@ module CurrencyRate
16
17
 
17
18
  # Because Bitstamp has USD/EUR pair
18
19
  def invert_rate(from,to,rate)
19
- if to == 'BTC' || (from == 'USD' && to == 'EUR')
20
+ if self.class::SUPPORTED_CRYPTO_CURRENCIES.include?(to) || (from == 'USD' && to == 'EUR')
20
21
  _invert_rate(rate)
21
22
  else
22
23
  rate
@@ -1,8 +1,9 @@
1
1
  module CurrencyRate
2
- class BTCChinaAdapter < BtcAdapter
2
+ class BTCChinaAdapter < CryptoAdapter
3
3
 
4
4
  FETCH_URL = 'https://data.btcchina.com/data/ticker'
5
5
  DEFAULT_CURRENCIES = ["CNY", "BTC"]
6
+ SUPPORTED_CRYPTO_CURRENCIES = ["BTC"]
6
7
 
7
8
  def rate_for(from,to)
8
9
  super
@@ -1,5 +1,5 @@
1
1
  module CurrencyRate
2
- class BtceAdapter < BtcAdapter
2
+ class BtceAdapter < CryptoAdapter
3
3
 
4
4
  FETCH_URL = {
5
5
  'btc_usd' => 'https://btc-e.com/api/2/btc_usd/ticker',
@@ -9,6 +9,7 @@ module CurrencyRate
9
9
  'eur_rub' => 'https://btc-e.com/api/2/eur_rur/ticker'
10
10
  }
11
11
  DEFAULT_CURRENCIES = ["USD", "BTC"]
12
+ SUPPORTED_CRYPTO_CURRENCIES = ["BTC"]
12
13
 
13
14
 
14
15
  def rate_for(from,to)
@@ -24,7 +25,7 @@ module CurrencyRate
24
25
  end
25
26
 
26
27
  def invert_rate(from,to,rate)
27
- if to == 'BTC' || (from == 'RUB' && to == 'USD') || (from == 'RUB' && to == 'EUR')
28
+ if self.class::SUPPORTED_CRYPTO_CURRENCIES.include?(to) || (from == 'RUB' && to == 'USD') || (from == 'RUB' && to == 'EUR')
28
29
  _invert_rate(rate)
29
30
  else
30
31
  rate
@@ -1,8 +1,9 @@
1
1
  module CurrencyRate
2
- class CoinbaseAdapter < BtcAdapter
2
+ class CoinbaseAdapter < CryptoAdapter
3
3
 
4
4
  FETCH_URL = 'https://coinbase.com/api/v1/currencies/exchange_rates'
5
5
  DEFAULT_CURRENCIES = ["USD", "BTC"]
6
+ SUPPORTED_CRYPTO_CURRENCIES = ["BTC", "LTC"]
6
7
 
7
8
  def rate_for(from,to)
8
9
  super
@@ -1,11 +1,12 @@
1
1
  module CurrencyRate
2
- class HuobiAdapter < BtcAdapter
2
+ class HuobiAdapter < CryptoAdapter
3
3
 
4
4
  FETCH_URL = {
5
5
  'btc_cny' => 'http://api.huobi.com/staticmarket/ticker_btc_json.js',
6
6
  'ltc_cny' => 'http://api.huobi.com/staticmarket/ticker_ltc_json.js'
7
7
  }
8
8
  DEFAULT_CURRENCIES = ["CNY", "BTC"]
9
+ SUPPORTED_CRYPTO_CURRENCIES = ["BTC", "LTC"]
9
10
 
10
11
  def rate_for(from,to)
11
12
  super
@@ -20,7 +21,7 @@ module CurrencyRate
20
21
  end
21
22
 
22
23
  def invert_rate(from,to,rate)
23
- if ['BTC', 'LTC'].include?(to)
24
+ if self.class::SUPPORTED_CRYPTO_CURRENCIES.include?(to)
24
25
  _invert_rate(rate)
25
26
  else
26
27
  rate
@@ -1,5 +1,5 @@
1
1
  module CurrencyRate
2
- class KrakenAdapter < BtcAdapter
2
+ class KrakenAdapter < CryptoAdapter
3
3
 
4
4
  FETCH_URL = {
5
5
  "usd_btc" => 'https://api.kraken.com/0/public/Ticker?pair=xbtusd',
@@ -8,7 +8,7 @@ module CurrencyRate
8
8
  "eur_ltc" => 'https://api.kraken.com/0/public/Ticker?pair=ltceur',
9
9
  }
10
10
  DEFAULT_CURRENCIES = ["USD", "BTC"]
11
- CRYPTO_CURRENCIES = ["BTC", "LTC"]
11
+ SUPPORTED_CRYPTO_CURRENCIES = ["BTC", "LTC"]
12
12
  ASSET_MAP = {
13
13
  "BTC" => "XBT",
14
14
  }
@@ -21,8 +21,8 @@ module CurrencyRate
21
21
 
22
22
  def currency_pair_rate(currency1, currency2)
23
23
  rate = @rates["#{currency1.downcase}_#{currency2.downcase}"] || @rates["#{currency2.downcase}_#{currency1.downcase}"]
24
- raise CurrencyNotSupported unless rate || ([currency1, currency2] & CRYPTO_CURRENCIES).any?
25
- fiat, crypto = CRYPTO_CURRENCIES.include?(currency1) ? [currency2, currency1] : [currency1, currency2]
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
26
  rate['result']["X#{ta(crypto)}Z#{ta(fiat)}"]['c'].first
27
27
  end
28
28
 
@@ -1,8 +1,9 @@
1
1
  module CurrencyRate
2
- class LocalbitcoinsAdapter < BtcAdapter
2
+ class LocalbitcoinsAdapter < CryptoAdapter
3
3
 
4
4
  FETCH_URL = 'https://localbitcoins.com/bitcoinaverage/ticker-all-currencies/'
5
5
  DEFAULT_CURRENCIES = ["USD", "BTC"]
6
+ SUPPORTED_CRYPTO_CURRENCIES = ["BTC"]
6
7
 
7
8
  def rate_for(from,to)
8
9
  super
@@ -13,7 +14,7 @@ module CurrencyRate
13
14
 
14
15
  def currency_pair_rate(currency1, currency2)
15
16
  rate = @rates[currency1] || @rates[currency2]
16
- raise CurrencyNotSupported if !rate || !([currency1, currency2].include?('BTC'))
17
+ raise CurrencyNotSupported if !rate || !([currency1, currency2] & self.class::SUPPORTED_CRYPTO_CURRENCIES).any?
17
18
  rate['rates']['last']
18
19
  end
19
20
 
@@ -1,5 +1,5 @@
1
1
  module CurrencyRate
2
- class OkcoinAdapter < BtcAdapter
2
+ class OkcoinAdapter < CryptoAdapter
3
3
 
4
4
  FETCH_URL = {
5
5
  'ltc_usd' => 'https://www.okcoin.com/api/v1/ticker.do?symbol=ltc_usd',
@@ -8,6 +8,7 @@ module CurrencyRate
8
8
  'btc_cny' => 'https://www.okcoin.cn/api/ticker.do?symbol=btc_cny'
9
9
  }
10
10
  DEFAULT_CURRENCIES = ["CNY", "BTC"]
11
+ SUPPORTED_CRYPTO_CURRENCIES = ["BTC", "LTC"]
11
12
 
12
13
  def rate_for(from,to)
13
14
  super
@@ -23,7 +24,7 @@ module CurrencyRate
23
24
 
24
25
  # Because OKCoin has LTC
25
26
  def invert_rate(from,to,rate)
26
- if ['BTC', 'LTC'].include?(to)
27
+ if self.class::SUPPORTED_CRYPTO_CURRENCIES.include?(to)
27
28
  _invert_rate(rate)
28
29
  else
29
30
  rate
data/lib/currency_rate.rb CHANGED
@@ -5,7 +5,7 @@ require 'open-uri'
5
5
  require 'json'
6
6
 
7
7
  require "adapter"
8
- require "btc_adapter"
8
+ require "crypto_adapter"
9
9
  require "fiat_adapter"
10
10
 
11
11
  Dir["#{File.expand_path File.dirname(__FILE__)}/**/*.rb"].each { |f| require f }
@@ -14,42 +14,47 @@ module CurrencyRate
14
14
 
15
15
  def self.get(adapter_name, from, to, anchor_currency: nil, try_storage_on_fetching_failed: false)
16
16
 
17
- a = adapter_class(adapter_name)
17
+ a = adapter_instance(adapter_name)
18
18
  a.try_storage_on_fetching_failed = try_storage_on_fetching_failed
19
19
 
20
20
  # Setting default values for anchor currency depending on
21
21
  # which adapter type is un use.
22
- anchor_currency ||= if a.kind_of?(BtcAdapter)
23
- 'BTC' if anchor_currency.nil?
22
+ anchor_currency ||= if a.kind_of?(CryptoAdapter)
23
+ a.class::SUPPORTED_CRYPTO_CURRENCIES.include?("BTC") ? "BTC" : a.class::SUPPORTED_CRYPTO_CURRENCIES.first
24
24
  else
25
- 'USD' if anchor_currency.nil?
26
- end
25
+ a.class::SUPPORTED_CURRENCIES.include?("USD") ? "USD" : a.class::SUPPORTED_CURRENCIES.first
26
+ end if anchor_currency.nil?
27
27
 
28
28
  # None of the currencies is anchor currency?
29
29
  # No problem, convert the amount given into the anchor currency first.
30
30
  if [to, from].include?(anchor_currency)
31
31
  a.rate_for(from, to)
32
32
  else
33
- rate_from = get(adapter_name, anchor_currency, from)
34
- rate_to = get(adapter_name, anchor_currency, to )
33
+ rate_from = get(adapter_name, anchor_currency, from, try_storage_on_fetching_failed: try_storage_on_fetching_failed)
34
+ rate_to = get(adapter_name, anchor_currency, to , try_storage_on_fetching_failed: try_storage_on_fetching_failed)
35
35
  BigDecimal.new(rate_to.to_s)/BigDecimal.new(rate_from.to_s)
36
36
  end
37
37
  end
38
38
 
39
39
  def self.convert(adapter_name, amount:, from:, to:, anchor_currency: nil, try_storage_on_fetching_failed: false)
40
- result = BigDecimal.new(amount.to_s)*BigDecimal.new(get(adapter_name, from, to, anchor_currency: nil, try_storage_on_fetching_failed: try_storage_on_fetching_failed).to_s)
41
- to == 'BTC' ? result.round(9) : result.round(2)
40
+ a = adapter_instance(adapter_name)
41
+ result = BigDecimal.new(amount.to_s)*BigDecimal.new(get(a, from, to, anchor_currency: anchor_currency, try_storage_on_fetching_failed: try_storage_on_fetching_failed).to_s)
42
+ result.round(a.kind_of?(CryptoAdapter) && a.class::SUPPORTED_CRYPTO_CURRENCIES.include?(to) ? a.class::DECIMAL_PRECISION : 2)
42
43
  end
43
44
 
44
45
  def self.default_currencies_for(adapter_name)
45
- adapter_class(adapter_name).class::DEFAULT_CURRENCIES
46
+ adapter_class(adapter_name)::DEFAULT_CURRENCIES
46
47
  end
47
48
 
48
49
  private
49
50
 
50
- def self.adapter_class(s)
51
+ def self.adapter_instance(s)
51
52
  return s unless s.kind_of?(String) # if we pass class, no need to convert
52
- adapter = classify_string("#{s}_adapter", CurrencyRate).instance
53
+ adapter_class(s).instance
54
+ end
55
+
56
+ def self.adapter_class(s)
57
+ classify_string("#{s}_adapter", CurrencyRate)
53
58
  end
54
59
 
55
60
  def self.classify_string(s, prefix="")
data/lib/fiat_adapter.rb CHANGED
@@ -3,7 +3,8 @@ module CurrencyRate
3
3
  class FiatAdapter < Adapter
4
4
 
5
5
  BigDecimal.mode BigDecimal::ROUND_MODE, :banker
6
- #@@decimal_precision = 2
6
+
7
+ DECIMAL_PRECISION = 2
7
8
 
8
9
  def rate_for(from,to)
9
10
  super
@@ -11,12 +12,6 @@ module CurrencyRate
11
12
  invert_rate(from,to,rate)
12
13
  end
13
14
 
14
- private
15
-
16
- def decimal_precision
17
- 2
18
- end
19
-
20
15
  end
21
16
 
22
17
  end
@@ -5,17 +5,18 @@ module CurrencyRate
5
5
  "eur" => "http://api.fixer.io/latest?base=eur",
6
6
  "usd" => "http://api.fixer.io/latest?base=usd"
7
7
  }
8
+ SUPPORTED_CURRENCIES = %w(USD EUR)
8
9
 
9
10
  def currency_pair_rate(currency1, currency2)
10
11
  rates = @rates[currency1.downcase] || @rates[currency2.downcase]
11
12
  raise CurrencyNotSupported unless rates
12
13
  rate = rates["rates"][currency1] || rates["rates"][currency2]
13
14
  raise CurrencyNotSupported unless rate
14
- BigDecimal.new(rate.to_s).round(decimal_precision)
15
+ BigDecimal.new(rate.to_s).round(self.class::DECIMAL_PRECISION)
15
16
  end
16
17
 
17
18
  def invert_rate(from,to,rate)
18
- if (to == 'USD' || to == 'EUR')
19
+ if SUPPORTED_CURRENCIES.include?(to)
19
20
  _invert_rate(rate)
20
21
  else
21
22
  rate
@@ -36,7 +36,7 @@ module CurrencyRate
36
36
  end
37
37
  raise CurrencyNotSupported unless rate
38
38
  rate = BigDecimal.new(rate['Rate'])
39
- rate.round(decimal_precision)
39
+ rate.round(self.class::DECIMAL_PRECISION)
40
40
  end
41
41
 
42
42
  def supported_currency_pairs
@@ -1,13 +1,15 @@
1
1
  require 'spec_helper'
2
2
 
3
- RSpec.describe CurrencyRate::BtcAdapter do
3
+ RSpec.describe CurrencyRate::CryptoAdapter do
4
4
 
5
5
  class CurrencyRate::Adapter
6
6
  FETCH_URL = ''
7
7
  DEFAULT_CURRENCIES = { from: "BTC", to: "USD" }
8
8
  end
9
9
 
10
- class SomeExchangeAdapter < CurrencyRate::BtcAdapter
10
+ class SomeExchangeAdapter < CurrencyRate::CryptoAdapter
11
+ SUPPORTED_CRYPTO_CURRENCIES = ["BTC"]
12
+
11
13
  def rate_for(from,to)
12
14
  super
13
15
  rate = rate_to_f(750)
@@ -20,7 +22,7 @@ RSpec.describe CurrencyRate::BtcAdapter do
20
22
  end
21
23
 
22
24
  before(:each) do
23
- @exchange_adapter = CurrencyRate::BtcAdapter.instance
25
+ @exchange_adapter = CurrencyRate::CryptoAdapter.instance
24
26
  end
25
27
 
26
28
  it "inverts currency rate when needed" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: currency-rate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.8
4
+ version: 0.3.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Roman Snitko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-26 00:00:00.000000000 Z
11
+ date: 2017-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: satoshi-unit
@@ -112,19 +112,19 @@ files:
112
112
  - VERSION
113
113
  - currency-rate.gemspec
114
114
  - lib/adapter.rb
115
- - lib/btc_adapter.rb
116
- - lib/btc_adapters/average_rate_adapter.rb
117
- - lib/btc_adapters/bitfinex_adapter.rb
118
- - lib/btc_adapters/bitpay_adapter.rb
119
- - lib/btc_adapters/bitstamp_adapter.rb
120
- - lib/btc_adapters/btcchina_adapter.rb
121
- - lib/btc_adapters/btce_adapter.rb
122
- - lib/btc_adapters/coinbase_adapter.rb
123
- - lib/btc_adapters/huobi_adapter.rb
124
- - lib/btc_adapters/kraken_adapter.rb
125
- - lib/btc_adapters/localbitcoins_adapter.rb
126
- - lib/btc_adapters/okcoin_adapter.rb
127
115
  - lib/core_ext/deep_get.rb
116
+ - lib/crypto_adapter.rb
117
+ - lib/crypto_adapters/average_rate_adapter.rb
118
+ - lib/crypto_adapters/bitfinex_adapter.rb
119
+ - lib/crypto_adapters/bitpay_adapter.rb
120
+ - lib/crypto_adapters/bitstamp_adapter.rb
121
+ - lib/crypto_adapters/btcchina_adapter.rb
122
+ - lib/crypto_adapters/btce_adapter.rb
123
+ - lib/crypto_adapters/coinbase_adapter.rb
124
+ - lib/crypto_adapters/huobi_adapter.rb
125
+ - lib/crypto_adapters/kraken_adapter.rb
126
+ - lib/crypto_adapters/localbitcoins_adapter.rb
127
+ - lib/crypto_adapters/okcoin_adapter.rb
128
128
  - lib/currency_rate.rb
129
129
  - lib/fiat_adapter.rb
130
130
  - lib/fiat_adapters/fixer_adapter.rb
@@ -143,18 +143,18 @@ files:
143
143
  - spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/okcoin_adapter.yml
144
144
  - spec/fixtures/vcr/exchange_rate_adapters/fiat_adapters/fixer_adapter.yml
145
145
  - spec/fixtures/vcr/exchange_rate_adapters/fiat_adapters/yahoo_adapter.yml
146
- - spec/lib/btc_adapter_spec.rb
147
- - spec/lib/btc_adapters/average_rate_adapter_spec.rb
148
- - spec/lib/btc_adapters/bitfinex_adapter_spec.rb
149
- - spec/lib/btc_adapters/bitpay_adapter_spec.rb
150
- - spec/lib/btc_adapters/bitstamp_adapter_spec.rb
151
- - spec/lib/btc_adapters/btcchina_adapter_spec.rb
152
- - spec/lib/btc_adapters/btce_adapter_spec.rb
153
- - spec/lib/btc_adapters/coinbase_adapter_spec.rb
154
- - spec/lib/btc_adapters/huobi_adapter_spec.rb
155
- - spec/lib/btc_adapters/kraken_adapter_spec.rb
156
- - spec/lib/btc_adapters/localbitcoins_adapter_spec.rb
157
- - spec/lib/btc_adapters/okcoin_adapter_spec.rb
146
+ - spec/lib/crypto_adapter_spec.rb
147
+ - spec/lib/crypto_adapters/average_rate_adapter_spec.rb
148
+ - spec/lib/crypto_adapters/bitfinex_adapter_spec.rb
149
+ - spec/lib/crypto_adapters/bitpay_adapter_spec.rb
150
+ - spec/lib/crypto_adapters/bitstamp_adapter_spec.rb
151
+ - spec/lib/crypto_adapters/btcchina_adapter_spec.rb
152
+ - spec/lib/crypto_adapters/btce_adapter_spec.rb
153
+ - spec/lib/crypto_adapters/coinbase_adapter_spec.rb
154
+ - spec/lib/crypto_adapters/huobi_adapter_spec.rb
155
+ - spec/lib/crypto_adapters/kraken_adapter_spec.rb
156
+ - spec/lib/crypto_adapters/localbitcoins_adapter_spec.rb
157
+ - spec/lib/crypto_adapters/okcoin_adapter_spec.rb
158
158
  - spec/lib/fiat_adapters/fixer_adapter_spec.rb
159
159
  - spec/lib/fiat_adapters/yahoo_adapter_spec.rb
160
160
  - spec/lib/storage_spec.rb
data/lib/btc_adapter.rb DELETED
@@ -1,21 +0,0 @@
1
- module CurrencyRate
2
-
3
- class BtcAdapter < Adapter
4
-
5
- def rate_for(from,to)
6
- super
7
- end
8
-
9
- def invert_rate(from,to,rate)
10
- to == 'BTC' ? _invert_rate(rate) : rate
11
- end
12
-
13
- private
14
-
15
- def decimal_precision
16
- 9
17
- end
18
-
19
- end
20
-
21
- end