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.
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