class Money::Bank::GoogleCurrency
Constants
- SERVICE_HOST
- SERVICE_PATH
Attributes
@return [Time] Returns the time when the rates expire.
@return [Integer] Returns the Time To Live (TTL) in seconds.
@return [Hash] Stores the currently known rates.
Public Class Methods
# File lib/money/bank/google_currency.rb, line 52 def initialize(*) super @store.extend Money::RatesStore::RateRemovalSupport end
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
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
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
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
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
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 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
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
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