redis-bank 0.1.2 → 0.1.4
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.
- data/README.md +2 -2
- data/lib/redis-bank.rb +56 -11
- metadata +39 -12
data/README.md
CHANGED
@@ -15,6 +15,6 @@ Money.bank.add_rate("USD", "CAD", 1.24515)
|
|
15
15
|
Money.bank.add_rate("CAD", "USD", 0.803115)
|
16
16
|
Money.us_dollar(100).exchange_to("CAD") => Money.ca_dollar(124)
|
17
17
|
Money.ca_dollar(100).exchange_to("USD") => Money.us_dollar(80)
|
18
|
-
Money.bank.rates => {"
|
19
|
-
"
|
18
|
+
Money.bank.rates => {"usd_to_cad" => 1.24515,
|
19
|
+
"cad_to_usd" => 0.803115}
|
20
20
|
```
|
data/lib/redis-bank.rb
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
require 'money/bank/base'
|
2
|
+
require 'active_support/core_ext'
|
2
3
|
|
3
4
|
class Money
|
4
5
|
module Bank
|
5
6
|
# Thrown when an unknown rate format is requested.
|
6
7
|
class UnknownRateFormat < StandardError; end
|
7
8
|
|
8
|
-
KEY='redis_bank_exchange_rates'
|
9
|
-
|
10
9
|
# Class for aiding in exchanging money between different currencies. By
|
11
10
|
# default, the +Money+ class uses an object of this class (accessible
|
12
11
|
# through +Money#bank+) for performing currency exchanges.
|
@@ -25,15 +24,47 @@ class Money
|
|
25
24
|
# # Exchange 100 CAD to USD:
|
26
25
|
# bank.exchange_with(c2, "USD") #=> #<Money @cents=803115>
|
27
26
|
class RedisBank < Base
|
27
|
+
KEY='redis_bank_exchange_rates'
|
28
28
|
|
29
29
|
def initialize(redis_client, &block)
|
30
30
|
super(&block)
|
31
31
|
@redis_client = redis_client
|
32
32
|
end
|
33
33
|
|
34
|
+
# This allows the user to define a method of obtaining exchange rates
|
35
|
+
# should they not exist in redis.
|
36
|
+
# Once the new set of rates is obtained, it is stored in redis if
|
37
|
+
# write_through is set to true.
|
38
|
+
#
|
39
|
+
# @example
|
40
|
+
# bank = Money::Bank::RedisBank.new redis_client
|
41
|
+
# bank.set_fallback(true) { {"gbp_to_aud" => rand, "jpy_to_aud" => rand} }
|
42
|
+
# bank.rates # => {"gbp_to_aud"=>"1.75", "jpy_to_aud"=>"0.002"}
|
43
|
+
# redis_client.del "redis_bank_exchange_rates" # Oops!
|
44
|
+
# bank.rates # => {"gbp_to_aud"=>"0.861522064707917",
|
45
|
+
# "jpy_to_aud"=>"0.552042440462882"}
|
46
|
+
#
|
47
|
+
def set_fallback(write_through, &block)
|
48
|
+
@write_through = write_through
|
49
|
+
@fallback = block
|
50
|
+
end
|
51
|
+
|
34
52
|
# hash of exchange rates
|
35
53
|
def rates
|
36
|
-
|
54
|
+
begin
|
55
|
+
rates = @redis_client.hgetall KEY
|
56
|
+
if rates.blank? && @fallback
|
57
|
+
rates = @fallback.call
|
58
|
+
@redis_client.mapped_hmset KEY, rates if @write_through
|
59
|
+
end
|
60
|
+
rates
|
61
|
+
rescue
|
62
|
+
if @fallback
|
63
|
+
@fallback.call
|
64
|
+
else
|
65
|
+
raise
|
66
|
+
end
|
67
|
+
end
|
37
68
|
end
|
38
69
|
|
39
70
|
# Exchanges the given +Money+ object to a new +Money+ object in
|
@@ -103,11 +134,10 @@ class Money
|
|
103
134
|
# bank.add_rate("USD", "CAD", 1.24515)
|
104
135
|
# bank.add_rate("CAD", "USD", 0.803115)
|
105
136
|
def add_rate(from, to, rate)
|
106
|
-
set_rate
|
137
|
+
set_rate from, to, rate
|
107
138
|
end
|
108
139
|
|
109
|
-
# Set the rate for the given currencies.
|
110
|
-
# access.
|
140
|
+
# Set the rate for the given currencies.
|
111
141
|
#
|
112
142
|
# @param [Currency, String, Symbol] from Currency to exchange from.
|
113
143
|
# @param [Currency, String, Symbol] to Currency to exchange to.
|
@@ -122,9 +152,6 @@ class Money
|
|
122
152
|
def set_rate(from, to, rate)
|
123
153
|
@redis_client.hset KEY, rate_key_for(from, to), rate
|
124
154
|
end
|
125
|
-
|
126
|
-
# Retrieve the rate for the given currencies. Uses +Mutex+ to synchronize
|
127
|
-
# data access.
|
128
155
|
#
|
129
156
|
# @param [Currency, String, Symbol] from Currency to exchange from.
|
130
157
|
# @param [Currency, String, Symbol] to Currency to exchange to.
|
@@ -139,7 +166,25 @@ class Money
|
|
139
166
|
# bank.get_rate("USD", "CAD") #=> 1.24515
|
140
167
|
# bank.get_rate("CAD", "USD") #=> 0.803115
|
141
168
|
def get_rate(from, to)
|
142
|
-
|
169
|
+
from = from.downcase.strip if from.is_a? String
|
170
|
+
to = to.downcase.strip if to.is_a? String
|
171
|
+
return 1 if from == to
|
172
|
+
begin
|
173
|
+
rate = @redis_client.hget KEY, rate_key_for(from, to)
|
174
|
+
if rate.blank? && @fallback
|
175
|
+
rates = @fallback.call
|
176
|
+
rate = rates[rate_key_for(from, to)]
|
177
|
+
@redis_client.mapped_hmset KEY, rates if @write_through
|
178
|
+
end
|
179
|
+
rate
|
180
|
+
rescue
|
181
|
+
if @fallback
|
182
|
+
rates = @fallback.call
|
183
|
+
rate = rates[rate_key_for(from, to)]
|
184
|
+
else
|
185
|
+
raise
|
186
|
+
end
|
187
|
+
end
|
143
188
|
end
|
144
189
|
|
145
190
|
# Return the rate hashkey for the given currencies.
|
@@ -150,7 +195,7 @@ class Money
|
|
150
195
|
# @return [String]
|
151
196
|
#
|
152
197
|
# @example
|
153
|
-
# rate_key_for("USD", "CAD") #=> "
|
198
|
+
# rate_key_for("USD", "CAD") #=> "usd_to_cad"
|
154
199
|
def rate_key_for(from, to)
|
155
200
|
"#{Currency.wrap(from).iso_code}_to_#{Currency.wrap(to).iso_code}".downcase
|
156
201
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis-bank
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 4
|
10
|
+
version: 0.1.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Cameron Walsh
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-
|
18
|
+
date: 2012-08-23 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: money
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
type: :runtime
|
33
33
|
version_requirements: *id001
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
|
-
name:
|
35
|
+
name: activesupport
|
36
36
|
prerelease: false
|
37
37
|
requirement: &id002 !ruby/object:Gem::Requirement
|
38
38
|
none: false
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
segments:
|
44
44
|
- 0
|
45
45
|
version: "0"
|
46
|
-
type: :
|
46
|
+
type: :runtime
|
47
47
|
version_requirements: *id002
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
|
-
name:
|
49
|
+
name: money
|
50
50
|
prerelease: false
|
51
51
|
requirement: &id003 !ruby/object:Gem::Requirement
|
52
52
|
none: false
|
@@ -60,7 +60,7 @@ dependencies:
|
|
60
60
|
type: :development
|
61
61
|
version_requirements: *id003
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
|
-
name:
|
63
|
+
name: rake
|
64
64
|
prerelease: false
|
65
65
|
requirement: &id004 !ruby/object:Gem::Requirement
|
66
66
|
none: false
|
@@ -74,7 +74,7 @@ dependencies:
|
|
74
74
|
type: :development
|
75
75
|
version_requirements: *id004
|
76
76
|
- !ruby/object:Gem::Dependency
|
77
|
-
name:
|
77
|
+
name: rspec
|
78
78
|
prerelease: false
|
79
79
|
requirement: &id005 !ruby/object:Gem::Requirement
|
80
80
|
none: false
|
@@ -88,7 +88,7 @@ dependencies:
|
|
88
88
|
type: :development
|
89
89
|
version_requirements: *id005
|
90
90
|
- !ruby/object:Gem::Dependency
|
91
|
-
name:
|
91
|
+
name: simplecov
|
92
92
|
prerelease: false
|
93
93
|
requirement: &id006 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
@@ -102,7 +102,7 @@ dependencies:
|
|
102
102
|
type: :development
|
103
103
|
version_requirements: *id006
|
104
104
|
- !ruby/object:Gem::Dependency
|
105
|
-
name:
|
105
|
+
name: yard
|
106
106
|
prerelease: false
|
107
107
|
requirement: &id007 !ruby/object:Gem::Requirement
|
108
108
|
none: false
|
@@ -115,6 +115,34 @@ dependencies:
|
|
115
115
|
version: "0"
|
116
116
|
type: :development
|
117
117
|
version_requirements: *id007
|
118
|
+
- !ruby/object:Gem::Dependency
|
119
|
+
name: redcarpet
|
120
|
+
prerelease: false
|
121
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ">="
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
hash: 3
|
127
|
+
segments:
|
128
|
+
- 0
|
129
|
+
version: "0"
|
130
|
+
type: :development
|
131
|
+
version_requirements: *id008
|
132
|
+
- !ruby/object:Gem::Dependency
|
133
|
+
name: redis
|
134
|
+
prerelease: false
|
135
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
136
|
+
none: false
|
137
|
+
requirements:
|
138
|
+
- - ">="
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
hash: 3
|
141
|
+
segments:
|
142
|
+
- 0
|
143
|
+
version: "0"
|
144
|
+
type: :development
|
145
|
+
version_requirements: *id009
|
118
146
|
description: Redis-backed Bank for the Money gem based on the VariableExchange Bank
|
119
147
|
email: cameron.walsh@gmail.com
|
120
148
|
executables: []
|
@@ -163,4 +191,3 @@ specification_version: 3
|
|
163
191
|
summary: Redis-backed Bank for the Money gem
|
164
192
|
test_files: []
|
165
193
|
|
166
|
-
has_rdoc: yard
|