infopark_component_cache 3.0.0 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +8 -0
- data/infopark_component_cache.gemspec +1 -1
- data/lib/infopark_component_cache/component.rb +6 -2
- data/lib/infopark_component_cache/component_cache.rb +5 -2
- data/lib/infopark_component_cache/version.rb +1 -1
- data/spec/dummy/config/environments/test.rb +1 -0
- data/spec/lib/compontent_cache_spec.rb +116 -0
- data/spec/spec_helper.rb +3 -0
- metadata +8 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 97f5a401ded8bb31c5e7539f39bdb7686fbbbb69
|
4
|
+
data.tar.gz: 99d9b252e0e9b37b03c17aac61753a354d4d3b27
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f4b0472ea662483d07b9d21b45c2be93e056a7cb76bf09f2b7b56423b0a4d00b93469c6a6babecfc79b1d2485aa38356765fbe46222c93518f2d9eefd249b38b
|
7
|
+
data.tar.gz: 5b7b9f4e4d36c41e35b87ef8382d72ed7ecec73d39de1f7cb01155444131848d19d5093c3dd6d12adf34512139e9d02053748529d3f7a3da0c1ca74bb5e2158e
|
data/README.md
CHANGED
@@ -16,6 +16,14 @@ Or install it yourself as:
|
|
16
16
|
|
17
17
|
$ gem install infopark_component_cache
|
18
18
|
|
19
|
+
## Tests
|
20
|
+
|
21
|
+
To run the test suite just execute:
|
22
|
+
|
23
|
+
$ bundle exec rspec spec/
|
24
|
+
|
25
|
+
No setup neccessary.
|
26
|
+
|
19
27
|
## Usage
|
20
28
|
|
21
29
|
Set up Rails catching (see [http://guides.rubyonrails.org/caching_with_rails.html](http://guides.rubyonrails.org/caching_with_rails.html)) and
|
@@ -21,7 +21,7 @@ Gem::Specification.new do |gem|
|
|
21
21
|
|
22
22
|
gem.add_dependency 'infopark_fiona_connector'
|
23
23
|
|
24
|
-
gem.add_development_dependency 'rspec-rails'
|
24
|
+
gem.add_development_dependency 'rspec-rails', '~> 3.5'
|
25
25
|
gem.add_development_dependency 'sqlite3'
|
26
26
|
gem.add_development_dependency 'byebug'
|
27
27
|
end
|
@@ -5,12 +5,16 @@ module InfoparkComponentCache
|
|
5
5
|
# and some parameters (hash). It should be used to point
|
6
6
|
# to some data stored in a particular context
|
7
7
|
class Component
|
8
|
-
attr_reader :obj, :
|
8
|
+
attr_reader :obj, :component, :params
|
9
9
|
|
10
10
|
def initialize(obj, component, params={})
|
11
11
|
@obj, @component, @params = obj, component, params
|
12
12
|
end
|
13
13
|
|
14
|
+
def name
|
15
|
+
self.component
|
16
|
+
end
|
17
|
+
|
14
18
|
def cache_key(meta_prefix=nil)
|
15
19
|
if meta_prefix
|
16
20
|
meta_prefix + "_" + KeyGenerator.generate_key(identity_hash)
|
@@ -23,4 +27,4 @@ module InfoparkComponentCache
|
|
23
27
|
@params.merge({:obj_name=>@obj.name, :obj_id=>@obj.id, :obj_component=>@component})
|
24
28
|
end
|
25
29
|
end
|
26
|
-
end
|
30
|
+
end
|
@@ -54,6 +54,7 @@ module InfoparkComponentCache
|
|
54
54
|
#
|
55
55
|
# @return true if cache is valid and in consistent state
|
56
56
|
def expired?
|
57
|
+
return true if !cache.enabled?
|
57
58
|
return !guards.all?(&:consistent?)
|
58
59
|
|
59
60
|
rescue => exception
|
@@ -73,8 +74,10 @@ module InfoparkComponentCache
|
|
73
74
|
if expired?
|
74
75
|
value = yield
|
75
76
|
begin
|
76
|
-
cache.
|
77
|
-
|
77
|
+
if cache.enabled?
|
78
|
+
cache.write(component.cache_key, value)
|
79
|
+
ensure_consistency!
|
80
|
+
end
|
78
81
|
return value
|
79
82
|
|
80
83
|
rescue => exception
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe InfoparkComponentCache::ComponentCache do
|
4
|
+
let(:obj) { double(name: 'spec_obj', id: 2001) }
|
5
|
+
let(:name) { 'spec_cached_component' }
|
6
|
+
let(:params) { {some: 'additional', params: 'supplied'} }
|
7
|
+
let(:guard) { Class.new(Struct.new(:component)) }
|
8
|
+
|
9
|
+
subject { described_class.new(obj, name, params, [guard]) }
|
10
|
+
|
11
|
+
context 'with caching disabled' do
|
12
|
+
before { allow(Rails.application.config.action_controller).to receive(:perform_caching).and_return(false) }
|
13
|
+
|
14
|
+
describe '#fetch' do
|
15
|
+
let(:value) { 'very_hard_computation_required_for_this_string' }
|
16
|
+
let(:specific_guard) { subject.guards.first }
|
17
|
+
|
18
|
+
it 'returns the passed the block value' do
|
19
|
+
expect(subject.fetch { value }).to eq(value)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'never calls any methods on the guard' do
|
23
|
+
expect(specific_guard).not_to receive(:consistent?)
|
24
|
+
expect(specific_guard).not_to receive(:guard!)
|
25
|
+
|
26
|
+
subject.fetch { value }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'with caching enabled' do
|
32
|
+
before { allow(Rails.application.config.action_controller).to receive(:perform_caching).and_return(true) }
|
33
|
+
|
34
|
+
let(:guard) { Class.new(InfoparkComponentCache::ConsistencyGuard) {
|
35
|
+
def consistent?
|
36
|
+
cache.exist?(:guard_called)
|
37
|
+
end
|
38
|
+
|
39
|
+
def guard!
|
40
|
+
cache.write(:guard_called, 1)
|
41
|
+
end
|
42
|
+
} }
|
43
|
+
|
44
|
+
describe '#fetch' do
|
45
|
+
let(:value) { 'very_hard_computation_required_for_this_string' }
|
46
|
+
let(:specific_guard) { subject.guards.first }
|
47
|
+
let(:computer) { double }
|
48
|
+
|
49
|
+
it 'returns the passed the block value' do
|
50
|
+
expect(subject.fetch { value }).to eq(value)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'calls the required methods on the guard' do
|
54
|
+
expect(specific_guard).to receive(:consistent?).exactly(3).times
|
55
|
+
expect(specific_guard).to receive(:guard!).exactly(3).times
|
56
|
+
|
57
|
+
3.times { subject.fetch { value } }
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'only evalues the block once' do
|
61
|
+
expect(computer).to receive(:compute).and_return(value).once
|
62
|
+
|
63
|
+
3.times { expect(subject.fetch { computer.compute }).to eq(value) }
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe '#compontent' do
|
69
|
+
subject { described_class.new(obj, name, params).component }
|
70
|
+
|
71
|
+
it 'stores the passed obj' do
|
72
|
+
expect(subject.obj).to eq(obj)
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'stores the passed name' do
|
76
|
+
expect(subject.name).to eq(name)
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'stores the passed params' do
|
80
|
+
expect(subject.params).to eq(params)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe '#guards' do
|
85
|
+
let(:guard_class1) { Struct.new(:component) }
|
86
|
+
let(:guard_class2) { Struct.new(:compontent, :extra) }
|
87
|
+
let(:guard_params) { {guard: guard_class2, something: 'more'} }
|
88
|
+
|
89
|
+
subject { described_class.new(obj, name, params, [guard_class1, guard_params]).guards }
|
90
|
+
|
91
|
+
it 'contains an array of passed guards' do
|
92
|
+
expect(subject).to match_array([
|
93
|
+
an_instance_of(guard_class1),
|
94
|
+
an_instance_of(guard_class2)
|
95
|
+
])
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'preserves the extra params' do
|
99
|
+
expect(subject.last.extra).to eq(guard_params)
|
100
|
+
end
|
101
|
+
|
102
|
+
context 'with no guards specified in the constructors' do
|
103
|
+
subject { described_class.new(obj, name, params).guards }
|
104
|
+
|
105
|
+
it 'contains standard guards' do
|
106
|
+
expect(subject).to match_array([
|
107
|
+
an_instance_of(InfoparkComponentCache::Guards::ValuePresent),
|
108
|
+
an_instance_of(InfoparkComponentCache::Guards::LastChanged),
|
109
|
+
an_instance_of(InfoparkComponentCache::Guards::ObjCount),
|
110
|
+
an_instance_of(InfoparkComponentCache::Guards::ValidFrom),
|
111
|
+
an_instance_of(InfoparkComponentCache::Guards::ValidUntil)
|
112
|
+
])
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: infopark_component_cache
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tomasz Przedmojski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-02-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -42,16 +42,16 @@ dependencies:
|
|
42
42
|
name: rspec-rails
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '3.5'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '3.5'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: sqlite3
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -137,6 +137,7 @@ files:
|
|
137
137
|
- spec/dummy/db/development.sqlite3
|
138
138
|
- spec/dummy/db/schema.rb
|
139
139
|
- spec/dummy/log/.gitkeep
|
140
|
+
- spec/lib/compontent_cache_spec.rb
|
140
141
|
- spec/lib/delayed_guard_spec.rb
|
141
142
|
- spec/lib/guards/always_consistent_spec.rb
|
142
143
|
- spec/lib/guards/last_changed_spec.rb
|
@@ -187,6 +188,7 @@ test_files:
|
|
187
188
|
- spec/dummy/db/development.sqlite3
|
188
189
|
- spec/dummy/db/schema.rb
|
189
190
|
- spec/dummy/log/.gitkeep
|
191
|
+
- spec/lib/compontent_cache_spec.rb
|
190
192
|
- spec/lib/delayed_guard_spec.rb
|
191
193
|
- spec/lib/guards/always_consistent_spec.rb
|
192
194
|
- spec/lib/guards/last_changed_spec.rb
|