Sha256: 98dd544995321bc861587d95a36a0331f455a926864fbd434b1ff5ef8485c02a

Contents?: true

Size: 1.39 KB

Versions: 3

Compression:

Stored size: 1.39 KB

Contents

module CurrencyRate
  class AverageRateAdapter < CryptoAdapter

    DEFAULT_CURRENCIES = ["USD", "BTC"]
    SUPPORTED_CRYPTO_CURRENCIES = ["BTC"]

    # Takes exchange rate adapters instances or classes as arguments
    def self.instance(*adapters)
      instance = super()
      instance.instance_variable_set(:@adapters, adapters.map { |adapter| adapter.respond_to?(:instance) ? adapter.instance : adapter })
      instance
    end

    def fetch_rates!
      failed_fetches = 0
      @adapters.each do |adapter|
        begin
          adapter.fetch_rates!
        rescue FetchingFailed => e
          failed_fetches += 1
          raise e if failed_fetches == @adapters.size
        end
      end
    end

    def rate_for(from, to)
      rates = []
      @adapters.each do |adapter|
        begin
          rates << adapter.rate_for(from,to)
        rescue CurrencyNotSupported
          rates << nil
        end
      end

      unless rates.select(&:nil?).size == @adapters.size
        rates.compact!
        rate = rates.inject {|sum, rate| sum + rate} / rates.size
        invert_rate(from,to, rate)
      else
        raise CurrencyNotSupported
      end
    end

    def get_rate_value_from_hash(rates_hash, *keys)
      raise "This method is not supposed to be used in #{self.class}."
    end

    def rate_to_f(rate)
      raise "This method is not supposed to be used in #{self.class}."
    end

  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
currency-rate-0.4.1 lib/crypto_adapters/average_rate_adapter.rb
currency-rate-0.4.0 lib/crypto_adapters/average_rate_adapter.rb
currency-rate-0.3.9 lib/crypto_adapters/average_rate_adapter.rb