omni_exchange 1.1.1 → 1.4.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 +4 -4
- data/.gitignore +3 -0
- data/.rubocop_todo.yml +18 -5
- data/Gemfile.lock +1 -1
- data/README.md +2 -2
- data/bin/console +1 -0
- data/lib/omni_exchange/error.rb +4 -0
- data/lib/omni_exchange/providers/open_exchange_rates.rb +6 -2
- data/lib/omni_exchange/providers/xe.rb +10 -2
- data/lib/omni_exchange/version.rb +1 -1
- data/lib/omni_exchange.rb +9 -8
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3ab4966ed766dfb9d1762d0b476ce31c5b418e90a92cb7036ced1e0cd251522f
|
4
|
+
data.tar.gz: b8de8d1a0e0ab10bfe53bc6bce3ad0d3ce8d8387dc22182bba9a8f78e95dafb1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 67730c3e4c1664dcd04ead3a6a4cb03b25dfc152712dcd7bdf4c706d9ff5b72c36820bfbc4ac87cf1c7e5c8e0586519bbeda5424fdc6db939e4e105676c0b5b2
|
7
|
+
data.tar.gz: 6c9ff326e891090d87b41277ee2d0402ecf85b1c7f72d826184a8a8cef7519dbdca07bc0b1e8f62d829229877673d70ca86c67458771689bb9de86282076128c
|
data/.gitignore
CHANGED
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-
|
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:
|
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:
|
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:
|
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:
|
68
|
+
Max: 220
|
data/Gemfile.lock
CHANGED
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.
|
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, :
|
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
data/lib/omni_exchange/error.rb
CHANGED
@@ -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
|
30
|
+
rescue *EXCEPTIONS => e
|
31
31
|
raise e.class, 'Open Exchange Rates has timed out.'
|
32
32
|
end
|
33
33
|
|
34
|
-
|
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
|
35
|
+
rescue *EXCEPTIONS => e
|
36
36
|
raise e.class, 'xe.com has timed out.'
|
37
37
|
end
|
38
38
|
|
39
|
-
|
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
|
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
|
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
|
-
# * :
|
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,
|
77
|
-
rescue
|
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.
|
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-
|
11
|
+
date: 2022-07-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|