omni_exchange 1.2.0 → 1.3.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: 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