eu_central_bank 1.4.2 → 1.6.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 01a35ff1906fc6fcb306bff2804ed3684b8925ab
4
- data.tar.gz: 56e430e88205e5f30248570cacc32d7cfdcd7270
2
+ SHA256:
3
+ metadata.gz: 5a531cbda27d58075c18fb0ed04177d5d16872e178046854495fe87c2094678e
4
+ data.tar.gz: b87062758ed6a9ef559fbd42a8d3bdf4f59366abd3c201951a01af62bbfb46df
5
5
  SHA512:
6
- metadata.gz: e84505f83a5c70373b71cb0f07325fef8e11c313fa4936e607bc5162531b666a5e04f53a9dedf18270113ce402d3f3c65948cfac7633d1146782c437e64079fe
7
- data.tar.gz: beef6198548c17b60f27e0151cee6df2a59280ebdd7c4261621ca4359274ada0aa6d7043db5e6d25be2e54330e3a150f6aea1dc7b671d4fff0bf96138dcafe30
6
+ metadata.gz: fffe386b9fadfa03a24e36e77bb52d66df0c21e9d042e96a74e945b314798ee942938a3e2f9aec29c69aabedd2b3934bca780574112c842764f7708816ddeee9
7
+ data.tar.gz: 6f495beaafc197894bbeecb9333f31d4d5b530879f64d162442fc8389793a23f87096100ee5ebc9a978143f350445dbd6e0c6651448dddc870b35e7efac8da04
data/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
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
+
3
13
  ## 1.4.2 (Feb 2 2019)
4
14
 
5
15
  * Fix issue with importing exported rates
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)
@@ -146,7 +146,7 @@ class EuCentralBank < Money::Bank::VariableExchange
146
146
  from, to = key.split(SERIALIZER_SEPARATOR)
147
147
  to, date = to.split(SERIALIZER_DATE_SEPARATOR)
148
148
 
149
- store.add_rate from, to, BigDecimal(rate), date
149
+ store.add_rate from, to, BigDecimal(rate, DECIMAL_PRECISION), date
150
150
  end
151
151
  end
152
152
 
@@ -164,9 +164,9 @@ class EuCentralBank < Money::Bank::VariableExchange
164
164
 
165
165
  def doc(cache, url=ECB_RATES_URL)
166
166
  rates_source = !!cache ? cache : url
167
- 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') }
168
168
  rescue Nokogiri::XML::XPath::SyntaxError
169
- Nokogiri::XML(open(url))
169
+ Nokogiri::XML(open_url(url))
170
170
  end
171
171
 
172
172
  def doc_from_s(content)
@@ -178,7 +178,7 @@ class EuCentralBank < Money::Bank::VariableExchange
178
178
 
179
179
  store.transaction true do
180
180
  rates.each do |exchange_rate|
181
- rate = BigDecimal(exchange_rate.attribute("rate").value)
181
+ rate = BigDecimal(exchange_rate.attribute("rate").value, DECIMAL_PRECISION)
182
182
  currency = exchange_rate.attribute("currency").value
183
183
  set_rate("EUR", currency, rate)
184
184
  end
@@ -196,7 +196,7 @@ class EuCentralBank < Money::Bank::VariableExchange
196
196
 
197
197
  store.transaction true do
198
198
  rates.each do |exchange_rate|
199
- rate = BigDecimal(exchange_rate.attribute("rate").value)
199
+ rate = BigDecimal(exchange_rate.attribute("rate").value, DECIMAL_PRECISION)
200
200
  currency = exchange_rate.attribute("currency").value
201
201
  date = exchange_rate.parent.attribute("time").value
202
202
  set_rate("EUR", currency, rate, date)
@@ -214,8 +214,16 @@ class EuCentralBank < Money::Bank::VariableExchange
214
214
  def calculate_exchange(from, to_currency, rate)
215
215
  to_currency_money = Money::Currency.wrap(to_currency).subunit_to_unit
216
216
  from_currency_money = from.currency.subunit_to_unit
217
- 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)
218
218
  money = (decimal_money * from.cents * rate).round
219
219
  Money.new(money, to_currency)
220
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
221
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.2
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: 2019-02-02 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'
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'
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.