blunt-cache 0.1.2 → 0.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.
- checksums.yaml +4 -4
- data/README.md +37 -23
- data/lib/blunt-cache.rb +11 -6
- data/lib/blunt-cache/version.rb +1 -1
- data/spec/blunt_cache_spec.rb +109 -40
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 05f69782e6693f701b6163492ba7691080be6bdf
|
4
|
+
data.tar.gz: a543120a64bc44e0f1de54bf0d4bd5e2e9357e72
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 14490f56139a5d252ae1ef9e8617b69ff2b234dc80255d08a959c3568350b9cace55251fdf5ed96a449d0a4cf202f8746dad1dabad6ff6c2d255ffd513b2df67
|
7
|
+
data.tar.gz: 137f43be21cf0513e56c318d82cce66912842cea0215c157cd4b3d417606294b7d7954ebc4ff059fee7f066449954546310c292b329cf1c65f58cfc34de1d026
|
data/README.md
CHANGED
@@ -1,31 +1,45 @@
|
|
1
1
|
# BluntCache
|
2
2
|
Simple in-memory cache service for Ruby.
|
3
3
|
|
4
|
+
[](https://travis-ci.org/appelsin/blunt_cache)
|
5
|
+
[](https://codeclimate.com/github/appelsin/blunt_cache)
|
6
|
+
|
4
7
|
## Usage
|
5
8
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
9
|
+
```ruby
|
10
|
+
# set/get by key
|
11
|
+
BluntCache.set "key", data
|
12
|
+
data = BluntCache.get "key"
|
13
|
+
|
14
|
+
# executes block if not set or expired
|
15
|
+
data = BluntCache.fetch "key" do
|
16
|
+
do_something
|
17
|
+
end
|
18
|
+
|
19
|
+
# time to live can be provided (default is 60 sec)
|
20
|
+
BluntCache.set "key", expire: 120 data
|
21
|
+
BluntCache.fetch "key", expire: 120 do
|
22
|
+
do_something
|
23
|
+
end
|
24
|
+
|
25
|
+
# checks if key exists
|
26
|
+
BluntCache.key? "nil_key" # false
|
27
|
+
BluntCache.set "nil_key", nil
|
28
|
+
BluntCache.key? "nil_key" # true
|
29
|
+
|
30
|
+
# doesn't re-executes nil fetches
|
31
|
+
data = BluntCache.fetch("heavy_key") { sleep 1; nil } # some heavy block returning nil
|
32
|
+
data = BluntCache.fetch("heavy_key") { sleep 1; nil } # doesn't re-executes if not expired
|
33
|
+
|
34
|
+
# inherit it for namespacing and extending
|
35
|
+
class MyCache < BluntCache
|
36
|
+
@expire_default = 30
|
37
|
+
end
|
38
|
+
|
39
|
+
MyCache.set "1", "2"
|
40
|
+
BluntCache.set "1", "3"
|
41
|
+
MyCache.get "1" #2
|
42
|
+
```
|
29
43
|
|
30
44
|
## Why? When to use?
|
31
45
|
|
data/lib/blunt-cache.rb
CHANGED
@@ -4,7 +4,7 @@ class BluntCache
|
|
4
4
|
|
5
5
|
# Store +data+ in cache by +key+ for +:expire+ seconds (default is 60 sec)
|
6
6
|
# def self.set(key, data, expire: nil)
|
7
|
-
def self.set(key, data, options = {}
|
7
|
+
def self.set(key, data, options = {})
|
8
8
|
expire = options[:expire]
|
9
9
|
self.timestamp[key] = Time.now + (expire || self.expire_default)
|
10
10
|
self.data[key] = data
|
@@ -16,14 +16,21 @@ class BluntCache
|
|
16
16
|
self.timestamp[key].is_a?(Time) && Time.now < self.timestamp[key] ? self.data[key] : nil
|
17
17
|
end
|
18
18
|
|
19
|
+
# Checks if key present in store.
|
20
|
+
# Returns true if key exists (even if value is false or nil) and false if key doesn't exist or expired.
|
21
|
+
def self.key?(key)
|
22
|
+
self.data.key?(key) && self.timestamp[key].is_a?(Time) && Time.now < self.timestamp[key]
|
23
|
+
end
|
24
|
+
|
19
25
|
# Get +key+ from cache. Executes +block+, stores it's result and returns it if not set or expired.
|
20
26
|
# def self.fetch(key, expire: nil, &block)
|
21
27
|
def self.fetch(key, options = {}, &block)
|
22
28
|
expire = options[:expire]
|
23
|
-
|
24
|
-
|
25
|
-
self.set key, block.call, :expire => expire
|
29
|
+
if self.key?(key)
|
30
|
+
self.data[key]
|
26
31
|
else
|
32
|
+
result = block.call
|
33
|
+
self.set key, result, :expire => expire
|
27
34
|
result
|
28
35
|
end
|
29
36
|
end
|
@@ -34,8 +41,6 @@ class BluntCache
|
|
34
41
|
@timestamp = {}
|
35
42
|
end
|
36
43
|
|
37
|
-
protected
|
38
|
-
|
39
44
|
def self.data
|
40
45
|
@data||= {}
|
41
46
|
end
|
data/lib/blunt-cache/version.rb
CHANGED
data/spec/blunt_cache_spec.rb
CHANGED
@@ -11,54 +11,123 @@ describe BluntCache do
|
|
11
11
|
|
12
12
|
[BluntCache, MyCache, ShortCache].each do |c|
|
13
13
|
context '#{c.name}' do
|
14
|
-
|
15
|
-
|
16
|
-
result = nil
|
17
|
-
expect { result = c.get("1") }.not_to raise_error
|
18
|
-
expect(result).to eq "1_val"
|
19
|
-
expect { c.set("1", "1_val_2") }.not_to raise_error
|
20
|
-
expect { result = c.get("1") }.not_to raise_error
|
21
|
-
expect(result).to eq "1_val_2"
|
14
|
+
context 'set' do
|
15
|
+
it { expect(c.set("1", "1_val")).to eq "1_val" }
|
22
16
|
end
|
23
17
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
expect(
|
18
|
+
context 'get' do
|
19
|
+
before(:all) { c.set("1", "1_val") }
|
20
|
+
|
21
|
+
it { expect(c.get("1")).to eq "1_val" }
|
22
|
+
|
23
|
+
it 'returns previous set value' do
|
24
|
+
c.set("1", "1_val_2")
|
25
|
+
expect(result = c.get("1")).to eq "1_val_2"
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'returns nil if not set' do
|
29
|
+
expect(c.get("2")).to eq nil
|
30
|
+
end
|
28
31
|
end
|
29
32
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
sleep
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
33
|
+
context 'get with expiration' do
|
34
|
+
before(:each) { c.set("3", "3_val", :expire => 0.1) }
|
35
|
+
|
36
|
+
it { expect(c.get("3")).to eq "3_val" }
|
37
|
+
|
38
|
+
it 'returns value after short sleep' do
|
39
|
+
sleep(0.09)
|
40
|
+
expect(c.get("3")).to eq "3_val"
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'returns nil after long sleep' do
|
44
|
+
sleep(0.11)
|
45
|
+
expect(c.get("3")).to eq nil
|
46
|
+
end
|
41
47
|
end
|
42
48
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
49
|
+
context 'key?' do
|
50
|
+
before(:all) { c.set("k1", "k1_val") }
|
51
|
+
|
52
|
+
it { expect(c.key?("k1")).to eq true }
|
53
|
+
it 'returns false if not set' do
|
54
|
+
expect(c.key?("k2")).to eq false
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'key? with expiration' do
|
59
|
+
before(:each) { c.set("k3", "k3_val", :expire => 0.1) }
|
60
|
+
|
61
|
+
it { expect(c.key?("k3")).to eq true }
|
62
|
+
|
63
|
+
it 'returns true after short sleep' do
|
64
|
+
sleep(0.09)
|
65
|
+
expect(c.key?("k3")).to eq true
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'returns false after long sleep' do
|
69
|
+
sleep(0.11)
|
70
|
+
expect(c.key?("k3")).to eq false
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'fetch' do
|
75
|
+
it 'executes block for a first time' do
|
76
|
+
executed = :not_executed
|
77
|
+
expect(c.fetch("4-0") { executed = :executed }).to eq :executed
|
78
|
+
expect(executed).to eq :executed
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'sets value from block' do
|
82
|
+
expect(c.get("4")).to eq nil #pre-check
|
83
|
+
expect(c.fetch("4") { "4_val" }).to eq "4_val"
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'doesn\'t execute block for a second time' do
|
87
|
+
expect(c.fetch("4-1") { :executed_first }).to eq :executed_first
|
88
|
+
executed = :not_executed
|
89
|
+
expect(c.fetch("4-1") { executed = :executed_second }).to eq :executed_first
|
90
|
+
expect(executed).to eq :not_executed
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
context 'fetch with experation' do
|
95
|
+
it 'recieves :expire' do
|
96
|
+
expect( c.fetch("6", :expire => 0.1) { "6_val" } ).to eq "6_val"
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'doesn\'t execute block for a second time' do
|
100
|
+
expect(c.fetch("6-1", :expire => 0.1) { :executed_first }).to eq :executed_first
|
101
|
+
executed = :not_executed
|
102
|
+
expect(c.fetch("6-1", :expire => 0.1) { executed = :executed_second }).to eq :executed_first
|
103
|
+
expect(executed).to eq :not_executed
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'doesn\'t execute block for a second time after short sleep' do
|
107
|
+
expect(c.fetch("6-2", :expire => 0.1) { :executed_first }).to eq :executed_first
|
108
|
+
executed = :not_executed
|
109
|
+
sleep(0.09)
|
110
|
+
expect(c.fetch("6-2", :expire => 0.1) { executed = :executed_second }).to eq :executed_first
|
111
|
+
expect(executed).to eq :not_executed
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'executes block for a second time after long sleep' do
|
115
|
+
expect(c.fetch("6-3", :expire => 0.1) { :executed_first }).to eq :executed_first
|
116
|
+
executed = :not_executed
|
117
|
+
sleep(0.11)
|
118
|
+
expect(c.fetch("6-3", :expire => 0.1) { executed = :executed_second }).to eq :executed_second
|
119
|
+
expect(executed).to eq :executed_second
|
120
|
+
end
|
51
121
|
end
|
52
122
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
expect(result).to eq "6_val_3"
|
123
|
+
context 'fetch with nil' do
|
124
|
+
it 'doesn\'t re-executes for nil value' do
|
125
|
+
execution_counter = 0
|
126
|
+
expect(c.fetch("nill") { execution_counter+= 1; nil }).to eq nil
|
127
|
+
expect(execution_counter).to eq 1
|
128
|
+
expect(c.fetch("nill") { execution_counter+= 1; nil }).to eq nil
|
129
|
+
expect(execution_counter).to eq 1
|
130
|
+
end
|
62
131
|
end
|
63
132
|
end
|
64
133
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blunt-cache
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roman Exempliarov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-10-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -90,10 +90,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
90
90
|
version: '0'
|
91
91
|
requirements: []
|
92
92
|
rubyforge_project:
|
93
|
-
rubygems_version: 2.4
|
93
|
+
rubygems_version: 2.6.4
|
94
94
|
signing_key:
|
95
95
|
specification_version: 4
|
96
96
|
summary: Simple in-memory cache service for Ruby.
|
97
97
|
test_files:
|
98
98
|
- spec/blunt_cache_spec.rb
|
99
99
|
- spec/spec_helper.rb
|
100
|
+
has_rdoc:
|