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
@@ -0,0 +1,65 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe CurrencyRate::Synchronizer do
4
+ before do
5
+ @storage_double = double("storage")
6
+ @synchronizer = CurrencyRate::Synchronizer.new(storage: @storage_double)
7
+ end
8
+
9
+ describe "#sync!" do
10
+ before do
11
+ @kraken_data = normalized_data_for :kraken
12
+ @crypto_adapters = ["KrakenAdapter"]
13
+ allow(CurrencyRate::KrakenAdapter.instance).to receive(:fetch_rates).and_return(@kraken_data)
14
+ allow(CurrencyRate.configuration).to receive(:crypto_adapters).and_return(@crypto_adapters)
15
+
16
+ @yahoo_data = normalized_data_for :yahoo
17
+ @fiat_adapters = ["YahooAdapter"]
18
+ allow(CurrencyRate::YahooAdapter.instance).to receive(:fetch_rates).and_return(@yahoo_data)
19
+ allow(CurrencyRate.configuration).to receive(:fiat_adapters).and_return(@fiat_adapters)
20
+ end
21
+
22
+ it "saves fetched rates to given storage" do
23
+ expect(@storage_double).to receive(:write).with("kraken", @kraken_data)
24
+ expect(@storage_double).to receive(:write).with("yahoo", @yahoo_data)
25
+ @synchronizer.sync!
26
+ end
27
+
28
+ context "when adapter returned nil data" do
29
+ before do
30
+ allow(CurrencyRate::KrakenAdapter.instance).to receive(:fetch_rates).and_return(nil)
31
+ allow(@storage_double).to receive(:write).with("yahoo", @yahoo_data)
32
+ end
33
+
34
+ it "doesn't try to save nil data to the storage" do
35
+ expect(@storage_double).not_to receive(:write).with("kraken", nil)
36
+ @synchronizer.sync!
37
+ end
38
+
39
+ it "doesn't throw an exception" do
40
+ expect { @synchronizer.sync! }.not_to raise_error
41
+ end
42
+
43
+ it "saves other successfully fetched adapters data" do
44
+ expect(@storage_double).to receive(:write).with("yahoo", @yahoo_data)
45
+ @synchronizer.sync!
46
+ end
47
+ end
48
+
49
+ context "when adapter fetching failed with and error" do
50
+ before do
51
+ allow(CurrencyRate::KrakenAdapter.instance).to receive(:fetch_rates).and_raise("Error!")
52
+ allow(@storage_double).to receive(:write).with("yahoo", @yahoo_data)
53
+ end
54
+
55
+ it "catches the exception" do
56
+ expect { @synchronizer.sync! }.not_to raise_error
57
+ end
58
+
59
+ it "continues fetching other adapters" do
60
+ expect(@storage_double).to receive(:write).with("yahoo", @yahoo_data)
61
+ @synchronizer.sync!
62
+ end
63
+ end
64
+ end
65
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,13 +1,28 @@
1
+ require "yaml"
2
+ require "byebug"
3
+ require "webmock/rspec"
4
+
1
5
  require_relative "../lib/currency_rate"
2
- require 'webmock/rspec'
3
- require 'vcr'
4
6
 
5
- VCR.configure do |config|
6
- config.cassette_library_dir = 'spec/fixtures/vcr'
7
- config.hook_into :webmock
7
+ Dir[File.join CurrencyRate.root, "spec/support/**/*.rb"].each { |f| require f }
8
+
9
+ def exchange_data_for(name)
10
+ YAML.load_file File.join(CurrencyRate.root, "spec/fixtures/adapters/#{name}_adapter.yml")
11
+ end
12
+
13
+ def normalized_data_for(name)
14
+ floating = YAML.load_file File.join(CurrencyRate.root, "spec/fixtures/adapters/normalized/#{name}_adapter.yml")
15
+ floating.each { |k, v| floating[k] = BigDecimal.new(v.to_s) if k != "anchor" }
16
+ end
17
+
18
+ def data_for(name)
19
+ [exchange_data_for(name), normalized_data_for(name)]
20
+ end
21
+
22
+ RSpec.configure do |config|
23
+ config.default_formatter = "doc"
8
24
  end
9
25
 
10
- if ENV['VCR_OFF']
11
- WebMock.allow_net_connect!
12
- VCR.turn_off! ignore_cassettes: true
26
+ CurrencyRate.configure do |config|
27
+ config.logger[:level] = :fatal
13
28
  end
@@ -0,0 +1,3 @@
1
+ RSpec::Matchers.define :eq_any_of do |values|
2
+ match { |actual| values.include? actual }
3
+ end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: currency-rate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 1.0.0
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-08-31 00:00:00.000000000 Z
11
+ date: 2017-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: satoshi-unit
14
+ name: http
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
@@ -24,20 +24,6 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: bundler
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '1.0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '1.0'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: jeweler
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -81,7 +67,7 @@ dependencies:
81
67
  - !ruby/object:Gem::Version
82
68
  version: '0'
83
69
  - !ruby/object:Gem::Dependency
84
- name: vcr
70
+ name: byebug
85
71
  requirement: !ruby/object:Gem::Requirement
86
72
  requirements:
87
73
  - - ">="
@@ -105,60 +91,77 @@ files:
105
91
  - ".document"
106
92
  - ".rspec"
107
93
  - Gemfile
108
- - Gemfile.lock
109
94
  - LICENSE.txt
110
95
  - README.md
111
96
  - Rakefile
112
97
  - VERSION
113
98
  - currency-rate.gemspec
114
99
  - lib/adapter.rb
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
100
+ - lib/adapters/crypto/bitfinex_adapter.rb
101
+ - lib/adapters/crypto/bitpay_adapter.rb
102
+ - lib/adapters/crypto/bitstamp_adapter.rb
103
+ - lib/adapters/crypto/btc_china_adapter.rb
104
+ - lib/adapters/crypto/btc_e_adapter.rb
105
+ - lib/adapters/crypto/coinbase_adapter.rb
106
+ - lib/adapters/crypto/huobi_adapter.rb
107
+ - lib/adapters/crypto/kraken_adapter.rb
108
+ - lib/adapters/crypto/localbitcoins_adapter.rb
109
+ - lib/adapters/crypto/okcoin_adapter.rb
110
+ - lib/adapters/fiat/fixer_adapter.rb
111
+ - lib/adapters/fiat/forge_adapter.rb
112
+ - lib/adapters/fiat/yahoo_adapter.rb
113
+ - lib/configuration.rb
128
114
  - lib/currency_rate.rb
129
- - lib/fiat_adapter.rb
130
- - lib/fiat_adapters/fixer_adapter.rb
131
- - lib/fiat_adapters/yahoo_adapter.rb
132
- - lib/storage.rb
133
- - spec/currency_rate_spec.rb
134
- - spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/average_rate_adapter.yml
135
- - spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/bitfinex_adapter.yml
136
- - spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/bitpay_adapter.yml
137
- - spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/btcchina_adapter.yml
138
- - spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/btce_adapter.yml
139
- - spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/coinbase_adapter.yml
140
- - spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/huobi_adapter.yml
141
- - spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/kraken_adapter.yml
142
- - spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/localbitcoins_adapter.yml
143
- - spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/okcoin_adapter.yml
144
- - spec/fixtures/vcr/exchange_rate_adapters/fiat_adapters/fixer_adapter.yml
145
- - spec/fixtures/vcr/exchange_rate_adapters/fiat_adapters/yahoo_adapter.yml
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
- - spec/lib/fiat_adapters/fixer_adapter_spec.rb
159
- - spec/lib/fiat_adapters/yahoo_adapter_spec.rb
160
- - spec/lib/storage_spec.rb
115
+ - lib/fetcher.rb
116
+ - lib/storage/file_storage.rb
117
+ - lib/storage/serializers/yaml_serializer.rb
118
+ - lib/synchronizer.rb
119
+ - spec/fixtures/adapters/bitfinex_adapter.yml
120
+ - spec/fixtures/adapters/bitpay_adapter.yml
121
+ - spec/fixtures/adapters/bitstamp_adapter.yml
122
+ - spec/fixtures/adapters/btc_china_adapter.yml
123
+ - spec/fixtures/adapters/btce_adapter.yml
124
+ - spec/fixtures/adapters/coinbase_adapter.yml
125
+ - spec/fixtures/adapters/fixer_adapter.yml
126
+ - spec/fixtures/adapters/forge_adapter.yml
127
+ - spec/fixtures/adapters/huobi_adapter.yml
128
+ - spec/fixtures/adapters/kraken_adapter.yml
129
+ - spec/fixtures/adapters/localbitcoins_adapter.yml
130
+ - spec/fixtures/adapters/normalized/bitfinex_adapter.yml
131
+ - spec/fixtures/adapters/normalized/bitpay_adapter.yml
132
+ - spec/fixtures/adapters/normalized/bitstamp_adapter.yml
133
+ - spec/fixtures/adapters/normalized/btc_china_adapter.yml
134
+ - spec/fixtures/adapters/normalized/btce_adapter.yml
135
+ - spec/fixtures/adapters/normalized/coinbase_adapter.yml
136
+ - spec/fixtures/adapters/normalized/fixer_adapter.yml
137
+ - spec/fixtures/adapters/normalized/forge_adapter.yml
138
+ - spec/fixtures/adapters/normalized/huobi_adapter.yml
139
+ - spec/fixtures/adapters/normalized/kraken_adapter.yml
140
+ - spec/fixtures/adapters/normalized/localbitcoins_adapter.yml
141
+ - spec/fixtures/adapters/normalized/okcoin_adapter.yml
142
+ - spec/fixtures/adapters/normalized/yahoo_adapter.yml
143
+ - spec/fixtures/adapters/okcoin_adapter.yml
144
+ - spec/fixtures/adapters/yahoo_adapter.yml
145
+ - spec/lib/adapter_spec.rb
146
+ - spec/lib/adapters/crypto/bitfinex_adapter_spec.rb
147
+ - spec/lib/adapters/crypto/bitpay_adapter_spec.rb
148
+ - spec/lib/adapters/crypto/bitstamp_adapter_spec.rb
149
+ - spec/lib/adapters/crypto/btc_china_adapter_spec.rb
150
+ - spec/lib/adapters/crypto/btc_e_adapter_spec.rb
151
+ - spec/lib/adapters/crypto/coinbase_adapter_spec.rb
152
+ - spec/lib/adapters/crypto/huobi_adapter_spec.rb
153
+ - spec/lib/adapters/crypto/kraken_adapter_spec.rb
154
+ - spec/lib/adapters/crypto/localbitcoins_adapter_spec.rb
155
+ - spec/lib/adapters/crypto/okcoin_adapter_spec.rb
156
+ - spec/lib/adapters/fiat/fixer_adapter_spec.rb
157
+ - spec/lib/adapters/fiat/forge_adapter_spec.rb
158
+ - spec/lib/adapters/fiat/yahoo_adapter_spec.rb
159
+ - spec/lib/currency_rate_spec.rb
160
+ - spec/lib/fetcher_spec.rb
161
+ - spec/lib/storage/file_storage_spec.rb
162
+ - spec/lib/synchronizer_spec.rb
161
163
  - spec/spec_helper.rb
164
+ - spec/support/matchers/eq_any_of.rb
162
165
  homepage: http://github.com/snitko/currency-rate
163
166
  licenses:
164
167
  - MIT
data/Gemfile.lock DELETED
@@ -1,93 +0,0 @@
1
- GIT
2
- remote: git@github.com:technicalpickles/jeweler.git
3
- revision: afab16b95fbac811f3ab233e058d39eb4e300284
4
- specs:
5
- jeweler (2.3.7)
6
- builder
7
- bundler (>= 1)
8
- git (>= 1.2.5)
9
- github_api (~> 0.16.0)
10
- highline (>= 1.6.15)
11
- nokogiri (>= 1.5.10)
12
- psych (~> 2.2)
13
- rake
14
- rdoc
15
- semver2
16
-
17
- GEM
18
- remote: https://rubygems.org/
19
- specs:
20
- addressable (2.4.0)
21
- builder (3.2.3)
22
- crack (0.4.3)
23
- safe_yaml (~> 1.0.0)
24
- descendants_tracker (0.0.4)
25
- thread_safe (~> 0.3, >= 0.3.1)
26
- diff-lcs (1.2.5)
27
- faraday (0.9.2)
28
- multipart-post (>= 1.2, < 3)
29
- git (1.3.0)
30
- github_api (0.16.0)
31
- addressable (~> 2.4.0)
32
- descendants_tracker (~> 0.0.4)
33
- faraday (~> 0.8, < 0.10)
34
- hashie (>= 3.4)
35
- mime-types (>= 1.16, < 3.0)
36
- oauth2 (~> 1.0)
37
- hashdiff (0.3.0)
38
- hashie (3.5.5)
39
- highline (1.7.8)
40
- jwt (1.5.6)
41
- mime-types (2.99.3)
42
- mini_portile2 (2.2.0)
43
- multi_json (1.12.1)
44
- multi_xml (0.6.0)
45
- multipart-post (2.0.0)
46
- nokogiri (1.8.0)
47
- mini_portile2 (~> 2.2.0)
48
- oauth2 (1.4.0)
49
- faraday (>= 0.8, < 0.13)
50
- jwt (~> 1.0)
51
- multi_json (~> 1.3)
52
- multi_xml (~> 0.5)
53
- rack (>= 1.2, < 3)
54
- psych (2.2.4)
55
- rack (2.0.3)
56
- rake (12.0.0)
57
- rdoc (5.1.0)
58
- rspec (3.4.0)
59
- rspec-core (~> 3.4.0)
60
- rspec-expectations (~> 3.4.0)
61
- rspec-mocks (~> 3.4.0)
62
- rspec-core (3.4.4)
63
- rspec-support (~> 3.4.0)
64
- rspec-expectations (3.4.0)
65
- diff-lcs (>= 1.2.0, < 2.0)
66
- rspec-support (~> 3.4.0)
67
- rspec-mocks (3.4.1)
68
- diff-lcs (>= 1.2.0, < 2.0)
69
- rspec-support (~> 3.4.0)
70
- rspec-support (3.4.1)
71
- safe_yaml (1.0.4)
72
- satoshi-unit (0.1.8)
73
- semver2 (3.4.2)
74
- thread_safe (0.3.6)
75
- vcr (3.0.3)
76
- webmock (2.0.3)
77
- addressable (>= 2.3.6)
78
- crack (>= 0.3.2)
79
- hashdiff
80
-
81
- PLATFORMS
82
- ruby
83
-
84
- DEPENDENCIES
85
- bundler (~> 1.0)
86
- jeweler (~> 2.3.7)!
87
- rspec
88
- satoshi-unit
89
- vcr
90
- webmock
91
-
92
- BUNDLED WITH
93
- 1.15.1
@@ -1,11 +0,0 @@
1
- class Hash
2
- def deep_get(*args)
3
- args.inject(self) do |intermediate, key|
4
- if intermediate.respond_to?(:[])
5
- intermediate[key]
6
- else
7
- return nil
8
- end
9
- end
10
- end
11
- end
@@ -1,19 +0,0 @@
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,54 +0,0 @@
1
- module CurrencyRate
2
- class AverageRateAdapter < CryptoAdapter
3
-
4
- DEFAULT_CURRENCIES = ["USD", "BTC"]
5
- SUPPORTED_CRYPTO_CURRENCIES = ["BTC"]
6
-
7
- # Takes exchange rate adapters instances or classes as arguments
8
- def self.instance(*adapters)
9
- instance = super()
10
- instance.instance_variable_set(:@adapters, adapters.map { |adapter| adapter.respond_to?(:instance) ? adapter.instance : adapter })
11
- instance
12
- end
13
-
14
- def fetch_rates!
15
- failed_fetches = 0
16
- @adapters.each do |adapter|
17
- begin
18
- adapter.fetch_rates!
19
- rescue FetchingFailed => e
20
- failed_fetches += 1
21
- raise e if failed_fetches == @adapters.size
22
- end
23
- end
24
- end
25
-
26
- def rate_for(from, to)
27
- rates = []
28
- @adapters.each do |adapter|
29
- begin
30
- rates << adapter.rate_for(from,to)
31
- rescue CurrencyNotSupported
32
- rates << nil
33
- end
34
- end
35
-
36
- unless rates.select(&:nil?).size == @adapters.size
37
- rates.compact!
38
- rate = rates.inject {|sum, rate| sum + rate} / rates.size
39
- invert_rate(from,to, rate)
40
- else
41
- raise CurrencyNotSupported
42
- end
43
- end
44
-
45
- def get_rate_value_from_hash(rates_hash, *keys)
46
- raise "This method is not supposed to be used in #{self.class}."
47
- end
48
-
49
- def rate_to_f(rate)
50
- raise "This method is not supposed to be used in #{self.class}."
51
- end
52
-
53
- end
54
- end