currency-rate 0.1.1 → 0.2.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/README.md +13 -0
 - data/VERSION +1 -1
 - data/currency-rate.gemspec +22 -3
 - data/lib/adapter.rb +17 -9
 - data/lib/btc_adapter.rb +4 -6
 - data/lib/btc_adapters/average_rate_adapter.rb +4 -3
 - data/lib/btc_adapters/bitfinex_adapter.rb +30 -0
 - data/lib/btc_adapters/bitpay_adapter.rb +10 -3
 - data/lib/btc_adapters/bitstamp_adapter.rb +24 -5
 - data/lib/btc_adapters/btcchina_adapter.rb +13 -0
 - data/lib/btc_adapters/btce_adapter.rb +26 -5
 - data/lib/btc_adapters/coinbase_adapter.rb +2 -2
 - data/lib/btc_adapters/huobi_adapter.rb +30 -0
 - data/lib/btc_adapters/kraken_adapter.rb +14 -5
 - data/lib/btc_adapters/localbitcoins_adapter.rb +10 -3
 - data/lib/btc_adapters/okcoin_adapter.rb +24 -5
 - data/lib/currency_rate.rb +11 -10
 - data/lib/fiat_adapter.rb +4 -18
 - data/lib/fiat_adapters/fixer_adapter.rb +20 -5
 - data/lib/fiat_adapters/yahoo_adapter.rb +28 -6
 - data/spec/currency_rate_spec.rb +10 -6
 - data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/average_rate_adapter.yml +423 -0
 - data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/bitfinex_adapter.yml +125 -0
 - data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/bitpay_adapter_yml.yml +272 -0
 - data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/bitstamp_adapter.yml +153 -0
 - data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/btcchina_adapter.yml +83 -0
 - data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/btce_adapter.yml +223 -0
 - data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/coinbase_adapter.yml +76 -0
 - data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/huobi_adapter.yml +83 -0
 - data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/kraken_adapter.yml +83 -0
 - data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/localbitcoins_adapter.yml +128 -0
 - data/spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/okcoin_adapter.yml +207 -0
 - data/spec/fixtures/vcr/exchange_rate_adapters/fiat_adapters/fixer_adapter.yml +81 -0
 - data/spec/fixtures/vcr/exchange_rate_adapters/fiat_adapters/yahoo_adapter.yml +50 -0
 - data/spec/lib/btc_adapter_spec.rb +16 -28
 - data/spec/lib/btc_adapters/average_rate_adapter_spec.rb +4 -4
 - data/spec/lib/btc_adapters/bitfinex_adapter_spec.rb +38 -0
 - data/spec/lib/btc_adapters/bitpay_adapter_spec.rb +8 -3
 - data/spec/lib/btc_adapters/bitstamp_adapter_spec.rb +8 -3
 - data/spec/lib/btc_adapters/btcchina_adapter_spec.rb +36 -0
 - data/spec/lib/btc_adapters/btce_adapter_spec.rb +10 -3
 - data/spec/lib/btc_adapters/coinbase_adapter_spec.rb +5 -3
 - data/spec/lib/btc_adapters/huobi_adapter_spec.rb +38 -0
 - data/spec/lib/btc_adapters/kraken_adapter_spec.rb +6 -3
 - data/spec/lib/btc_adapters/localbitcoins_adapter_spec.rb +4 -3
 - data/spec/lib/btc_adapters/okcoin_adapter_spec.rb +11 -3
 - data/spec/lib/fiat_adapters/fixer_adapter_spec.rb +5 -2
 - data/spec/lib/fiat_adapters/yahoo_adapter_spec.rb +5 -2
 - metadata +21 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 3840cff6b0d67d1daba2cf2a74231d2c8655311e
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 9057b69eeef323940d40e0f127abe91cc902e949
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 64b511ad2f1a37c491a0e3d805c0053130dfeceb9e19874a8a3a981b175840098abbb529d9a89881b466ed15bd4364eeecfc9be04b3aefa6b8d05b7851f798d4
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 9b4708166f703fb4ebc34563073dd846e593fe87b2a17716ee5b76f1a0d60800caf1efcd1a75f94f869d381b448ba4123a0fae54de26f351720cbcef933b30bf
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -30,6 +30,19 @@ simply pass it as another argument, for example: 
     | 
|
| 
       30 
30 
     | 
    
         | 
| 
       31 
31 
     | 
    
         
             
                CurrencyRate.convert('Bitstamp', amount: 1000, from: 'USD', to: 'EUR', anchor_currency: 'BTC')
         
     | 
| 
       32 
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:
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                CurrencyRate.get('Bitstamp', 'BTC', 'USD') # => 750
         
     | 
| 
      
 36 
     | 
    
         
            +
                CurrencyRate.get('Bitstamp', 'USD', 'BTC') # => 0.001818182
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
            In the second case, we are trying to get the exchange rate for USD/BTC pair, which literally means
         
     | 
| 
      
 39 
     | 
    
         
            +
            "how much in BTC would 1 USD be?". If the source (Bitstamp, in this case) doesn't provide the
         
     | 
| 
      
 40 
     | 
    
         
            +
            inverted rate, the Adapter inverts the rate itself using the exchange rate for BTC/USD.
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
            You can also using `anchor_currency` with `#get`:
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                CurrencyRate.get('Bitstamp', 'USD', 'EUR', anchor_currency: 'BTC')
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
       33 
46 
     | 
    
         
             
            For a list of available adapters, please see
         
     | 
| 
       34 
47 
     | 
    
         
             
            [lib/btc_adapters](https://github.com/snitko/currency-rate/tree/master/lib/btc_adapters)
         
     | 
| 
       35 
48 
     | 
    
         
             
            and [lib/fiat_adapters](https://github.com/snitko/currency-rate/tree/master/lib/fiat_adapters).
         
     | 
    
        data/VERSION
    CHANGED
    
    | 
         @@ -1 +1 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            0. 
     | 
| 
      
 1 
     | 
    
         
            +
            0.2.0
         
     | 
    
        data/currency-rate.gemspec
    CHANGED
    
    | 
         @@ -2,16 +2,16 @@ 
     | 
|
| 
       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 0.2.0 ruby lib
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
            Gem::Specification.new do |s|
         
     | 
| 
       8 
8 
     | 
    
         
             
              s.name = "currency-rate"
         
     | 
| 
       9 
     | 
    
         
            -
              s.version = "0. 
     | 
| 
      
 9 
     | 
    
         
            +
              s.version = "0.2.0"
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       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 = "2016-06- 
     | 
| 
      
 14 
     | 
    
         
            +
              s.date = "2016-06-20"
         
     | 
| 
       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 = [
         
     | 
| 
         @@ -31,10 +31,13 @@ Gem::Specification.new do |s| 
     | 
|
| 
       31 
31 
     | 
    
         
             
                "lib/adapter.rb",
         
     | 
| 
       32 
32 
     | 
    
         
             
                "lib/btc_adapter.rb",
         
     | 
| 
       33 
33 
     | 
    
         
             
                "lib/btc_adapters/average_rate_adapter.rb",
         
     | 
| 
      
 34 
     | 
    
         
            +
                "lib/btc_adapters/bitfinex_adapter.rb",
         
     | 
| 
       34 
35 
     | 
    
         
             
                "lib/btc_adapters/bitpay_adapter.rb",
         
     | 
| 
       35 
36 
     | 
    
         
             
                "lib/btc_adapters/bitstamp_adapter.rb",
         
     | 
| 
      
 37 
     | 
    
         
            +
                "lib/btc_adapters/btcchina_adapter.rb",
         
     | 
| 
       36 
38 
     | 
    
         
             
                "lib/btc_adapters/btce_adapter.rb",
         
     | 
| 
       37 
39 
     | 
    
         
             
                "lib/btc_adapters/coinbase_adapter.rb",
         
     | 
| 
      
 40 
     | 
    
         
            +
                "lib/btc_adapters/huobi_adapter.rb",
         
     | 
| 
       38 
41 
     | 
    
         
             
                "lib/btc_adapters/kraken_adapter.rb",
         
     | 
| 
       39 
42 
     | 
    
         
             
                "lib/btc_adapters/localbitcoins_adapter.rb",
         
     | 
| 
       40 
43 
     | 
    
         
             
                "lib/btc_adapters/okcoin_adapter.rb",
         
     | 
| 
         @@ -46,12 +49,28 @@ Gem::Specification.new do |s| 
     | 
|
| 
       46 
49 
     | 
    
         
             
                "lib/fiat_adapters/yahoo_adapter.rb",
         
     | 
| 
       47 
50 
     | 
    
         
             
                "lib/storage.rb",
         
     | 
| 
       48 
51 
     | 
    
         
             
                "spec/currency_rate_spec.rb",
         
     | 
| 
      
 52 
     | 
    
         
            +
                "spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/average_rate_adapter.yml",
         
     | 
| 
      
 53 
     | 
    
         
            +
                "spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/bitfinex_adapter.yml",
         
     | 
| 
      
 54 
     | 
    
         
            +
                "spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/bitpay_adapter_yml.yml",
         
     | 
| 
      
 55 
     | 
    
         
            +
                "spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/bitstamp_adapter.yml",
         
     | 
| 
      
 56 
     | 
    
         
            +
                "spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/btcchina_adapter.yml",
         
     | 
| 
      
 57 
     | 
    
         
            +
                "spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/btce_adapter.yml",
         
     | 
| 
      
 58 
     | 
    
         
            +
                "spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/coinbase_adapter.yml",
         
     | 
| 
      
 59 
     | 
    
         
            +
                "spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/huobi_adapter.yml",
         
     | 
| 
      
 60 
     | 
    
         
            +
                "spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/kraken_adapter.yml",
         
     | 
| 
      
 61 
     | 
    
         
            +
                "spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/localbitcoins_adapter.yml",
         
     | 
| 
      
 62 
     | 
    
         
            +
                "spec/fixtures/vcr/exchange_rate_adapters/btc_adapters/okcoin_adapter.yml",
         
     | 
| 
      
 63 
     | 
    
         
            +
                "spec/fixtures/vcr/exchange_rate_adapters/fiat_adapters/fixer_adapter.yml",
         
     | 
| 
      
 64 
     | 
    
         
            +
                "spec/fixtures/vcr/exchange_rate_adapters/fiat_adapters/yahoo_adapter.yml",
         
     | 
| 
       49 
65 
     | 
    
         
             
                "spec/lib/btc_adapter_spec.rb",
         
     | 
| 
       50 
66 
     | 
    
         
             
                "spec/lib/btc_adapters/average_rate_adapter_spec.rb",
         
     | 
| 
      
 67 
     | 
    
         
            +
                "spec/lib/btc_adapters/bitfinex_adapter_spec.rb",
         
     | 
| 
       51 
68 
     | 
    
         
             
                "spec/lib/btc_adapters/bitpay_adapter_spec.rb",
         
     | 
| 
       52 
69 
     | 
    
         
             
                "spec/lib/btc_adapters/bitstamp_adapter_spec.rb",
         
     | 
| 
      
 70 
     | 
    
         
            +
                "spec/lib/btc_adapters/btcchina_adapter_spec.rb",
         
     | 
| 
       53 
71 
     | 
    
         
             
                "spec/lib/btc_adapters/btce_adapter_spec.rb",
         
     | 
| 
       54 
72 
     | 
    
         
             
                "spec/lib/btc_adapters/coinbase_adapter_spec.rb",
         
     | 
| 
      
 73 
     | 
    
         
            +
                "spec/lib/btc_adapters/huobi_adapter_spec.rb",
         
     | 
| 
       55 
74 
     | 
    
         
             
                "spec/lib/btc_adapters/kraken_adapter_spec.rb",
         
     | 
| 
       56 
75 
     | 
    
         
             
                "spec/lib/btc_adapters/localbitcoins_adapter_spec.rb",
         
     | 
| 
       57 
76 
     | 
    
         
             
                "spec/lib/btc_adapters/okcoin_adapter_spec.rb",
         
     | 
    
        data/lib/adapter.rb
    CHANGED
    
    | 
         @@ -2,8 +2,8 @@ module CurrencyRate 
     | 
|
| 
       2 
2 
     | 
    
         
             
              class Adapter
         
     | 
| 
       3 
3 
     | 
    
         
             
                include Singleton
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
     | 
    
         
            -
                class FetchingFailed 
     | 
| 
       6 
     | 
    
         
            -
                class CurrencyNotSupported 
     | 
| 
      
 5 
     | 
    
         
            +
                class FetchingFailed          < Exception; end
         
     | 
| 
      
 6 
     | 
    
         
            +
                class CurrencyNotSupported    < Exception; end
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
       8 
8 
     | 
    
         
             
                def initialize
         
     | 
| 
       9 
9 
     | 
    
         
             
                  @storage = Storage.new
         
     | 
| 
         @@ -11,26 +11,34 @@ module CurrencyRate 
     | 
|
| 
       11 
11 
     | 
    
         | 
| 
       12 
12 
     | 
    
         
             
                def fetch_rates!
         
     | 
| 
       13 
13 
     | 
    
         
             
                  raise "FETCH_URL is not defined!" unless self.class::FETCH_URL
         
     | 
| 
       14 
     | 
    
         
            -
                  uri = URI.parse(self.class::FETCH_URL)
         
     | 
| 
       15 
14 
     | 
    
         
             
                  begin
         
     | 
| 
       16 
     | 
    
         
            -
                     
     | 
| 
      
 15 
     | 
    
         
            +
                    if self.class::FETCH_URL.kind_of?(Hash)
         
     | 
| 
      
 16 
     | 
    
         
            +
                      @rates = {}
         
     | 
| 
      
 17 
     | 
    
         
            +
                      self.class::FETCH_URL.each do |name, url|
         
     | 
| 
      
 18 
     | 
    
         
            +
                        uri = URI.parse(url)
         
     | 
| 
      
 19 
     | 
    
         
            +
                        @rates[name] = JSON.parse(uri.read(read_timeout: 4))
         
     | 
| 
      
 20 
     | 
    
         
            +
                      end
         
     | 
| 
      
 21 
     | 
    
         
            +
                    else
         
     | 
| 
      
 22 
     | 
    
         
            +
                      uri = URI.parse(self.class::FETCH_URL)
         
     | 
| 
      
 23 
     | 
    
         
            +
                      @rates = JSON.parse(uri.read(read_timeout: 4))
         
     | 
| 
      
 24 
     | 
    
         
            +
                    end
         
     | 
| 
       17 
25 
     | 
    
         
             
                    @rates_updated_at = Time.now
         
     | 
| 
       18 
26 
     | 
    
         
             
                  rescue OpenURI::HTTPError => e
         
     | 
| 
       19 
27 
     | 
    
         
             
                    raise FetchingFailed
         
     | 
| 
       20 
28 
     | 
    
         
             
                  end
         
     | 
| 
       21 
29 
     | 
    
         
             
                end
         
     | 
| 
       22 
30 
     | 
    
         | 
| 
       23 
     | 
    
         
            -
                def rate_for( 
     | 
| 
      
 31 
     | 
    
         
            +
                def rate_for(from,to)
         
     | 
| 
       24 
32 
     | 
    
         
             
                  @storage.fetch(self.class.to_s) do
         
     | 
| 
       25 
33 
     | 
    
         
             
                    self.fetch_rates!
         
     | 
| 
       26 
34 
     | 
    
         
             
                  end
         
     | 
| 
       27 
35 
     | 
    
         
             
                  nil # this should be changed in descendant classes
         
     | 
| 
       28 
36 
     | 
    
         
             
                end
         
     | 
| 
       29 
37 
     | 
    
         | 
| 
       30 
     | 
    
         
            -
                #  
     | 
| 
       31 
     | 
    
         
            -
                #  
     | 
| 
       32 
     | 
    
         
            -
                def  
     | 
| 
       33 
     | 
    
         
            -
                   
     | 
| 
      
 38 
     | 
    
         
            +
                # Must be implemented inside every descendant class
         
     | 
| 
      
 39 
     | 
    
         
            +
                # because storage format may be completely different
         
     | 
| 
      
 40 
     | 
    
         
            +
                def get_rate_value_from_source(rates_hash, *keys)
         
     | 
| 
      
 41 
     | 
    
         
            +
                  raise "Please implement this method in your Adapter"
         
     | 
| 
       34 
42 
     | 
    
         
             
                end
         
     | 
| 
       35 
43 
     | 
    
         | 
| 
       36 
44 
     | 
    
         
             
                # We dont want to have false positive rate, because nil.to_f is 0.0
         
     | 
    
        data/lib/btc_adapter.rb
    CHANGED
    
    | 
         @@ -2,14 +2,12 @@ module CurrencyRate 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
              class BtcAdapter < Adapter
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
     | 
    
         
            -
                def  
     | 
| 
       6 
     | 
    
         
            -
                   
     | 
| 
       7 
     | 
    
         
            -
                  Satoshi.new(btc_amount, from_unit: :btc, to_unit: btc_denomination).to_unit
         
     | 
| 
      
 5 
     | 
    
         
            +
                def rate_for(from,to)
         
     | 
| 
      
 6 
     | 
    
         
            +
                  super
         
     | 
| 
       8 
7 
     | 
    
         
             
                end
         
     | 
| 
       9 
8 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
                def  
     | 
| 
       11 
     | 
    
         
            -
                   
     | 
| 
       12 
     | 
    
         
            -
                  amount_in_btc*rate_for(currency)
         
     | 
| 
      
 9 
     | 
    
         
            +
                def invert_rate(from,to,rate)
         
     | 
| 
      
 10 
     | 
    
         
            +
                  to == 'BTC' ? 1/rate.to_f : rate
         
     | 
| 
       13 
11 
     | 
    
         
             
                end
         
     | 
| 
       14 
12 
     | 
    
         | 
| 
       15 
13 
     | 
    
         
             
              end
         
     | 
| 
         @@ -20,11 +20,11 @@ module CurrencyRate 
     | 
|
| 
       20 
20 
     | 
    
         
             
                  end
         
     | 
| 
       21 
21 
     | 
    
         
             
                end
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
     | 
    
         
            -
                def rate_for( 
     | 
| 
      
 23 
     | 
    
         
            +
                def rate_for(from, to)
         
     | 
| 
       24 
24 
     | 
    
         
             
                  rates = []
         
     | 
| 
       25 
25 
     | 
    
         
             
                  @adapters.each do |adapter|
         
     | 
| 
       26 
26 
     | 
    
         
             
                    begin
         
     | 
| 
       27 
     | 
    
         
            -
                      rates << adapter.rate_for( 
     | 
| 
      
 27 
     | 
    
         
            +
                      rates << adapter.rate_for(from,to)
         
     | 
| 
       28 
28 
     | 
    
         
             
                    rescue CurrencyNotSupported
         
     | 
| 
       29 
29 
     | 
    
         
             
                      rates << nil
         
     | 
| 
       30 
30 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -32,7 +32,8 @@ module CurrencyRate 
     | 
|
| 
       32 
32 
     | 
    
         | 
| 
       33 
33 
     | 
    
         
             
                  unless rates.select(&:nil?).size == @adapters.size
         
     | 
| 
       34 
34 
     | 
    
         
             
                    rates.compact!
         
     | 
| 
       35 
     | 
    
         
            -
                    rates.inject {|sum, rate| sum + rate} / rates.size
         
     | 
| 
      
 35 
     | 
    
         
            +
                    rate = rates.inject {|sum, rate| sum + rate} / rates.size
         
     | 
| 
      
 36 
     | 
    
         
            +
                    invert_rate(from,to, rate)
         
     | 
| 
       36 
37 
     | 
    
         
             
                  else
         
     | 
| 
       37 
38 
     | 
    
         
             
                    raise CurrencyNotSupported
         
     | 
| 
       38 
39 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -0,0 +1,30 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module CurrencyRate
         
     | 
| 
      
 2 
     | 
    
         
            +
              class BitfinexAdapter < BtcAdapter
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
                FETCH_URL = {
         
     | 
| 
      
 5 
     | 
    
         
            +
                  'btc_usd' => 'https://api.bitfinex.com/v1/pubticker/btcusd',
         
     | 
| 
      
 6 
     | 
    
         
            +
                  'ltc_usd' => 'https://api.bitfinex.com/v1/pubticker/ltcusd'
         
     | 
| 
      
 7 
     | 
    
         
            +
                }
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                def rate_for(from,to)
         
     | 
| 
      
 10 
     | 
    
         
            +
                  super
         
     | 
| 
      
 11 
     | 
    
         
            +
                  rate = rate_to_f(currency_pair_rate(to,from))
         
     | 
| 
      
 12 
     | 
    
         
            +
                  invert_rate(from,to,rate)
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                def currency_pair_rate(currency1, currency2)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  rate = @rates["#{currency1.downcase}_#{currency2.downcase}"] || @rates["#{currency2.downcase}_#{currency1.downcase}"]
         
     | 
| 
      
 17 
     | 
    
         
            +
                  raise CurrencyNotSupported unless rate
         
     | 
| 
      
 18 
     | 
    
         
            +
                  rate['last_price']
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                def invert_rate(from,to,rate)
         
     | 
| 
      
 22 
     | 
    
         
            +
                  if ['BTC', 'LTC'].include?(to)
         
     | 
| 
      
 23 
     | 
    
         
            +
                    1/rate.to_f
         
     | 
| 
      
 24 
     | 
    
         
            +
                  else
         
     | 
| 
      
 25 
     | 
    
         
            +
                    rate
         
     | 
| 
      
 26 
     | 
    
         
            +
                  end
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
              end
         
     | 
| 
      
 30 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -3,16 +3,23 @@ module CurrencyRate 
     | 
|
| 
       3 
3 
     | 
    
         | 
| 
       4 
4 
     | 
    
         
             
                FETCH_URL = 'https://bitpay.com/api/rates'
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
                def rate_for( 
     | 
| 
      
 6 
     | 
    
         
            +
                def rate_for(from,to)
         
     | 
| 
       7 
7 
     | 
    
         
             
                  super
         
     | 
| 
      
 8 
     | 
    
         
            +
                  rate = nil
         
     | 
| 
       8 
9 
     | 
    
         
             
                  @rates.each do |rt|
         
     | 
| 
       9 
     | 
    
         
            -
                    if rt['code'] ==  
     | 
| 
       10 
     | 
    
         
            -
                      rate =  
     | 
| 
      
 10 
     | 
    
         
            +
                    if rt['code'] == to
         
     | 
| 
      
 11 
     | 
    
         
            +
                      rate = invert_rate(from,to, currency_pair_rate(to,from,rt))
         
     | 
| 
       11 
12 
     | 
    
         
             
                      return rate_to_f(rate)
         
     | 
| 
       12 
13 
     | 
    
         
             
                    end
         
     | 
| 
       13 
14 
     | 
    
         
             
                  end
         
     | 
| 
       14 
15 
     | 
    
         
             
                  raise CurrencyNotSupported
         
     | 
| 
       15 
16 
     | 
    
         
             
                end
         
     | 
| 
       16 
17 
     | 
    
         | 
| 
      
 18 
     | 
    
         
            +
                def currency_pair_rate(currency1, currency2, rt)
         
     | 
| 
      
 19 
     | 
    
         
            +
                  rate = rt['rate'] if [currency1, currency2].include?(rt['code'])
         
     | 
| 
      
 20 
     | 
    
         
            +
                  raise CurrencyNotSupported if !rate || !([currency1, currency2].include?('BTC'))
         
     | 
| 
      
 21 
     | 
    
         
            +
                  rate
         
     | 
| 
      
 22 
     | 
    
         
            +
                end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
       17 
24 
     | 
    
         
             
              end
         
     | 
| 
       18 
25 
     | 
    
         
             
            end
         
     | 
| 
         @@ -1,13 +1,32 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module CurrencyRate
         
     | 
| 
       2 
2 
     | 
    
         
             
              class BitstampAdapter < BtcAdapter
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
     | 
    
         
            -
                FETCH_URL =  
     | 
| 
      
 4 
     | 
    
         
            +
                FETCH_URL = {
         
     | 
| 
      
 5 
     | 
    
         
            +
                  'btc_usd' => 'https://www.bitstamp.net/api/v2/ticker/btcusd/',
         
     | 
| 
      
 6 
     | 
    
         
            +
                  'btc_eur' => 'https://www.bitstamp.net/api/v2/ticker/btceur/',
         
     | 
| 
      
 7 
     | 
    
         
            +
                  'eur_usd' => 'https://www.bitstamp.net/api/v2/ticker/eurusd/'
         
     | 
| 
      
 8 
     | 
    
         
            +
                }
         
     | 
| 
       5 
9 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
                def rate_for( 
     | 
| 
      
 10 
     | 
    
         
            +
                def rate_for(from,to)
         
     | 
| 
      
 11 
     | 
    
         
            +
                  raise CurrencyNotSupported unless ["BTC", "USD", "EUR"].include?(to) && ["BTC", "USD", "EUR"].include?(from)
         
     | 
| 
       7 
12 
     | 
    
         
             
                  super
         
     | 
| 
       8 
     | 
    
         
            -
                   
     | 
| 
       9 
     | 
    
         
            -
                   
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
      
 13 
     | 
    
         
            +
                  rate = rate_to_f(currency_pair_rate(to,from))
         
     | 
| 
      
 14 
     | 
    
         
            +
                  invert_rate(from,to,rate)
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                # Because Bitstamp has USD/EUR pair
         
     | 
| 
      
 18 
     | 
    
         
            +
                def invert_rate(from,to,rate)
         
     | 
| 
      
 19 
     | 
    
         
            +
                  if to == 'BTC' || (from == 'USD' && to == 'EUR')
         
     | 
| 
      
 20 
     | 
    
         
            +
                    1/rate.to_f
         
     | 
| 
      
 21 
     | 
    
         
            +
                  else
         
     | 
| 
      
 22 
     | 
    
         
            +
                    rate
         
     | 
| 
      
 23 
     | 
    
         
            +
                  end
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                def currency_pair_rate(currency1, currency2)
         
     | 
| 
      
 27 
     | 
    
         
            +
                  rate = @rates["#{currency1.downcase}_#{currency2.downcase}"] || @rates["#{currency2.downcase}_#{currency1.downcase}"]
         
     | 
| 
      
 28 
     | 
    
         
            +
                  raise CurrencyNotSupported unless rate
         
     | 
| 
      
 29 
     | 
    
         
            +
                  rate['last']
         
     | 
| 
       11 
30 
     | 
    
         
             
                end
         
     | 
| 
       12 
31 
     | 
    
         | 
| 
       13 
32 
     | 
    
         
             
              end
         
     | 
| 
         @@ -1,13 +1,34 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module CurrencyRate
         
     | 
| 
       2 
2 
     | 
    
         
             
              class BtceAdapter < BtcAdapter
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
     | 
    
         
            -
                FETCH_URL =  
     | 
| 
      
 4 
     | 
    
         
            +
                FETCH_URL = {
         
     | 
| 
      
 5 
     | 
    
         
            +
                  'btc_usd' => 'https://btc-e.com/api/2/btc_usd/ticker',
         
     | 
| 
      
 6 
     | 
    
         
            +
                  'btc_eur' => 'https://btc-e.com/api/2/btc_eur/ticker',
         
     | 
| 
      
 7 
     | 
    
         
            +
                  'btc_rub' => 'https://btc-e.com/api/2/btc_rur/ticker',
         
     | 
| 
      
 8 
     | 
    
         
            +
                  'usd_rub' => 'https://btc-e.com/api/2/usd_rur/ticker',
         
     | 
| 
      
 9 
     | 
    
         
            +
                  'eur_rub' => 'https://btc-e.com/api/2/eur_rur/ticker'
         
     | 
| 
      
 10 
     | 
    
         
            +
                }
         
     | 
| 
       5 
11 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                def rate_for(from,to)
         
     | 
| 
      
 14 
     | 
    
         
            +
                  raise CurrencyNotSupported unless ["BTC", "USD", "EUR", "RUB"].include?(to) && ["BTC", "USD", "EUR", "RUB"].include?(from)
         
     | 
| 
       7 
15 
     | 
    
         
             
                  super
         
     | 
| 
       8 
     | 
    
         
            -
                   
     | 
| 
       9 
     | 
    
         
            -
                   
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
      
 16 
     | 
    
         
            +
                  rate = rate_to_f(currency_pair_rate(to,from))
         
     | 
| 
      
 17 
     | 
    
         
            +
                  invert_rate(from,to,rate)
         
     | 
| 
      
 18 
     | 
    
         
            +
                end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                def currency_pair_rate(currency1, currency2)
         
     | 
| 
      
 21 
     | 
    
         
            +
                  rate = @rates["#{currency1.downcase}_#{currency2.downcase}"] || @rates["#{currency2.downcase}_#{currency1.downcase}"]
         
     | 
| 
      
 22 
     | 
    
         
            +
                  raise CurrencyNotSupported unless rate
         
     | 
| 
      
 23 
     | 
    
         
            +
                  rate['ticker']['last']
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                def invert_rate(from,to,rate)
         
     | 
| 
      
 27 
     | 
    
         
            +
                  if to == 'BTC' || (from == 'RUB' && to == 'USD') || (from == 'RUB' && to == 'EUR')
         
     | 
| 
      
 28 
     | 
    
         
            +
                    1/rate.to_f
         
     | 
| 
      
 29 
     | 
    
         
            +
                  else
         
     | 
| 
      
 30 
     | 
    
         
            +
                    rate
         
     | 
| 
      
 31 
     | 
    
         
            +
                  end
         
     | 
| 
       11 
32 
     | 
    
         
             
                end
         
     | 
| 
       12 
33 
     | 
    
         | 
| 
       13 
34 
     | 
    
         
             
              end
         
     | 
| 
         @@ -3,9 +3,9 @@ module CurrencyRate 
     | 
|
| 
       3 
3 
     | 
    
         | 
| 
       4 
4 
     | 
    
         
             
                FETCH_URL = 'https://coinbase.com/api/v1/currencies/exchange_rates'
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
                def rate_for( 
     | 
| 
      
 6 
     | 
    
         
            +
                def rate_for(from,to)
         
     | 
| 
       7 
7 
     | 
    
         
             
                  super
         
     | 
| 
       8 
     | 
    
         
            -
                  rate =  
     | 
| 
      
 8 
     | 
    
         
            +
                  rate = @rates["#{from.downcase}_to_#{to.downcase}"]
         
     | 
| 
       9 
9 
     | 
    
         
             
                  rate_to_f(rate)
         
     | 
| 
       10 
10 
     | 
    
         
             
                end
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
         @@ -0,0 +1,30 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module CurrencyRate
         
     | 
| 
      
 2 
     | 
    
         
            +
              class HuobiAdapter < BtcAdapter
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
                FETCH_URL = {
         
     | 
| 
      
 5 
     | 
    
         
            +
                  'btc_cny' => 'http://api.huobi.com/staticmarket/ticker_btc_json.js',
         
     | 
| 
      
 6 
     | 
    
         
            +
                  'ltc_cny' => 'http://api.huobi.com/staticmarket/ticker_ltc_json.js'
         
     | 
| 
      
 7 
     | 
    
         
            +
                }
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                def rate_for(from,to)
         
     | 
| 
      
 10 
     | 
    
         
            +
                  super
         
     | 
| 
      
 11 
     | 
    
         
            +
                  rate = rate_to_f(currency_pair_rate(to,from))
         
     | 
| 
      
 12 
     | 
    
         
            +
                  invert_rate(from,to,rate)
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                def currency_pair_rate(currency1, currency2)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  rate = @rates["#{currency1.downcase}_#{currency2.downcase}"] || @rates["#{currency2.downcase}_#{currency1.downcase}"]
         
     | 
| 
      
 17 
     | 
    
         
            +
                  raise CurrencyNotSupported unless rate
         
     | 
| 
      
 18 
     | 
    
         
            +
                  rate["ticker"]['last']
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                def invert_rate(from,to,rate)
         
     | 
| 
      
 22 
     | 
    
         
            +
                  if ['BTC', 'LTC'].include?(to)
         
     | 
| 
      
 23 
     | 
    
         
            +
                    1/rate.to_f
         
     | 
| 
      
 24 
     | 
    
         
            +
                  else
         
     | 
| 
      
 25 
     | 
    
         
            +
                    rate
         
     | 
| 
      
 26 
     | 
    
         
            +
                  end
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
              end
         
     | 
| 
      
 30 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -1,13 +1,22 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module CurrencyRate
         
     | 
| 
       2 
2 
     | 
    
         
             
              class KrakenAdapter < BtcAdapter
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
     | 
    
         
            -
                FETCH_URL =  
     | 
| 
      
 4 
     | 
    
         
            +
                FETCH_URL = {
         
     | 
| 
      
 5 
     | 
    
         
            +
                  "usd_btc" => 'https://api.kraken.com/0/public/Ticker?pair=xbtusd',
         
     | 
| 
      
 6 
     | 
    
         
            +
                  "eur_btc" => 'https://api.kraken.com/0/public/Ticker?pair=xbteur'
         
     | 
| 
      
 7 
     | 
    
         
            +
                }
         
     | 
| 
       5 
8 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
                def rate_for( 
     | 
| 
      
 9 
     | 
    
         
            +
                def rate_for(to,from)
         
     | 
| 
       7 
10 
     | 
    
         
             
                  super
         
     | 
| 
       8 
     | 
    
         
            -
                  rate =  
     | 
| 
       9 
     | 
    
         
            -
                   
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
      
 11 
     | 
    
         
            +
                  rate = rate_to_f(currency_pair_rate(to,from))
         
     | 
| 
      
 12 
     | 
    
         
            +
                  invert_rate(to,from,rate)
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                def currency_pair_rate(currency1, currency2)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  rate = @rates["#{currency1.downcase}_#{currency2.downcase}"] || @rates["#{currency2.downcase}_#{currency1.downcase}"]
         
     | 
| 
      
 17 
     | 
    
         
            +
                  raise CurrencyNotSupported unless rate || [currency1, currency2].include?("BTC")
         
     | 
| 
      
 18 
     | 
    
         
            +
                  currency = currency1 == "BTC" ? currency2 : currency1
         
     | 
| 
      
 19 
     | 
    
         
            +
                  rate['result']["XXBTZ#{currency}"]['c'].first
         
     | 
| 
       11 
20 
     | 
    
         
             
                end
         
     | 
| 
       12 
21 
     | 
    
         | 
| 
       13 
22 
     | 
    
         
             
              end
         
     | 
| 
         @@ -3,10 +3,17 @@ module CurrencyRate 
     | 
|
| 
       3 
3 
     | 
    
         | 
| 
       4 
4 
     | 
    
         
             
                FETCH_URL = 'https://localbitcoins.com/bitcoinaverage/ticker-all-currencies/'
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
                def rate_for( 
     | 
| 
      
 6 
     | 
    
         
            +
                def rate_for(from,to)
         
     | 
| 
       7 
7 
     | 
    
         
             
                  super
         
     | 
| 
       8 
     | 
    
         
            -
                  rate =  
     | 
| 
       9 
     | 
    
         
            -
                  rate_to_f(rate)
         
     | 
| 
      
 8 
     | 
    
         
            +
                  rate = currency_pair_rate(to,from)
         
     | 
| 
      
 9 
     | 
    
         
            +
                  rate = rate_to_f(rate)
         
     | 
| 
      
 10 
     | 
    
         
            +
                  invert_rate(from,to,rate)
         
     | 
| 
      
 11 
     | 
    
         
            +
                end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                def currency_pair_rate(currency1, currency2)
         
     | 
| 
      
 14 
     | 
    
         
            +
                  rate = @rates[currency1] || @rates[currency2]
         
     | 
| 
      
 15 
     | 
    
         
            +
                  raise CurrencyNotSupported if !rate || !([currency1, currency2].include?('BTC'))
         
     | 
| 
      
 16 
     | 
    
         
            +
                  rate['rates']['last']
         
     | 
| 
       10 
17 
     | 
    
         
             
                end
         
     | 
| 
       11 
18 
     | 
    
         | 
| 
       12 
19 
     | 
    
         
             
              end
         
     |