class Money::Bank::GoogleCurrency

Constants

SERVICE_HOST
SERVICE_PATH

Attributes

rates_expiration[R]

@return [Time] Returns the time when the rates expire.

ttl_in_seconds[R]

@return [Integer] Returns the Time To Live (TTL) in seconds.

rates[R]

@return [Hash] Stores the currently known rates.

Public Class Methods

new(*) click to toggle source
Calls superclass method
# File lib/money/bank/google_currency.rb, line 52
def initialize(*)
  super
  @store.extend Money::RatesStore::RateRemovalSupport
end
refresh_rates_expiration!() click to toggle source

Set the rates expiration TTL seconds from the current time.

@return [Time] The next expiration.

# File lib/money/bank/google_currency.rb, line 47
def refresh_rates_expiration!
  @rates_expiration = Time.now + ttl_in_seconds
end
ttl_in_seconds=(value) click to toggle source

Set the Time To Live (TTL) in seconds.

@param [Integer] the seconds between an expiration and another.

# File lib/money/bank/google_currency.rb, line 38
def ttl_in_seconds=(value)
  @ttl_in_seconds = value
  refresh_rates_expiration! if ttl_in_seconds
end

Public Instance Methods

expire_rates() click to toggle source

Flushes all the rates if they are expired.

@return [Boolean]

# File lib/money/bank/google_currency.rb, line 110
def expire_rates
  if self.class.ttl_in_seconds && self.class.rates_expiration <= Time.now
    flush_rates
    self.class.refresh_rates_expiration!
    true
  else
    false
  end
end
flush_rate(from, to) click to toggle source

Clears the specified rate stored in @rates.

@param [String, Symbol, Currency] from Currency to convert from (used

for key into @rates).

@param [String, Symbol, Currency] to Currency to convert to (used for

key into @rates).

@return [Float] The flushed rate.

@example

@bank = GoogleCurrency.new    #=> <Money::Bank::GoogleCurrency...>
@bank.get_rate(:USD, :EUR)    #=> 0.776337241
@bank.flush_rate(:USD, :EUR)  #=> 0.776337241
# File lib/money/bank/google_currency.rb, line 84
def flush_rate(from, to)
  store.remove_rate(from, to)
end
flush_rates() click to toggle source

Clears all rates stored in @rates

@return [Hash] The empty @rates Hash.

@example

@bank = GoogleCurrency.new  #=> <Money::Bank::GoogleCurrency...>
@bank.get_rate(:USD, :EUR)  #=> 0.776337241
@bank.flush_rates           #=> {}
# File lib/money/bank/google_currency.rb, line 66
def flush_rates
  store.clear_rates
end
get_rate(from, to) click to toggle source

Returns the requested rate.

It also flushes all the rates when and if they are expired.

@param [String, Symbol, Currency] from Currency to convert from @param [String, Symbol, Currency] to Currency to convert to

@return [Float] The requested rate.

@example

@bank = GoogleCurrency.new  #=> <Money::Bank::GoogleCurrency...>
@bank.get_rate(:USD, :EUR)  #=> 0.776337241
# File lib/money/bank/google_currency.rb, line 101
def get_rate(from, to)
  expire_rates
  store.get_rate(from, to) || store.add_rate(from, to, fetch_rate(from, to))
end

Private Instance Methods

build_uri(from, to) click to toggle source

Build a URI for the given arguments.

@param [Currency] from The currency to convert from. @param [Currency] to The currency to convert to.

@return [URI::HTTP]

# File lib/money/bank/google_currency.rb, line 151
def build_uri(from, to)
  uri = URI::HTTP.build(
    :host  => SERVICE_HOST,
    :path  => SERVICE_PATH,
    :query => "a=1&from=#{from.iso_code}&to=#{to.iso_code}"
  )
end
extract_rate(data) click to toggle source

Takes the response from Google and extract the rate.

@param [String] data The google rate string to decode.

@return [BigDecimal]

# File lib/money/bank/google_currency.rb, line 165
def extract_rate(data)
  case data
  when /<span class=bld>(\d+\.?\d*) [A-Z]{3}<\/span>/
    BigDecimal($1)
  when /Could not convert\./
    raise UnknownRate
  when /captcha-form/
    raise GoogleCurrencyCaptchaError
  else
    raise GoogleCurrencyFetchError
  end
end
fetch_rate(from, to) click to toggle source

Queries for the requested rate and returns it.

@param [String, Symbol, Currency] from Currency to convert from @param [String, Symbol, Currency] to Currency to convert to

@return [BigDecimal] The requested rate.

# File lib/money/bank/google_currency.rb, line 129
def fetch_rate(from, to)

  from, to = Currency.wrap(from), Currency.wrap(to)

  data = build_uri(from, to).read
  rate = extract_rate(data);

  if (rate < 0.1)
    rate = 1/extract_rate(build_uri(to, from).read)
  end

  rate

end