exchange 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data/.gitignore +1 -0
  2. data/.rspec +1 -1
  3. data/Gemfile.lock +3 -3
  4. data/README.rdoc +115 -47
  5. data/benchmark/benchmark.rb +49 -0
  6. data/changelog.rdoc +8 -1
  7. data/lib/exchange.rb +4 -4
  8. data/lib/exchange/base.rb +1 -1
  9. data/lib/exchange/cache.rb +2 -0
  10. data/lib/exchange/cache/base.rb +20 -6
  11. data/lib/exchange/cache/configuration.rb +24 -0
  12. data/lib/exchange/cache/file.rb +24 -9
  13. data/lib/exchange/cache/memcached.rb +3 -3
  14. data/lib/exchange/cache/memory.rb +89 -0
  15. data/lib/exchange/cache/rails.rb +1 -1
  16. data/lib/exchange/cache/redis.rb +4 -4
  17. data/lib/exchange/configurable.rb +53 -0
  18. data/lib/exchange/configuration.rb +32 -26
  19. data/lib/exchange/core_extensions.rb +3 -0
  20. data/lib/exchange/core_extensions/cachify.rb +25 -0
  21. data/lib/exchange/core_extensions/float/error_safe.rb +25 -0
  22. data/lib/{core_extensions → exchange/core_extensions/numeric}/conversability.rb +12 -12
  23. data/lib/exchange/external_api.rb +2 -1
  24. data/lib/exchange/external_api/base.rb +34 -9
  25. data/lib/exchange/external_api/call.rb +6 -8
  26. data/lib/exchange/external_api/configuration.rb +25 -0
  27. data/lib/exchange/external_api/ecb.rb +16 -25
  28. data/lib/exchange/external_api/json.rb +11 -1
  29. data/lib/exchange/external_api/open_exchange_rates.rb +65 -0
  30. data/lib/exchange/external_api/xavier_media.rb +7 -7
  31. data/lib/exchange/iso_4217.rb +32 -5
  32. data/lib/exchange/{currency.rb → money.rb} +112 -110
  33. data/lib/exchange/typecasting.rb +94 -0
  34. data/spec/exchange/cache/base_spec.rb +2 -2
  35. data/spec/exchange/cache/configuration_spec.rb +56 -0
  36. data/spec/exchange/cache/file_spec.rb +10 -8
  37. data/spec/exchange/cache/memcached_spec.rb +9 -18
  38. data/spec/exchange/cache/memory_spec.rb +122 -0
  39. data/spec/exchange/cache/no_cache_spec.rb +5 -15
  40. data/spec/exchange/cache/rails_spec.rb +2 -6
  41. data/spec/exchange/cache/redis_spec.rb +8 -18
  42. data/spec/exchange/configuration_spec.rb +31 -7
  43. data/spec/exchange/core_extensions/array/cachify_spec.rb +12 -0
  44. data/spec/exchange/core_extensions/float/error_safe_spec.rb +49 -0
  45. data/spec/exchange/core_extensions/hash/cachify_spec.rb +12 -0
  46. data/spec/exchange/core_extensions/numeric/cachify_spec.rb +26 -0
  47. data/spec/{core_extensions → exchange/core_extensions/numeric}/conversability_spec.rb +22 -22
  48. data/spec/exchange/core_extensions/string/cachify_spec.rb +59 -0
  49. data/spec/exchange/core_extensions/symbol/cachify_spec.rb +12 -0
  50. data/spec/exchange/external_api/base_spec.rb +10 -7
  51. data/spec/exchange/external_api/call_spec.rb +3 -0
  52. data/spec/exchange/external_api/configuration_spec.rb +52 -0
  53. data/spec/exchange/external_api/ecb_spec.rb +8 -5
  54. data/spec/exchange/external_api/open_exchange_rates_spec.rb +70 -0
  55. data/spec/exchange/external_api/xavier_media_spec.rb +8 -5
  56. data/spec/exchange/iso_4217_spec.rb +208 -20
  57. data/spec/exchange/{currency_spec.rb → money_spec.rb} +102 -82
  58. data/spec/exchange/typecasting_spec.rb +86 -0
  59. metadata +117 -71
  60. data/exchange-0.7.5.gem +0 -0
  61. data/exchange-0.7.6.gem +0 -0
  62. data/lib/exchange/external_api/currency_bot.rb +0 -61
  63. data/spec/exchange/external_api/currency_bot_spec.rb +0 -63
@@ -0,0 +1,94 @@
1
+ module Exchange
2
+
3
+ # Allows to access properties of an object as currencies
4
+ # The setter takes care of passing the right values to the original setter method,
5
+ # The getter takes care of instantiating a currency of the original getter method,
6
+ # This is framework agnostic. It works in ActiveRecord/Rails, Datamapper, Ohm, Your own, whatever you want
7
+ #
8
+ # @example The setter converts the currency automatically when the currency is not the one set (example in Active Record)
9
+ # class MyClass < ActiveRecord::Base
10
+ # extend Exchange::Typecasting
11
+ # money :price, :currency => lambda { |s| s.manager.currency }
12
+ #
13
+ # has_one :manager
14
+ #
15
+ # attr_accessible :price
16
+ #
17
+ # end
18
+ #
19
+ # MyClass.find(1).update_attributes :price => 1.usd
20
+ # MyClass.find(1).price #=> 0.77 EUR
21
+ #
22
+ # @example The getter sets the currency automatically to the currency set in the definition (example in Ohm)
23
+ # class MyClass < Ohm::Model
24
+ # extend Exchange::Typecasting
25
+ # reference :manager, Manager
26
+ # attribute :price
27
+ #
28
+ # money :price, :currency => :manager_currency
29
+ #
30
+ # def manager_currency
31
+ # manager.currency
32
+ # end
33
+ #
34
+ # end
35
+ #
36
+ # my_instance = MyClass[0]
37
+ # my_instance.price #=> instance of exchange currency in eur
38
+ #
39
+ # manager = my_instance.manager
40
+ # managermanager.update :currency => :usd
41
+ # my_instance.price #=> instance of exchange currency in usd
42
+ #
43
+ module Typecasting
44
+
45
+ # installs a setter and a getter for the attribute you want to typecast as exchange money
46
+
47
+ def money *attributes
48
+
49
+ options = attributes.last.is_a?(Hash) ? attributes.pop : {}
50
+
51
+ attributes.each do |attribute|
52
+
53
+ define_method :"#{attribute}_with_exchange_typecasting" do
54
+ currency = evaluate_money_option(options[:currency]) if options[:currency]
55
+ raise NoCurrencyError.new("No currency is given for typecasting #{attributes.join(', ')}. Make sure a currency is present") unless currency
56
+
57
+ time = evaluate_money_option(options[:at]) if options[:at]
58
+
59
+ Exchange::Money.new(send(:"#{attribute}_without_exchange_typecasting")) do |c|
60
+ c.currency = currency
61
+ c.time = time if time
62
+ end
63
+ end
64
+ alias_method :"#{attribute}_without_exchange_typecasting", attribute.to_sym
65
+ alias_method attribute.to_sym, :"#{attribute}_with_exchange_typecasting"
66
+
67
+ define_method :"#{attribute}_with_exchange_typecasting=" do |data|
68
+ att = send(attribute)
69
+
70
+ if !data.respond_to?(:currency)
71
+ send(:"#{attribute}_without_exchange_typecasting=", data)
72
+ elsif att.currency == data.currency
73
+ send(:"#{attribute}_without_exchange_typecasting=", data.value)
74
+ elsif att.currency != data.currency
75
+ send(:"#{attribute}_without_exchange_typecasting=", data.send(:"to_#{att.currency}").value)
76
+ end
77
+ end
78
+ alias_method :"#{attribute}_without_exchange_typecasting=", :"#{attribute}="
79
+ alias_method :"#{attribute}=", :"#{attribute}_with_exchange_typecasting="
80
+
81
+ end
82
+
83
+ define_method :evaluate_money_option do |option|
84
+ option.is_a?(Proc) ? instance_eval(&option) : send(option)
85
+ end
86
+ end
87
+
88
+ # Is raised when no currency is given for typecasting
89
+ #
90
+ NoCurrencyError = Class.new(ArgumentError)
91
+
92
+ end
93
+
94
+ end
@@ -10,7 +10,7 @@ describe "Exchange::Cache::Base" do
10
10
  context "with a daily cache" do
11
11
  it "should build a timestamped key with the class given, the yearday and the year" do
12
12
  subject.send(:key, :xavier_media).should == 'exchange_xavier_media_2012_61'
13
- subject.send(:key, :currency_bot).should == 'exchange_currency_bot_2012_61'
13
+ subject.send(:key, :open_exchange_rates).should == 'exchange_open_exchange_rates_2012_61'
14
14
  end
15
15
  end
16
16
  context "with an hourly cache" do
@@ -22,7 +22,7 @@ describe "Exchange::Cache::Base" do
22
22
  end
23
23
  it "should build a timestamped key with the class given, the yearday, the year and the hour" do
24
24
  subject.send(:key, :xavier_media).should == 'exchange_xavier_media_2012_61_23'
25
- subject.send(:key, :currency_bot).should == 'exchange_currency_bot_2012_61_23'
25
+ subject.send(:key, :open_exchange_rates).should == 'exchange_open_exchange_rates_2012_61_23'
26
26
  end
27
27
  end
28
28
  end
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Exchange::Cache::Configuration" do
4
+
5
+ subject { Exchange::Cache::Configuration.instance }
6
+
7
+ describe "attr_readers" do
8
+ [:subclass, :expire, :host, :port, :path].each do |reader|
9
+ it "should respond to #{reader}" do
10
+ subject.should be_respond_to(reader)
11
+ end
12
+ it "should respond to #{reader}=" do
13
+ subject.should be_respond_to(:"#{reader}=")
14
+ end
15
+ end
16
+ end
17
+
18
+ describe "subclass constantize" do
19
+ it "should automatically constantize the subclass" do
20
+ subject.subclass = :no_cache
21
+
22
+ subject.subclass.should == Exchange::Cache::NoCache
23
+ end
24
+ end
25
+
26
+ describe "set" do
27
+ before(:each) do
28
+ @return = subject.set :subclass => :no_cache, :expire => :daily, :host => 'localhost', :port => 112211, :path => "PATH"
29
+ end
30
+ it "should set the options given" do
31
+ subject.subclass.should == Exchange::Cache::NoCache
32
+ subject.expire.should == :daily
33
+ subject.host.should == 'localhost'
34
+ subject.port.should == 112211
35
+ subject.path.should == 'PATH'
36
+ end
37
+ it "should return self" do
38
+ @return.should == subject
39
+ end
40
+ end
41
+
42
+ describe "reset" do
43
+ before(:each) do
44
+ subject.set :subclass => :no_cache, :expire => :daily, :host => 'localhost', :port => 112211, :path => "PATH"
45
+ end
46
+ it "should restore the defaults" do
47
+ subject.reset
48
+ subject.subclass.should == Exchange::Cache::Memory
49
+ subject.expire.should == :daily
50
+ subject.host.should be_nil
51
+ subject.port.should be_nil
52
+ subject.path.should be_nil
53
+ end
54
+ end
55
+
56
+ end
@@ -11,11 +11,7 @@ describe "Exchange::Cache::File" do
11
11
  }
12
12
  end
13
13
  after(:each) do
14
- Exchange.configuration = Exchange::Configuration.new { |c|
15
- c.cache = {
16
- :subclass => :memcached
17
- }
18
- }
14
+ Exchange.configuration.reset
19
15
  end
20
16
  describe "cached" do
21
17
  it "should raise an error if no block was given" do
@@ -26,21 +22,27 @@ describe "Exchange::Cache::File" do
26
22
  before(:each) do
27
23
  subject.should_receive(:key).with('API_CLASS', nil).and_return('KEY')
28
24
  ::File.should_receive(:exists?).with('STORE/PATH/KEY').and_return(true)
29
- ::File.should_receive(:read).with('STORE/PATH/KEY').and_return 'CONTENT'
25
+ ::File.should_receive(:read).with('STORE/PATH/KEY').and_return 'CONTENT'.cachify
30
26
  end
31
27
  it "should return the file contents" do
32
28
  subject.cached('API_CLASS') { 'something' }.should == 'CONTENT'
33
29
  end
30
+ it "should also return plain when asked to" do
31
+ subject.cached('API_CLASS', :plain => true) { 'something' }.should == 'CONTENT'.cachify
32
+ end
34
33
  end
35
- context "with an monthly cache" do
34
+ context "with a monthly cache" do
36
35
  before(:each) do
37
36
  subject.should_receive(:key).with('API_CLASS', an_instance_of(Symbol)).and_return('KEY')
38
37
  ::File.should_receive(:exists?).with('STORE/PATH/KEY').and_return(true)
39
- ::File.should_receive(:read).with('STORE/PATH/KEY').and_return 'CONTENT'
38
+ ::File.should_receive(:read).with('STORE/PATH/KEY').and_return 'CONTENT'.cachify
40
39
  end
41
40
  it "should return the file contents" do
42
41
  subject.cached('API_CLASS', :cache_period => :monthly) { 'something' }.should == 'CONTENT'
43
42
  end
43
+ it "should also return plain when asked to" do
44
+ subject.cached('API_CLASS', :cache_period => :monthly, :plain => true) { 'something' }.should == 'CONTENT'.cachify
45
+ end
44
46
  end
45
47
  end
46
48
  context "when no file is cached yet" do
@@ -11,12 +11,7 @@ describe "Exchange::CacheDalli::Client" do
11
11
  }
12
12
  end
13
13
  after(:each) do
14
- Exchange.configuration = Exchange::Configuration.new { |c|
15
- c.cache = {
16
- :host => 'localhost',
17
- :port => 11211
18
- }
19
- }
14
+ Exchange.configuration.reset
20
15
  end
21
16
  describe "client" do
22
17
  let(:client) { mock('memcached') }
@@ -43,10 +38,10 @@ describe "Exchange::CacheDalli::Client" do
43
38
  lambda { subject.cached('API_CLASS') }.should raise_error(Exchange::Cache::CachingWithoutBlockError)
44
39
  end
45
40
  context "when a cached result exists" do
46
- context "when loading json" do
41
+ context "when loading" do
47
42
  before(:each) do
48
43
  subject.should_receive(:key).with('API_CLASS', {}).and_return('KEY')
49
- client.should_receive(:get).with('KEY').and_return "{\"RESULT\":\"YAY\"}"
44
+ client.should_receive(:get).with('KEY').and_return({'RESULT' => 'YAY'}.cachify)
50
45
  end
51
46
  it "should return the JSON loaded result" do
52
47
  subject.cached('API_CLASS') { 'something' }.should == {'RESULT' => 'YAY'}
@@ -57,12 +52,8 @@ describe "Exchange::CacheDalli::Client" do
57
52
  subject.should_receive(:key).with('API_CLASS', {:plain => true}).and_return('KEY')
58
53
  end
59
54
  it "should return a String result in the right format" do
60
- client.should_receive(:get).with('KEY').and_return "122.0"
61
- subject.cached('API_CLASS', :plain => true) { 'something' }.should == "122.0"
62
- end
63
- it "should also return a String result in the right format when memcached adds quotes and spaces" do
64
- client.should_receive(:get).with('KEY').and_return "\"122.0\" "
65
- subject.cached('API_CLASS', :plain => true) { 'something' }.should == "122.0"
55
+ client.should_receive(:get).with('KEY').and_return "122.0".cachify
56
+ subject.cached('API_CLASS', :plain => true) { 'something' }.should == "122.0".cachify
66
57
  end
67
58
  end
68
59
  end
@@ -75,7 +66,7 @@ describe "Exchange::CacheDalli::Client" do
75
66
  end
76
67
  context "with daily cache" do
77
68
  it "should call the block and set and return the result" do
78
- client.should_receive(:set).with('KEY', "{\"RESULT\":\"YAY\"}", 86400).once
69
+ client.should_receive(:set).with('KEY', {'RESULT' => 'YAY'}.cachify, 86400).once
79
70
  subject.cached('API_CLASS') { {'RESULT' => 'YAY'} }.should == {'RESULT' => 'YAY'}
80
71
  end
81
72
  end
@@ -87,7 +78,7 @@ describe "Exchange::CacheDalli::Client" do
87
78
  Exchange.configuration.cache.expire = :daily
88
79
  end
89
80
  it "should call the block and set and return the result" do
90
- client.should_receive(:set).with('KEY', "{\"RESULT\":\"YAY\"}", 3600).once
81
+ client.should_receive(:set).with('KEY', {'RESULT' => 'YAY'}.cachify, 3600).once
91
82
  subject.cached('API_CLASS') { {'RESULT' => 'YAY'} }.should == {'RESULT' => 'YAY'}
92
83
  end
93
84
  end
@@ -99,7 +90,7 @@ describe "Exchange::CacheDalli::Client" do
99
90
  end
100
91
  context "with daily cache" do
101
92
  it "should call the block and set and return the result" do
102
- client.should_receive(:set).with('KEY', "{\"RESULT\":\"YAY\"}", 86400).once
93
+ client.should_receive(:set).with('KEY', {'RESULT' => 'YAY'}.cachify, 86400).once
103
94
  subject.cached('API_CLASS') { {'RESULT' => 'YAY'} }.should == {'RESULT' => 'YAY'}
104
95
  end
105
96
  end
@@ -111,7 +102,7 @@ describe "Exchange::CacheDalli::Client" do
111
102
  Exchange.configuration.cache.expire = :daily
112
103
  end
113
104
  it "should call the block and set and return the result" do
114
- client.should_receive(:set).with('KEY', "{\"RESULT\":\"YAY\"}", 3600).once
105
+ client.should_receive(:set).with('KEY', {'RESULT' => 'YAY'}.cachify, 3600).once
115
106
  subject.cached('API_CLASS') { {'RESULT' => 'YAY'} }.should == {'RESULT' => 'YAY'}
116
107
  end
117
108
  end
@@ -0,0 +1,122 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Exchange::Cache::Memory" do
4
+ subject { Exchange::Cache::Memory.instance }
5
+ before(:each) do
6
+ Exchange.configuration = Exchange::Configuration.new { |c|
7
+ c.cache = { :subclass => :memory }
8
+ }
9
+ end
10
+ after(:each) do
11
+ Exchange.configuration.reset
12
+ end
13
+ describe "instance_variable_name" do
14
+ context "with a class" do
15
+ before(:each) do
16
+ @time = Time.gm(2012,10,10,12)
17
+ Time.stub! :now => @time
18
+ end
19
+ it "should yield a valid instance variable name" do
20
+ subject.send(:instance_variable_name, Exchange::ExternalAPI::Ecb, {}).should == '@exchange_externalapi_ecb_2012_284_2012_284'
21
+ end
22
+ end
23
+ end
24
+ describe "clean_out_cache" do
25
+ before(:each) do
26
+ @time = Time.gm(2012,10,10,12)
27
+ Time.stub! :now => @time
28
+ subject.instance_variable_set '@exchange_externalapi_someapi_2011_284_2011_284_chfeur', 'Expired'
29
+ subject.instance_variable_set '@exchange_externalapi_someapi_2010_284_2012_284_chfeur', 'Valid1'
30
+ subject.instance_variable_set '@exchange_externalapi_ecb_2012_283_2011_283', 'Expired'
31
+ subject.instance_variable_set '@exchange_externalapi_ecb_2012_282_2012_284_chfusd', 'Valid2'
32
+ subject.instance_variable_set '@exchange_externalapi_currency_2012_284_11_2012_284_11', 'Expired'
33
+ subject.instance_variable_set '@exchange_externalapi_something_2012_284_12_2012_284_12', 'Valid3'
34
+ subject.instance_variable_set '@exchange_externalapi_something_2009_284_12_2012_284_12', 'Valid4'
35
+ subject.instance_variable_set '@exchange_externalapi_open_exchange_rates_2010_280_8_2012_284_8', 'Expired'
36
+ subject.instance_variable_set '@exchange_externalapi_xaviermedia_2012_84_12_2012_123_8', 'Expired'
37
+ end
38
+ it "should unset all expired instance variables" do
39
+ subject.send(:clean!)
40
+ subject.instance_variables.reject{|i| i.to_s == "@helper" }.map{|i| subject.instance_variable_get(i) }.compact.sort_by(&:to_s).should == %W(Valid1 Valid2 Valid3 Valid4).sort
41
+ end
42
+ end
43
+ describe "cached" do
44
+ it "should raise an error if no block was given" do
45
+ lambda { subject.cached('API_CLASS') }.should raise_error(Exchange::Cache::CachingWithoutBlockError)
46
+ end
47
+ context "when a cached result exists" do
48
+ context "when loading json" do
49
+ before(:each) do
50
+ subject.should_receive(:instance_variable_name).with('API::CLASS', {}).and_return('@KEY')
51
+ subject.should_receive(:instance_variable_get).with('@KEY').and_return('something')
52
+ end
53
+ it "should return the loaded result" do
54
+ subject.cached('API::CLASS') { 'something' }.should == 'something'
55
+ end
56
+ end
57
+ context "when loading plain" do
58
+ before(:each) do
59
+ subject.should_receive(:instance_variable_name).with('API::CLASS', {:plain => true}).and_return('@KEY')
60
+ end
61
+ it "should return a String result in the right format" do
62
+ subject.should_receive(:instance_variable_get).with('@KEY').and_return "0.122E3"
63
+ subject.cached('API::CLASS', :plain => true) { 'something' }.should == "0.122E3".cachify
64
+ end
65
+ it "should return a Hash result in the right format" do
66
+ subject.should_receive(:instance_variable_get).with('@KEY').and_return({'RESULT' => 'YAY'})
67
+ subject.cached('API::CLASS', :plain => true) { 'something' }.should == {'RESULT' => 'YAY'}.cachify
68
+ end
69
+ end
70
+ end
71
+ context "when no cached result exists" do
72
+ context "when returning nil" do
73
+ before(:each) do
74
+ subject.should_receive(:instance_variable_name).with('API::CLASS', {}).once.and_return('@KEY')
75
+ subject.should_receive(:instance_variable_get).with('@KEY').and_return(nil)
76
+ end
77
+ context "with daily cache" do
78
+ it "should call the block and set and return the result" do
79
+ subject.should_receive(:instance_variable_set).with('@KEY', {'RESULT' => 'YAY'}).once
80
+ subject.cached('API::CLASS') { {'RESULT' => 'YAY'} }.should == {'RESULT' => 'YAY'}
81
+ end
82
+ end
83
+ context "with hourly cache" do
84
+ before(:each) do
85
+ Exchange.configuration.cache.expire = :hourly
86
+ end
87
+ after(:each) do
88
+ Exchange.configuration.cache.expire = :daily
89
+ end
90
+ it "should call the block and set and return the result" do
91
+ subject.should_receive(:instance_variable_set).with('@KEY', {'RESULT' => 'YAY'}).once
92
+ subject.cached('API::CLASS') { {'RESULT' => 'YAY'} }.should == {'RESULT' => 'YAY'}
93
+ end
94
+ end
95
+ end
96
+ context "when returning an empty string" do
97
+ before(:each) do
98
+ subject.should_receive(:instance_variable_name).with('API::CLASS', {}).once.and_return('@KEY')
99
+ subject.should_receive(:instance_variable_get).with('@KEY').and_return('')
100
+ end
101
+ context "with daily cache" do
102
+ it "should call the block and set and return the result" do
103
+ subject.should_receive(:instance_variable_set).with('@KEY', {'RESULT' => 'YAY'}).once
104
+ subject.cached('API::CLASS') { {'RESULT' => 'YAY'} }.should == {'RESULT' => 'YAY'}
105
+ end
106
+ end
107
+ context "with hourly cache" do
108
+ before(:each) do
109
+ Exchange.configuration.cache.expire = :hourly
110
+ end
111
+ after(:each) do
112
+ Exchange.configuration.cache.expire = :daily
113
+ end
114
+ it "should call the block and set and return the result" do
115
+ subject.should_receive(:instance_variable_set).with('@KEY', {'RESULT' => 'YAY'}).once
116
+ subject.cached('API::CLASS') { {'RESULT' => 'YAY'} }.should == {'RESULT' => 'YAY'}
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
@@ -1,26 +1,16 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "Exchange::Cache::Rails" do
4
- context "with rails defined" do
5
- class ::Rails
6
- end
7
- end
3
+ describe "Exchange::Cache::NoCache" do
8
4
  subject { Exchange::Cache::NoCache }
9
- before(:each) do
5
+ before(:all) do
10
6
  Exchange.configuration = Exchange::Configuration.new { |c|
11
7
  c.cache = {
12
- :class => :no_cache
8
+ :subclass => :no_cache
13
9
  }
14
10
  }
15
11
  end
16
- after(:each) do
17
- Exchange.configuration = Exchange::Configuration.new { |c|
18
- c.cache = {
19
- :class => :memcached,
20
- :host => 'localhost',
21
- :port => 11211
22
- }
23
- }
12
+ after(:all) do
13
+ Exchange.configuration.reset
24
14
  end
25
15
  describe "cached" do
26
16
  it "should directly call the block" do
@@ -9,16 +9,12 @@ describe "Exchange::Cache::Rails" do
9
9
  before(:each) do
10
10
  Exchange.configuration = Exchange::Configuration.new { |c|
11
11
  c.cache = {
12
- :class => :rails
12
+ :subclass => :rails
13
13
  }
14
14
  }
15
15
  end
16
16
  after(:each) do
17
- Exchange.configuration = Exchange::Configuration.new { |c|
18
- c.cache = {
19
- :class => :memcached
20
- }
21
- }
17
+ Exchange.configuration.reset
22
18
  end
23
19
  describe "client" do
24
20
  let(:client) { mock('rails_cache') }