currency-rate 1.4.1 → 1.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +22 -0
  3. data/Gemfile +3 -8
  4. data/Rakefile +6 -25
  5. data/api_keys.yml.sample +1 -0
  6. data/currency-rate.gemspec +33 -133
  7. data/lib/adapters/crypto/binance_adapter.rb +3 -3
  8. data/lib/adapters/crypto/bitfinex_adapter.rb +2 -2
  9. data/lib/adapters/crypto/bitpay_adapter.rb +1 -1
  10. data/lib/adapters/crypto/bitstamp_adapter.rb +11 -5
  11. data/lib/adapters/crypto/btc_china_adapter.rb +1 -1
  12. data/lib/adapters/crypto/btc_e_adapter.rb +1 -1
  13. data/lib/adapters/crypto/coin_market_cap_adapter.rb +31 -0
  14. data/lib/adapters/crypto/coinbase_adapter.rb +1 -1
  15. data/lib/adapters/crypto/exmo_adapter.rb +2 -2
  16. data/lib/adapters/crypto/huobi_adapter.rb +1 -1
  17. data/lib/adapters/crypto/kraken_adapter.rb +21 -15
  18. data/lib/adapters/crypto/localbitcoins_adapter.rb +1 -1
  19. data/lib/adapters/crypto/okcoin_adapter.rb +1 -1
  20. data/lib/adapters/fiat/bonbast_adapter.rb +25 -0
  21. data/lib/adapters/fiat/currency_layer_adapter.rb +1 -1
  22. data/lib/adapters/fiat/fixer_adapter.rb +1 -1
  23. data/lib/adapters/fiat/forge_adapter.rb +1 -1
  24. data/lib/adapters/fiat/free_forex_adapter.rb +1 -1
  25. data/lib/adapters/fiat/yahoo_adapter.rb +1 -1
  26. data/lib/configuration.rb +4 -0
  27. data/lib/currency_rate.rb +3 -1
  28. data/lib/currency_rate/version.rb +3 -0
  29. data/lib/fetcher.rb +26 -6
  30. data/lib/synchronizer.rb +1 -1
  31. metadata +23 -95
  32. data/VERSION +0 -1
  33. data/spec/fixtures/adapters/binance_rates.yml +0 -993
  34. data/spec/fixtures/adapters/bitfinex_rates.yml +0 -4050
  35. data/spec/fixtures/adapters/bitpay_rates.yml +0 -490
  36. data/spec/fixtures/adapters/bitstamp_rates.yml +0 -61
  37. data/spec/fixtures/adapters/btc_china_rates.yml +0 -11
  38. data/spec/fixtures/adapters/btce_rates.yml +0 -60
  39. data/spec/fixtures/adapters/coinbase_rates.yml +0 -181
  40. data/spec/fixtures/adapters/currency_layer_rates.yml +0 -174
  41. data/spec/fixtures/adapters/exmo_rates.yml +0 -1251
  42. data/spec/fixtures/adapters/fixer_rates.yml +0 -174
  43. data/spec/fixtures/adapters/forge_rates.yml +0 -75
  44. data/spec/fixtures/adapters/free_forex_rates.yml +0 -59
  45. data/spec/fixtures/adapters/huobi_rates.yml +0 -22
  46. data/spec/fixtures/adapters/kraken_rates.yml +0 -507
  47. data/spec/fixtures/adapters/localbitcoins_rates.yml +0 -493
  48. data/spec/fixtures/adapters/normalized/binance_rates.yml +0 -134
  49. data/spec/fixtures/adapters/normalized/bitfinex_rates.yml +0 -95
  50. data/spec/fixtures/adapters/normalized/bitpay_rates.yml +0 -164
  51. data/spec/fixtures/adapters/normalized/bitstamp_rates.yml +0 -9
  52. data/spec/fixtures/adapters/normalized/btc_china_rates.yml +0 -1
  53. data/spec/fixtures/adapters/normalized/btce_rates.yml +0 -5
  54. data/spec/fixtures/adapters/normalized/coinbase_rates.yml +0 -179
  55. data/spec/fixtures/adapters/normalized/currency_layer_rates.yml +0 -169
  56. data/spec/fixtures/adapters/normalized/exmo_rates.yml +0 -42
  57. data/spec/fixtures/adapters/normalized/fixer_rates.yml +0 -170
  58. data/spec/fixtures/adapters/normalized/forge_rates.yml +0 -16
  59. data/spec/fixtures/adapters/normalized/free_forex_rates.yml +0 -16
  60. data/spec/fixtures/adapters/normalized/huobi_rates.yml +0 -2
  61. data/spec/fixtures/adapters/normalized/kraken_rates.yml +0 -21
  62. data/spec/fixtures/adapters/normalized/localbitcoins_rates.yml +0 -73
  63. data/spec/fixtures/adapters/normalized/okcoin_rates.yml +0 -4
  64. data/spec/fixtures/adapters/normalized/yahoo_rates.yml +0 -160
  65. data/spec/fixtures/adapters/okcoin_rates.yml +0 -40
  66. data/spec/fixtures/adapters/yahoo_rates.yml +0 -1119
  67. data/spec/lib/adapter_spec.rb +0 -54
  68. data/spec/lib/adapters/crypto/binance_adapter_spec.rb +0 -13
  69. data/spec/lib/adapters/crypto/bitfinex_adapter_spec.rb +0 -13
  70. data/spec/lib/adapters/crypto/bitpay_adapter_spec.rb +0 -13
  71. data/spec/lib/adapters/crypto/bitstamp_adapter_spec.rb +0 -13
  72. data/spec/lib/adapters/crypto/btc_china_adapter_spec.rb +0 -13
  73. data/spec/lib/adapters/crypto/btc_e_adapter_spec.rb +0 -13
  74. data/spec/lib/adapters/crypto/coinbase_adapter_spec.rb +0 -13
  75. data/spec/lib/adapters/crypto/exmo_adapter_spec.rb +0 -13
  76. data/spec/lib/adapters/crypto/huobi_adapter_spec.rb +0 -13
  77. data/spec/lib/adapters/crypto/kraken_adapter_spec.rb +0 -13
  78. data/spec/lib/adapters/crypto/localbitcoins_adapter_spec.rb +0 -13
  79. data/spec/lib/adapters/crypto/okcoin_adapter_spec.rb +0 -13
  80. data/spec/lib/adapters/fiat/currency_layer_adapter_spec.rb +0 -23
  81. data/spec/lib/adapters/fiat/fixer_adapter_spec.rb +0 -13
  82. data/spec/lib/adapters/fiat/forge_adapter_spec.rb +0 -23
  83. data/spec/lib/adapters/fiat/free_forex_adapter_spec.rb +0 -13
  84. data/spec/lib/adapters/fiat/yahoo_adapter_spec.rb +0 -13
  85. data/spec/lib/currency_rate_spec.rb +0 -9
  86. data/spec/lib/fetcher_spec.rb +0 -124
  87. data/spec/lib/storage/file_storage_spec.rb +0 -38
  88. data/spec/lib/synchronizer_spec.rb +0 -99
  89. data/spec/spec_helper.rb +0 -28
  90. data/spec/support/matchers/eq_any_of.rb +0 -3
@@ -1,54 +0,0 @@
1
- require 'spec_helper'
2
-
3
- EXCHANGE_STUB_DOMAIN = "http://exchange.stub.com"
4
-
5
- RESPONSE = {
6
- "btc_usd" => 5000,
7
- "ltc_usd" => 50,
8
- }
9
-
10
- class HashUrlAdapter < CurrencyRate::Adapter
11
- FETCH_URL = {
12
- "btc_usd" => "#{EXCHANGE_STUB_DOMAIN}/btc_usd",
13
- "ltc_usd" => "#{EXCHANGE_STUB_DOMAIN}/ltc_usd",
14
- }
15
- end
16
-
17
- class StringUrlAdapter < CurrencyRate::Adapter
18
- FETCH_URL = EXCHANGE_STUB_DOMAIN
19
- end
20
-
21
- RSpec.describe CurrencyRate::Adapter do
22
- describe "#exchange_data" do
23
- context "when FETCH_URL is not defined" do
24
- before { @adapter = CurrencyRate::Adapter.instance }
25
-
26
- it "raises an error" do
27
- expect { @adapter.exchange_data }.to raise_error("FETCH_URL is not defined!")
28
- end
29
- end
30
-
31
- context "when FETCH_URL is Hash" do
32
- before do
33
- @adapter = HashUrlAdapter.instance
34
- @response_map = Hash[RESPONSE.map { |k, v| [k, { "price" => v } ] }]
35
- RESPONSE.each { |k, v| stub_request(:get, "#{EXCHANGE_STUB_DOMAIN}/#{k}").to_return(body: { "price" => v }.to_json) }
36
- end
37
-
38
- it "fetches data for each defined pair" do
39
- expect(@adapter.exchange_data).to eq(@response_map)
40
- end
41
- end
42
-
43
- context "when FETCH_URL is String" do
44
- before do
45
- @adapter = StringUrlAdapter.instance
46
- stub_request(:get, EXCHANGE_STUB_DOMAIN).to_return(body: RESPONSE.to_json)
47
- end
48
-
49
- it "fetches all data from exchange and retruns parsed Hash" do
50
- expect(@adapter.exchange_data).to eq(RESPONSE)
51
- end
52
- end
53
- end
54
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe CurrencyRate::BinanceAdapter do
4
- before(:all) { @data, @normalized = data_for :binance }
5
-
6
- before { @adapter = CurrencyRate::BinanceAdapter.instance }
7
-
8
- describe "#normalize" do
9
- it "brings data to canonical form" do
10
- expect(@adapter.normalize(@data)).to eq(@normalized)
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe CurrencyRate::BitfinexAdapter do
4
- before(:all) { @data, @normalized = data_for :bitfinex }
5
-
6
- before { @adapter = CurrencyRate::BitfinexAdapter.instance }
7
-
8
- describe "#normalize" do
9
- it "brings data to canonical form" do
10
- expect(@adapter.normalize(@data)).to eq(@normalized)
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe CurrencyRate::BitpayAdapter do
4
- before(:all) { @data, @normalized = data_for :bitpay }
5
-
6
- before { @adapter = CurrencyRate::BitpayAdapter.instance }
7
-
8
- describe "#normalize" do
9
- it "brings data to cannonical form" do
10
- expect(@adapter.normalize(@data)).to eq(@normalized)
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe CurrencyRate::BitstampAdapter do
4
- before(:all) { @data, @normalized = data_for :bitstamp }
5
-
6
- before { @adapter = CurrencyRate::BitstampAdapter.instance }
7
-
8
- describe "#normalize" do
9
- it "brings data to cannonical form" do
10
- expect(@adapter.normalize(@data)).to eq(@normalized)
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe CurrencyRate::BtcChinaAdapter do
4
- before(:all) { @data, @normalized = data_for :btc_china }
5
-
6
- before { @adapter = CurrencyRate::BtcChinaAdapter.instance }
7
-
8
- describe "#normalize" do
9
- it "brings data to canonical form" do
10
- expect(@adapter.normalize(@data)).to eq(@normalized)
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe CurrencyRate::BtcEAdapter do
4
- before(:all) { @data, @normalized = data_for :btce }
5
-
6
- before { @adapter = CurrencyRate::BtcEAdapter.instance }
7
-
8
- describe "#normalize" do
9
- it "brings data to canonical form" do
10
- expect(@adapter.normalize(@data)).to eq(@normalized)
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe CurrencyRate::CoinbaseAdapter do
4
- before(:all) { @data, @normalized = data_for :coinbase }
5
-
6
- before { @adapter = CurrencyRate::CoinbaseAdapter.instance }
7
-
8
- describe "#normalize" do
9
- it "brings data to canonical form" do
10
- expect(@adapter.normalize(@data)).to eq(@normalized)
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe CurrencyRate::ExmoAdapter do
4
- before(:all) { @data, @normalized = data_for :exmo }
5
-
6
- before { @adapter = CurrencyRate::ExmoAdapter.instance }
7
-
8
- describe "#normalize" do
9
- it "brings data to canonical form" do
10
- expect(@adapter.normalize(@data)).to eq(@normalized)
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe CurrencyRate::HuobiAdapter do
4
- before(:all) { @data, @normalized = data_for :huobi }
5
-
6
- before { @adapter = CurrencyRate::HuobiAdapter.instance }
7
-
8
- describe "#normalize" do
9
- it "brings data to canonical form" do
10
- expect(@adapter.normalize(@data)).to eq(@normalized)
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe CurrencyRate::KrakenAdapter do
4
- before(:all) { @data, @normalized = data_for :kraken }
5
-
6
- before { @adapter = CurrencyRate::KrakenAdapter.instance }
7
-
8
- describe "#normalize" do
9
- it "brings data to canonical form" do
10
- expect(@adapter.normalize(@data)).to eq(@normalized)
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe CurrencyRate::LocalbitcoinsAdapter do
4
- before(:all) { @data, @normalized = data_for :localbitcoins }
5
-
6
- before { @adapter = CurrencyRate::LocalbitcoinsAdapter.instance }
7
-
8
- describe "#normalize" do
9
- it "brings data to canonical form" do
10
- expect(@adapter.normalize(@data)).to eq(@normalized)
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe CurrencyRate::OkcoinAdapter do
4
- before(:all) { @data, @normalized = data_for :okcoin }
5
-
6
- before { @adapter = CurrencyRate::OkcoinAdapter.instance }
7
-
8
- describe "#normalize" do
9
- it "brings data to canonical form" do
10
- expect(@adapter.normalize(@data)).to eq(@normalized)
11
- end
12
- end
13
- end
@@ -1,23 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe CurrencyRate::CurrencyLayerAdapter do
4
- before(:all) { @data, @normalized = data_for :currency_layer }
5
-
6
- before { stub_request(:get, /apilayer/).to_return(body: @data.to_json) }
7
-
8
- before { @adapter = CurrencyRate::CurrencyLayerAdapter.instance }
9
-
10
- describe "#normalize" do
11
- it "brings data to canonical form" do
12
- expect(@adapter.normalize(@data)).to eq(@normalized)
13
- end
14
- end
15
-
16
- describe "#exchange_data" do
17
- context "when api_key not defined" do
18
- it "returns nil" do
19
- expect(@adapter.exchange_data).to be_nil
20
- end
21
- end
22
- end
23
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe CurrencyRate::FixerAdapter do
4
- before(:all) { @data, @normalized = data_for :fixer }
5
-
6
- before { @adapter = CurrencyRate::FixerAdapter.instance }
7
-
8
- describe "#normalize" do
9
- it "brings data to canonical form" do
10
- expect(@adapter.normalize(@data)).to eq(@normalized)
11
- end
12
- end
13
- end
@@ -1,23 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe CurrencyRate::ForgeAdapter do
4
- before(:all) { @data, @normalized = data_for :forge }
5
-
6
- before { stub_request(:get, /1forge/).to_return(body: @data) }
7
-
8
- before { @adapter = CurrencyRate::ForgeAdapter.instance }
9
-
10
- describe "#normalize" do
11
- it "brings data to canonical form" do
12
- expect(@adapter.normalize(@data)).to eq(@normalized)
13
- end
14
- end
15
-
16
- describe "#exchange_data" do
17
- context "when api_key not defined" do
18
- it "returns nil" do
19
- expect(@adapter.exchange_data).to be_nil
20
- end
21
- end
22
- end
23
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe CurrencyRate::FreeForexAdapter do
4
- before(:all) { @data, @normalized = data_for :free_forex }
5
-
6
- before { @adapter = CurrencyRate::FreeForexAdapter.instance }
7
-
8
- describe "#normalize" do
9
- it "brings data to canonical form" do
10
- expect(@adapter.normalize(@data)).to eq(@normalized)
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe CurrencyRate::YahooAdapter do
4
- before(:all) { @data, @normalized = data_for :yahoo }
5
-
6
- before { @adapter = CurrencyRate::YahooAdapter.instance }
7
-
8
- describe "#normalize" do
9
- it "brings data to canonical form" do
10
- expect(@adapter.normalize(@data)).to eq(@normalized)
11
- end
12
- end
13
- end
@@ -1,9 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe CurrencyRate do
4
- it { is_expected.to respond_to(:configure) }
5
- it { is_expected.to respond_to(:sync!) }
6
- it { is_expected.to respond_to(:fetch_crypto) }
7
- it { is_expected.to respond_to(:fetch_fiat) }
8
- it { is_expected.to respond_to(:logger) }
9
- end
@@ -1,124 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe CurrencyRate::Fetcher do
4
- before do
5
- @usd_try = BigDecimal.new("22")
6
- @usd_eur = BigDecimal.new("0.8457")
7
- @eur_try = @usd_try / @usd_eur
8
- @storage_double = double("storage")
9
- @fetcher = CurrencyRate::Fetcher.new(storage: @storage_double)
10
- end
11
-
12
- it "uses FileStorage by default" do
13
- fetcher = CurrencyRate::Fetcher.new
14
- expect(fetcher.storage).to be_a(CurrencyRate::FileStorage)
15
- end
16
-
17
- it "overwrites the default list of fiat exchanges" do
18
- fetcher = CurrencyRate::Fetcher.new(fiat_exchanges: ["CurrencyLayer", "Forge", "Fixer"])
19
- expect(fetcher.fiat_exchanges).to eq(["CurrencyLayer", "Forge", "Fixer"])
20
- end
21
-
22
- describe "#fetch_crypto" do
23
- before do
24
- @from = "BTC"
25
- @to = "ETH"
26
- @btc_eth = BigDecimal.new("3832.5432")
27
- @exchange = "Bitstamp"
28
- end
29
-
30
- subject { @fetcher.fetch_crypto(@exchange, @from, @to) }
31
-
32
- context "when rates for selected exchange are not available" do
33
- before { allow(@storage_double).to receive(:read).with(@exchange).and_return(nil) }
34
-
35
- it { is_expected.to be_nil }
36
- end
37
-
38
- context "when pair is supported by selected exchange" do
39
- before do
40
- allow(@storage_double).to receive(:read).with(@exchange).and_return({ "anchor" => "BTC", "ETH" => @btc_eth })
41
- end
42
-
43
- it { is_expected.to eq(@btc_eth) }
44
-
45
- it { is_expected.to be_a(BigDecimal) }
46
- end
47
-
48
- context "when pair is not supported by selected exchange" do
49
- before do
50
- allow(@storage_double).to receive(:read).with(@exchange).and_return({ "anchor" => "BTC", "XOS" => @btc_eth })
51
- allow(@storage_double).to receive(:read).with("Yahoo").and_return(nil)
52
- allow(@storage_double).to receive(:read).with("Fixer").and_return(nil)
53
- allow(@storage_double).to receive(:read).with("Forge").and_return(nil)
54
- end
55
-
56
- it { is_expected.to be_nil }
57
- end
58
- end
59
-
60
- describe "#fetch_fiat" do
61
- before do
62
- @from = "EUR"
63
- @to = "TRY"
64
- @fiat_exchanges = ["Yahoo", "Fixer", "Forge"]
65
- end
66
-
67
- subject { @fetcher.fetch_fiat(@from, @to) }
68
-
69
- it "uses Yahoo -> Fixer -> Forge priority order" do
70
- expect(@storage_double).to receive(:read).with("Yahoo").and_return(nil).ordered
71
- expect(@storage_double).to receive(:read).with("Fixer").and_return(nil).ordered
72
- expect(@storage_double).to receive(:read).with("Forge").and_return(nil).ordered
73
- @fetcher.fetch_fiat("EUR", "TRY")
74
- end
75
-
76
- it "uses next exchange if rates for current do not exist" do
77
- allow(@storage_double).to receive(:read).with(@fiat_exchanges.first).and_return(nil)
78
- expect(@storage_double).to receive(:read).with(@fiat_exchanges[1]).and_return(nil)
79
- expect(@storage_double).to receive(:read).with(@fiat_exchanges[2]).and_return(nil)
80
- @fetcher.fetch_fiat("EUR", "TRY")
81
- end
82
-
83
- context 'when first exchange has "from" currency as an anchor' do
84
- before do
85
- allow(@storage_double).to receive(:read).with(@fiat_exchanges.first).and_return({ "anchor" => "EUR", "TRY" => @eur_try })
86
- end
87
- it { is_expected.to eq(@eur_try) }
88
- end
89
-
90
- context 'when first exchange has "to" currency as an anchor' do
91
- before do
92
- allow(@storage_double).to receive(:read).with(@fiat_exchanges.first).and_return({ "anchor" => "TRY", "EUR" => (BigDecimal.new(1) / @eur_try).round(16) })
93
- end
94
-
95
- it "returns reversed to anchor rate" do
96
- expect(subject.round(16)).to eq(@eur_try.round(16))
97
- end
98
- end
99
-
100
- context "when first exchange has different from requested anchor currency" do
101
- context "when first exchange has rates for both requested currencies" do
102
- before do
103
- allow(@storage_double).to receive(:read).with(@fiat_exchanges.first).and_return({
104
- "anchor" => "USD",
105
- "EUR" => @usd_eur,
106
- "TRY" => @usd_try,
107
- })
108
- end
109
-
110
- it { is_expected.to eq(@eur_try) }
111
- end
112
-
113
- context "when first exchange doen't have rates for requested currencies" do
114
- before do
115
- allow(@storage_double).to receive(:read).with(@fiat_exchanges.first).and_return(nil)
116
- expect(@storage_double).to receive(:read).with(@fiat_exchanges[1]).and_return({ "anchor" => "EUR", "TRY" => @eur_try })
117
- end
118
-
119
- it { is_expected.to eq(@eur_try) }
120
- end
121
- end
122
-
123
- end
124
- end