currency-rate 0.4.1 → 1.0.0
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.
- 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
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a3676983c63a5f579c68cde5320507f1ae2865e8
|
|
4
|
+
data.tar.gz: da1012848a17db8f389d10201d26e66aed2ac93b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d5b015e4587fee54369ecaa39345485f2c9acdb81581fcd4f62655ec235472ef3158dd774c52a5f66b8dadcc2e49206e8c1036017c0421d6ac591aa7785448dd
|
|
7
|
+
data.tar.gz: 707067690373ce67e6cb2cd6697ac1271e7f615ff533bb73d25c196fcc987054258092524621a9773df62043408107f2b9c598da95da91352c32664b674a126f
|
data/Gemfile
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
source "https://rubygems.org"
|
|
2
2
|
|
|
3
|
-
gem
|
|
3
|
+
gem "http"
|
|
4
4
|
|
|
5
5
|
group :development do
|
|
6
|
-
gem "bundler", "~> 1.0"
|
|
7
6
|
gem "jeweler", "~> 2.3.7", git: 'git@github.com:technicalpickles/jeweler.git'
|
|
8
7
|
gem "rspec"
|
|
9
|
-
gem
|
|
10
|
-
gem
|
|
8
|
+
gem "webmock"
|
|
9
|
+
gem "byebug"
|
|
11
10
|
end
|
data/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
currency-rate
|
|
2
2
|
=============
|
|
3
3
|
|
|
4
|
-
Converter for fiat and crypto currencies
|
|
4
|
+
Converter for fiat and crypto currencies. Currently supports BTC and LTC.
|
|
5
5
|
|
|
6
6
|
Installation
|
|
7
7
|
------------
|
|
@@ -12,66 +12,54 @@ or in Gemfile
|
|
|
12
12
|
|
|
13
13
|
gem "currency-rate"
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
CurrencyRate.convert('Bitstamp', amount: 1000, from: 'USD', to: 'EUR')
|
|
23
|
-
|
|
24
|
-
In the third case, because Bitstamp doesn't really support direct conversion from
|
|
25
|
-
USD to EUR, the 1000 will first be converted to BTC, then the BTC amount will be converted to EUR.
|
|
26
|
-
|
|
27
|
-
This introduced the concept of anchor currency. For all Btc adapters in this lib, it's set to BTC
|
|
28
|
-
by default. For all Fiat adapters it's set to USD by default. To specify anchor currency manually,
|
|
29
|
-
simply pass it as another argument, for example:
|
|
30
|
-
|
|
31
|
-
CurrencyRate.convert('Bitstamp', amount: 1000, from: 'USD', to: 'EUR', anchor_currency: 'BTC')
|
|
32
|
-
|
|
33
|
-
You can also use `#get` method to get just the rate. It basically works as `#convert`, but only returns the rate and the method signature (attributes passed) is different - attributes are not named:
|
|
15
|
+
Configuration
|
|
16
|
+
-------------
|
|
17
|
+
```ruby
|
|
18
|
+
CurrencyRate.configure do |config|
|
|
19
|
+
# Now only ForgeAdapter requires api key to fetch rates
|
|
20
|
+
# Empty array by default
|
|
21
|
+
config.api_keys["ForgeAdapter"] = "forge_api_key"
|
|
34
22
|
|
|
35
|
-
CurrencyRate
|
|
36
|
-
|
|
23
|
+
# CurrencyRate::FileStorage configuration has only 'path' attribute
|
|
24
|
+
config.file_storage[:path] = "/home/user/data" # default: ""
|
|
37
25
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
26
|
+
# CurrencyRate uses default Logger from Ruby core library
|
|
27
|
+
# It can be replaced with any compatible object
|
|
28
|
+
# All logger values listed below are default
|
|
29
|
+
config.logger[:device] = $stdout
|
|
30
|
+
config.logger[:level] = :info
|
|
31
|
+
config.logger[:formatter] = nil
|
|
41
32
|
|
|
42
|
-
|
|
33
|
+
# Cryptocurrency exchange adapters to fetch
|
|
34
|
+
config.crypto_adapters = ["Kraken", "Localbitcoins"]
|
|
43
35
|
|
|
44
|
-
|
|
36
|
+
# Fiat exchange adapters to fetch
|
|
37
|
+
config.fiat_adapters = ["Yahoo"]
|
|
38
|
+
end
|
|
39
|
+
```
|
|
45
40
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
and [lib/fiat_adapters](https://github.com/snitko/currency-rate/tree/master/lib/fiat_adapters).
|
|
49
|
-
To specify an adapter for `#convert` or `#get`, remove the last `Adapter` part from its name.
|
|
41
|
+
Usage
|
|
42
|
+
-----
|
|
50
43
|
|
|
51
|
-
|
|
52
|
-
|
|
44
|
+
To fetch rates from exchanges into file storage (the only supported at this moment):
|
|
45
|
+
```ruby
|
|
46
|
+
CurrencyRate.sync!
|
|
47
|
+
```
|
|
48
|
+
This method will load all available data from exchanges and put into `yml` files. Failed exchanges will not create new / update exsisting files.
|
|
53
49
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
50
|
+
To get rates for Crypto/Fiat currency pair use:
|
|
51
|
+
```ruby
|
|
52
|
+
CurrencyRate.fetch_crypto("Bitstamp", "BTC", "USD")
|
|
53
|
+
```
|
|
58
54
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
55
|
+
For fetching Fiat/Fiat pair:
|
|
56
|
+
```ruby
|
|
57
|
+
CurrencyRate.fetch_fiat("CNY", "USD")
|
|
58
|
+
```
|
|
62
59
|
|
|
63
|
-
|
|
60
|
+
Details
|
|
64
61
|
-------
|
|
65
|
-
This gem was extracted from [straight gem](https://github.com/MyceliumGear/straight), thanks to all the people who added various exchange rate adapters and contributed code.
|
|
66
|
-
|
|
67
|
-
TODO
|
|
68
|
-
----
|
|
69
|
-
|
|
70
|
-
1. Remove code duplication in Adapters, specifically for
|
|
71
|
-
`#rate_for`, `#invert_rate` and `#currency_pair_rate` methods.
|
|
72
|
-
|
|
73
|
-
2. Allow both lower case and upper case currency codes.
|
|
74
|
-
|
|
75
|
-
3. Clean up tests, I have a feeling there some completely useless ones.
|
|
76
62
|
|
|
77
|
-
|
|
63
|
+
`CurrencyRate` contains two parts that can work independently: Synchronizer and Fetcher.
|
|
64
|
+
`CurrencyRate::Synchronizer` loads data from selected exchanges using adapters and saves it into FileStorage in normalized format.
|
|
65
|
+
`CurrencyRate::Fetch` reads data from FileStorage and returns rate for requested pair and exchange.
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
1.0.0
|
data/currency-rate.gemspec
CHANGED
|
@@ -2,18 +2,18 @@
|
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
|
5
|
-
# stub: currency-rate 0.
|
|
5
|
+
# stub: currency-rate 1.0.0 ruby lib
|
|
6
6
|
|
|
7
7
|
Gem::Specification.new do |s|
|
|
8
|
-
s.name = "currency-rate"
|
|
9
|
-
s.version = "0.
|
|
8
|
+
s.name = "currency-rate".freeze
|
|
9
|
+
s.version = "1.0.0"
|
|
10
10
|
|
|
11
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
12
|
-
s.require_paths = ["lib"]
|
|
13
|
-
s.authors = ["Roman Snitko"]
|
|
14
|
-
s.date = "2017-
|
|
15
|
-
s.description = "Fetches exchange rates from various sources and does the conversion"
|
|
16
|
-
s.email = "roman.snitko@gmail.com"
|
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
|
12
|
+
s.require_paths = ["lib".freeze]
|
|
13
|
+
s.authors = ["Roman Snitko".freeze]
|
|
14
|
+
s.date = "2017-10-30"
|
|
15
|
+
s.description = "Fetches exchange rates from various sources and does the conversion".freeze
|
|
16
|
+
s.email = "roman.snitko@gmail.com".freeze
|
|
17
17
|
s.extra_rdoc_files = [
|
|
18
18
|
"LICENSE.txt",
|
|
19
19
|
"README.md"
|
|
@@ -22,91 +22,105 @@ Gem::Specification.new do |s|
|
|
|
22
22
|
".document",
|
|
23
23
|
".rspec",
|
|
24
24
|
"Gemfile",
|
|
25
|
-
"Gemfile.lock",
|
|
26
25
|
"LICENSE.txt",
|
|
27
26
|
"README.md",
|
|
28
27
|
"Rakefile",
|
|
29
28
|
"VERSION",
|
|
30
29
|
"currency-rate.gemspec",
|
|
31
30
|
"lib/adapter.rb",
|
|
32
|
-
"lib/
|
|
33
|
-
"lib/
|
|
34
|
-
"lib/
|
|
35
|
-
"lib/
|
|
36
|
-
"lib/
|
|
37
|
-
"lib/
|
|
38
|
-
"lib/
|
|
39
|
-
"lib/
|
|
40
|
-
"lib/
|
|
41
|
-
"lib/
|
|
42
|
-
"lib/
|
|
43
|
-
"lib/
|
|
44
|
-
"lib/
|
|
31
|
+
"lib/adapters/crypto/bitfinex_adapter.rb",
|
|
32
|
+
"lib/adapters/crypto/bitpay_adapter.rb",
|
|
33
|
+
"lib/adapters/crypto/bitstamp_adapter.rb",
|
|
34
|
+
"lib/adapters/crypto/btc_china_adapter.rb",
|
|
35
|
+
"lib/adapters/crypto/btc_e_adapter.rb",
|
|
36
|
+
"lib/adapters/crypto/coinbase_adapter.rb",
|
|
37
|
+
"lib/adapters/crypto/huobi_adapter.rb",
|
|
38
|
+
"lib/adapters/crypto/kraken_adapter.rb",
|
|
39
|
+
"lib/adapters/crypto/localbitcoins_adapter.rb",
|
|
40
|
+
"lib/adapters/crypto/okcoin_adapter.rb",
|
|
41
|
+
"lib/adapters/fiat/fixer_adapter.rb",
|
|
42
|
+
"lib/adapters/fiat/forge_adapter.rb",
|
|
43
|
+
"lib/adapters/fiat/yahoo_adapter.rb",
|
|
44
|
+
"lib/configuration.rb",
|
|
45
45
|
"lib/currency_rate.rb",
|
|
46
|
-
"lib/
|
|
47
|
-
"lib/
|
|
48
|
-
"lib/
|
|
49
|
-
"lib/
|
|
50
|
-
"spec/
|
|
51
|
-
"spec/fixtures/
|
|
52
|
-
"spec/fixtures/
|
|
53
|
-
"spec/fixtures/
|
|
54
|
-
"spec/fixtures/
|
|
55
|
-
"spec/fixtures/
|
|
56
|
-
"spec/fixtures/
|
|
57
|
-
"spec/fixtures/
|
|
58
|
-
"spec/fixtures/
|
|
59
|
-
"spec/fixtures/
|
|
60
|
-
"spec/fixtures/
|
|
61
|
-
"spec/fixtures/
|
|
62
|
-
"spec/fixtures/
|
|
63
|
-
"spec/
|
|
64
|
-
"spec/
|
|
65
|
-
"spec/
|
|
66
|
-
"spec/
|
|
67
|
-
"spec/
|
|
68
|
-
"spec/
|
|
69
|
-
"spec/
|
|
70
|
-
"spec/
|
|
71
|
-
"spec/
|
|
72
|
-
"spec/
|
|
73
|
-
"spec/
|
|
74
|
-
"spec/
|
|
75
|
-
"spec/
|
|
76
|
-
"spec/lib/
|
|
77
|
-
"spec/lib/
|
|
78
|
-
"spec/
|
|
46
|
+
"lib/fetcher.rb",
|
|
47
|
+
"lib/storage/file_storage.rb",
|
|
48
|
+
"lib/storage/serializers/yaml_serializer.rb",
|
|
49
|
+
"lib/synchronizer.rb",
|
|
50
|
+
"spec/fixtures/adapters/bitfinex_adapter.yml",
|
|
51
|
+
"spec/fixtures/adapters/bitpay_adapter.yml",
|
|
52
|
+
"spec/fixtures/adapters/bitstamp_adapter.yml",
|
|
53
|
+
"spec/fixtures/adapters/btc_china_adapter.yml",
|
|
54
|
+
"spec/fixtures/adapters/btce_adapter.yml",
|
|
55
|
+
"spec/fixtures/adapters/coinbase_adapter.yml",
|
|
56
|
+
"spec/fixtures/adapters/fixer_adapter.yml",
|
|
57
|
+
"spec/fixtures/adapters/forge_adapter.yml",
|
|
58
|
+
"spec/fixtures/adapters/huobi_adapter.yml",
|
|
59
|
+
"spec/fixtures/adapters/kraken_adapter.yml",
|
|
60
|
+
"spec/fixtures/adapters/localbitcoins_adapter.yml",
|
|
61
|
+
"spec/fixtures/adapters/normalized/bitfinex_adapter.yml",
|
|
62
|
+
"spec/fixtures/adapters/normalized/bitpay_adapter.yml",
|
|
63
|
+
"spec/fixtures/adapters/normalized/bitstamp_adapter.yml",
|
|
64
|
+
"spec/fixtures/adapters/normalized/btc_china_adapter.yml",
|
|
65
|
+
"spec/fixtures/adapters/normalized/btce_adapter.yml",
|
|
66
|
+
"spec/fixtures/adapters/normalized/coinbase_adapter.yml",
|
|
67
|
+
"spec/fixtures/adapters/normalized/fixer_adapter.yml",
|
|
68
|
+
"spec/fixtures/adapters/normalized/forge_adapter.yml",
|
|
69
|
+
"spec/fixtures/adapters/normalized/huobi_adapter.yml",
|
|
70
|
+
"spec/fixtures/adapters/normalized/kraken_adapter.yml",
|
|
71
|
+
"spec/fixtures/adapters/normalized/localbitcoins_adapter.yml",
|
|
72
|
+
"spec/fixtures/adapters/normalized/okcoin_adapter.yml",
|
|
73
|
+
"spec/fixtures/adapters/normalized/yahoo_adapter.yml",
|
|
74
|
+
"spec/fixtures/adapters/okcoin_adapter.yml",
|
|
75
|
+
"spec/fixtures/adapters/yahoo_adapter.yml",
|
|
76
|
+
"spec/lib/adapter_spec.rb",
|
|
77
|
+
"spec/lib/adapters/crypto/bitfinex_adapter_spec.rb",
|
|
78
|
+
"spec/lib/adapters/crypto/bitpay_adapter_spec.rb",
|
|
79
|
+
"spec/lib/adapters/crypto/bitstamp_adapter_spec.rb",
|
|
80
|
+
"spec/lib/adapters/crypto/btc_china_adapter_spec.rb",
|
|
81
|
+
"spec/lib/adapters/crypto/btc_e_adapter_spec.rb",
|
|
82
|
+
"spec/lib/adapters/crypto/coinbase_adapter_spec.rb",
|
|
83
|
+
"spec/lib/adapters/crypto/huobi_adapter_spec.rb",
|
|
84
|
+
"spec/lib/adapters/crypto/kraken_adapter_spec.rb",
|
|
85
|
+
"spec/lib/adapters/crypto/localbitcoins_adapter_spec.rb",
|
|
86
|
+
"spec/lib/adapters/crypto/okcoin_adapter_spec.rb",
|
|
87
|
+
"spec/lib/adapters/fiat/fixer_adapter_spec.rb",
|
|
88
|
+
"spec/lib/adapters/fiat/forge_adapter_spec.rb",
|
|
89
|
+
"spec/lib/adapters/fiat/yahoo_adapter_spec.rb",
|
|
90
|
+
"spec/lib/currency_rate_spec.rb",
|
|
91
|
+
"spec/lib/fetcher_spec.rb",
|
|
92
|
+
"spec/lib/storage/file_storage_spec.rb",
|
|
93
|
+
"spec/lib/synchronizer_spec.rb",
|
|
94
|
+
"spec/spec_helper.rb",
|
|
95
|
+
"spec/support/matchers/eq_any_of.rb"
|
|
79
96
|
]
|
|
80
|
-
s.homepage = "http://github.com/snitko/currency-rate"
|
|
81
|
-
s.licenses = ["MIT"]
|
|
82
|
-
s.rubygems_version = "2.
|
|
83
|
-
s.summary = "Converter for fiat and crypto currencies"
|
|
97
|
+
s.homepage = "http://github.com/snitko/currency-rate".freeze
|
|
98
|
+
s.licenses = ["MIT".freeze]
|
|
99
|
+
s.rubygems_version = "2.6.14".freeze
|
|
100
|
+
s.summary = "Converter for fiat and crypto currencies".freeze
|
|
84
101
|
|
|
85
102
|
if s.respond_to? :specification_version then
|
|
86
103
|
s.specification_version = 4
|
|
87
104
|
|
|
88
105
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
|
89
|
-
s.add_runtime_dependency(%q<
|
|
90
|
-
s.add_development_dependency(%q<
|
|
91
|
-
s.add_development_dependency(%q<
|
|
92
|
-
s.add_development_dependency(%q<
|
|
93
|
-
s.add_development_dependency(%q<
|
|
94
|
-
s.add_development_dependency(%q<vcr>, [">= 0"])
|
|
106
|
+
s.add_runtime_dependency(%q<http>.freeze, [">= 0"])
|
|
107
|
+
s.add_development_dependency(%q<jeweler>.freeze, ["~> 2.3.7"])
|
|
108
|
+
s.add_development_dependency(%q<rspec>.freeze, [">= 0"])
|
|
109
|
+
s.add_development_dependency(%q<webmock>.freeze, [">= 0"])
|
|
110
|
+
s.add_development_dependency(%q<byebug>.freeze, [">= 0"])
|
|
95
111
|
else
|
|
96
|
-
s.add_dependency(%q<
|
|
97
|
-
s.add_dependency(%q<
|
|
98
|
-
s.add_dependency(%q<
|
|
99
|
-
s.add_dependency(%q<
|
|
100
|
-
s.add_dependency(%q<
|
|
101
|
-
s.add_dependency(%q<vcr>, [">= 0"])
|
|
112
|
+
s.add_dependency(%q<http>.freeze, [">= 0"])
|
|
113
|
+
s.add_dependency(%q<jeweler>.freeze, ["~> 2.3.7"])
|
|
114
|
+
s.add_dependency(%q<rspec>.freeze, [">= 0"])
|
|
115
|
+
s.add_dependency(%q<webmock>.freeze, [">= 0"])
|
|
116
|
+
s.add_dependency(%q<byebug>.freeze, [">= 0"])
|
|
102
117
|
end
|
|
103
118
|
else
|
|
104
|
-
s.add_dependency(%q<
|
|
105
|
-
s.add_dependency(%q<
|
|
106
|
-
s.add_dependency(%q<
|
|
107
|
-
s.add_dependency(%q<
|
|
108
|
-
s.add_dependency(%q<
|
|
109
|
-
s.add_dependency(%q<vcr>, [">= 0"])
|
|
119
|
+
s.add_dependency(%q<http>.freeze, [">= 0"])
|
|
120
|
+
s.add_dependency(%q<jeweler>.freeze, ["~> 2.3.7"])
|
|
121
|
+
s.add_dependency(%q<rspec>.freeze, [">= 0"])
|
|
122
|
+
s.add_dependency(%q<webmock>.freeze, [">= 0"])
|
|
123
|
+
s.add_dependency(%q<byebug>.freeze, [">= 0"])
|
|
110
124
|
end
|
|
111
125
|
end
|
|
112
126
|
|
data/lib/adapter.rb
CHANGED
|
@@ -2,105 +2,59 @@ module CurrencyRate
|
|
|
2
2
|
class Adapter
|
|
3
3
|
include Singleton
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
FETCH_URL = nil
|
|
6
|
+
API_KEY_PARAM = nil
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
def name
|
|
9
|
+
self.class.name.gsub /^.*::/, ""
|
|
10
|
+
end
|
|
9
11
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
+
def fetch_rates
|
|
13
|
+
begin
|
|
14
|
+
normalize exchange_data
|
|
15
|
+
rescue StandardError => e
|
|
16
|
+
CurrencyRate.logger.error("Error in #{self.name}#fetch_rates")
|
|
17
|
+
CurrencyRate.logger.error(e)
|
|
18
|
+
nil
|
|
19
|
+
end
|
|
20
|
+
end
|
|
12
21
|
|
|
13
|
-
def
|
|
14
|
-
|
|
22
|
+
def normalize(data)
|
|
23
|
+
if data.nil?
|
|
24
|
+
CurrencyRate.logger.warn("#{self.name}#normalize: data is nil")
|
|
25
|
+
return nil
|
|
26
|
+
end
|
|
27
|
+
true
|
|
15
28
|
end
|
|
16
29
|
|
|
17
|
-
def
|
|
30
|
+
def exchange_data
|
|
18
31
|
raise "FETCH_URL is not defined!" unless self.class::FETCH_URL
|
|
32
|
+
|
|
19
33
|
begin
|
|
20
34
|
if self.class::FETCH_URL.kind_of?(Hash)
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
@rates[name] = JSON.parse(uri.read(read_timeout: 4))
|
|
35
|
+
self.class::FETCH_URL.reduce({}) do |result, (name, url)|
|
|
36
|
+
result[name] = request url
|
|
37
|
+
result
|
|
25
38
|
end
|
|
26
39
|
else
|
|
27
|
-
|
|
28
|
-
@rates = JSON.parse(uri.read(read_timeout: 4))
|
|
40
|
+
request self.class::FETCH_URL
|
|
29
41
|
end
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
42
|
+
rescue StandardError => e
|
|
43
|
+
CurrencyRate.logger.error("Error in #{self.name}#exchange_data")
|
|
44
|
+
CurrencyRate.logger.error(e)
|
|
45
|
+
nil
|
|
34
46
|
end
|
|
35
47
|
end
|
|
36
48
|
|
|
37
|
-
def
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
if
|
|
42
|
-
@rates = self.storage.data[self.class.to_s][:content]
|
|
43
|
-
else
|
|
44
|
-
raise e
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
unless supports_currency_pair?(from,to)
|
|
49
|
-
raise CurrencyNotSupported, "Unsupported currencies (one or both) are: #{from} -> #{to}"
|
|
49
|
+
def request(url)
|
|
50
|
+
fetch_url = url
|
|
51
|
+
if self.class::API_KEY_PARAM
|
|
52
|
+
api_key = CurrencyRate.configuration.api_keys[self.name]
|
|
53
|
+
fetch_url << "&#{self.class::API_KEY_PARAM}=#{api_key}" if api_key
|
|
50
54
|
end
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
# here it doesn't really return anything useful!
|
|
54
|
-
|
|
55
|
+
http_client = HTTP.timeout(connect: 4, read: 4)
|
|
56
|
+
JSON.parse(http_client.get(fetch_url).to_s)
|
|
55
57
|
end
|
|
56
58
|
|
|
57
|
-
def supports_currency_pair?(c1,c2)
|
|
58
|
-
supported_currency_pairs.include?("#{c1}/#{c2}".upcase) || supported_currency_pairs.include?("#{c2}/#{c1}".upcase)
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
# This method is supposed to be implemented for each individual adapter because the format of
|
|
62
|
-
# the contents of the @rate variable is specific to each adapter. It would parse @rates and
|
|
63
|
-
# extract currency pairs. Returns an array of supported currency pairs: ["USD/BTC", "EUR/BTC"]
|
|
64
|
-
#
|
|
65
|
-
# If you're implementing this method please note that you don't need to return a reversed pair
|
|
66
|
-
# that is ["USD/BTC", "BTC/USD"] would be excessive and just ["USD/BTC"] would work,
|
|
67
|
-
# because it is assumed that the adapter supports a reverse pair (see #rate_for implementation above).
|
|
68
|
-
#
|
|
69
|
-
# It would also be wise to use caching when implementing, that is:
|
|
70
|
-
#
|
|
71
|
-
# return @supported_currency_pairs if @supported_currency_pairs
|
|
72
|
-
#
|
|
73
|
-
# Which would make this method parse @rates only once.
|
|
74
|
-
def supported_currency_pairs
|
|
75
|
-
raise "Please implement #supported_currency_pairs in your Adapter"
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
def cache_supported_currency_pairs
|
|
79
|
-
return @supported_currency_pairs if @supported_currency_pairs
|
|
80
|
-
@supported_currency_pairs = []
|
|
81
|
-
yield
|
|
82
|
-
@supported_currency_pairs
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
# Must be implemented inside every descendant class
|
|
86
|
-
# because storage format may be completely different
|
|
87
|
-
def get_rate_value_from_source(rates_hash, *keys)
|
|
88
|
-
raise "Please implement this method in your Adapter"
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
# We dont want to have false positive rate, because nil.to_f is 0.0
|
|
92
|
-
# This method checks that rate value is not nil
|
|
93
|
-
def rate_to_f(rate)
|
|
94
|
-
rate ? rate.to_f : raise(CurrencyNotSupported)
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
private
|
|
99
|
-
|
|
100
|
-
def _invert_rate(rate)
|
|
101
|
-
r = (BigDecimal.new('1')/BigDecimal.new(rate.to_s))
|
|
102
|
-
r = r.round(self.class::DECIMAL_PRECISION) if self.class::DECIMAL_PRECISION
|
|
103
|
-
r
|
|
104
|
-
end
|
|
105
59
|
end
|
|
106
60
|
end
|