money_persistent_bank 0.1.0 → 0.2.0.alpha
Sign up to get free protection for your applications and to get access to all the features.
- data/Readme.md +1 -1
- data/lib/money/bank/persistent_bank.rb +13 -39
- data/lib/money_persistent_bank/railtie.rb +19 -7
- data/lib/money_persistent_bank/version.rb +1 -1
- data/lib/money_persistent_bank.rb +1 -2
- data/test/persistent_bank_test.rb +16 -34
- metadata +5 -5
data/Readme.md
CHANGED
@@ -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
|
-
|
8
|
-
|
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
|
-
|
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
|
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
|
-
|
33
|
-
|
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
|
41
|
-
|
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
|
-
|
5
|
+
initializer "money_persistent_bank" do |app|
|
6
|
+
require "money"
|
5
7
|
require "money/bank/persistent_bank"
|
6
|
-
|
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
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
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,2 +1 @@
|
|
1
|
-
require "
|
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
|
-
|
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
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
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
|
34
|
-
|
35
|
-
|
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
|
-
|
42
|
-
|
43
|
-
end
|
30
|
+
@reader.import_rates
|
31
|
+
refute_nil @reader.get_rate('USD', 'AZN')
|
44
32
|
|
45
|
-
|
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
|
-
|
52
|
-
assert_nil
|
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.
|
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-
|
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:
|
81
|
+
version: 1.3.1
|
82
82
|
requirements: []
|
83
83
|
rubyforge_project: money_persistent_bank
|
84
84
|
rubygems_version: 1.8.23
|