google_currency 3.2.0 → 3.3.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/AUTHORS +1 -0
- data/CHANGELOG.md +9 -0
- data/README.md +21 -2
- data/google_currency.gemspec +2 -2
- data/lib/money/bank/google_currency.rb +20 -12
- data/lib/money/rates_store/rate_removal_support.rb +27 -0
- data/spec/google_currency_with_json_spec.rb +4 -4
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b57390ef56dd1b049e7b5d9fd8a3ed893791779
|
4
|
+
data.tar.gz: 38469aad714942d2fb16afa1b933a2d31e6940b0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8207d9c3712b4e58da9080e9dcf1b1bf43620d615205435ebd36b2895824f99a155a52b3889bafa4729ee275d7e9c17d96728f65110ceeccc88de0188d805cf1
|
7
|
+
data.tar.gz: ed516c931481812b71dad0290ef1a657742eb743c2ff46699ec210a4c644e9dd3e23c4b8aba96a702269d6a893a5382139264b6af3e48c2dca66efc40e98c183
|
data/AUTHORS
CHANGED
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -24,7 +24,8 @@ Usage
|
|
24
24
|
money = Money.new(1_00, "USD") # amount is in cents
|
25
25
|
money.exchange_to(:EUR)
|
26
26
|
|
27
|
-
# or install the 'monetize' gem
|
27
|
+
# or install and use the 'monetize' gem
|
28
|
+
require 'monetize'
|
28
29
|
money = 1.to_money(:USD)
|
29
30
|
money.exchange_to(:EUR)
|
30
31
|
|
@@ -36,7 +37,25 @@ An `UnknownCurrency` will be thrown if `#exchange_to` is called with a
|
|
36
37
|
|
37
38
|
A `GoogleCurrencyFetchError` will be thrown if there is an unknown issue with the Google Finance Converter API.
|
38
39
|
|
40
|
+
Caveats
|
41
|
+
-------
|
42
|
+
|
43
|
+
This gem uses [Google Finance Converter](https://www.google.com/finance/converter) under the hood.
|
44
|
+
|
45
|
+
Exchange rates are,
|
46
|
+
|
47
|
+
1. Based on 1 unit of the original currency.
|
48
|
+
1. Have a precision of 4 decimal places.
|
49
|
+
|
50
|
+
What this means is that if the JPY to USD exchange rate is 0.0083660,
|
51
|
+
Google will report the JPY to USD exchange rate as 0.0084.
|
52
|
+
As a result, a larger JPY to USD conversion such as 10000 JPY to USD would yield 84 USD instead of 83.66 USD.
|
53
|
+
|
54
|
+
Consequently, this means that small exchange rates will be imprecise.
|
55
|
+
For example, if the IDR to USD exchange rate were 0.00007761, Google will report it as 0.0001.
|
56
|
+
This means 100000 IDR would exchange to 10 USD instead of 7.76 USD.
|
57
|
+
|
39
58
|
Copyright
|
40
59
|
---------
|
41
60
|
|
42
|
-
Copyright (c) 2011 Shane Emmons. See
|
61
|
+
Copyright (c) 2011 Shane Emmons. See [LICENSE](LICENSE) for details.
|
data/google_currency.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "google_currency"
|
3
|
-
s.version = "3.
|
3
|
+
s.version = "3.3.0"
|
4
4
|
s.platform = Gem::Platform::RUBY
|
5
5
|
s.authors = ["Shane Emmons"]
|
6
6
|
s.email = ["semmons99@gmail.com"]
|
@@ -13,7 +13,7 @@ Gem::Specification.new do |s|
|
|
13
13
|
s.add_development_dependency "yard", ">= 0.5.8"
|
14
14
|
s.add_development_dependency "ffi"
|
15
15
|
|
16
|
-
s.add_dependency "money", "~> 6.
|
16
|
+
s.add_dependency "money", "~> 6.7"
|
17
17
|
|
18
18
|
s.files = Dir.glob("{lib,spec}/**/*")
|
19
19
|
s.files += %w(LICENSE README.md CHANGELOG.md AUTHORS)
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'money'
|
2
|
+
require 'money/rates_store/rate_removal_support'
|
2
3
|
require 'open-uri'
|
3
4
|
|
4
5
|
class Money
|
@@ -14,6 +15,7 @@ class Money
|
|
14
15
|
SERVICE_HOST = "www.google.com"
|
15
16
|
SERVICE_PATH = "/finance/converter"
|
16
17
|
|
18
|
+
|
17
19
|
# @return [Hash] Stores the currently known rates.
|
18
20
|
attr_reader :rates
|
19
21
|
|
@@ -43,6 +45,11 @@ class Money
|
|
43
45
|
end
|
44
46
|
end
|
45
47
|
|
48
|
+
def initialize(*)
|
49
|
+
super
|
50
|
+
@store.extend Money::RatesStore::RateRemovalSupport
|
51
|
+
end
|
52
|
+
|
46
53
|
##
|
47
54
|
# Clears all rates stored in @rates
|
48
55
|
#
|
@@ -53,9 +60,7 @@ class Money
|
|
53
60
|
# @bank.get_rate(:USD, :EUR) #=> 0.776337241
|
54
61
|
# @bank.flush_rates #=> {}
|
55
62
|
def flush_rates
|
56
|
-
|
57
|
-
@rates = {}
|
58
|
-
}
|
63
|
+
store.clear_rates
|
59
64
|
end
|
60
65
|
|
61
66
|
##
|
@@ -73,10 +78,7 @@ class Money
|
|
73
78
|
# @bank.get_rate(:USD, :EUR) #=> 0.776337241
|
74
79
|
# @bank.flush_rate(:USD, :EUR) #=> 0.776337241
|
75
80
|
def flush_rate(from, to)
|
76
|
-
|
77
|
-
@mutex.synchronize{
|
78
|
-
@rates.delete(key)
|
79
|
-
}
|
81
|
+
store.remove_rate(from, to)
|
80
82
|
end
|
81
83
|
|
82
84
|
##
|
@@ -94,10 +96,7 @@ class Money
|
|
94
96
|
# @bank.get_rate(:USD, :EUR) #=> 0.776337241
|
95
97
|
def get_rate(from, to)
|
96
98
|
expire_rates
|
97
|
-
|
98
|
-
@mutex.synchronize{
|
99
|
-
@rates[rate_key_for(from, to)] ||= fetch_rate(from, to)
|
100
|
-
}
|
99
|
+
store.get_rate(from, to) || store.add_rate(from, to, fetch_rate(from, to))
|
101
100
|
end
|
102
101
|
|
103
102
|
##
|
@@ -124,9 +123,18 @@ class Money
|
|
124
123
|
#
|
125
124
|
# @return [BigDecimal] The requested rate.
|
126
125
|
def fetch_rate(from, to)
|
126
|
+
|
127
127
|
from, to = Currency.wrap(from), Currency.wrap(to)
|
128
|
+
|
128
129
|
data = build_uri(from, to).read
|
129
|
-
extract_rate(data)
|
130
|
+
rate = extract_rate(data);
|
131
|
+
|
132
|
+
if (rate < 0.1)
|
133
|
+
rate = 1/extract_rate(build_uri(to, from).read)
|
134
|
+
end
|
135
|
+
|
136
|
+
rate
|
137
|
+
|
130
138
|
end
|
131
139
|
|
132
140
|
##
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Money::RatesStore
|
2
|
+
module RateRemovalSupport
|
3
|
+
# Remove a conversion rate and returns it. Uses +Mutex+ to synchronize data access.
|
4
|
+
#
|
5
|
+
# @param [String] currency_iso_from Currency to exchange from.
|
6
|
+
# @param [String] currency_iso_to Currency to exchange to.
|
7
|
+
#
|
8
|
+
# @return [Numeric]
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
# store = Money::RatesStore::Memory.new
|
12
|
+
# store.remove_rate("USD", "CAD")
|
13
|
+
# store.remove_rate("CAD", "USD")
|
14
|
+
def remove_rate(currency_iso_from, currency_iso_to)
|
15
|
+
transaction { index.delete rate_key_for(currency_iso_from, currency_iso_to) }
|
16
|
+
end
|
17
|
+
|
18
|
+
# Clears all conversion rates. Uses +Mutex+ to synchronize data access.
|
19
|
+
#
|
20
|
+
# @example
|
21
|
+
# store = Money::RatesStore::Memory.new
|
22
|
+
# store.clear_rates
|
23
|
+
def clear_rates
|
24
|
+
transaction { @index = {} }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -46,7 +46,7 @@ describe "GoogleCurrency" do
|
|
46
46
|
|
47
47
|
it "should store the rate for faster retreival" do
|
48
48
|
@bank.get_rate('USD', 'EUR')
|
49
|
-
expect(@bank.
|
49
|
+
expect(@bank.store.instance_variable_get("@index")).to include('USD_TO_EUR')
|
50
50
|
end
|
51
51
|
|
52
52
|
context "handles" do
|
@@ -80,7 +80,7 @@ describe "GoogleCurrency" do
|
|
80
80
|
it "should empty @rates" do
|
81
81
|
@bank.get_rate('USD', 'EUR')
|
82
82
|
@bank.flush_rates
|
83
|
-
expect(@bank.
|
83
|
+
expect(@bank.store.instance_variable_get("@index")).to eq({})
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
@@ -89,8 +89,8 @@ describe "GoogleCurrency" do
|
|
89
89
|
@bank.get_rate('USD', 'EUR')
|
90
90
|
@bank.get_rate('USD', 'JPY')
|
91
91
|
@bank.flush_rate('USD', 'EUR')
|
92
|
-
expect(@bank.
|
93
|
-
expect(@bank.
|
92
|
+
expect(@bank.store.instance_variable_get("@index")).to include('USD_TO_JPY')
|
93
|
+
expect(@bank.store.instance_variable_get("@index")).to_not include('USD_TO_EUR')
|
94
94
|
end
|
95
95
|
end
|
96
96
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: google_currency
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shane Emmons
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 6.
|
61
|
+
version: '6.7'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 6.
|
68
|
+
version: '6.7'
|
69
69
|
description: GoogleCurrency extends Money::Bank::Base and gives you access to the
|
70
70
|
current Google Currency exchange rates.
|
71
71
|
email:
|
@@ -82,6 +82,7 @@ files:
|
|
82
82
|
- Rakefile
|
83
83
|
- google_currency.gemspec
|
84
84
|
- lib/money/bank/google_currency.rb
|
85
|
+
- lib/money/rates_store/rate_removal_support.rb
|
85
86
|
- spec/google_currency_with_json_spec.rb
|
86
87
|
- spec/rates/error.html
|
87
88
|
- spec/rates/sgd_to_usd.html
|
@@ -107,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
107
108
|
version: '0'
|
108
109
|
requirements: []
|
109
110
|
rubyforge_project:
|
110
|
-
rubygems_version: 2.
|
111
|
+
rubygems_version: 2.4.5.1
|
111
112
|
signing_key:
|
112
113
|
specification_version: 4
|
113
114
|
summary: Access the Google Currency exchange rate data.
|