google_currency_rails_cache 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gemtest ADDED
File without changes
data/AUTHORS ADDED
@@ -0,0 +1,8 @@
1
+ andersonbrandon
2
+ Donald Ball
3
+ James Chen
4
+ Jérémy Lecour
5
+ Lars Pind
6
+ Shane Emmons
7
+ sowenjub
8
+ Alex Kremer
data/CHANGELOG.md ADDED
@@ -0,0 +1,107 @@
1
+ Google Currency 2.2.0
2
+ =====================
3
+
4
+ - Update money dependency to ~> 5.1.0
5
+
6
+ Google Currency 2.1.0
7
+ =====================
8
+
9
+ - Update money dependency to ~> 5.0.0
10
+
11
+ Google Currency 2.0.2
12
+ =====================
13
+
14
+ Bugfixes
15
+ --------
16
+ - Fix encoding issue
17
+
18
+ Google Currency 2.0.1
19
+ =====================
20
+
21
+ Features
22
+ --------
23
+ - Handles funky exchange rates (Arnaud Joubay)
24
+
25
+ Bugfixes
26
+ --------
27
+ - Fix for running under 1.9.2 in TextMate (larspind)
28
+
29
+ Google Currency 2.0.0
30
+ =====================
31
+
32
+ Features
33
+ --------
34
+ - Added multi_json to allow users to select their own JSON parsing engine.
35
+ - Removed deprecated method #get_google_rate.
36
+
37
+ Bugfixes
38
+ --------
39
+ - Updated deprecated rake tasks
40
+
41
+ Google Currency 1.1.1
42
+ =====================
43
+
44
+ Bugfixes
45
+ --------
46
+ - Built gem using Ruby 1.8.7 to bypass a known error with RubyGems 1.5.0 and
47
+ Ruby 1.9.2
48
+
49
+ Google Currency 1.1.0
50
+ =====================
51
+
52
+ Features
53
+ --------
54
+ - Deprecated #get_google_rate, use #get_rate (thanks RMU Alumni)
55
+
56
+ Bugfixes
57
+ ---------
58
+ - Fixed an issue when rates over 1000 did not parse correctly (thanks Brandon
59
+ Anderson)
60
+
61
+ Google Currency 1.0.3
62
+ =====================
63
+
64
+ Features
65
+ --------
66
+ - Update `money` requirement to `~> 3.5`
67
+
68
+ Google Currency 1.0.2
69
+ =====================
70
+
71
+ Features
72
+ --------
73
+ - Replace `eval` with `JSON.parse`
74
+ - Use BigDecimal instead of Float
75
+
76
+ Bugfixes
77
+ --------
78
+ - Quell parenthetical warnings in specs
79
+
80
+ Google Currency 1.0.1
81
+ =====================
82
+
83
+ Features
84
+ --------
85
+ - Update `money` requirement to `~> 3.1.5`
86
+
87
+ Google Currency 1.0.0
88
+ =====================
89
+
90
+ Features
91
+ --------
92
+ - Updated `money` requirement to `~> 3.1.0`
93
+
94
+ Google Currency 0.1.1
95
+ =====================
96
+
97
+ Features
98
+ --------
99
+ - Added #flush_rates
100
+ - Added #flush_rate
101
+
102
+ Google Currency 0.1.0
103
+ =====================
104
+
105
+ Features
106
+ --------
107
+ - Initial release
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Shane Emmons
2
+
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:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
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.
data/README.md ADDED
@@ -0,0 +1,39 @@
1
+ Google Currency with Rails Cache
2
+ ================================
3
+
4
+ This gem extends Money::Bank::VariableExchange with Money::Bank::GoogleCurrency
5
+ and gives you access to the current Google Currency exchange rates.
6
+
7
+ You have to load one of the JSON libraries supported by
8
+ [MultiJSON](https://github.com/intridea/multi_json) (`json` for example)
9
+ if it's not already loaded by your application. In a Rails application,
10
+ ActiveSupport provides a JSON implementation that is automatically recognized.
11
+
12
+ This fork of the original GoogleCurrency library uses the Rails.cache for exchange rate
13
+ storage instead of a Mutex. It is designed for multiple application server environments.
14
+
15
+ Usage
16
+ -----
17
+
18
+ require 'money'
19
+ require 'money/bank/google_currency'
20
+ require 'json'
21
+ MultiJson.engine = :json_gem # or :yajl
22
+
23
+ # set default bank to instance of GoogleCurrency
24
+ Money.default_bank = Money::Bank::GoogleCurrency.new
25
+
26
+ # create a new money object, and use the standard #exchange_to method
27
+ n = 1.to_money(:USD)
28
+ n.exchange_to(:EUR)
29
+
30
+ An `UnknownRate` will be thrown if `#exchange_to` is called with a `Currency`
31
+ that `Money` knows, but Google does not.
32
+
33
+ An `UnknownCurrency` will be thrown if `#exchange_to` is called with a
34
+ `Currency` that `Money` does not know.
35
+
36
+ Copyright
37
+ ---------
38
+
39
+ Original Google Currency work is Copyright (c) 2011 Shane Emmons. See {file:LICENSE} for details.
data/Rakefile ADDED
@@ -0,0 +1,49 @@
1
+ require 'rubygems'
2
+ require 'rake/clean'
3
+
4
+ CLOBBER.include('.yardoc', 'doc')
5
+
6
+ def gemspec
7
+ @gemspec ||= begin
8
+ file = File.expand_path("../google_currency.gemspec", __FILE__)
9
+ eval(File.read(file), binding, file)
10
+ end
11
+ end
12
+
13
+ begin
14
+ require 'rspec/core/rake_task'
15
+ RSpec::Core::RakeTask.new
16
+ rescue LoadError
17
+ task(:spec){abort "`gem install rspec` to run specs"}
18
+ end
19
+ task :default => :spec
20
+ task :test => :spec
21
+
22
+ begin
23
+ require 'yard'
24
+ YARD::Rake::YardocTask.new do |t|
25
+ t.options << "--files" << "CHANGELOG.md,LICENSE"
26
+ end
27
+ rescue LoadError
28
+ task(:yard){abort "`gem install yard` to generate documentation"}
29
+ end
30
+
31
+ begin
32
+ require 'rubygems/package_task'
33
+ Gem::PackageTask.new(gemspec) do |pkg|
34
+ pkg.gem_spec = gemspec
35
+ end
36
+ task :gem => :gemspec
37
+ rescue LoadError
38
+ task(:gem){abort "`gem install rake` to package gems"}
39
+ end
40
+
41
+ desc "Install the gem locally"
42
+ task :install => :gem do
43
+ sh "gem install pkg/#{gemspec.full_name}.gem"
44
+ end
45
+
46
+ desc "Validate the gemspec"
47
+ task :gemspec do
48
+ gemspec.validate
49
+ end
@@ -0,0 +1,28 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "google_currency_rails_cache"
3
+ s.version = "1.0.0"
4
+ s.platform = Gem::Platform::RUBY
5
+ s.authors = ["Shane Emmons", "Alex Kremer"]
6
+ s.email = ["semmons99@gmail.com", "alex@flextrip.com"]
7
+ s.homepage = "http://github.com/flextrip/google_currency_rails_cache"
8
+ s.summary = "Access the Google Currency exchange rate data."
9
+ s.description = "GoogleCurrency extends Money::Bank::Base and gives you access to the current Google Currency exchange rates. This fork allows caching of exchange rate data in Rails.cache and removes the necessity for the Mutex."
10
+
11
+ s.required_rubygems_version = ">= 1.3.6"
12
+
13
+ s.add_development_dependency "rspec", ">= 2.0.0"
14
+ s.add_development_dependency "yard", ">= 0.5.8"
15
+ s.add_development_dependency "json", ">= 1.4.0"
16
+ s.add_development_dependency "yajl-ruby", ">= 1.0.0"
17
+ s.add_development_dependency "ffi"
18
+
19
+ s.add_dependency "money", "~> 5.1.0"
20
+ s.add_dependency "multi_json", ">= 1.0.0"
21
+ s.add_dependency "rails", "> 3.2"
22
+
23
+ s.files = Dir.glob("{lib,spec}/**/*")
24
+ s.files += %w(LICENSE README.md CHANGELOG.md AUTHORS)
25
+ s.files += %w(Rakefile .gemtest google_currency_rails_cache.gemspec)
26
+
27
+ s.require_path = "lib"
28
+ end
@@ -0,0 +1,169 @@
1
+ require 'money'
2
+ require 'open-uri'
3
+ require 'multi_json'
4
+
5
+ class Money
6
+ module Bank
7
+ class GoogleCurrencyRailsCache < Money::Bank::VariableExchange
8
+
9
+ SERVICE_HOST = "www.google.com"
10
+ SERVICE_PATH = "/ig/calculator"
11
+
12
+ # @return [Hash] Stores the currently known rates.
13
+ attr_reader :rates
14
+
15
+ ##
16
+ # Clears all rates stored in @rates
17
+ #
18
+ # @return [Hash] The empty @rates Hash.
19
+ #
20
+ # @example
21
+ # @bank = GoogleCurrency.new #=> <Money::Bank::GoogleCurrency...>
22
+ # @bank.get_rate(:USD, :EUR) #=> 0.776337241
23
+ # @bank.flush_rates #=> {}
24
+ def flush_rates
25
+ @rates.keys.each do |rate_key|
26
+ Rails.cache.delete "exchange_rate/#{rate_key}"
27
+ end
28
+ @rates.clear
29
+ end
30
+
31
+ ##
32
+ # Clears the specified rate stored in @rates.
33
+ #
34
+ # @param [String, Symbol, Currency] from Currency to convert from (used
35
+ # for key into @rates).
36
+ # @param [String, Symbol, Currency] to Currency to convert to (used for
37
+ # key into @rates).
38
+ #
39
+ # @return [Float] The flushed rate.
40
+ #
41
+ # @example
42
+ # @bank = GoogleCurrency.new #=> <Money::Bank::GoogleCurrency...>
43
+ # @bank.get_rate(:USD, :EUR) #=> 0.776337241
44
+ # @bank.flush_rate(:USD, :EUR) #=> 0.776337241
45
+ def flush_rate(from, to)
46
+ rate_key = rate_key_for(from, to)
47
+ Rails.cache.delete "exchange_rate/#{rate_key}"
48
+ @rates.delete(rate_key)
49
+ end
50
+
51
+ ##
52
+ # Returns the requested rate.
53
+ #
54
+ # @param [String, Symbol, Currency] from Currency to convert from
55
+ # @param [String, Symbol, Currency] to Currency to convert to
56
+ #
57
+ # @return [Float] The requested rate.
58
+ #
59
+ # @example
60
+ # @bank = GoogleCurrency.new #=> <Money::Bank::GoogleCurrency...>
61
+ # @bank.get_rate(:USD, :EUR) #=> 0.776337241
62
+ def get_rate(from, to)
63
+ @rates[rate_key_for(from, to)] ||= Rails.cache.fetch("exchange_rate/#{rate_key_for(from, to)}", :expires_in => 12.hours ) {
64
+ fetch_rate(from, to)
65
+ }
66
+ end
67
+
68
+ private
69
+
70
+ ##
71
+ # Queries for the requested rate and returns it.
72
+ #
73
+ # @param [String, Symbol, Currency] from Currency to convert from
74
+ # @param [String, Symbol, Currency] to Currency to convert to
75
+ #
76
+ # @return [BigDecimal] The requested rate.
77
+ def fetch_rate(from, to)
78
+ from, to = Currency.wrap(from), Currency.wrap(to)
79
+
80
+ data = build_uri(from, to).read
81
+ data = fix_response_json_data(data)
82
+
83
+ error = data['error']
84
+ raise UnknownRate unless error == '' || error == '0'
85
+ decode_rate data['rhs']
86
+ end
87
+
88
+ ##
89
+ # Build a URI for the given arguments.
90
+ #
91
+ # @param [Currency] from The currency to convert from.
92
+ # @param [Currency] to The currency to convert to.
93
+ #
94
+ # @return [URI::HTTP]
95
+ def build_uri(from, to)
96
+ uri = URI::HTTP.build(
97
+ :host => SERVICE_HOST,
98
+ :path => SERVICE_PATH,
99
+ :query => "hl=en&q=1#{from.iso_code}%3D%3F#{to.iso_code}"
100
+ )
101
+ end
102
+
103
+ ##
104
+ # Takes the invalid JSON returned by Google and fixes it.
105
+ #
106
+ # @param [String] data The JSON string to fix.
107
+ #
108
+ # @return [Hash]
109
+ def fix_response_json_data(data)
110
+ data.gsub!(/lhs:/, '"lhs":')
111
+ data.gsub!(/rhs:/, '"rhs":')
112
+ data.gsub!(/error:/, '"error":')
113
+ data.gsub!(/icc:/, '"icc":')
114
+ data.gsub!(Regexp.new("(\\\\x..|\\\\240)"), '')
115
+
116
+ MultiJson.decode(data)
117
+ end
118
+
119
+ ##
120
+ # Takes the 'rhs' response from Google and decodes it.
121
+ #
122
+ # @param [String] rhs The google rate string to decode.
123
+ #
124
+ # @return [BigDecimal]
125
+ def decode_rate(rhs)
126
+ if complex_rate?(rhs)
127
+ decode_complex_rate(rhs)
128
+ else
129
+ decode_basic_rate(rhs)
130
+ end
131
+ end
132
+
133
+ ##
134
+ # Takes the 'rhs' response from Google and decides if it's a complex rate
135
+ #
136
+ # @param [String] rhs The google rate string to check.
137
+ #
138
+ # @return [Boolean]
139
+ def complex_rate?(rhs)
140
+ rhs.match(/10x3csupx3e(-?\d+)x3c\/supx3e/)
141
+ end
142
+
143
+ ##
144
+ # Takes a complex 'rhs' response from Google and converts it to a numeric
145
+ # rate.
146
+ #
147
+ # @param [String] rhs The complex google rate string to convert.
148
+ #
149
+ # @return [BigDecimal]
150
+ def decode_complex_rate(rhs)
151
+ rate = BigDecimal(rhs.match(/\d[\d\s]*\.?\d*/)[0])
152
+ power = rhs.match(/10x3csupx3e(-?\d+)x3c\/supx3e/)
153
+
154
+ rate * 10**power[1].to_i
155
+ end
156
+
157
+ ##
158
+ # Takes a basic 'rhs' response from Google and converts it to a numeric
159
+ # rate.
160
+ #
161
+ # @param [String] rhs The basic google rate string to convert.
162
+ #
163
+ # @return [BigDecimal]
164
+ def decode_basic_rate(rhs)
165
+ BigDecimal(rhs.gsub(/[^\d\.]/, ''))
166
+ end
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,64 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ require 'money'
4
+ require 'money/bank/google_currency_rails_cache'
5
+ require 'rails'
6
+
7
+ require 'json'
8
+ MultiJson.engine = :json_gem
9
+
10
+ describe "GoogleCurrency" do
11
+
12
+ before :each do
13
+ Rails.stub(:cache).and_return(ActiveSupport::Cache::MemoryStore.new)
14
+ @bank = Money::Bank::GoogleCurrencyRailsCache.new
15
+ end
16
+
17
+ describe "#get_rate" do
18
+ it "should use #fetch_rate when rate is unknown" do
19
+ @bank.should_receive(:fetch_rate).once
20
+ @bank.get_rate('USD', 'USD')
21
+ end
22
+
23
+ it "should not use #fetch_rate when rate is known" do
24
+ @bank.get_rate('USD', 'USD')
25
+ @bank.should_not_receive(:fetch_rate)
26
+ @bank.get_rate('USD', 'USD')
27
+ end
28
+
29
+ it "should return the correct rate" do
30
+ @bank.get_rate('USD', 'USD').should == 1.0
31
+ end
32
+
33
+ it "should store the rate for faster retreival" do
34
+ @bank.get_rate('USD', 'EUR')
35
+ @bank.rates.should include('USD_TO_EUR')
36
+ end
37
+
38
+ it "should handle complex rates" do
39
+ uri = double('uri')
40
+ @bank.stub(:build_uri){|from,to| uri }
41
+ uri.stub(:read) { %q({lhs: "1 Vietnamese dong",rhs: "4.8 \x26#215; 10\x3csup\x3e-5\x3c/sup\x3e U.S. dollars",error: "",icc: true}) }
42
+
43
+ @bank.get_rate('VND', 'USD').should == BigDecimal("0.48215105E1")
44
+ end
45
+ end
46
+
47
+ describe "#flush_rates" do
48
+ it "should empty @rates" do
49
+ @bank.get_rate('USD', 'EUR')
50
+ @bank.flush_rates
51
+ @bank.rates.should == {}
52
+ end
53
+ end
54
+
55
+ describe "#flush_rate" do
56
+ it "should remove a specific rate from @rates" do
57
+ @bank.get_rate('USD', 'EUR')
58
+ @bank.get_rate('USD', 'JPY')
59
+ @bank.flush_rate('USD', 'EUR')
60
+ @bank.rates.should include('USD_TO_JPY')
61
+ @bank.rates.should_not include('USD_TO_EUR')
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,63 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ require 'money'
4
+ require 'money/bank/google_currency_rails_cache'
5
+
6
+ require 'rails'
7
+
8
+ require 'yajl'
9
+ MultiJson.engine = :yajl
10
+
11
+ describe "GoogleCurrency" do
12
+ before :each do
13
+ Rails.stub(:cache).and_return(ActiveSupport::Cache::MemoryStore.new)
14
+ @bank = Money::Bank::GoogleCurrencyRailsCache.new
15
+ end
16
+
17
+ describe "#get_rate" do
18
+ it "should use #fetch_rate when rate is unknown" do
19
+ @bank.should_receive(:fetch_rate).once
20
+ @bank.get_rate('USD', 'USD')
21
+ end
22
+
23
+ it "should not use #fetch_rate when rate is known" do
24
+ @bank.get_rate('USD', 'USD')
25
+ @bank.should_not_receive(:fetch_rate)
26
+ @bank.get_rate('USD', 'USD')
27
+ end
28
+
29
+ it "should return the correct rate" do
30
+ @bank.get_rate('USD', 'USD').should == 1.0
31
+ end
32
+
33
+ it "should store the rate for faster retreival" do
34
+ @bank.get_rate('USD', 'EUR')
35
+ @bank.rates.should include('USD_TO_EUR')
36
+ end
37
+
38
+ it "should handle complex rates" do
39
+ uri = double('uri')
40
+ @bank.stub(:build_uri){|from,to| uri }
41
+ uri.stub(:read) { %q({lhs: "1 Vietnamese dong",rhs: "4.8 \x26#215; 10\x3csup\x3e-5\x3c/sup\x3e U.S. dollars",error: "",icc: true}) }
42
+ @bank.get_rate('VND', 'USD').should == BigDecimal("0.48215105E1")
43
+ end
44
+ end
45
+
46
+ describe "#flush_rates" do
47
+ it "should empty @rates" do
48
+ @bank.get_rate('USD', 'EUR')
49
+ @bank.flush_rates
50
+ @bank.rates.should == {}
51
+ end
52
+ end
53
+
54
+ describe "#flush_rate" do
55
+ it "should remove a specific rate from @rates" do
56
+ @bank.get_rate('USD', 'EUR')
57
+ @bank.get_rate('USD', 'JPY')
58
+ @bank.flush_rate('USD', 'EUR')
59
+ @bank.rates.should include('USD_TO_JPY')
60
+ @bank.rates.should_not include('USD_TO_EUR')
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,2 @@
1
+ RSpec.configure do |config|
2
+ end
metadata ADDED
@@ -0,0 +1,189 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: google_currency_rails_cache
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Shane Emmons
9
+ - Alex Kremer
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2013-06-29 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rspec
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: 2.0.0
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: 2.0.0
31
+ - !ruby/object:Gem::Dependency
32
+ name: yard
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: 0.5.8
39
+ type: :development
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: 0.5.8
47
+ - !ruby/object:Gem::Dependency
48
+ name: json
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: 1.4.0
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: 1.4.0
63
+ - !ruby/object:Gem::Dependency
64
+ name: yajl-ruby
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: 1.0.0
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: 1.0.0
79
+ - !ruby/object:Gem::Dependency
80
+ name: ffi
81
+ requirement: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ type: :development
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ - !ruby/object:Gem::Dependency
96
+ name: money
97
+ requirement: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ~>
101
+ - !ruby/object:Gem::Version
102
+ version: 5.1.0
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 5.1.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: multi_json
113
+ requirement: !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ! '>='
117
+ - !ruby/object:Gem::Version
118
+ version: 1.0.0
119
+ type: :runtime
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ none: false
123
+ requirements:
124
+ - - ! '>='
125
+ - !ruby/object:Gem::Version
126
+ version: 1.0.0
127
+ - !ruby/object:Gem::Dependency
128
+ name: rails
129
+ requirement: !ruby/object:Gem::Requirement
130
+ none: false
131
+ requirements:
132
+ - - ! '>'
133
+ - !ruby/object:Gem::Version
134
+ version: '3.2'
135
+ type: :runtime
136
+ prerelease: false
137
+ version_requirements: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>'
141
+ - !ruby/object:Gem::Version
142
+ version: '3.2'
143
+ description: GoogleCurrency extends Money::Bank::Base and gives you access to the
144
+ current Google Currency exchange rates. This fork allows caching of exchange rate
145
+ data in Rails.cache and removes the necessity for the Mutex.
146
+ email:
147
+ - semmons99@gmail.com
148
+ - alex@flextrip.com
149
+ executables: []
150
+ extensions: []
151
+ extra_rdoc_files: []
152
+ files:
153
+ - lib/money/bank/google_currency_rails_cache.rb
154
+ - spec/google_currency_with_json_spec.rb
155
+ - spec/google_currency_with_yajl_spec.rb
156
+ - spec/spec_helper.rb
157
+ - LICENSE
158
+ - README.md
159
+ - CHANGELOG.md
160
+ - AUTHORS
161
+ - Rakefile
162
+ - .gemtest
163
+ - google_currency_rails_cache.gemspec
164
+ homepage: http://github.com/flextrip/google_currency_rails_cache
165
+ licenses: []
166
+ post_install_message:
167
+ rdoc_options: []
168
+ require_paths:
169
+ - lib
170
+ required_ruby_version: !ruby/object:Gem::Requirement
171
+ none: false
172
+ requirements:
173
+ - - ! '>='
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
176
+ required_rubygems_version: !ruby/object:Gem::Requirement
177
+ none: false
178
+ requirements:
179
+ - - ! '>='
180
+ - !ruby/object:Gem::Version
181
+ version: 1.3.6
182
+ requirements: []
183
+ rubyforge_project:
184
+ rubygems_version: 1.8.25
185
+ signing_key:
186
+ specification_version: 3
187
+ summary: Access the Google Currency exchange rate data.
188
+ test_files: []
189
+ has_rdoc: