redis-bank 0.1.2 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/README.md +2 -2
  2. data/lib/redis-bank.rb +56 -11
  3. 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 => {"EXCHANGE_RATE_USD_TO_CAD" => 1.24515,
19
- "EXCHANGE_RATE_CAD_TO_USD" => 0.803115}
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
- @redis_client.hgetall KEY
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(from, to, rate)
137
+ set_rate from, to, rate
107
138
  end
108
139
 
109
- # Set the rate for the given currencies. Uses +Mutex+ to synchronize data
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
- @redis_client.hget KEY, rate_key_for(from, to)
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") #=> "exchange_rate_usd_to_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: 31
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 2
10
- version: 0.1.2
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-06-20 00:00:00 Z
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: money
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: :development
46
+ type: :runtime
47
47
  version_requirements: *id002
48
48
  - !ruby/object:Gem::Dependency
49
- name: rake
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: rspec
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: simplecov
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: yard
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: redis
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