omni_exchange 1.1.1 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 23f8e6cc867244781c587d8ba217e373dabd00c5bf78710b673d8e6f4b330cb0
4
- data.tar.gz: fffb0e30a3bb6f953ff6a38afcf821023f0e9f898c91448c29e2a6697153bf5d
3
+ metadata.gz: 3ab4966ed766dfb9d1762d0b476ce31c5b418e90a92cb7036ced1e0cd251522f
4
+ data.tar.gz: b8de8d1a0e0ab10bfe53bc6bce3ad0d3ce8d8387dc22182bba9a8f78e95dafb1
5
5
  SHA512:
6
- metadata.gz: a4fe1ff6099ab9d3662f3a4881303e6c3c7d380cfc49c559c09ca39f1a5a918e381fb017c45cb9552e4b7dd35f8c7f52beaa2762898eb84e43e737aa59f7999e
7
- data.tar.gz: 67d7ae42c4ff478a18669cbbed4ac9c99ac81947402e671e8fec1f072d7e3eeacaf46f18b4570e23b675a7dd34c1ff44b34c051c947aa6a2766e50fc3531755e
6
+ metadata.gz: 67730c3e4c1664dcd04ead3a6a4cb03b25dfc152712dcd7bdf4c706d9ff5b72c36820bfbc4ac87cf1c7e5c8e0586519bbeda5424fdc6db939e4e105676c0b5b2
7
+ data.tar.gz: 6c9ff326e891090d87b41277ee2d0402ecf85b1c7f72d826184a8a8cef7519dbdca07bc0b1e8f62d829229877673d70ca86c67458771689bb9de86282076128c
data/.gitignore CHANGED
@@ -17,3 +17,6 @@ sandbox.rb
17
17
  omni_exchange-0.1.0.gem
18
18
  omni_exchange-0.2.0.gem
19
19
  omni_exchange-1.1.0.gem
20
+ omni_exchange-1.1.1.gem
21
+ omni_exchange-1.2.0.gem
22
+ omni_exchange-1.3.0.gem
data/.rubocop_todo.yml CHANGED
@@ -1,15 +1,20 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2022-06-30 01:49:03 UTC using RuboCop version 0.93.1.
3
+ # on 2022-07-12 04:26:20 UTC using RuboCop version 0.93.1.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
7
7
  # versions of RuboCop, may require this file to be generated again.
8
8
 
9
+ # Offense count: 1
10
+ Lint/UselessAssignment:
11
+ Exclude:
12
+ - 'lib/sandbox.rb'
13
+
9
14
  # Offense count: 2
10
15
  # Configuration parameters: IgnoredMethods.
11
16
  Metrics/AbcSize:
12
- Max: 28
17
+ Max: 33
13
18
 
14
19
  # Offense count: 1
15
20
  # Configuration parameters: CountComments, CountAsOne, ExcludedMethods.
@@ -39,7 +44,7 @@ Style/ExponentialNotation:
39
44
  Exclude:
40
45
  - 'spec/omni_exchange_spec.rb'
41
46
 
42
- # Offense count: 3
47
+ # Offense count: 4
43
48
  # Cop supports --auto-correct.
44
49
  # Configuration parameters: EnforcedStyle, ConsistentQuotesInMultiline.
45
50
  # SupportedStyles: single_quotes, double_quotes
@@ -47,9 +52,17 @@ Style/StringLiterals:
47
52
  Exclude:
48
53
  - 'lib/sandbox.rb'
49
54
 
50
- # Offense count: 16
55
+ # Offense count: 1
56
+ # Cop supports --auto-correct.
57
+ # Configuration parameters: .
58
+ # SupportedStyles: percent, brackets
59
+ Style/SymbolArray:
60
+ EnforcedStyle: percent
61
+ MinSize: 3
62
+
63
+ # Offense count: 19
51
64
  # Cop supports --auto-correct.
52
65
  # Configuration parameters: AutoCorrect, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
53
66
  # URISchemes: http, https
54
67
  Layout/LineLength:
55
- Max: 226
68
+ Max: 220
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- omni_exchange (1.1.1)
4
+ omni_exchange (1.3.0)
5
5
  faraday (= 0.17.4)
6
6
  money (~> 6.13.1)
7
7
 
data/README.md CHANGED
@@ -57,7 +57,7 @@ To convert currency and/or get an exchange rate, all you have to do is call `Omn
57
57
  What you get back is a hash containing:
58
58
  1. converted_amount: (BigDecimal) the amount of money exchanged from the base currency to the target currency
59
59
  2. exchange_rate: (BigDecimal) the rate used to calculate the converted_amount
60
- 3. provider_class: (Class) the name of the provider class that supplied the exchange_rate (ie. OmniExchange::OpenExhangeRates)
60
+ 3. provider: (Symbol) the provider that supplied the exchange_rate (ie. :open_exchange_rates, :xe)
61
61
 
62
62
  [For the sake of precise calculation](https://www.bigbinary.com/blog/handling-money-in-ruby), converted_amount and exchange_rate are BigDecimal. Simply call `.to_f` to the results if you'd like to see a number that is easier to read.
63
63
 
@@ -67,7 +67,7 @@ Here is an example. Lets say I want to convert $1.00 US Dollar to Japanese Yen,
67
67
  ```ruby
68
68
  USD_to_JPY = OmniExchange.get_fx_data(amount: 100, base_currency: 'USD', target_currency: 'JPY', providers: [:open_exchange_rates, :xe])
69
69
 
70
- puts USD_to_JPY # => { :converted_amount=>0.13566633333e3, :exchange_rate=>0.13566633333e1, :provider_class=>OmniExchange::OpenExchangeRates }
70
+ puts USD_to_JPY # => { :converted_amount=>0.13566633333e3, :exchange_rate=>0.13566633333e1, :provider=>:open_exchange_rates }
71
71
 
72
72
  puts USD_to_JPY[:converted_amount] # => 0.13566633333e3
73
73
  puts USD_to_JPY[:converted_amount].to_f # => 135.66633333
data/bin/console CHANGED
@@ -6,6 +6,7 @@ require 'omni_exchange'
6
6
  require 'dotenv/load'
7
7
  require 'faraday'
8
8
  require 'money'
9
+ require 'net/http'
9
10
  require_relative '../lib/omni_exchange/provider'
10
11
  require_relative '../lib/omni_exchange/configuration'
11
12
  require_relative '../lib/omni_exchange/error'
@@ -8,4 +8,8 @@ module OmniExchange
8
8
  # A custom error for failure to get data from a provider
9
9
  class HttpError < StandardError
10
10
  end
11
+
12
+ # A custom error for exceeding the monthly request limit for xe.com
13
+ class XeMonthlyLimit < StandardError
14
+ end
11
15
  end
@@ -27,11 +27,15 @@ module OmniExchange
27
27
  req.options.timeout = config[:read_timeout] || OmniExchange::Configuration::DEFAULT_READ_TIMEOUT
28
28
  req.options.open_timeout = config[:connect_timeout] || OmniExchange::Configuration::DEFAULT_CONNECTION_TIMEOUT
29
29
  end
30
- rescue Faraday::Error, Faraday::ConnectionFailed => e
30
+ rescue *EXCEPTIONS => e
31
31
  raise e.class, 'Open Exchange Rates has timed out.'
32
32
  end
33
33
 
34
- exchange_rate = JSON.parse(response.body, symbolize_names: true)[:rates][target_currency.to_sym].to_d
34
+ begin
35
+ exchange_rate = JSON.parse(response.body, symbolize_names: true)[:rates][target_currency.to_sym].to_d
36
+ rescue JSON::ParserError => e
37
+ raise e.class, 'JSON::ParserError in OmniExchange::OpenExchangeRates'
38
+ end
35
39
 
36
40
  currency_unit = get_currency_unit(base_currency).to_d
37
41
 
@@ -32,11 +32,19 @@ module OmniExchange
32
32
  req.options.timeout = config[:read_timeout] || OmniExchange::Configuration::DEFAULT_READ_TIMEOUT
33
33
  req.options.open_timeout = config[:connect_timeout] || OmniExchange::Configuration::DEFAULT_CONNECTION_TIMEOUT
34
34
  end
35
- rescue Faraday::Error, Faraday::ConnectionFailed => e
35
+ rescue *EXCEPTIONS => e
36
36
  raise e.class, 'xe.com has timed out.'
37
37
  end
38
38
 
39
- JSON.parse(response.body, symbolize_names: true)[:to][0][:mid].to_d
39
+ begin
40
+ body = JSON.parse(response.body, symbolize_names: true)
41
+ rescue JSON::ParserError => e
42
+ raise e.class, 'JSON::ParserError in OmniExchange::Xe'
43
+ end
44
+
45
+ raise OmniExchange::XeMonthlyLimit, 'Xe.com monthly limit has been exceeded' if body[:code] == 3
46
+
47
+ body[:to][0][:mid].to_d
40
48
  end
41
49
 
42
50
  # when this file is required at the top of lib/omni_exchange.rb, this method call is run and allows
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module OmniExchange
4
- VERSION = '1.1.1'
4
+ VERSION = '1.4.0'
5
5
  end
data/lib/omni_exchange.rb CHANGED
@@ -12,6 +12,7 @@ require 'faraday'
12
12
  require 'money'
13
13
  require 'json'
14
14
  require 'bigdecimal/util'
15
+ require 'net/http'
15
16
 
16
17
  # rubocop:disable Lint/Syntax
17
18
  module OmniExchange
@@ -32,6 +33,9 @@ module OmniExchange
32
33
  yield(configuration)
33
34
  end
34
35
 
36
+ # if a provider raises one of these exceptions, OmniExchange will gracefully attempt to use another provider
37
+ EXCEPTIONS = [Faraday::Error, Faraday::ConnectionFailed, Faraday::TimeoutError, Faraday::SSLError, Net::OpenTimeout, Net::WriteTimeout, Net::ReadTimeout, OpenSSL::SSL::SSLError]
38
+
35
39
  module_function
36
40
 
37
41
  # returns foreign exchange data including the amount of money in one country's currency when exchanged from an
@@ -44,15 +48,12 @@ module OmniExchange
44
48
  # @param providers: [Array] an array of symbols of the providers that will be used to get exchange rates API
45
49
  # data. The symbols must be found in the @providers hash in the Provider class (lib/omni_exchange/provider.rb).
46
50
  # ie. xe:, :open_exchange_rates
47
- # @return [Hash] If all of the providers in the providers hash fail to retrieve data, or if one of the currencies
48
- # is not valid, an exception is raised.
51
+ # @return [Hash] If none of the providers in the providers hash are able to retrieve data, or if one of the
52
+ # currencies is not valid, an exception is raised.
49
53
  # * :converted_amount [BigDecimal] the amount of money exchanged from the base currency to the target
50
54
  # currency as a BigDecimal for precice calculation. ie. 1, 10, 100
51
55
  # * :exchange_rate [BigDecimal] the rate used to calculate the converted_amount as a BigDecimal. ie. 0.95211e1
52
- # * :provider_class [Class] the provider class that supplied the exchange_rate data. ie. OmniExchange::Xe
53
- #the amount of the base currency exchanged to the target currency using an exchange rate
54
- # provided by one of the data providers in the providers hash. The final amount is returned as a BigDecimal
55
- # for precise calculation. If all of the providers in the providers hash fail to retrieve data, an exception is raised.
56
+ # * :provider [Symbol] the provider that supplied the exchange_rate data. ie. :xe, :open_exchange_rates
56
57
  def get_fx_data(amount:, base_currency:, target_currency:, providers:)
57
58
  # if one of the currencies is not valid (ie. 'fake_crypto'), an exception is raised.
58
59
  begin
@@ -73,8 +74,8 @@ module OmniExchange
73
74
 
74
75
  exchanged_amount = rate.to_d * amount.to_d
75
76
 
76
- return { converted_amount: exchanged_amount, exchange_rate: rate, provider_class: klass }
77
- rescue Faraday::Error, Faraday::ConnectionFailed => e
77
+ return { converted_amount: exchanged_amount, exchange_rate: rate, provider: OmniExchange::Provider.all.key(klass) }
78
+ rescue *EXCEPTIONS, OmniExchange::XeMonthlyLimit, JSON::ParserError => e
78
79
  error_messages << e.inspect
79
80
  end
80
81
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omni_exchange
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yun Chung
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-07-04 00:00:00.000000000 Z
11
+ date: 2022-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday