currency-rate 1.7.0 → 2.0.6

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 (45) hide show
  1. checksums.yaml +4 -4
  2. metadata +9 -125
  3. data/.document +0 -5
  4. data/.gitignore +0 -20
  5. data/.rspec +0 -1
  6. data/Gemfile +0 -6
  7. data/Gemfile.lock +0 -68
  8. data/LICENSE.txt +0 -20
  9. data/README.md +0 -73
  10. data/Rakefile +0 -43
  11. data/api_keys.yml.sample +0 -4
  12. data/currency-rate.gemspec +0 -41
  13. data/lib/adapter.rb +0 -71
  14. data/lib/adapters/crypto/binance_adapter.rb +0 -42
  15. data/lib/adapters/crypto/bitfinex_adapter.rb +0 -41
  16. data/lib/adapters/crypto/bitpay_adapter.rb +0 -29
  17. data/lib/adapters/crypto/bitstamp_adapter.rb +0 -26
  18. data/lib/adapters/crypto/btc_china_adapter.rb +0 -11
  19. data/lib/adapters/crypto/btc_e_adapter.rb +0 -18
  20. data/lib/adapters/crypto/coin_market_cap_adapter.rb +0 -31
  21. data/lib/adapters/crypto/coinbase_adapter.rb +0 -30
  22. data/lib/adapters/crypto/exmo_adapter.rb +0 -27
  23. data/lib/adapters/crypto/hit_btc_adapter.rb +0 -61
  24. data/lib/adapters/crypto/huobi_adapter.rb +0 -25
  25. data/lib/adapters/crypto/kraken_adapter.rb +0 -46
  26. data/lib/adapters/crypto/localbitcoins_adapter.rb +0 -25
  27. data/lib/adapters/crypto/okcoin_adapter.rb +0 -19
  28. data/lib/adapters/crypto/paxful_adapter.rb +0 -18
  29. data/lib/adapters/crypto/poloniex_adapter.rb +0 -33
  30. data/lib/adapters/crypto/yadio_adapter.rb +0 -19
  31. data/lib/adapters/fiat/bonbast_adapter.rb +0 -25
  32. data/lib/adapters/fiat/coinmonitor_adapter.rb +0 -14
  33. data/lib/adapters/fiat/currency_layer_adapter.rb +0 -32
  34. data/lib/adapters/fiat/fixer_adapter.rb +0 -18
  35. data/lib/adapters/fiat/forge_adapter.rb +0 -25
  36. data/lib/adapters/fiat/free_forex_adapter.rb +0 -32
  37. data/lib/adapters/fiat/yahoo_adapter.rb +0 -35
  38. data/lib/configuration.rb +0 -28
  39. data/lib/currency_rate.rb +0 -85
  40. data/lib/currency_rate/version.rb +0 -3
  41. data/lib/exceptions.rb +0 -9
  42. data/lib/fetcher.rb +0 -80
  43. data/lib/storage/file_storage.rb +0 -29
  44. data/lib/storage/serializers/yaml_serializer.rb +0 -15
  45. data/lib/synchronizer.rb +0 -54
@@ -1,25 +0,0 @@
1
- module CurrencyRate
2
- class LocalbitcoinsAdapter < Adapter
3
- # No need to use it for fetching, just additional information about supported currencies
4
- SUPPORTED_CURRENCIES = %w(
5
- AED AOA ARS AUD BDT BRL BYN CAD CHF CLP CNY COP CRC CZK DKK DOP EGP ETH
6
- EUR GBP GEL GHS HKD HUF IDR ILS INR IRR JOD JPY KES KRW KWD KZT LKR LTC
7
- MAD MWK MXN MYR NGN NOK NZD OMR PAB PEN PHP PKR PLN QAR RON RSD RUB RWF
8
- SAR SEK SGD SZL THB TRY TWD TZS UAH UGX USD UYU VES VND XAF XMR XOF XRP
9
- ZAR ZMW
10
- )
11
-
12
- ANCHOR_CURRENCY = "BTC"
13
-
14
- FETCH_URL = 'https://localbitcoins.com/bitcoinaverage/ticker-all-currencies/'
15
-
16
- def normalize(data)
17
- return nil unless super
18
- data.reduce({ "anchor" => ANCHOR_CURRENCY }) do |result, (fiat, value)|
19
- result["#{fiat.upcase}"] = BigDecimal(value["rates"]["last"].to_s)
20
- result
21
- end
22
- end
23
-
24
- end
25
- end
@@ -1,19 +0,0 @@
1
- module CurrencyRate
2
- class OkcoinAdapter < Adapter
3
- FETCH_URL = {
4
- 'LTC_USD' => 'https://www.okcoin.com/api/v1/ticker.do?symbol=ltc_usd',
5
- 'BTC_USD' => 'https://www.okcoin.com/api/v1/ticker.do?symbol=btc_usd',
6
- 'LTC_CNY' => 'https://www.okcoin.cn/api/ticker.do?symbol=ltc_cny',
7
- 'BTC_CNY' => 'https://www.okcoin.cn/api/ticker.do?symbol=btc_cny'
8
- }
9
-
10
- def normalize(data)
11
- return nil unless super
12
- data.reduce({}) do |result, (pair, value)|
13
- result[pair] = BigDecimal(value["ticker"]["last"].to_s)
14
- result
15
- end
16
- end
17
-
18
- end
19
- end
@@ -1,18 +0,0 @@
1
- module CurrencyRate
2
- class PaxfulAdapter < Adapter
3
- SUPPORTED_CURRENCIES = %w(USD)
4
-
5
- ANCHOR_CURRENCY = "BTC"
6
-
7
- FETCH_URL = "https://paxful.com/api/currency/btc"
8
-
9
- def normalize(data)
10
- return nil unless super
11
-
12
- {
13
- "anchor" => ANCHOR_CURRENCY,
14
- "USD" => BigDecimal(data["price"].to_s)
15
- }
16
- end
17
- end
18
- end
@@ -1,33 +0,0 @@
1
- module CurrencyRate
2
- class PoloniexAdapter < Adapter
3
- SUPPORTED_CURRENCIES = %w(BTS DASH DOGE LTC NXT STR XEM XMR XRP USDT
4
- ETH SC DCR LSK STEEM ETC REP ARDR ZEC STRAT
5
- GNT ZRX CVC OMG GAS STORJ EOS SNT KNC BAT
6
- LOOM QTUM USDC MANA BNT BCHABC BCHSV FOAM
7
- NMR POLY LPT ATOM TRX ETHBNT LINK XTZ PAX
8
- USDJ SNX MATIC MKR DAI NEO SWFTC FXC AVA
9
- CHR BNB BUSD MDT XFIL LEND REN LRC WRX SXP
10
- STPT SWAP EXE).freeze
11
-
12
- ANCHOR_CURRENCY = "BTC".freeze
13
-
14
- FETCH_URL = "https://poloniex.com/public?command=returnTicker".freeze
15
-
16
- def normalize(data)
17
- return nil unless super
18
-
19
- data.each_with_object({ "anchor" => ANCHOR_CURRENCY }) do |(pair_name, pair_info), result|
20
- next unless pair_name.include?(ANCHOR_CURRENCY)
21
-
22
- key = pair_name.sub(ANCHOR_CURRENCY, "").sub("_", "")
23
-
24
- result[key] =
25
- if pair_name.index(ANCHOR_CURRENCY) == 0
26
- 1 / BigDecimal(pair_info["last"])
27
- else
28
- BigDecimal(pair_info["last"])
29
- end
30
- end
31
- end
32
- end
33
- end
@@ -1,19 +0,0 @@
1
- module CurrencyRate
2
- class YadioAdapter < Adapter
3
- SUPPORTED_CURRENCIES = %w(VES)
4
-
5
- ANCHOR_CURRENCY = "BTC"
6
-
7
- FETCH_URL = "https://api.yadio.io/rate/BTC"
8
-
9
- def normalize(data)
10
- return nil unless super
11
-
12
- {
13
- "anchor" => ANCHOR_CURRENCY,
14
- "USD" => BigDecimal(data["usd"].to_s),
15
- "VES" => BigDecimal(data["rate"].to_s),
16
- }
17
- end
18
- end
19
- end
@@ -1,25 +0,0 @@
1
- module CurrencyRate
2
- class BonbastAdapter < Adapter
3
- # No need to use it for fetching, just additional information about supported currencies
4
- SUPPORTED_CURRENCIES = %w(USD IRR)
5
- ANCHOR_CURRENCY = "USD"
6
- FETCH_URL = "https://www.bonbast.com/"
7
-
8
- def normalize(data)
9
- sell = data.match(/<td id="usd1"[^>]*>(\d+)<\/td>/)[1].to_f
10
- buy = data.match(/<td id="usd2"[^>]*>(\d+)<\/td>/)[1].to_f
11
- { "anchor" => self.class::ANCHOR_CURRENCY, "IRR" => BigDecimal(([buy, sell].reduce(:+).fdiv(2)*10).to_s) }
12
- end
13
-
14
- def request(url)
15
-
16
- http_client = HTTP.timeout(connect:
17
- CurrencyRate.configuration.connect_timeout, read:
18
- CurrencyRate.configuration.read_timeout
19
- )
20
- http_client.get(url).to_s
21
-
22
- end
23
-
24
- end
25
- end
@@ -1,14 +0,0 @@
1
- module CurrencyRate
2
- class CoinmonitorAdapter < Adapter
3
- # No need to use it for fetching, just additional information about supported currencies
4
- SUPPORTED_CURRENCIES = %w(ARS)
5
- ANCHOR_CURRENCY = "USD"
6
- FETCH_URL = "https://ar.coinmonitor.info/api/dolar_ar/"
7
-
8
- def normalize(data)
9
- return nil unless super
10
-
11
- { "anchor" => ANCHOR_CURRENCY }.merge({ SUPPORTED_CURRENCIES.first => BigDecimal(data["DOL_blue"].to_s) })
12
- end
13
- end
14
- end
@@ -1,32 +0,0 @@
1
- module CurrencyRate
2
- class CurrencyLayerAdapter < Adapter
3
- # No need to use it for fetching, just additional information about supported currencies
4
- SUPPORTED_CURRENCIES = %w(
5
- AED AFN ALL AMD ANG AOA ARS AUD AWG AZN BAM BBD BDT BGN
6
- BHD BIF BMD BND BOB BRL BSD BTC BTN BWP BYN BYR BZD CAD
7
- CDF CHF CLF CLP CNY COP CRC CUC CUP CVE CZK DJF DKK DOP
8
- DZD EGP ERN ETB EUR FJD FKP GBP GEL GGP GHS GIP GMD GNF
9
- GTQ GYD HKD HNL HRK HTG HUF IDR ILS IMP INR IQD IRR ISK
10
- JEP JMD JOD JPY KES KGS KHR KMF KPW KRW KWD KYD KZT LAK
11
- LBP LKR LRD LSL LTL LVL LYD MAD MDL MGA MKD MMK MNT MOP
12
- MRO MUR MVR MWK MXN MYR MZN NAD NGN NIO NOK NPR NZD OMR
13
- PAB PEN PGK PHP PKR PLN PYG QAR RON RSD RUB RWF SAR SBD
14
- SCR SDG SEK SGD SHP SLL SOS SRD STD SVC SYP SZL THB TJS
15
- TMT TND TOP TRY TTD TWD TZS UAH UGX USD UYU UZS VEF VND
16
- VUV WST XAF XAG XAU XCD XDR XOF XPF YER ZAR ZMK ZMW ZWL
17
- )
18
-
19
- ANCHOR_CURRENCY = "USD"
20
- FETCH_URL = "http://www.apilayer.net/api/live"
21
- API_KEY_PARAM = "access_key"
22
-
23
- def normalize(data)
24
- return nil unless super
25
- rates = { "anchor" => self.class::ANCHOR_CURRENCY }
26
- data["quotes"].each do |key, value|
27
- rates[key.sub(self.class::ANCHOR_CURRENCY, "")] = BigDecimal(value.to_s)
28
- end
29
- rates
30
- end
31
- end
32
- end
@@ -1,18 +0,0 @@
1
- module CurrencyRate
2
- class FixerAdapter < Adapter
3
- # EUR is the only currency available as a base on free plan
4
- ANCHOR_CURRENCY = "EUR"
5
- FETCH_URL = "http://data.fixer.io/latest"
6
- API_KEY_PARAM = "access_key"
7
-
8
- def normalize(data)
9
- return nil unless super
10
- rates = { "anchor" => ANCHOR_CURRENCY }
11
- data["rates"].each do |k, v|
12
- rates[k] = BigDecimal(v.to_s)
13
- end
14
- rates
15
- end
16
-
17
- end
18
- end
@@ -1,25 +0,0 @@
1
- module CurrencyRate
2
- class ForgeAdapter < Adapter
3
- SUPPORTED_CURRENCIES = %w(
4
- JPY CHF CAD SEK NOK MXN ZAR TRY CNH EUR GBP AUD NZD XAU XAG
5
- )
6
-
7
- ANCHOR_CURRENCY = "USD"
8
- FETCH_URL = "https://forex.1forge.com/1.0.2/quotes?pairs=" + SUPPORTED_CURRENCIES.map { |c| "#{ANCHOR_CURRENCY}#{c}" }.join(",")
9
- API_KEY_PARAM = "api_key"
10
-
11
- def normalize(data)
12
- return nil unless super
13
- rates = { "anchor" => self.class::ANCHOR_CURRENCY }
14
- data.each do |rate|
15
- if rate["error"]
16
- CurrencyRate.logger.error("Forge exchange returned error")
17
- return nil
18
- end
19
- rates[rate["symbol"].sub(self.class::ANCHOR_CURRENCY, "")] = BigDecimal(rate["price"].to_s)
20
- end
21
- rates
22
- end
23
-
24
- end
25
- end
@@ -1,32 +0,0 @@
1
- module CurrencyRate
2
- class FreeForexAdapter < Adapter
3
- SUPPORTED_CURRENCIES = %w(
4
- AED AFN ALL AMD ANG AOA ARS ATS AUD AWG AZM AZN BAM BBD BDT
5
- BEF BGN BHD BIF BMD BND BOB BRL BSD BTN BWP BYN BYR BZD CAD
6
- CDF CLP CNH CNY COP CRC CUC CUP CVE CYP CZK DEM DJF DKK DOP
7
- DZD EEK EGP ERN ESP ETB EUR FIM FJD FKP FRF GBP GEL GGP GHC
8
- GHS GIP GMD GNF GRD GTQ GYD HKD HNL HRK HTG HUF IDR IEP ILS
9
- IMP INR IQD IRR ISK ITL JEP JMD JOD KES KGS KHR KMF KPW KRW
10
- KWD KYD KZT LAK LBP LKR LRD LSL LTL LUF LVL LYD MAD MDL MGA
11
- MGF MKD MMK MNT MOP MRO MRU MTL MUR MVR MWK MXN MYR MZM MZN
12
- NAD NGN NIO NLG NOK NPR NZD OMR PAB PEN PGK PHP PKR PLN PTE
13
- PYG QAR ROL RON RSD RUB RWF SAR SBD SCR SDD SDG SEK SGD SHP
14
- SIT SKK SLL SOS SPL SRD SRG STD STN SVC SYP SZL THB TJS TMM
15
- TMT TND TOP TRL TRY TTD TVD TWD TZS UAH UGX UYU UZS VAL VEB
16
- VEF VES VND VUV WST XAF XAG XAU XBT XCD XDR XOF XPD XPF XPT
17
- YER ZAR ZMK ZMW ZWD
18
- )
19
-
20
- ANCHOR_CURRENCY = "USD"
21
- FETCH_URL = "https://www.freeforexapi.com/api/live?pairs=" + SUPPORTED_CURRENCIES.map{|cur| "USD#{cur}"}.join(",")
22
-
23
- def normalize(data)
24
- return nil unless super
25
- rates = { "anchor" => self.class::ANCHOR_CURRENCY }
26
- data["rates"].each do |pair, payload|
27
- rates[pair.sub(self.class::ANCHOR_CURRENCY, "")] = BigDecimal(payload["rate"].to_s)
28
- end
29
- rates
30
- end
31
- end
32
- end
@@ -1,35 +0,0 @@
1
- module CurrencyRate
2
- class YahooAdapter < Adapter
3
- SUPPORTED_CURRENCIES = %w(
4
- AED AFN ALL AMD ANG AOA ARS AUD AWG AZN BAM BBD BDT BGN BHD BIF BMD BND
5
- BRL BSD BTN BWP BYR BZD CAD CHF CLF CLP CNY COP CRC CUC CUP CVE CZK DEM
6
- DJF DKK DOP DZD ECS EGP ERN ETB EUR FJD FKP FRF GBP GEL GHS GIP GMD GNF
7
- GTQ GYD HKD HNL HRK HTG HUF IDR IEP ILS INR IQD ISK ITL JMD JOD JPY KES
8
- KGS KHR KMF KWD KYD KZT LAK LBP LKR LRD LSL LTL LVL LYD MAD MGA MMK MNT
9
- MOP MRO MUR MVR MWK MXN MXV MYR MZN NAD NGN NIO NOK NPR NZD OMR PAB PEN
10
- PGK PHP PKR PLN PYG QAR RON RSD RUB RWF SAR SBD SCR SDG SEK SGD SLL SOS
11
- SRD STD SVC SYP SZL THB TJS TMT TND TOP TRY TTD UAH UGX USD UYU UZS VND
12
- VUV WST XAF XAG XAU XCD XDR XOF XPD XPF XPT YER ZAR ZMW ZWL
13
- )
14
-
15
- ANCHOR_CURRENCY = "USD"
16
-
17
- FETCH_URL = "http://query.yahooapis.com/v1/public/yql?" + URI.encode_www_form(
18
- format: 'json',
19
- env: "store://datatables.org/alltableswithkeys",
20
- q: "SELECT * FROM yahoo.finance.xchange WHERE pair IN" +
21
- # The following line is building array string in SQL: '("USDJPY", "USDRUB", ...)'
22
- "(#{SUPPORTED_CURRENCIES.map{|x| '"' + ANCHOR_CURRENCY + x.upcase + '"'}.join(',')})"
23
- )
24
-
25
- def normalize(data)
26
- return nil unless super
27
- rates = { "anchor" => self.class::ANCHOR_CURRENCY }
28
- data["query"]["results"]["rate"].each do |rate|
29
- rates[rate["Name"].split("/")[1]] = BigDecimal(rate["Rate"].to_s)
30
- end
31
- rates
32
- end
33
-
34
- end
35
- end
data/lib/configuration.rb DELETED
@@ -1,28 +0,0 @@
1
- module CurrencyRate
2
- class Configuration
3
- attr_accessor :api_keys
4
- attr_accessor :logger
5
- attr_accessor :crypto_adapters
6
- attr_accessor :fiat_adapters
7
- attr_accessor :connect_timeout
8
- attr_accessor :read_timeout
9
- attr_accessor :storage
10
- attr_accessor :limit_sources_for_fiat_currencies
11
- attr_accessor :crypto_currencies
12
-
13
- def initialize
14
- @api_keys = { }
15
- @logger = {
16
- device: $stdout,
17
- level: :info,
18
- formatter: nil,
19
- }
20
- @crypto_adapters = CurrencyRate.adapters :crypto
21
- @fiat_adapters = CurrencyRate.adapters :fiat
22
- @connect_timeout = 4
23
- @read_timeout = 4
24
- @limit_sources_for_fiat_currencies = {}
25
- @crypto_currencies = []
26
- end
27
- end
28
- end
data/lib/currency_rate.rb DELETED
@@ -1,85 +0,0 @@
1
- require "bigdecimal"
2
- require "logger"
3
- require "singleton"
4
- require "json"
5
- require "http"
6
-
7
- require_relative "exceptions"
8
- require_relative "configuration"
9
- require_relative "adapter"
10
- require_relative "fetcher"
11
- require_relative "synchronizer"
12
-
13
- Dir["#{File.expand_path __dir__}/adapters/**/*.rb"].each { |f| require f }
14
- Dir["#{File.expand_path __dir__}/storage/**/*.rb"].each { |f| require f }
15
-
16
- module CurrencyRate
17
- class << self
18
- attr_writer :configuration
19
- end
20
-
21
- def self.method_missing(m, *args, &block)
22
- if m.to_s.end_with? "_adapters"
23
- self.send(:adapters, m[0..-10])
24
- else
25
- super
26
- end
27
- end
28
-
29
- def self.adapters(type)
30
- Dir[File.join self.root, "lib/adapters/#{type}/*"].map do |file|
31
- File.basename(file, ".rb").split('_')[0...-1].map {|w| w.capitalize}.join
32
- end
33
- end
34
-
35
- def self.configuration
36
- @configuration ||= Configuration.new
37
- end
38
-
39
- def self.configure
40
- yield(configuration)
41
- end
42
-
43
- def self.fetcher
44
- @fetcher ||= Fetcher.new(fiat_exchanges: configuration.fiat_adapters,
45
- crypto_exchanges: configuration.crypto_adapters,
46
- limit_sources_for_fiat_currencies: configuration.limit_sources_for_fiat_currencies)
47
- end
48
-
49
- def self.fetch_crypto(exchange, from, to)
50
- fetcher.fetch_crypto(exchange, from, to)
51
- end
52
-
53
- def self.fetch_fiat(from, to)
54
- fetcher.fetch_fiat(from, to)
55
- end
56
-
57
- def self.logger
58
- return @logger if @logger
59
- @logger = Logger.new(configuration.logger[:device])
60
- @logger.progname = "CurrencyRate"
61
- @logger.level = configuration.logger[:level]
62
- @logger.formatter = configuration.logger[:formatter] if configuration.logger[:formatter]
63
- @logger
64
- end
65
-
66
- def self.synchronizer
67
- @synchronizer ||= Synchronizer.new
68
- end
69
-
70
- def self.sync_crypto!
71
- synchronizer.sync_crypto!
72
- end
73
-
74
- def self.sync_fiat!
75
- synchronizer.sync_fiat!
76
- end
77
-
78
- def self.sync!
79
- synchronizer.sync!
80
- end
81
-
82
- def self.root
83
- File.expand_path("../", File.dirname(__FILE__))
84
- end
85
- end
@@ -1,3 +0,0 @@
1
- module CurrencyRate
2
- VERSION = "1.7.0"
3
- end
data/lib/exceptions.rb DELETED
@@ -1,9 +0,0 @@
1
- module CurrencyRate
2
- class CurrencyRateError < StandardError; end
3
-
4
- class StorageNotDefinedError < CurrencyRateError
5
- def initialize
6
- super("Storage is not configured for currency-rate gem.")
7
- end
8
- end
9
- end