money_persistent_bank 0.1.0 → 0.2.0.alpha

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.
data/Readme.md CHANGED
@@ -8,7 +8,7 @@ This can be useful in a Rails application. You fetch rates from external source
8
8
 
9
9
  Add it to your gemfile:
10
10
 
11
- gem "persistent_bank", "~> 0.1.0"
11
+ gem "money_persistent_bank", "~> 0.1.0"
12
12
 
13
13
  Now you can use it in a rake task.
14
14
 
@@ -3,54 +3,28 @@ require "money/bank/variable_exchange"
3
3
  class Money
4
4
  module Bank
5
5
  class PersistentBank < VariableExchange
6
+ attr_reader :storage
6
7
 
7
- class << self
8
- attr_accessor :default_storage
8
+ def initialize storage, key = 'persistent_bank/rates', format = :yaml
9
+ super()
10
+ @storage = storage
11
+ @storage_key = key
12
+ @storage_format = format
9
13
  end
10
14
 
11
- attr_accessor :storage
12
-
13
- RATE_FORMAT = :yaml
14
- CACHE_KEY = 'persistent_bank/rates'
15
-
16
- # Inherited .instance returns VariableExchange for some reason
17
- def self.instance
18
- @@pb_singleton ||= new
19
- end
20
-
21
- def setup
22
- super
23
- @storage = self.class.default_storage
24
- self
15
+ def export_rates
16
+ storage.write(@storage_key, super(@storage_format))
25
17
  end
26
18
 
27
- def update_rates
28
- previous_cache = @rates_cache
29
- @rates_cache = storage.read(CACHE_KEY)
30
- return if previous_cache == @rates_cache # Do not reload rates if cache wasn't changed
19
+ def import_rates
31
20
  rates.clear
32
- import_rates(RATE_FORMAT, @rates_cache) if @rates_cache
33
- end
34
-
35
- def get_rate(*)
36
- update_rates
37
- super
21
+ cache = storage.read(@storage_key)
22
+ super(@storage_format, cache) if cache
38
23
  end
39
24
 
40
- def rates(*)
41
- update_rates
42
- super
25
+ def clear
26
+ storage.delete(@storage_key)
43
27
  end
44
-
45
- def save
46
- storage.write(CACHE_KEY, export_rates(RATE_FORMAT))
47
- end
48
- alias_method :save!, :save
49
-
50
- def destroy
51
- storage.delete(CACHE_KEY)
52
- end
53
-
54
28
  end
55
29
  end
56
30
  end
@@ -1,16 +1,28 @@
1
+ require "rails/railtie"
2
+
1
3
  module MoneyPersistentBank
2
4
  class Railtie < Rails::Railtie
3
-
4
- initializer "money_persistent_bank.default_storage" do
5
+ initializer "money_persistent_bank" do |app|
6
+ require "money"
5
7
  require "money/bank/persistent_bank"
6
- Money::Bank::PersistentBank.default_storage = Rails.cache
8
+ tmp = app.paths['tmp'].first
9
+ cache = ActiveSupport::Cache::FileStore.new("#{tmp}/money_persistent_bank")
10
+ bank = Money::Bank::PersistentBank.new(cache)
11
+ Money.default_bank = bank
12
+ app.config.middleware.use Synchronization, bank
7
13
  end
14
+ end
8
15
 
9
- initializer "money_persistent_bank.make_default" do
10
- require "money"
11
- require "money/bank/persistent_bank"
12
- Money.default_bank = Money::Bank::PersistentBank.instance
16
+ # Updates rates from the cache on each request
17
+ class Synchronization
18
+ def initialize app, bank = Money.default_bank
19
+ @app = app
20
+ @bank = bank
13
21
  end
14
22
 
23
+ def call env
24
+ @bank.import_rates
25
+ @app.call env
26
+ end
15
27
  end
16
28
  end
@@ -1,3 +1,3 @@
1
1
  module MoneyPersistentBank
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0.alpha"
3
3
  end
@@ -1,2 +1 @@
1
- require "money/bank/persistent_bank"
2
- require "money_persistent_bank/railtie" if defined? Rails
1
+ require "money_persistent_bank/railtie"
@@ -6,51 +6,33 @@ $:.unshift(File.expand_path('../../lib', __FILE__))
6
6
  require "money_persistent_bank"
7
7
  require "active_support/cache"
8
8
 
9
- STORAGE = ActiveSupport::Cache::MemoryStore.new
10
- Money::Bank::PersistentBank.default_storage = STORAGE
11
-
12
9
  class PersistentBankTest < MiniTest::Unit::TestCase
13
10
  include Money::Bank
14
11
 
15
- def test_instance
16
- assert_equal PersistentBank, PersistentBank.instance.class
17
- end
18
-
19
12
  def setup
20
- STORAGE.clear
13
+ @storage = ActiveSupport::Cache::MemoryStore.new
14
+ @writer = PersistentBank.new(@storage)
15
+ @reader = PersistentBank.new(@storage)
21
16
  end
22
17
 
23
18
  def test_persistance
24
- pb = PersistentBank.new
25
- pb.add_rate('USD', 'AZN', 123)
26
-
27
- assert_nil PersistentBank.new.get_rate('USD', 'AZN')
28
-
29
- pb.save
30
- assert_equal 123, PersistentBank.new.get_rate('USD', 'AZN')
19
+ @writer.add_rate('USD', 'AZN', 123)
20
+ @writer.export_rates
21
+ assert_nil @reader.get_rate('USD', 'AZN')
22
+ @reader.import_rates
23
+ assert_equal 123, @reader.get_rate('USD', 'AZN')
31
24
  end
32
25
 
33
- def test_destroy
34
- PersistentBank.instance.add_rate('USD', 'AZN', 123)
35
- PersistentBank.instance.save
36
-
37
- refute_nil PersistentBank.instance.get_rate('USD', 'AZN')
38
- refute_nil PersistentBank.new.get_rate('USD', 'AZN')
39
- PersistentBank.instance.destroy
26
+ def test_clear
27
+ @writer.add_rate('USD', 'AZN', 123)
28
+ @writer.export_rates
40
29
 
41
- assert_nil PersistentBank.instance.get_rate('USD', 'AZN')
42
- assert_nil PersistentBank.new.get_rate('USD', 'AZN')
43
- end
30
+ @reader.import_rates
31
+ refute_nil @reader.get_rate('USD', 'AZN')
44
32
 
45
- def test_updating_rates
46
- assert_nil PersistentBank.instance.get_rate('USD', 'AZN')
47
- PersistentBank.new.tap{|b| b.add_rate('USD', 'AZN', 123)}.save
48
- assert_equal 123, PersistentBank.instance.get_rate('USD', 'AZN')
49
- end
33
+ @writer.clear
50
34
 
51
- def test_rates_also_trigger_update
52
- assert_nil PersistentBank.instance.get_rate('USD', 'AZN')
53
- PersistentBank.new.tap{|b| b.add_rate('USD', 'AZN', 123)}.save
54
- assert_equal({ "USD_TO_AZN" => 123 }, PersistentBank.instance.rates)
35
+ @reader.import_rates
36
+ assert_nil @reader.get_rate('USD', 'AZN')
55
37
  end
56
38
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: money_persistent_bank
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
5
- prerelease:
4
+ version: 0.2.0.alpha
5
+ prerelease: 6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Semyon Perepelitsa
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-06 00:00:00.000000000 Z
12
+ date: 2012-09-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: money
@@ -76,9 +76,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
76
76
  required_rubygems_version: !ruby/object:Gem::Requirement
77
77
  none: false
78
78
  requirements:
79
- - - ! '>='
79
+ - - ! '>'
80
80
  - !ruby/object:Gem::Version
81
- version: '0'
81
+ version: 1.3.1
82
82
  requirements: []
83
83
  rubyforge_project: money_persistent_bank
84
84
  rubygems_version: 1.8.23