Class: OpenExchangeRates::Rates

Inherits:
Object
  • Object
show all
Defined in:
lib/open_exchange_rates/rates.rb

Defined Under Namespace

Classes: MissingAppIdError, RateNotFoundError

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Rates

Returns a new instance of Rates.

Raises:



23
24
25
26
27
28
29
30
31
# File 'lib/open_exchange_rates/rates.rb', line 23

def initialize(options = {})
  if options.kind_of? Hash
    @app_id = options[:app_id] || OpenExchangeRates.configuration.app_id
  else
    warn "[DEPRECATION] `OpenExchangeRates::Rates.new('myappid')` is deprecated.  Please use `OpenExchangeRates::Rates.new(:app_id => 'myappid')` instead."
    @app_id = options
  end
  raise MissingAppIdError unless @app_id
end

Instance Attribute Details

#app_idObject (readonly)

Returns the value of attribute app_id.



21
22
23
# File 'lib/open_exchange_rates/rates.rb', line 21

def app_id
  @app_id
end

Instance Method Details

#convert(amount, options = {}) ⇒ Object



59
60
61
# File 'lib/open_exchange_rates/rates.rb', line 59

def convert(amount, options = {})
  round(amount*exchange_rate(options))
end

#date_string_from(date_representation) ⇒ Object



74
75
76
77
78
79
80
81
82
# File 'lib/open_exchange_rates/rates.rb', line 74

def date_string_from(date_representation)
  if date_representation.kind_of? Date
    date_representation.to_s
  elsif date_representation.kind_of? String
    valid_yyyy_mm_dd date_representation
  else
    raise ArgumentError, "'on' must be a Date or 'yyyy-mm-dd' string"
  end
end

#exchange_rate(options = {}) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/open_exchange_rates/rates.rb', line 33

def exchange_rate(options = {})
  from_curr = options[:from].to_s.upcase
  to_curr = options[:to].to_s.upcase

  response = options[:on] ? on(options[:on]) : latest
  rates = response.rates

  from_curr = response.base_currency if from_curr.empty?
  to_curr = response.base_currency if to_curr.empty?

  unless rates[from_curr] && rates[to_curr]
    raise RateNotFoundError.new(from_curr, to_curr)
  end

  if from_curr == to_curr
    rate = 1.0
  elsif from_curr == response.base_currency
    rate = rates[to_curr]
  elsif to_curr == response.base_currency
    rate = 1.0 / rates[from_curr]
  else
    rate = rates[to_curr] * (1.0 / rates[from_curr])
  end
  round(rate, 6)
end

#latest(reload = false) ⇒ Object



63
64
65
66
# File 'lib/open_exchange_rates/rates.rb', line 63

def latest(reload = false)
  @latest_response = reload ? parse_latest : (@latest_response ||= parse_latest)
  OpenExchangeRates::Response.new(@latest_response)
end

#on(date_representation) ⇒ Object



84
85
86
87
# File 'lib/open_exchange_rates/rates.rb', line 84

def on(date_representation)
  date_string = date_string_from(date_representation)
  OpenExchangeRates::Response.new(parse_on(date_string))
end

#parse_latestObject



93
94
95
96
# File 'lib/open_exchange_rates/rates.rb', line 93

def parse_latest
  json = URI.open("#{OpenExchangeRates::LATEST_URL}?app_id=#{@app_id}").read
  JSON.parse(json)
end

#parse_on(date_string) ⇒ Object



98
99
100
101
# File 'lib/open_exchange_rates/rates.rb', line 98

def parse_on(date_string)
  json = URI.open("#{OpenExchangeRates::BASE_URL}/historical/#{date_string}.json?app_id=#{@app_id}").read
  JSON.parse(json)
end

#round(amount, decimals = 2) ⇒ Object



89
90
91
# File 'lib/open_exchange_rates/rates.rb', line 89

def round(amount, decimals = 2)
  (amount * 10**decimals).round.to_f / 10**decimals
end

#valid_yyyy_mm_dd(date_string) ⇒ Object

Raises:

  • (ArgumentError)


68
69
70
71
72
# File 'lib/open_exchange_rates/rates.rb', line 68

def valid_yyyy_mm_dd(date_string)
  matches = date_string =~ /^([0-9]{4})(?:(1[0-2]|0[1-9])|-(1[0-2]|0[1-9])-)(3[0-1]|0[1-9]|[1-2][0-9])/
  raise ArgumentError, 'Not a valid date string (ie. yyyy-mm-dd)' unless matches
  date_string
end