eu_central_bank 1.4.0 → 1.6.1

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
- SHA1:
3
- metadata.gz: 78904e92dcf5fb857c2590a14b5d79b500f77304
4
- data.tar.gz: aa26643fb7a2e2fb94faa127e5351ad080d09630
2
+ SHA256:
3
+ metadata.gz: 5a531cbda27d58075c18fb0ed04177d5d16872e178046854495fe87c2094678e
4
+ data.tar.gz: b87062758ed6a9ef559fbd42a8d3bdf4f59366abd3c201951a01af62bbfb46df
5
5
  SHA512:
6
- metadata.gz: 47a0d6729bb4523fae805e13955ce7c1f6888d93f256cefde9038185e463780a9e70c7b2204add1f5cb1962d54917894df5bb1f891b7cce1af0aacf9ad852e69
7
- data.tar.gz: 31fcedde5dd2c68ed4508e9e4413f054a5466015a76d3678bd982ec3283c179a7690a450a65d43d648d1d04c26084fd5c107d52a41f18e08e8830271b51ec63e
6
+ metadata.gz: fffe386b9fadfa03a24e36e77bb52d66df0c21e9d042e96a74e945b314798ee942938a3e2f9aec29c69aabedd2b3934bca780574112c842764f7708816ddeee9
7
+ data.tar.gz: 6f495beaafc197894bbeecb9333f31d4d5b530879f64d162442fc8389793a23f87096100ee5ebc9a978143f350445dbd6e0c6651448dddc870b35e7efac8da04
data/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # eu_central_bank changelog
2
2
 
3
+ ## 1.6.1 (Mar 3 2021)
4
+
5
+ * Allow a fallback when loading cached rate files to inhibit network fetch.
6
+
7
+ ## 1.5.0 (Dec 7 2019)
8
+
9
+ * Fix issue with money gem incompatibility
10
+ * Fix thread safety of the default rates store
11
+ * Bump money dependency to >= 6.13.6
12
+
13
+ ## 1.4.2 (Feb 2 2019)
14
+
15
+ * Fix issue with importing exported rates
16
+
17
+ ## 1.4.1 (Jan 14 2019)
18
+
19
+ * Relax Nokogiri dependency to `~> 1.8` on newer rubies
20
+
3
21
  ## 1.4.0 (Dec 17 2018)
4
22
 
5
23
  * Update money dependency to 6.13.x
data/LICENSE CHANGED
@@ -1,20 +1,22 @@
1
+ MIT License
2
+
1
3
  Copyright (c) 2009 Wong Liang Zan
4
+ Copyright (c) 2021 Shane Emmons
2
5
 
3
- Permission is hereby granted, free of charge, to any person obtaining
4
- a copy of this software and associated documentation files (the
5
- "Software"), to deal in the Software without restriction, including
6
- without limitation the rights to use, copy, modify, merge, publish,
7
- distribute, sublicense, and/or sell copies of the Software, and to
8
- permit persons to whom the Software is furnished to do so, subject to
9
- the following conditions:
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
10
12
 
11
- The above copyright notice and this permission notice shall be
12
- included in all copies or substantial portions of the Software.
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
13
15
 
14
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
data/README.md CHANGED
@@ -25,7 +25,7 @@ gem 'nokogiri', '1.6.8'
25
25
 
26
26
  ## Usage
27
27
 
28
- With the gem, you do not need to manually add exchange rates. Calling update_rates will download the rates from the European Central Bank. The API is the same as the money gem. Feel free to use Money objects with the bank.
28
+ With the gem, you do not need to manually add exchange rates. Calling `update_rates` will download the rates from the European Central Bank. The API is the same as the money gem. Feel free to use Money objects with the bank.
29
29
 
30
30
  ``` ruby
31
31
  require 'eu_central_bank'
@@ -15,7 +15,7 @@ class EuCentralBank < Money::Bank::VariableExchange
15
15
  attr_accessor :historical_rates_updated_at
16
16
 
17
17
  SERIALIZER_DATE_SEPARATOR = '_AT_'
18
-
18
+ DECIMAL_PRECISION = 5
19
19
  CURRENCIES = %w(USD JPY BGN CZK DKK GBP HUF ILS ISK PLN RON SEK CHF NOK HRK RUB TRY AUD BRL CAD CNY HKD IDR INR KRW MXN MYR NZD PHP SGD THB ZAR).map(&:freeze).freeze
20
20
  ECB_RATES_URL = 'https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml'.freeze
21
21
  ECB_90_DAY_URL = 'https://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml'.freeze
@@ -25,8 +25,8 @@ class EuCentralBank < Money::Bank::VariableExchange
25
25
  @currency_string = nil
26
26
  end
27
27
 
28
- def update_rates(cache=nil)
29
- update_parsed_rates(doc(cache))
28
+ def update_rates(cache=nil, url=ECB_RATES_URL)
29
+ update_parsed_rates(doc(cache, url))
30
30
  end
31
31
 
32
32
  def update_historical_rates(cache=nil)
@@ -36,7 +36,7 @@ class EuCentralBank < Money::Bank::VariableExchange
36
36
  def save_rates(cache, url=ECB_RATES_URL)
37
37
  raise InvalidCache unless cache
38
38
  File.open(cache, "w") do |file|
39
- io = open(url);
39
+ io = open_url(url);
40
40
  io.each_line { |line| file.puts line }
41
41
  end
42
42
  end
@@ -46,7 +46,7 @@ class EuCentralBank < Money::Bank::VariableExchange
46
46
  end
47
47
 
48
48
  def save_rates_to_s(url=ECB_RATES_URL)
49
- open(url).read
49
+ open_url(url).read
50
50
  end
51
51
 
52
52
  def exchange(cents, from_currency, to_currency, date=nil)
@@ -145,7 +145,8 @@ class EuCentralBank < Money::Bank::VariableExchange
145
145
  data.each do |key, rate|
146
146
  from, to = key.split(SERIALIZER_SEPARATOR)
147
147
  to, date = to.split(SERIALIZER_DATE_SEPARATOR)
148
- store.add_rate from, to, rate, date
148
+
149
+ store.add_rate from, to, BigDecimal(rate, DECIMAL_PRECISION), date
149
150
  end
150
151
  end
151
152
 
@@ -163,9 +164,9 @@ class EuCentralBank < Money::Bank::VariableExchange
163
164
 
164
165
  def doc(cache, url=ECB_RATES_URL)
165
166
  rates_source = !!cache ? cache : url
166
- Nokogiri::XML(open(rates_source)).tap { |doc| doc.xpath('gesmes:Envelope/xmlns:Cube/xmlns:Cube//xmlns:Cube') }
167
+ Nokogiri::XML(open_url(rates_source)).tap { |doc| doc.xpath('gesmes:Envelope/xmlns:Cube/xmlns:Cube//xmlns:Cube') }
167
168
  rescue Nokogiri::XML::XPath::SyntaxError
168
- Nokogiri::XML(open(url))
169
+ Nokogiri::XML(open_url(url))
169
170
  end
170
171
 
171
172
  def doc_from_s(content)
@@ -177,7 +178,7 @@ class EuCentralBank < Money::Bank::VariableExchange
177
178
 
178
179
  store.transaction true do
179
180
  rates.each do |exchange_rate|
180
- rate = BigDecimal(exchange_rate.attribute("rate").value)
181
+ rate = BigDecimal(exchange_rate.attribute("rate").value, DECIMAL_PRECISION)
181
182
  currency = exchange_rate.attribute("currency").value
182
183
  set_rate("EUR", currency, rate)
183
184
  end
@@ -195,7 +196,7 @@ class EuCentralBank < Money::Bank::VariableExchange
195
196
 
196
197
  store.transaction true do
197
198
  rates.each do |exchange_rate|
198
- rate = BigDecimal(exchange_rate.attribute("rate").value)
199
+ rate = BigDecimal(exchange_rate.attribute("rate").value, DECIMAL_PRECISION)
199
200
  currency = exchange_rate.attribute("currency").value
200
201
  date = exchange_rate.parent.attribute("time").value
201
202
  set_rate("EUR", currency, rate, date)
@@ -213,8 +214,16 @@ class EuCentralBank < Money::Bank::VariableExchange
213
214
  def calculate_exchange(from, to_currency, rate)
214
215
  to_currency_money = Money::Currency.wrap(to_currency).subunit_to_unit
215
216
  from_currency_money = from.currency.subunit_to_unit
216
- decimal_money = BigDecimal(to_currency_money) / BigDecimal(from_currency_money)
217
+ decimal_money = BigDecimal(to_currency_money, DECIMAL_PRECISION) / BigDecimal(from_currency_money, DECIMAL_PRECISION)
217
218
  money = (decimal_money * from.cents * rate).round
218
219
  Money.new(money, to_currency)
219
220
  end
221
+
222
+ def open_url(url)
223
+ if RUBY_VERSION >= '2.5.0'
224
+ URI.open(url)
225
+ else
226
+ open(url)
227
+ end
228
+ end
220
229
  end
@@ -3,33 +3,16 @@ module Money::RatesStore
3
3
  INDEX_DATE_SEPARATOR = '_AT_'.freeze
4
4
 
5
5
  def add_rate(currency_iso_from, currency_iso_to, rate, date = nil)
6
- transaction { index[rate_key_for(currency_iso_from, currency_iso_to, date)] = rate }
6
+ transaction { rates[rate_key_for(currency_iso_from, currency_iso_to, date)] = rate }
7
7
  end
8
8
 
9
9
  def get_rate(currency_iso_from, currency_iso_to, date = nil)
10
- transaction { index[rate_key_for(currency_iso_from, currency_iso_to, date)] }
10
+ transaction { rates[rate_key_for(currency_iso_from, currency_iso_to, date)] }
11
11
  end
12
12
 
13
13
  # Wraps block execution in a thread-safe transaction
14
- def transaction(force_sync = false, &block)
15
- # Ruby 1.9.3 does not support @mutex.owned?
16
- if @mutex.respond_to?(:owned?)
17
- force_sync = false if @mutex.locked? && @mutex.owned?
18
- else
19
- # If we allowed this in Ruby 1.9.3, it might possibly cause recursive
20
- # locking within the same thread.
21
- force_sync = false
22
- end
23
- if !force_sync && (@in_transaction || options[:without_mutex])
24
- block.call self
25
- else
26
- @mutex.synchronize do
27
- @in_transaction = true
28
- result = block.call
29
- @in_transaction = false
30
- result
31
- end
32
- end
14
+ def transaction(_force_sync = false, &block)
15
+ super(&block)
33
16
  end
34
17
 
35
18
  # Iterate over rate tuples (iso_from, iso_to, rate)
@@ -47,7 +30,7 @@ module Money::RatesStore
47
30
  # end
48
31
  def each_rate(&block)
49
32
  enum = Enumerator.new do |yielder|
50
- index.each do |key, rate|
33
+ rates.each do |key, rate|
51
34
  iso_from, iso_to = key.split(Memory::INDEX_KEY_SEPARATOR)
52
35
  iso_to, date = iso_to.split(INDEX_DATE_SEPARATOR)
53
36
  date = Date.parse(date) if date
@@ -60,10 +43,10 @@ module Money::RatesStore
60
43
 
61
44
  private
62
45
 
63
- def rate_key_for(currency_iso_from, currency_iso_to, date = nil)
64
- key = [currency_iso_from, currency_iso_to].join(Memory::INDEX_KEY_SEPARATOR)
65
- key = [key, date.to_s].join(INDEX_DATE_SEPARATOR) if date
66
- key.upcase
67
- end
46
+ def rate_key_for(currency_iso_from, currency_iso_to, date = nil)
47
+ key = [currency_iso_from, currency_iso_to].join(Memory::INDEX_KEY_SEPARATOR)
48
+ key = [key, date.to_s].join(INDEX_DATE_SEPARATOR) if date
49
+ key.upcase
50
+ end
68
51
  end
69
52
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eu_central_bank
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shane Emmons
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-17 00:00:00.000000000 Z
11
+ date: 2021-03-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.8.1
19
+ version: '1.9'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.8.1
26
+ version: '1.9'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: money
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -31,6 +31,9 @@ dependencies:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '6.13'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 6.13.6
34
37
  type: :runtime
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
@@ -38,6 +41,9 @@ dependencies:
38
41
  - - "~>"
39
42
  - !ruby/object:Gem::Version
40
43
  version: '6.13'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 6.13.6
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: rspec
43
49
  requirement: !ruby/object:Gem::Requirement
@@ -66,9 +72,10 @@ files:
66
72
  - lib/eu_central_bank.rb
67
73
  - lib/money/rates_store/store_with_historical_data_support.rb
68
74
  homepage: https://github.com/RubyMoney/eu_central_bank
69
- licenses: []
75
+ licenses:
76
+ - MIT
70
77
  metadata: {}
71
- post_install_message:
78
+ post_install_message:
72
79
  rdoc_options: []
73
80
  require_paths:
74
81
  - lib
@@ -83,9 +90,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
83
90
  - !ruby/object:Gem::Version
84
91
  version: '0'
85
92
  requirements: []
86
- rubyforge_project:
87
- rubygems_version: 2.6.8
88
- signing_key:
93
+ rubygems_version: 3.2.3
94
+ signing_key:
89
95
  specification_version: 4
90
96
  summary: Calculates exchange rates based on rates from european central bank. Money
91
97
  gem compatible.