currency 0.4.3 → 0.4.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.
@@ -50,4 +50,5 @@ test/new_york_fed_test.rb
50
50
  test/parser_test.rb
51
51
  test/test_base.rb
52
52
  test/time_quantitizer_test.rb
53
+ test/timed_cache_test.rb
53
54
  test/xe_test.rb
data/Rakefile CHANGED
@@ -26,8 +26,9 @@ Can store/retrieve Money values using ActiveRecord.
26
26
 
27
27
  For more details, see:
28
28
 
29
+ http://rubyforge.org/projects/currency/
29
30
  http://currency.rubyforge.org/
30
- http://currency.rubyforge.org/files/README.txt
31
+ http://currency.rubyforge.org/files/README_txt.html
31
32
 
32
33
  }
33
34
 
@@ -68,7 +69,7 @@ PKG_SVN_ROOT="svn+ssh://rubyforge.org/var/svn/#{PKG_NAME}/#{PKG_NAME}"
68
69
 
69
70
  release, release_notes = get_release_notes
70
71
 
71
- hoe = Hoe.new("currency", release) do |p|
72
+ hoe = Hoe.new(PKG_Name.downcase, release) do |p|
72
73
  p.author = 'Kurt Stephens'
73
74
  p.description = PKG_DESCRIPTION
74
75
  p.email = "ruby-#{PKG_NAME}@umleta.com"
@@ -1,5 +1,12 @@
1
1
  = Currency Release History
2
2
 
3
+ == Release 0.4.4: 2007/04/01
4
+
5
+ * Fixed TimedCache.
6
+ * Updated documentation.
7
+ * Added support for Parser#time = :now.
8
+ * Added support for Time in Formatter and Parser using Time#xmlschema.
9
+
3
10
  == Release 0.4.3: 2007/04/01
4
11
 
5
12
  * Added available? checks for NewYorkFed.
@@ -26,7 +26,9 @@
26
26
  # exchange rates from http://xe.com/ :
27
27
  #
28
28
  # require 'currency'
29
+ # require 'currency/exchange/rate/deriver'
29
30
  # require 'currency/exchange/rate/source/xe'
31
+ # require 'currency/exchange/rate/source/timed_cache'
30
32
  #
31
33
  # # Rate source initialization
32
34
  # provider = Currency::Exchange::Rate::Source::Xe.new
@@ -1,5 +1,5 @@
1
1
  module Currency
2
- CurrencyVersion = '0.4.3'
2
+ CurrencyVersion = '0.4.4'
3
3
  end
4
4
  # DO NOT EDIT
5
5
  # This file is auto-generated by build scripts.
@@ -41,9 +41,9 @@ class Currency::Exchange::Rate::Deriver < Currency::Exchange::Rate::Source::Base
41
41
 
42
42
  # Flush all cached Rates.
43
43
  def clear_rates
44
- @derived_rate.clear
44
+ @derived_rates.clear
45
45
  @all_rates.clear
46
- @source.clear
46
+ @source.clear_rates
47
47
  super
48
48
  end
49
49
 
@@ -140,6 +140,11 @@ class Currency::Exchange::Rate::Deriver < Currency::Exchange::Rate::Source::Base
140
140
  end
141
141
 
142
142
 
143
+ def load_rates(time = nil)
144
+ all_rates(time)
145
+ end
146
+
147
+
143
148
  # Returns true if the underlying rate provider is available.
144
149
  def available?(time = nil)
145
150
  source.available?(time)
@@ -41,10 +41,15 @@ require 'currency/exchange/rate'
41
41
  #
42
42
  # Somewhere at initialization of application:
43
43
  #
44
- # provider = Currency::Exchange::Rate::Source::Xe.new
45
- # deriver = Currency::Exchange::Rate::Deriver.new(:source => provider)
46
- # cache = Currency::Exchange::Rate::Source::TimedCache.new(:source => deriver)
47
- # Currency::Exchange::Rate::Source.default = cache
44
+ # require 'currency'
45
+ # require 'currency/exchange/rate/deriver'
46
+ # require 'currency/exchange/rate/source/xe'
47
+ # require 'currency/exchange/rate/source/timed_cache'
48
+ #
49
+ # provider = Currency::Exchange::Rate::Source::Xe.new
50
+ # deriver = Currency::Exchange::Rate::Deriver.new(:source => provider)
51
+ # cache = Currency::Exchange::Rate::Source::TimedCache.new(:source => deriver)
52
+ # Currency::Exchange::Rate::Source.default = cache
48
53
  #
49
54
  module Currency::Exchange::Rate::Source
50
55
 
@@ -34,7 +34,7 @@ class Currency::Exchange::Rate::Source::Test < Currency::Exchange::Rate::Source:
34
34
  def self.USD_EUR; 0.7737; end
35
35
 
36
36
 
37
- # Test rate from :USD to :EUR.
37
+ # Test rate from :USD to :GBP.
38
38
  def self.USD_GBP; 0.5098; end
39
39
 
40
40
 
@@ -26,6 +26,14 @@ class Currency::Exchange::Rate::Source::TimedCache < ::Currency::Exchange::Rate:
26
26
  attr_accessor :time_to_live_fudge
27
27
 
28
28
 
29
+ # Returns the time of the last load.
30
+ attr_reader :rate_load_time
31
+
32
+
33
+ # Returns the time of the next load.
34
+ attr_reader :rate_reload_time
35
+
36
+
29
37
  # Returns source's name.
30
38
  def name
31
39
  source.name
@@ -35,15 +43,18 @@ class Currency::Exchange::Rate::Source::TimedCache < ::Currency::Exchange::Rate:
35
43
  def initialize(*opt)
36
44
  self.time_to_live = 600
37
45
  self.time_to_live_fudge = 30
38
- @rate_timestamp = nil
46
+ @rate_load_time = nil
47
+ @rate_reload_time = nil
39
48
  @processing_rates = false
49
+ @cached_rates = { }
50
+ @cached_rates_old = nil
40
51
  super(*opt)
41
52
  end
42
53
 
43
54
 
44
55
  # Clears current rates.
45
56
  def clear_rates
46
- @cached_rates.clear
57
+ @cached_rates = { }
47
58
  @source.clear_rates
48
59
  super
49
60
  end
@@ -53,16 +64,16 @@ class Currency::Exchange::Rate::Source::TimedCache < ::Currency::Exchange::Rate:
53
64
  # is expired.
54
65
  def expired?
55
66
  if @time_to_live &&
56
- @rates_renew_time &&
57
- (Time.now > @rates_renew_time)
67
+ @rate_reload_time &&
68
+ (Time.now > @rate_reload_time)
58
69
 
59
70
  if @cached_rates
60
- $stderr.puts "#{self}: rates expired on #{@rates_renew_time}" if @verbose
61
-
62
- @cached_rates_old ||= @cashed_rates
71
+ $stderr.puts "#{self}: rates expired on #{@rate_reload_time}" if @verbose
63
72
 
64
- @cached_rates = nil
73
+ @cached_rates_old = @cached_rates
65
74
  end
75
+
76
+ clear_rates
66
77
 
67
78
  true
68
79
  else
@@ -79,7 +90,17 @@ class Currency::Exchange::Rate::Source::TimedCache < ::Currency::Exchange::Rate:
79
90
  super(c1, c2, time)
80
91
  end
81
92
 
93
+
94
+ def get_rate(c1, c2, time)
95
+ # STDERR.puts "get_rate #{c1} #{c2} #{time}"
96
+ rates = load_rates(time)
97
+ # STDERR.puts "rates = #{rates.inspect}"
98
+ rate = rates && (rates.select{|x| x.c1 == c1 && x.c2 == c2}[0])
99
+ # STDERR.puts "rate = #{rate.inspect}"
100
+ rate
101
+ end
82
102
 
103
+
83
104
  # Returns an array of all the cached Rates.
84
105
  def rates(time = nil)
85
106
  load_rates(time)
@@ -92,52 +113,85 @@ class Currency::Exchange::Rate::Source::TimedCache < ::Currency::Exchange::Rate:
92
113
  expired?
93
114
 
94
115
  # Return rates, if cached.
95
- return @cached_rates if @cashed_rates
116
+ return rates if rates = @cached_rates["#{time}"]
96
117
 
97
- # Force load of rates
98
- @cached_rates = _load_rates_from_source(time)
118
+ # Force load of rates.
119
+ rates = @cached_rates["#{time}"] = _load_rates_from_source(time)
99
120
 
121
+ # Update expiration.
122
+ _calc_rate_reload_time
123
+
124
+ return nil unless rates
125
+
100
126
  # Flush old rates.
101
127
  @cached_rates_old = nil
102
-
103
- # Update expiration.
104
- if time_to_live
105
- @rates_renew_time = @rate_timestamp + (time_to_live + (time_to_live_fudge || 0))
106
- $stderr.puts "#{self}: rates expire on #{@rates_renew_time}" if @verbose
107
- end
108
-
109
- @rates
128
+
129
+ rates
110
130
  end
111
131
 
112
132
 
133
+ def time_to_live=(x)
134
+ @time_to_live = x
135
+ _calc_rate_reload_time
136
+ x
137
+ end
138
+
139
+
140
+ def time_to_live_fudge=(x)
141
+ @time_to_live_fudge = x
142
+ _calc_rate_reload_time
143
+ x
144
+ end
145
+
146
+
147
+ def _calc_rate_reload_time
148
+ if @time_to_live && @rate_load_time
149
+ @rate_reload_time = @rate_load_time + (@time_to_live + (@time_to_live_fudge || 0))
150
+ $stderr.puts "#{self}: rates expire on #{@rate_reload_time}" if @verbose
151
+ end
152
+
153
+ end
154
+
155
+
156
+
113
157
  def _load_rates_from_source(time = nil) # :nodoc:
114
- # Do not allow re-entrancy
115
- raise "Reentry!" if @processing_rates
158
+ rates = nil
116
159
 
117
- # Begin processing new rate request.
118
- @processing_rates = true
160
+ begin
161
+ # Do not allow re-entrancy
162
+ raise "Reentry!" if @processing_rates
163
+
164
+ # Begin processing new rate request.
165
+ @processing_rates = true
119
166
 
120
- # Clear cached Rates.
121
- clear_rates
167
+ # Clear cached Rates.
168
+ clear_rates
122
169
 
123
- # Load rates from the source.
124
- rates = source.load_rates(time)
170
+ # Load rates from the source.
171
+ rates = source.load_rates(time)
125
172
 
126
- unless rates
127
- # FIXME: raise Exception::???
128
- return rates
173
+ # Compute new rate timestamp.
174
+ @rate_load_time = Time.now
175
+
176
+ # STDERR.puts "rate_load_time = #{@rate_load_time}"
177
+ ensure
178
+ # End processsing new rate request.
179
+ @processing_rates = false
180
+
129
181
  end
130
182
 
131
- # Compute new rate timestamp.
132
- @rate_timestamp = Time.now
183
+ # STDERR.puts "_load_rates => #{rates.inspect}"
133
184
 
134
- # End processsing new rate request.
135
- @processing_rates = false
136
-
137
185
  rates
138
186
  end
139
187
 
140
188
 
189
+ # Returns true if the underlying rate provider is available.
190
+ def available?(time = nil)
191
+ source.available?(time)
192
+ end
193
+
194
+
141
195
  end # class
142
196
 
143
197
 
@@ -1,6 +1,8 @@
1
1
  # Copyright (C) 2006-2007 Kurt Stephens <ruby-currency(at)umleta.com>
2
2
  # See LICENSE.txt for details.
3
3
 
4
+ require 'rss/rss' # Time#xmlschema
5
+
4
6
 
5
7
  # This class formats a Money value as a String.
6
8
  # Each Currency has a default Formatter.
@@ -32,7 +34,9 @@ class Currency::Formatter
32
34
  # The currency code or nil.
33
35
  attr_accessor :code
34
36
 
35
-
37
+ # The time or nil.
38
+ attr_accessor :time
39
+
36
40
  def initialize(opts = @@empty_hash)
37
41
  @template =
38
42
  @template_proc =
@@ -89,6 +93,13 @@ class Currency::Formatter
89
93
  # If true, append currency code.
90
94
  attr_accessor :code
91
95
 
96
+ # If true, append the time.
97
+ attr_accessor :time
98
+
99
+ # The number of fractional digits in the time.
100
+ # Defaults to 4.
101
+ attr_accessor :time_fractional_digits
102
+
92
103
  # If true, use html formatting.
93
104
  #
94
105
  # Currency::Money(12.45, :EUR).to_s(:html => true; :code => true)
@@ -98,7 +109,7 @@ class Currency::Formatter
98
109
  # A template string used to format a money value.
99
110
  # Defaults to:
100
111
  #
101
- # '#{code}#{code && " "}#{symbol}#{sign}#{whole}#{fraction}'
112
+ # '#{code}#{code && " "}#{symbol}#{sign}#{whole}#{fraction}#{time && " "}#{time}'
102
113
  attr_accessor :template
103
114
 
104
115
 
@@ -112,6 +123,8 @@ class Currency::Formatter
112
123
  self.symbol = false
113
124
  self.code = false
114
125
  self.html = false
126
+ self.time = false
127
+ self.time_fractional_digits = nil
115
128
  end
116
129
  x
117
130
  end
@@ -138,7 +151,10 @@ class Currency::Formatter
138
151
  @symbol = true
139
152
  @code = false
140
153
  @html = false
141
- @template = '#{code}#{code && " "}#{symbol}#{sign}#{whole}#{fraction}'
154
+ @time = false
155
+ @time_fractional_digits = 4
156
+ @template = '#{code}#{code && " "}#{symbol}#{sign}#{whole}#{fraction}#{time && " "}#{time}'
157
+ @template_object = nil
142
158
 
143
159
  opt.each_pair{ | k, v | self.send("#{k}=", v) }
144
160
  end
@@ -171,10 +187,13 @@ class Currency::Formatter
171
187
  end
172
188
 
173
189
 
174
- def _format(m, currency = nil) # :nodoc:
190
+ def _format(m, currency = nil, time = nil) # :nodoc:
175
191
  # Get currency.
176
192
  currency ||= m.currency
177
193
 
194
+ # Get time.
195
+ time ||= m.time
196
+
178
197
  # Setup template
179
198
  tmpl = self.template_object.clone
180
199
  # $stderr.puts "template.template = #{tmpl.template.inspect}"
@@ -219,8 +238,11 @@ class Currency::Formatter
219
238
  tmpl.symbol = @symbol ? ((@html && currency.symbol_html) || currency.symbol) : nil
220
239
 
221
240
 
222
- # Suffix with currency code.
241
+ # Add currency code.
223
242
  tmpl.code = @code ? _format_Currency(currency) : nil
243
+
244
+ # Add time.
245
+ tmpl.time = @time ? time && _format_Time(time) : nil
224
246
 
225
247
  # Ask template to format the components.
226
248
  tmpl.format
@@ -236,6 +258,13 @@ class Currency::Formatter
236
258
  end
237
259
 
238
260
 
261
+ def _format_Time(t) # :nodoc:
262
+ x = ''
263
+ x << t.getutc.xmlschema(@time_fractional_digits) if t
264
+ x
265
+ end
266
+
267
+
239
268
  @@empty_hash = { }
240
269
  @@empty_hash.freeze
241
270
 
@@ -278,10 +278,10 @@ class Currency::Money
278
278
  end
279
279
  end
280
280
 
281
- # Basic inspection, with symbol and currency code.
281
+ # Basic inspection, with symbol, currency code and time.
282
282
  # The standard #inspect method is available as #inspect_deep.
283
283
  def inspect(*opts)
284
- self.format(:symbol => true, :code => true)
284
+ self.format(:symbol => true, :code => true, :time => true)
285
285
  end
286
286
 
287
287
  # How to alias a method defined in an object superclass in a different class:
@@ -2,6 +2,9 @@
2
2
  # See LICENSE.txt for details.
3
3
 
4
4
 
5
+ require 'rss/rss' # Time#xmlschema
6
+
7
+
5
8
  # This class parses a Money value from a String.
6
9
  # Each Currency has a default Parser.
7
10
  class Currency::Parser
@@ -16,6 +19,7 @@ class Currency::Parser
16
19
  attr_accessor :enforce_currency
17
20
 
18
21
  # The default Time to use if no Time is specified in the string.
22
+ # If :now, time is set to Time.new.
19
23
  attr_accessor :time
20
24
 
21
25
  @@default = nil
@@ -34,6 +38,7 @@ class Currency::Parser
34
38
 
35
39
  def initialize(opt = { })
36
40
  @time =
41
+ @enforce_currency =
37
42
  @currency =
38
43
  nil
39
44
  opt.each_pair{ | k, v | self.send("#{k}=", v) }
@@ -50,15 +55,28 @@ class Currency::Parser
50
55
 
51
56
  # $stderr.puts "'#{x}'.Money_rep(#{self})"
52
57
 
58
+ # Parse time.
59
+ time = nil
60
+ if (md = /(\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d(\.\d+)?Z)/.match(x))
61
+ time = Time.xmlschema(md[1])
62
+ unless time
63
+ raise ::Currency::Exception::InvalidMoneyString.new("time: #{str.inspect} #{currency} #{x.inspect}")
64
+ end
65
+ x = md.pre_match + md.post_match
66
+ end
67
+ # Default time
68
+ time ||= @time
69
+ time = Time.new if time == :now
70
+
53
71
  # $stderr.puts "x = #{x}"
54
72
  convert_currency = nil
55
- # Handle currency code at front of string.
73
+ # Handle currency code in string.
56
74
  if (md = /([A-Z][A-Z][A-Z])/.match(x))
57
75
  curr = ::Currency::Currency.get(md[1])
58
76
  x = md.pre_match + md.post_match
59
77
  if @currency && @currency != curr
60
78
  if @enforce_currency
61
- raise ::Currency::Exception::IncompatibleCurrency.new("#{str.inspect} #{@currency.code}")
79
+ raise ::Currency::Exception::IncompatibleCurrency.new("currency: #{str.inspect} #{@currency.code}")
62
80
  end
63
81
  convert_currency = @currency
64
82
  end
@@ -67,7 +85,7 @@ class Currency::Parser
67
85
  currency = @currency || ::Currency::Currency.default
68
86
  currency = ::Currency::Currency.get(currency)
69
87
  end
70
-
88
+
71
89
  # Remove placeholders and symbol.
72
90
  x = x.gsub(/[, ]/, '')
73
91
  symbol = currency.symbol # FIXME
@@ -107,7 +125,7 @@ class Currency::Parser
107
125
 
108
126
  x = whole.to_i
109
127
 
110
- x = ::Currency::Money.new_rep(x, currency, @time)
128
+ x = ::Currency::Money.new_rep(x, currency, time)
111
129
  else
112
130
  # $stderr.puts "'#{self}'.parse(#{str}) => ??? '#{x}'"
113
131
  #x.to_f.Money_rep(self)
@@ -130,13 +148,13 @@ class Currency::Parser
130
148
  # Parse a Money string in this Currency.
131
149
  #
132
150
  # "123.45".money # Using default Currency.
133
- # => $123.45 USD
151
+ # => USD $123.45
134
152
  #
135
- # "123.45 USD".money # Explicit Currency.
136
- # => $123.45 USD
153
+ # "$123.45 USD".money # Explicit Currency.
154
+ # => USD $123.45
137
155
  #
138
- # "123.45 CAD".money
139
- # => $123.45 CAD
156
+ # "CAD 123.45".money
157
+ # => CAD $123.45
140
158
  #
141
159
  # "123.45 CAD".money(:USD) # Incompatible explicit Currency.
142
160
  # !!! "123.45 CAD" USD (Currency::Exception::IncompatibleCurrency)
@@ -15,11 +15,12 @@ class FormatterTest < TestBase
15
15
  # Simple stuff.
16
16
  #
17
17
 
18
- def test_default
19
- assert_kind_of Money, m = ::Currency::Money.new_rep(123456789)
20
- assert_equal m.currency, Currency.default
21
- assert_equal m.currency.code, :USD
18
+ def test_default(time = nil)
19
+ assert_kind_of Money, m = ::Currency::Money.new_rep(123456789, :USD, time)
20
+ assert_equal Currency.default, m.currency
21
+ assert_equal :USD, m.currency.code
22
22
  assert_equal "$1,234,567.89", m.to_s
23
+ assert_equal time, m.time
23
24
 
24
25
  m
25
26
  end
@@ -60,6 +61,7 @@ class FormatterTest < TestBase
60
61
  m
61
62
  end
62
63
 
64
+
63
65
  def test_misc
64
66
  m = ::Currency::Money(12.45, :USD)
65
67
  assert_equal "<span class=\"currency_code\">USD</span> $12.45",
@@ -75,6 +77,15 @@ class FormatterTest < TestBase
75
77
  end
76
78
 
77
79
 
80
+ def test_time
81
+ time = Time.new
82
+ m = test_default(time)
83
+ assert_equal "$1,234,567.89", m.to_s(:time => false)
84
+ assert_equal "$1,234,567.89 #{time.getutc.xmlschema(4)}", m.to_s(:time => true)
85
+
86
+ m
87
+ end
88
+
78
89
  end
79
90
 
80
91
  end # module
@@ -54,6 +54,51 @@ class ParserTest < TestBase
54
54
  assert_equal m.inspect, m2.inspect
55
55
  end
56
56
 
57
+
58
+ def test_round_trip_time
59
+ ::Currency::Currency.default = :USD
60
+ time = Time.now.getutc
61
+ assert_not_nil m = ::Currency::Money("1234567.89", :CAD, time)
62
+ assert_not_nil m.time
63
+ assert_not_nil m2 = ::Currency::Money(m.inspect)
64
+ assert_not_nil m2.time
65
+ assert_equal m.rep, m2.rep
66
+ assert_equal m.currency, m2.currency
67
+ assert_equal m.time.to_i, m2.time.to_i
68
+ assert_equal m.inspect, m2.inspect
69
+ end
70
+
71
+
72
+ def test_time_nil
73
+ parser = ::Currency::Parser.new
74
+ parser.time = nil
75
+
76
+ assert_not_nil m = parser.parse("$1234.55")
77
+ assert_equal nil, m.time
78
+ end
79
+
80
+
81
+ def test_time
82
+ parser = ::Currency::Parser.new
83
+ parser.time = Time.new
84
+
85
+ assert_not_nil m = parser.parse("$1234.55")
86
+ assert_equal parser.time, m.time
87
+ end
88
+
89
+
90
+ def test_time_now
91
+ parser = ::Currency::Parser.new
92
+ parser.time = :now
93
+
94
+ assert_not_nil m = parser.parse("$1234.55")
95
+ assert_not_nil m1_time = m.time
96
+
97
+ assert_not_nil m = parser.parse("$1234.55")
98
+ assert_not_nil m2_time = m.time
99
+
100
+ assert_not_equal m1_time, m2_time
101
+ end
57
102
  end
58
103
 
59
104
  end # module
@@ -0,0 +1,95 @@
1
+ # Copyright (C) 2006-2007 Kurt Stephens <ruby-currency(at)umleta.com>
2
+ # See LICENSE.txt for details.
3
+
4
+ require 'test/test_base'
5
+
6
+ require 'currency'
7
+ require 'currency/exchange/rate/source/xe'
8
+ require 'currency/exchange/rate/source/timed_cache'
9
+
10
+ module Currency
11
+
12
+ class TimedCacheTest < TestBase
13
+ def setup
14
+ super
15
+ end
16
+
17
+
18
+ def get_rate_source
19
+ @source = source = Exchange::Rate::Source::Xe.new
20
+
21
+ # source.verbose = true
22
+ deriver = Exchange::Rate::Deriver.new(:source => source)
23
+
24
+ @cache = cache = Exchange::Rate::Source::TimedCache.new(:source => deriver)
25
+
26
+ cache
27
+ end
28
+
29
+
30
+ def test_timed_cache_usd_cad
31
+ assert_not_nil rates = @source.raw_rates
32
+ assert_not_nil rates[:USD]
33
+ assert_not_nil usd_cad = rates[:USD][:CAD]
34
+
35
+ assert_not_nil usd = Money.new(123.45, :USD)
36
+ assert_not_nil cad = usd.convert(:CAD)
37
+
38
+ assert_kind_of Numeric, m = (cad.to_f / usd.to_f)
39
+ # $stderr.puts "m = #{m}"
40
+ assert_equal_float usd_cad, m, 0.001
41
+ end
42
+
43
+
44
+ def test_timed_cache_cad_eur
45
+ assert_not_nil rates = @source.raw_rates
46
+ assert_not_nil rates[:USD]
47
+ assert_not_nil usd_cad = rates[:USD][:CAD]
48
+ assert_not_nil usd_eur = rates[:USD][:EUR]
49
+
50
+ assert_not_nil cad = Money.new(123.45, :CAD)
51
+ assert_not_nil eur = cad.convert(:EUR)
52
+
53
+ assert_kind_of Numeric, m = (eur.to_f / cad.to_f)
54
+ # $stderr.puts "m = #{m}"
55
+ assert_equal_float((1.0 / usd_cad) * usd_eur, m, 0.001)
56
+ end
57
+
58
+
59
+ def test_reload
60
+ # @cache.verbose = 5
61
+
62
+ test_timed_cache_cad_eur
63
+
64
+ assert_not_nil rates = @source.raw_rates
65
+ assert_not_nil rates[:USD]
66
+ assert_not_nil usd_cad_1 = rates[:USD][:CAD]
67
+
68
+ assert_not_nil t1 = @cache.rate_load_time
69
+ assert_not_nil t1_reload = @cache.rate_reload_time
70
+ assert t1_reload.to_i > t1.to_i
71
+
72
+ @cache.time_to_live = 5
73
+ @cache.time_to_live_fudge = 0
74
+
75
+ # puts @cache.rate_reload_time.to_i - @cache.rate_load_time.to_i
76
+ assert @cache.rate_reload_time.to_i - @cache.rate_load_time.to_i == @cache.time_to_live
77
+
78
+ sleep 10
79
+
80
+ test_timed_cache_cad_eur
81
+
82
+ assert_not_nil t2 = @cache.rate_load_time
83
+ assert t1.to_i != t2.to_i
84
+
85
+ assert_not_nil rates = @source.raw_rates
86
+ assert_not_nil rates[:USD]
87
+ assert_not_nil usd_cad_2 = rates[:USD][:CAD]
88
+
89
+ assert usd_cad_1.object_id != usd_cad_2.object_id
90
+ end
91
+
92
+ end
93
+
94
+ end # module
95
+
metadata CHANGED
@@ -3,16 +3,16 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: currency
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.4.3
7
- date: 2007-04-01 00:00:00 -04:00
8
- summary: "Currency models currencies, monetary values, foreign exchanges rates. Pulls live and historical rates from http://xe.com/, http://newyorkfed.org/, http://thefinancials.com/. Can store/retrieve historical rate data from database using ActiveRecord. Can store/retrieve Money values using ActiveRecord. For more details, see: http://currency.rubyforge.org/ http://currency.rubyforge.org/files/README.txt"
6
+ version: 0.4.4
7
+ date: 2007-04-30 00:00:00 -04:00
8
+ summary: "Currency models currencies, monetary values, foreign exchanges rates. Pulls live and historical rates from http://xe.com/, http://newyorkfed.org/, http://thefinancials.com/. Can store/retrieve historical rate data from database using ActiveRecord. Can store/retrieve Money values using ActiveRecord. For more details, see: http://rubyforge.org/projects/currency/ http://currency.rubyforge.org/ http://currency.rubyforge.org/files/README_txt.html"
9
9
  require_paths:
10
10
  - lib
11
11
  - test
12
12
  email: ruby-currency@umleta.com
13
13
  homepage: http://rubyforge.org/projects/currency
14
14
  rubyforge_project: currency
15
- description: "Currency models currencies, monetary values, foreign exchanges rates. Pulls live and historical rates from http://xe.com/, http://newyorkfed.org/, http://thefinancials.com/. Can store/retrieve historical rate data from database using ActiveRecord. Can store/retrieve Money values using ActiveRecord. For more details, see: http://currency.rubyforge.org/ http://currency.rubyforge.org/files/README.txt"
15
+ description: "Currency models currencies, monetary values, foreign exchanges rates. Pulls live and historical rates from http://xe.com/, http://newyorkfed.org/, http://thefinancials.com/. Can store/retrieve historical rate data from database using ActiveRecord. Can store/retrieve Money values using ActiveRecord. For more details, see: http://rubyforge.org/projects/currency/ http://currency.rubyforge.org/ http://currency.rubyforge.org/files/README_txt.html"
16
16
  autorequire:
17
17
  default_executable:
18
18
  bindir: bin
@@ -82,6 +82,7 @@ files:
82
82
  - test/parser_test.rb
83
83
  - test/test_base.rb
84
84
  - test/time_quantitizer_test.rb
85
+ - test/timed_cache_test.rb
85
86
  - test/xe_test.rb
86
87
  test_files: []
87
88