Class: Money::RatesStore::Memory

Inherits:
Object
  • Object
show all
Defined in:
lib/money/rates_store/memory.rb

Overview

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

Examples:

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}" }

Constant Summary collapse

INDEX_KEY_SEPARATOR =
'_TO_'.freeze

Instance Method Summary collapse

Constructor Details

#initialize(opts = {}, rt = {}) ⇒ Memory

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

Parameters:

  • opts (Hash) (defaults to: {})

    Optional store options.

  • rt (Hash) (defaults to: {})

    Optional initial exchange rate data.

Options Hash (opts):

  • :without_mutex (Boolean)

    disables the usage of a mutex


21
22
23
24
25
# File 'lib/money/rates_store/memory.rb', line 21

def initialize(opts = {}, rt = {})
  @options, @index = opts, rt
  @mutex = Mutex.new
  @in_transaction = false
end

Instance Method Details

#add_rate(currency_iso_from, currency_iso_to, rate) ⇒ Numeric

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

Examples:

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

Parameters:

  • currency_iso_from (String)

    Currency to exchange from.

  • currency_iso_to (String)

    Currency to exchange to.

  • rate (Numeric)

    Rate to use when exchanging currencies.

Returns:

  • (Numeric)

39
40
41
# 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 {|iso_from, iso_to, rate| ... } ⇒ Enumerator

Iterate over rate tuples (iso_from, iso_to, rate)

Examples:

store.each_rate do |iso_from, iso_to, rate|
  puts [iso_from, iso_to, rate].join
end

Yield Parameters:

  • iso_from (String)

    Currency ISO string.

  • iso_to (String)

    Currency ISO string.

  • rate (Numeric)

    Exchange rate.

Returns:

  • (Enumerator)

90
91
92
93
94
95
96
97
98
99
# 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) ⇒ Numeric

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

Examples:

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

store.get_rate("USD", "CAD") #=> 1.24515

Parameters:

  • currency_iso_from (String)

    Currency to exchange from.

  • currency_iso_to (String)

    Currency to exchange to.

Returns:

  • (Numeric)

56
57
58
# 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_dumpObject


60
61
62
# File 'lib/money/rates_store/memory.rb', line 60

def marshal_dump
  [self.class, options, index]
end

#transaction(&block) ⇒ Object

Wraps block execution in a thread-safe transaction


65
66
67
68
69
70
71
72
73
74
75
76
# 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