lib/oxr.rb in oxr-0.5.0 vs lib/oxr.rb in oxr-0.6.0
- old
+ new
@@ -1,16 +1,70 @@
+# frozen_string_literal: true
+
require 'oxr/version'
require 'oxr/configuration'
require 'date'
require 'json'
require 'open-uri'
+##
+# All use of OXR takes place through module methods.
+#
+# Before you can make API calls, you must configure OXR with your Open Exchange
+# Rates App ID. Visit https://openexchangerates.org to sign up and generate one.
+#
+# OXR.configure do |config|
+# config.app_id = 'XXXX'
+# end
+#
+# Optionally you may also specify the base currency for the conversion rates.
+# The default base currency is USD.
+#
+# OXR.configure do |config|
+# config.app_id = 'XXXX'
+# config.base = 'JPY'
+# end
+#
+# If you will be using OXR in a test environment, you may want to test the
+# substitute local files for the API endpoints to provide deterministic results
+# and avoid running over your Open Exchange Rates API request quota.
+#
+# class ThisIsATest < Minitest::Test
+# def setup
+# OXR.configure do |config|
+# config.latest = 'test/fixtures/sample.json'
+# end
+# end
+#
+# def teardown
+# OXR.reset_sources
+# end
+# end
+#
+# To quickly get an exchange rate from the base currency to a given currency,
+# use `OXR.get_rate`.
+#
+# OXR.get_rate 'GBP' # => 0.703087
+# OXR.get_rate 'JPY' # => 111.7062
+#
+# This method is aliased as `OXR.[]`.
+#
+# OXR['GBP'] # => 0.703087
+#
+# Pass the `:on` keyword argument to get an historical exchange rate on a given
+# date.
+#
+# OXR.get_rate 'GBP', on: Date.new(2015, 6, 14) # => 0.642607
+#
module OXR
class Error < StandardError
end
+ ##
+ # ApiError is raised when OXR encounters an error connecting to the Open
+ # Exchange Rates API server.
class ApiError < Error
def message
cause.message
end
@@ -22,19 +76,31 @@
@response ||= JSON.parse cause.io.read
end
end
class << self
+ ##
+ # DEPRECATED: TO BE REMOVED IN 0.7.
+ #
+ # OXR should no longer be instantiated explicitly.
+ #
+ # Call OXR.configure to specify the application ID and use the module
+ # methods below to access the different API endpoints.
def new(app_id)
- warn '[DEPRECATION WARNING] OXR.new is deprecated.' \
+ warn '[DEPRECATION] OXR.new is deprecated and will be removed from 0.7.' \
" Use OXR class methods instead (from #{caller(1..1).first})."
configure do |config|
config.app_id = app_id
end
self
end
+ ##
+ # Get the latest exchange rate for currency identified by +code+.
+ #
+ # If the optional +on+ keyword is provided, it instead returns the
+ # historical exchange rate on the given date.
def get_rate(code, on: nil)
data = if on
historical on: on
else
latest
@@ -42,42 +108,66 @@
data['rates'][code.to_s]
end
alias [] get_rate
+ ##
+ # Returns a Hash mapping currency codes to full currency names.
def currencies
call configuration.currencies
end
+ ##
+ # Returns a Hash mapping currency codes to their historical exchange rate
+ # on the date given by the +on+ keyword argument.
+ #
+ # The exchange rate is relative to the configured base currency.
def historical(on:)
call configuration.historical on
end
+ ##
+ # Returns a Hash mapping currency codes to their latest exchange rate.
+ #
+ # The exchange rate is relative to the configured base currency.
def latest
call configuration.latest
end
+ ##
+ # Returns a Hash containinng details about the Open Exchange Rates account
+ # and current usage statistics.
def usage
call configuration.usage
end
+ ##
+ # Resets API endpoints to their defaults.
def reset_sources
configure(&:reset_sources)
end
+ ##
+ # Returns the OXR configuration struct.
+ #
+ # If given a block, the configuration will be yielded to the block.
def configure
yield configuration if block_given?
configuration
end
+ ##
+ # Returns the OXR configuration struct.
def configuration
@configuration ||= Configuration.new
end
private
def call(endpoint)
- JSON.parse(open(endpoint).read)
+ uri = URI.parse endpoint
+ data = uri.scheme ? uri.read : File.read(uri.path)
+ JSON.parse data
rescue OpenURI::HTTPError => e
raise ApiError, e
end
end
end