Class: Money::RatesStore::Memory

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

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 =

Returns:

  • (string)
"_TO_"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

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

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

Parameters:

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

    Optional store options.

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

    Optional initial exchange rate data.

Options Hash (opts):

  • :without_mutex (Boolean)

    disables the usage of a mutex



24
25
26
27
28
# File 'lib/money/rates_store/memory.rb', line 24

def initialize(opts = {}, rates = {})
  @rates = rates
  @options = opts
  @guard = Monitor.new
end

Instance Attribute Details

#guardObject (readonly)

Returns the value of attribute guard.

Returns:

  • (Object)


103
104
105
# File 'lib/money/rates_store/memory.rb', line 103

def guard
  @guard
end

#optionsObject (readonly)

Returns the value of attribute options.

Returns:

  • (Object)


103
104
105
# File 'lib/money/rates_store/memory.rb', line 103

def options
  @options
end

#ratesObject (readonly)

Returns the value of attribute rates.

Returns:

  • (Object)


103
104
105
# File 'lib/money/rates_store/memory.rb', line 103

def rates
  @rates
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)


42
43
44
45
46
# File 'lib/money/rates_store/memory.rb', line 42

def add_rate(currency_iso_from, currency_iso_to, rate)
  guard.synchronize do
    rates[rate_key_for(currency_iso_from, currency_iso_to)] = rate
  end
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(&)
  return to_enum(:each_rate) unless block_given?

  guard.synchronize do
    rates.each do |key, rate|
      iso_from, iso_to = key.split(INDEX_KEY_SEPARATOR)
      yield iso_from, iso_to, rate
    end
  end
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)


61
62
63
64
65
# File 'lib/money/rates_store/memory.rb', line 61

def get_rate(currency_iso_from, currency_iso_to)
  guard.synchronize do
    rates[rate_key_for(currency_iso_from, currency_iso_to)]
  end
end

#marshal_dumpObject

Returns:

  • (Object)


67
68
69
70
71
# File 'lib/money/rates_store/memory.rb', line 67

def marshal_dump
  guard.synchronize do
    return [self.class, options, rates.dup]
  end
end

#rate_key_for(currency_iso_from, currency_iso_to) ⇒ String

Return the rate hashkey for the given currencies.

Examples:

rate_key_for("USD", "CAD") #=> "USD_TO_CAD"

Parameters:

  • currency_iso_from (String)

    The currency to exchange from.

  • currency_iso_to (String)

    The currency to exchange to.

Returns:

  • (String)


114
115
116
# 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

#transaction { ... } ⇒ Object

Wraps block execution in a thread-safe transaction

Yields:

Yield Returns:

  • (Object)

Returns:

  • (Object)


74
75
76
# File 'lib/money/rates_store/memory.rb', line 74

def transaction(&)
  guard.synchronize(&)
end