omni_exchange 1.1.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: 71ebf805bee18ff582b11e816572b9bab09208e042c16a00d4c74b933a842104
4
- data.tar.gz: 9decd4210cdcfd4e41a92e59e17f1a1e44addb6618c13db4d0765750d711b6dc
3
+ metadata.gz: e498fc09556edce13c2f54ef7de9451e38546eaae859a38b2c0378d9011d8c2b
4
+ data.tar.gz: 8ef08385d9b929689e825ed4ac9b1f19756105e0f4d393279fe8e7482d85a281
5
5
  SHA512:
6
- metadata.gz: bd89c93e6e044e0bebb387f369e312760ac782e97da28a12bb0ed635c92696cedb4ea41e3c75cdc7d999d5b69853686a2a71cea6e706c79c263b046e96ff5c55
7
- data.tar.gz: 07ac0fcb122d03643889b01380d97f5dada0ea9b34951b8f88bb7c0a236a82b4244a491ae28f75e82a82c408624606462ebbf3eab08d93f0ea7f73a8e24a85e9
6
+ metadata.gz: a2dd2e4413a7c0f061d70f605d55395d924e48341a6f44b292c997ce58b6264d090d90d605fc4304e5afd36981797c4c49965684154c3a7b8b9719d4cb89dcc5
7
+ data.tar.gz: '048bb4224fd6c1b61d6ef89daa5eb2a38fc3527b9428c892e11786bf621205be39795b7876cf5b1832faa2811b733a5fca0dc45a01e77f2240bbe7fd914adf8b'
data/.gitignore CHANGED
@@ -14,3 +14,9 @@
14
14
  .env
15
15
 
16
16
  sandbox.rb
17
+ omni_exchange-0.1.0.gem
18
+ omni_exchange-0.2.0.gem
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.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'
@@ -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,15 +27,19 @@ 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
- currency_unit = get_currency_unit(base_currency)
40
+ currency_unit = get_currency_unit(base_currency).to_d
37
41
 
38
- exchange_rate * currency_unit
42
+ (exchange_rate * currency_unit).to_d
39
43
  end
40
44
 
41
45
  # when this file is required at the top of lib/omni_exchange.rb, this method call is run and allows
@@ -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.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
@@ -71,10 +72,10 @@ module OmniExchange
71
72
  provider_classes.each do |klass|
72
73
  rate = klass.get_exchange_rate(base_currency: base_currency, target_currency: target_currency)
73
74
 
74
- exchanged_amount = rate * amount.to_d
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.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-01 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