eu_central_bank 1.3.1 → 1.6.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
- SHA1:
3
- metadata.gz: 87c3be2859e80a5b6333cd87bcf2895c653baf3a
4
- data.tar.gz: a78a0dc23f3acdd61c927d8c23cac695535250e9
2
+ SHA256:
3
+ metadata.gz: f8305b19d4e97311f612dff41676d21546bde2ee5bdf34ca0a11b329681f8cc1
4
+ data.tar.gz: 272e8a8bc25af1aca904743b5336865bb40725874a60161fe700c49ebff5e6e3
5
5
  SHA512:
6
- metadata.gz: b89ae31c95e961aec67596968dc44d2c7393012b19d98b081a7c7b7c2e132f1bcbb7d4a3003398ba4d2e04a7e3658789574b265241887cbf1d7b2f682f796882
7
- data.tar.gz: 555eb9d9f044f74d880e4bd6e9e58206922d6cec4682d835489ce28eefb1e8103bf36f4dea6a456fc50b82a6f82167ced83c78c383f64e803220dc95d9ec9e00
6
+ metadata.gz: 43df545b3f015459fd1a10065e4989afe35ab57f0dcc34c989dcf008de739e82887223d1c4fe5d995203b612f33f2ec30c3e252f6d8585f7299484c59bd0117a
7
+ data.tar.gz: 511ed0225001148ee8cc84a3a0e9c7d7a6f31663399a762ee98ed5a254589e791320959ef44fde7950949c8cf1274a0310d31b6963f8256cda7352f53cbd08e4
@@ -1,5 +1,24 @@
1
1
  # eu_central_bank changelog
2
2
 
3
+ ## 1.5.0 (Dec 7 2019)
4
+
5
+ * Fix issue with money gem incompatibility
6
+ * Fix thread safety of the default rates store
7
+ * Bump money dependency to >= 6.13.6
8
+
9
+ ## 1.4.2 (Feb 2 2019)
10
+
11
+ * Fix issue with importing exported rates
12
+
13
+ ## 1.4.1 (Jan 14 2019)
14
+
15
+ * Relax Nokogiri dependency to `~> 1.8` on newer rubies
16
+
17
+ ## 1.4.0 (Dec 17 2018)
18
+
19
+ * Update money dependency to 6.13.x
20
+ * Relax money dependency to a minor version
21
+
3
22
  ## 1.3.1 (Sep 6 2018)
4
23
 
5
24
  * Fix HTTPS redirection error
@@ -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
@@ -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.3.1
4
+ version: 1.6.0
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-09-07 00:00:00.000000000 Z
11
+ date: 2021-01-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -16,28 +16,34 @@ 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
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 6.11.0
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
37
40
  requirements:
38
41
  - - "~>"
39
42
  - !ruby/object:Gem::Version
40
- version: 6.11.0
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.5.2
88
- signing_key:
93
+ rubygems_version: 3.0.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.