money-currencylayer-bank 0.5.4 → 0.5.5
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/LICENSE +1 -1
- data/README.md +8 -3
- data/lib/money/bank/currencylayer_bank.rb +42 -39
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bcc2d3fa0693e5f08c0368924439dfad9e36e744
|
4
|
+
data.tar.gz: 8d0d077b6c485208c35f49740e93054b7a5c8102
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 85105563870f9b83c96bc6e2e0a47ea8b6c3328d0ac7d7bfc709fe7f598996cd2cbf5eda05f2e96b34dad0520d793c42d862fc71f591f4f76ea2ab96989e52f8
|
7
|
+
data.tar.gz: 60f70f3a63f6c96883e9e34bc274bc96d343f0458eaeeb59e8fb07f441041f424e1734c87ba2d7d86d49ba005d67606021c08fdf8cff08f6845ddf06226e2696
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -40,6 +40,7 @@ See more about Currencylayer product plans on https://currencylayer.com/product.
|
|
40
40
|
* average response time < 20ms
|
41
41
|
* supports caching currency rates
|
42
42
|
* calculates every pair rate calculating inverse rate or using base currency rate
|
43
|
+
* supports multi threading
|
43
44
|
|
44
45
|
## Installation
|
45
46
|
|
@@ -89,7 +90,7 @@ mclb.secure_connection = true
|
|
89
90
|
# Define cache (string or pathname)
|
90
91
|
mclb.cache = 'path/to/file/cache'
|
91
92
|
|
92
|
-
# Set money default bank to
|
93
|
+
# Set money default bank to Currencylayer bank
|
93
94
|
Money.default_bank = mclb
|
94
95
|
~~~
|
95
96
|
|
@@ -104,7 +105,7 @@ mclb.source
|
|
104
105
|
# Expires rates if the expiration time is reached.
|
105
106
|
mclb.expire_rates!
|
106
107
|
|
107
|
-
#
|
108
|
+
# Returns true if the expiration time is reached.
|
108
109
|
mclb.expired?
|
109
110
|
|
110
111
|
# Get the API source url.
|
@@ -112,6 +113,9 @@ mclb.source_url
|
|
112
113
|
|
113
114
|
# Get the rates timestamp of the last API request.
|
114
115
|
mclb.rates_timestamp
|
116
|
+
|
117
|
+
# Get the rates timestamp of loaded rates in memory.
|
118
|
+
moxb.rates_mem_timestamp
|
115
119
|
~~~
|
116
120
|
|
117
121
|
### How to exchange
|
@@ -184,6 +188,7 @@ bundle exec rake
|
|
184
188
|
## Other Implementations
|
185
189
|
|
186
190
|
* Gem [currencylayer](https://github.com/askuratovsky/currencylayer)
|
191
|
+
* Gem [money-openexchangerates-bank](https://github.com/phlegx/money-openexchangerates-bank)
|
187
192
|
* Gem [money-open-exchange-rates](https://github.com/spk/money-open-exchange-rates)
|
188
193
|
* Gem [money-historical-bank](https://github.com/atwam/money-historical-bank)
|
189
194
|
* Gem [eu_central_bank](https://github.com/RubyMoney/eu_central_bank)
|
@@ -207,4 +212,4 @@ bundle exec rake
|
|
207
212
|
|
208
213
|
The MIT License
|
209
214
|
|
210
|
-
Copyright (c)
|
215
|
+
Copyright (c) 2017 Phlegx Systems OG
|
@@ -13,7 +13,6 @@ class Money
|
|
13
13
|
class Memory
|
14
14
|
# Add method to reset the build in memory store
|
15
15
|
# @param [Hash] rt Optional initial exchange rate data.
|
16
|
-
#
|
17
16
|
# @return [Object] store.
|
18
17
|
def reset!(rt = {})
|
19
18
|
transaction { @index = rt }
|
@@ -32,32 +31,29 @@ class Money
|
|
32
31
|
# CurrencylayerBank base class
|
33
32
|
class CurrencylayerBank < Money::Bank::VariableExchange
|
34
33
|
# CurrencylayerBank url
|
35
|
-
CL_URL = 'http://apilayer.net/api/live'
|
34
|
+
CL_URL = 'http://apilayer.net/api/live'.freeze
|
36
35
|
# CurrencylayerBank secure url
|
37
|
-
CL_SECURE_URL = CL_URL.
|
36
|
+
CL_SECURE_URL = CL_URL.sub('http:', 'https:')
|
38
37
|
# Default base currency
|
39
|
-
CL_SOURCE = 'USD'
|
38
|
+
CL_SOURCE = 'USD'.freeze
|
40
39
|
|
41
40
|
# Use https to fetch rates from CurrencylayerBank
|
42
41
|
# CurrencylayerBank only allows http as connection
|
43
42
|
# for the free plan users.
|
44
43
|
#
|
45
44
|
# @param value [Boolean] true for secure connection
|
46
|
-
#
|
47
45
|
# @return [Boolean] chosen secure connection
|
48
46
|
attr_accessor :secure_connection
|
49
47
|
|
50
48
|
# API must have a valid access_key
|
51
49
|
#
|
52
50
|
# @param value [String] API access key
|
53
|
-
#
|
54
51
|
# @return [String] chosen API access key
|
55
52
|
attr_accessor :access_key
|
56
53
|
|
57
54
|
# Cache accessor, can be a String or a Proc
|
58
55
|
#
|
59
56
|
# @param value [String,Pathname,Proc] cache system
|
60
|
-
#
|
61
57
|
# @return [String,Pathname,Proc] chosen cache system
|
62
58
|
attr_accessor :cache
|
63
59
|
|
@@ -75,7 +71,6 @@ class Money
|
|
75
71
|
# ttl_in_seconds = 86400 # will expire the rates in one day
|
76
72
|
#
|
77
73
|
# @param value [Integer] time to live in seconds
|
78
|
-
#
|
79
74
|
# @return [Integer] chosen time to live in seconds
|
80
75
|
attr_writer :ttl_in_seconds
|
81
76
|
|
@@ -87,7 +82,6 @@ class Money
|
|
87
82
|
# source = 'USD'
|
88
83
|
#
|
89
84
|
# @param value [String] Currency code, ISO 3166-1 alpha-3
|
90
|
-
#
|
91
85
|
# @return [String] chosen base currency
|
92
86
|
def source=(value)
|
93
87
|
@source = Money::Currency.find(value.to_s).try(:iso_code) || CL_SOURCE
|
@@ -124,47 +118,23 @@ class Money
|
|
124
118
|
# @param [String] from_currency Currency ISO code. ex. 'USD'
|
125
119
|
# @param [String] to_currency Currency ISO code. ex. 'CAD'
|
126
120
|
# @param [Numeric] rate Rate to use when exchanging currencies.
|
127
|
-
#
|
128
121
|
# @return [Numeric] rate.
|
129
122
|
def add_rate(from_currency, to_currency, rate)
|
130
123
|
super
|
131
124
|
end
|
132
125
|
|
126
|
+
# Alias super method
|
127
|
+
alias super_get_rate get_rate
|
128
|
+
|
133
129
|
# Override Money `get_rate` method for caching
|
134
130
|
# @param [String] from_currency Currency ISO code. ex. 'USD'
|
135
131
|
# @param [String] to_currency Currency ISO code. ex. 'CAD'
|
136
132
|
# @param [Hash] opts Options hash to set special parameters.
|
137
|
-
#
|
138
133
|
# @return [Numeric] rate.
|
139
|
-
def get_rate(from_currency, to_currency, opts = {})
|
134
|
+
def get_rate(from_currency, to_currency, opts = {})
|
140
135
|
expire_rates!
|
141
|
-
rate =
|
142
|
-
|
143
|
-
# Tries to calculate an inverse rate
|
144
|
-
inverse_rate = super(to_currency, from_currency, opts)
|
145
|
-
if inverse_rate
|
146
|
-
rate = 1.0 / inverse_rate
|
147
|
-
add_rate(from_currency, to_currency, rate)
|
148
|
-
end
|
149
|
-
end
|
150
|
-
unless rate
|
151
|
-
# Tries to calculate a pair rate using base currency rate
|
152
|
-
from_base_rate = super(source, from_currency, opts)
|
153
|
-
unless from_base_rate
|
154
|
-
from_inverse_rate = super(from_currency, source, opts)
|
155
|
-
from_base_rate = 1.0 / from_inverse_rate if from_inverse_rate
|
156
|
-
end
|
157
|
-
to_base_rate = super(source, to_currency, opts)
|
158
|
-
unless to_base_rate
|
159
|
-
to_inverse_rate = super(to_currency, source, opts)
|
160
|
-
to_base_rate = 1.0 / to_inverse_rate if to_inverse_rate
|
161
|
-
end
|
162
|
-
if to_base_rate && from_base_rate
|
163
|
-
rate = to_base_rate / from_base_rate
|
164
|
-
add_rate(from_currency, to_currency, rate)
|
165
|
-
end
|
166
|
-
end
|
167
|
-
rate
|
136
|
+
rate = get_rate_or_calc_inverse(from_currency, to_currency, opts)
|
137
|
+
rate || calc_pair_rate_using_base(from_currency, to_currency, opts)
|
168
138
|
end
|
169
139
|
|
170
140
|
# Fetch new rates if cached rates are expired or stale
|
@@ -305,6 +275,7 @@ class Money
|
|
305
275
|
end
|
306
276
|
|
307
277
|
# Get raw exchange rates from cache and then from url
|
278
|
+
# @param rescue_straight [Boolean] true for rescue straight, default true
|
308
279
|
# @return [String] JSON content
|
309
280
|
def raw_rates_careful(rescue_straight = true)
|
310
281
|
JSON.parse(read_from_cache.to_s)
|
@@ -319,6 +290,38 @@ class Money
|
|
319
290
|
rescue JSON::ParserError
|
320
291
|
raw_rates_careful(false)
|
321
292
|
end
|
293
|
+
|
294
|
+
# Get rate or calculate it as inverse rate
|
295
|
+
# @param [String] from_currency Currency ISO code. ex. 'USD'
|
296
|
+
# @param [String] to_currency Currency ISO code. ex. 'CAD'
|
297
|
+
# @return [Numeric] rate or rate calculated as inverse rate.
|
298
|
+
def get_rate_or_calc_inverse(from_currency, to_currency, opts = {})
|
299
|
+
rate = super_get_rate(from_currency, to_currency, opts)
|
300
|
+
unless rate
|
301
|
+
# Tries to calculate an inverse rate
|
302
|
+
inverse_rate = super_get_rate(to_currency, from_currency, opts)
|
303
|
+
if inverse_rate
|
304
|
+
rate = 1.0 / inverse_rate
|
305
|
+
add_rate(from_currency, to_currency, rate)
|
306
|
+
end
|
307
|
+
end
|
308
|
+
rate
|
309
|
+
end
|
310
|
+
|
311
|
+
# Tries to calculate a pair rate using base currency rate
|
312
|
+
# @param [String] from_currency Currency ISO code. ex. 'USD'
|
313
|
+
# @param [String] to_currency Currency ISO code. ex. 'CAD'
|
314
|
+
# @return [Numeric] rate or nil if cannot calculate rate.
|
315
|
+
def calc_pair_rate_using_base(from_currency, to_currency, opts = {})
|
316
|
+
from_base_rate = get_rate_or_calc_inverse(source, from_currency, opts)
|
317
|
+
to_base_rate = get_rate_or_calc_inverse(source, to_currency, opts)
|
318
|
+
if to_base_rate && from_base_rate
|
319
|
+
rate = to_base_rate / from_base_rate
|
320
|
+
add_rate(from_currency, to_currency, rate)
|
321
|
+
return rate
|
322
|
+
end
|
323
|
+
nil
|
324
|
+
end
|
322
325
|
end
|
323
326
|
end
|
324
327
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: money-currencylayer-bank
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Egon Zemmer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-05-
|
11
|
+
date: 2017-05-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: money
|