omni_exchange 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 79069dcd87cf3788896dbc2093d114028b94592743a5fea03559cfce974b4d5c
4
- data.tar.gz: 03a24de2dcfe6dca9ee1c0532e40b8bab6addbc14c9e4863ef644789a0a24adb
3
+ metadata.gz: e498fc09556edce13c2f54ef7de9451e38546eaae859a38b2c0378d9011d8c2b
4
+ data.tar.gz: 8ef08385d9b929689e825ed4ac9b1f19756105e0f4d393279fe8e7482d85a281
5
5
  SHA512:
6
- metadata.gz: bb380807a18d884f6ebef61b911e9a5301f6704577a15b8b4fc75cc11a4e0337ee1c911ea01c9a8269f919f6df62f86225cc9270bf24c8cad753eed0cefa8e2d
7
- data.tar.gz: f0909dabbacc96857512b405cc590431ca9df724f622d0e59d589c62e2856e2d6193e992370f4a06d52df2eff7c3f6d1acca1741f5d6c12c9be20c9736b6eef0
6
+ metadata.gz: a2dd2e4413a7c0f061d70f605d55395d924e48341a6f44b292c997ce58b6264d090d90d605fc4304e5afd36981797c4c49965684154c3a7b8b9719d4cb89dcc5
7
+ data.tar.gz: '048bb4224fd6c1b61d6ef89daa5eb2a38fc3527b9428c892e11786bf621205be39795b7876cf5b1832faa2811b733a5fca0dc45a01e77f2240bbe7fd914adf8b'
data/.gitignore CHANGED
@@ -18,3 +18,5 @@ omni_exchange-0.1.0.gem
18
18
  omni_exchange-0.2.0.gem
19
19
  omni_exchange-1.1.0.gem
20
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.2.0)
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'
@@ -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
 
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # rubocop:disable Metrics/AbcSize
4
3
  require 'omni_exchange'
5
4
 
6
5
  module OmniExchange
@@ -33,11 +32,15 @@ module OmniExchange
33
32
  req.options.timeout = config[:read_timeout] || OmniExchange::Configuration::DEFAULT_READ_TIMEOUT
34
33
  req.options.open_timeout = config[:connect_timeout] || OmniExchange::Configuration::DEFAULT_CONNECTION_TIMEOUT
35
34
  end
36
- rescue Faraday::Error, Faraday::ConnectionFailed => e
35
+ rescue *EXCEPTIONS => e
37
36
  raise e.class, 'xe.com has timed out.'
38
37
  end
39
38
 
40
- body = JSON.parse(response.body, symbolize_names: true)
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
41
44
 
42
45
  raise OmniExchange::XeMonthlyLimit, 'Xe.com monthly limit has been exceeded' if body[:code] == 3
43
46
 
@@ -49,4 +52,3 @@ module OmniExchange
49
52
  OmniExchange::Provider.register_provider(:xe, self)
50
53
  end
51
54
  end
52
- # rubocop:enable Metrics/AbcSize
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module OmniExchange
4
- VERSION = '1.2.0'
4
+ VERSION = '1.3.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, 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, OmniExchange::XeMonthlyLimit => 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.2.0
4
+ version: 1.3.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-05 00:00:00.000000000 Z
11
+ date: 2022-07-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday