class Money::RatesStore::Memory

Class for thread-safe storage of exchange rate pairs. Used by instances of Money::Bank::VariableExchange.

@example

store = Money::RatesStore::Memory.new
store.add_rate 'USD', 'CAD', 0.98
store.get_rate 'USD', 'CAD' # => 0.98
# iterates rates
store.each_rate {|iso_from, iso_to, rate| puts "#{from} -> #{to}: #{rate}" }

Constants

INDEX_KEY_SEPARATOR

Attributes

index[R]
options[R]

Public Class Methods

new(opts = {}, rt = {}) click to toggle source

Initializes a new Money::RatesStore::Memory object.

@param [Hash] opts Optional store options. @option opts [Boolean] :without_mutex disables the usage of a mutex @param [Hash] rt Optional initial exchange rate data.

# File lib/money/rates_store/memory.rb, line 21
def initialize(opts = {}, rt = {})
  @options, @index = opts, rt
  @mutex = Mutex.new
  @in_transaction = false
end

Public Instance Methods

add_rate(currency_iso_from, currency_iso_to, rate) click to toggle source

Registers a conversion rate and returns it. Uses Mutex to synchronize data access.

@param [String] currency_iso_from Currency to exchange from. @param [String] currency_iso_to Currency to exchange to. @param [Numeric] rate Rate to use when exchanging currencies.

@return [Numeric]

@example

store = Money::RatesStore::Memory.new
store.add_rate("USD", "CAD", 1.24515)
store.add_rate("CAD", "USD", 0.803115)
# File lib/money/rates_store/memory.rb, line 39
def add_rate(currency_iso_from, currency_iso_to, rate)
  transaction { index[rate_key_for(currency_iso_from, currency_iso_to)] = rate }
end
each_rate(&block) click to toggle source

Iterate over rate tuples (iso_from, iso_to, rate)

@yieldparam iso_from [String] Currency ISO string. @yieldparam iso_to [String] Currency ISO string. @yieldparam rate [Numeric] Exchange rate.

@return [Enumerator]

@example

store.each_rate do |iso_from, iso_to, rate|
  puts [iso_from, iso_to, rate].join
end
# File lib/money/rates_store/memory.rb, line 90
def each_rate(&block)
  enum = Enumerator.new do |yielder|
    index.each do |key, rate|
      iso_from, iso_to = key.split(INDEX_KEY_SEPARATOR)
      yielder.yield iso_from, iso_to, rate                  
    end
  end

  block_given? ? enum.each(&block) : enum
end
get_rate(currency_iso_from, currency_iso_to) click to toggle source

Retrieve the rate for the given currencies. Uses Mutex to synchronize data access. Delegates to Money::RatesStore::Memory

@param [String] currency_iso_from Currency to exchange from. @param [String] currency_iso_to Currency to exchange to.

@return [Numeric]

@example

store = Money::RatesStore::Memory.new
store.add_rate("USD", "CAD", 1.24515)

store.get_rate("USD", "CAD") #=> 1.24515
# File lib/money/rates_store/memory.rb, line 56
def get_rate(currency_iso_from, currency_iso_to)
  transaction { index[rate_key_for(currency_iso_from, currency_iso_to)] }
end
marshal_dump() click to toggle source
# File lib/money/rates_store/memory.rb, line 60
def marshal_dump
  [self.class, options, index]
end
transaction(&block) click to toggle source

Wraps block execution in a thread-safe transaction

# File lib/money/rates_store/memory.rb, line 65
def transaction(&block)
  if @in_transaction || options[:without_mutex]
    block.call self
  else
    @mutex.synchronize do
      @in_transaction = true
      result = block.call
      @in_transaction = false
      result
    end
  end
end

Private Instance Methods

rate_key_for(currency_iso_from, currency_iso_to) click to toggle source

Return the rate hashkey for the given currencies.

@param [String] currency_iso_from The currency to exchange from. @param [String] currency_iso_to The currency to exchange to.

@return [String]

@example

rate_key_for("USD", "CAD") #=> "USD_TO_CAD"
# File lib/money/rates_store/memory.rb, line 114
def rate_key_for(currency_iso_from, currency_iso_to)
  [currency_iso_from, currency_iso_to].join(INDEX_KEY_SEPARATOR).upcase
end