big_money 1.1.0 → 1.2.0

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.
@@ -1,5 +1,5 @@
1
1
  ---
2
2
  :major: 1
3
- :minor: 1
3
+ :minor: 2
4
4
  :patch: 0
5
5
  :build:
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{big_money}
8
- s.version = "1.1.0"
8
+ s.version = "1.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Shane Hanna", "Marshall Roch"]
12
- s.date = %q{2010-01-22}
12
+ s.date = %q{2010-05-27}
13
13
  s.email = ["shane.hanna@gmail.com", "mroch@cmu.edu"]
14
14
  s.extra_rdoc_files = [
15
15
  "LICENSE",
@@ -42,14 +42,14 @@ Gem::Specification.new do |s|
42
42
  s.homepage = %q{http://github.com/shanna/big_money}
43
43
  s.rdoc_options = ["--charset=UTF-8"]
44
44
  s.require_paths = ["lib"]
45
- s.rubygems_version = %q{1.3.5}
45
+ s.rubygems_version = %q{1.3.6}
46
46
  s.summary = %q{BigDecimal backed amount of money in a particular currency.}
47
47
  s.test_files = [
48
48
  "test/test_exchange.rb",
49
- "test/helper.rb",
50
49
  "test/test_currency.rb",
51
50
  "test/test_big_money.rb",
52
- "test/test_parser.rb"
51
+ "test/test_parser.rb",
52
+ "test/helper.rb"
53
53
  ]
54
54
 
55
55
  if s.respond_to? :specification_version then
@@ -36,13 +36,31 @@ class BigMoney
36
36
 
37
37
  # Find the exchange rate between two currencies.
38
38
  #
39
- # Be aware no caching is done at all at the moment.
40
- #--
41
- # TODO: Moneta would be ideal for this.
39
+ # ==== Notes
40
+ #
41
+ # No caching is done by default. You can set one though using anything that behaves like a Hash for example the
42
+ # moneta library.
43
+ #
44
+ # ==== Example
45
+ #
46
+ # require 'bigmoney/exchanage'
47
+ # require 'moneta/memcache'
48
+ #
49
+ # BigMoney::Exchange.cache = Moneta::Memcache.new('localhost', default_ttl: 3_600)
42
50
  class Exchange
43
51
  class ConversionError < StandardError; end
44
52
 
45
53
  class << self
54
+ def cache=(store)
55
+ raise "Cache object #{store.class} does not respond to [] and []=." \
56
+ unless store.respond_to?(:'[]') and store.respond_to?(:'[]=')
57
+ @@cache = store
58
+ end
59
+
60
+ def cache
61
+ @@cache ||= nil
62
+ end
63
+
46
64
  @@services = []
47
65
  def inherited(service) #:nodoc:
48
66
  @@services << service
@@ -62,12 +80,20 @@ class BigMoney
62
80
  exchange << (Currency.find(to) or raise ArgumentError.new("Unknown +to+ currency #{to.inspect}."))
63
81
  return BigDecimal.new(1.to_s) if exchange.uniq.size == 1 || exchange.find{|c| c == Currency::XXX}
64
82
 
83
+ id = exchange.map{|c| c.code}.join(':')
84
+ if cache && rate = cache[id]
85
+ return rate
86
+ end
87
+
65
88
  service = @@services.reverse.find do |service|
66
89
  !!exchange.reject{|c| service.currencies.include?(c)}
67
90
  end
68
91
 
69
92
  service or raise ConversionError # TODO: Message?
70
- BigDecimal.new(service.read_rate(*exchange).to_s)
93
+ rate = BigDecimal.new(service.read_rate(*exchange).to_s)
94
+
95
+ cache[id] = rate if cache
96
+ rate
71
97
  end
72
98
 
73
99
  protected
@@ -33,5 +33,11 @@ class TestExchange < Test::Unit::TestCase
33
33
  assert_equal BigDecimal.new('1'), BigMoney::Exchange.rate(:usd, :xxx)
34
34
  assert_equal BigDecimal.new('1'), BigMoney::Exchange.rate(:xxx, :usd)
35
35
  end
36
+
37
+ should 'be cacheable' do
38
+ BigMoney::Exchange.cache = {}
39
+ BigMoney::Exchange.rate(:usd, :aud)
40
+ assert_equal BigDecimal.new('2'), BigMoney::Exchange.cache.values.first
41
+ end
36
42
  end
37
43
  end
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: big_money
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ prerelease: false
5
+ segments:
6
+ - 1
7
+ - 2
8
+ - 0
9
+ version: 1.2.0
5
10
  platform: ruby
6
11
  authors:
7
12
  - Shane Hanna
@@ -10,7 +15,7 @@ autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
17
 
13
- date: 2010-01-22 00:00:00 +11:00
18
+ date: 2010-05-27 00:00:00 +10:00
14
19
  default_executable:
15
20
  dependencies: []
16
21
 
@@ -61,24 +66,26 @@ required_ruby_version: !ruby/object:Gem::Requirement
61
66
  requirements:
62
67
  - - ">="
63
68
  - !ruby/object:Gem::Version
69
+ segments:
70
+ - 0
64
71
  version: "0"
65
- version:
66
72
  required_rubygems_version: !ruby/object:Gem::Requirement
67
73
  requirements:
68
74
  - - ">="
69
75
  - !ruby/object:Gem::Version
76
+ segments:
77
+ - 0
70
78
  version: "0"
71
- version:
72
79
  requirements: []
73
80
 
74
81
  rubyforge_project:
75
- rubygems_version: 1.3.5
82
+ rubygems_version: 1.3.6
76
83
  signing_key:
77
84
  specification_version: 3
78
85
  summary: BigDecimal backed amount of money in a particular currency.
79
86
  test_files:
80
87
  - test/test_exchange.rb
81
- - test/helper.rb
82
88
  - test/test_currency.rb
83
89
  - test/test_big_money.rb
84
90
  - test/test_parser.rb
91
+ - test/helper.rb