sir_cachealot 0.4.2 → 0.5
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 +15 -0
- data/README.md +2 -1
- data/lib/sir_cachealot.rb +65 -13
- data/lib/sir_cachealot/version.rb +1 -1
- data/sir_cachealot.gemspec +1 -0
- data/spec/redis_spec.rb +49 -0
- data/spec/sir_cachealot_spec.rb +2 -5
- metadata +21 -9
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NmUyMGY5NzdhN2NmNjI2ZTAxYjcwMjM5N2RiYTg5ZmMyOTI0YTZiYg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MjRhYjBlYmE0ZDQ4MDQ4MDE2MzE3MTU5NzNhNzZhM2I4ODRiNmRmMw==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
M2JhMGZiYzc3NGFjMmY4OWUzOWJhMTZjYTc5ODU3NmQ0ZjI1ZjRmMDAxMjM3
|
10
|
+
NjM4NGU4MWVhNzc3YjQ1MmIyNWQ1OGYxYzBmMGFhZGI2M2E3ODEwNDI3NDQz
|
11
|
+
MmFjOWEwODk3ZTIwYzE0YzNiZjIzMWZjNjRlOTBhMjc4MTczYmI=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
Mjc5NjRlZGY0ZjU1M2M5YThkZGE0YWVlNmU0NzViMjE2ZGI1ODQ4YzZmZDYy
|
14
|
+
N2RhMjE1ZjZiZGI4NGRkMDI0MTZlM2U2MTI1MDE4MjY5ZjM4NWVjYWU1ZWVh
|
15
|
+
MjQ1MDA1Y2UyMWJlOTIxMWVhOTdjMjIxNzU2Nzc3MDdlZTBkZjk=
|
data/README.md
CHANGED
@@ -35,7 +35,8 @@ If `config(:delete_on_nil) == true` and `value == nil`, `put()` will return `tru
|
|
35
35
|
|
36
36
|
**You can retreive the value later, if it hasn't expired, with:**
|
37
37
|
|
38
|
-
my_var = Sir.get(keyname)
|
38
|
+
my_var = Sir.get(keyname) # for a shallow copy
|
39
|
+
my_var = Sir.get(keyname, true) # for a deep copy (crude way, Marshal.load(Marshal.dump(obj)) )
|
39
40
|
|
40
41
|
or
|
41
42
|
|
data/lib/sir_cachealot.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
1
|
-
require "sir_cachealot/version"
|
1
|
+
#require "sir_cachealot/version"
|
2
2
|
|
3
3
|
module Sir
|
4
4
|
|
5
5
|
RAM = :ram_cache
|
6
|
+
REDIS = :redis_cache
|
7
|
+
|
8
|
+
@@redis_driver = nil
|
6
9
|
|
7
10
|
@@ram_cache = { }
|
8
11
|
|
@@ -11,8 +14,8 @@ module Sir
|
|
11
14
|
debug: false,
|
12
15
|
annoy: false, #super annoying debug messages
|
13
16
|
default_expiry: 3600, #Integer(1.hour),
|
14
|
-
delete_on_nil: true
|
15
|
-
|
17
|
+
delete_on_nil: true,
|
18
|
+
use_redis_obj: nil
|
16
19
|
}
|
17
20
|
|
18
21
|
#Configuration parameters
|
@@ -25,6 +28,11 @@ module Sir
|
|
25
28
|
|
26
29
|
if !key.nil? && !value.nil?
|
27
30
|
@@configuration[key] = value
|
31
|
+
|
32
|
+
if key == :use_redis_obj
|
33
|
+
self::set_redis_obj(value)
|
34
|
+
end
|
35
|
+
|
28
36
|
return value
|
29
37
|
|
30
38
|
elsif !key.nil? && value.nil?
|
@@ -43,6 +51,10 @@ module Sir
|
|
43
51
|
@@configuration.delete(k)
|
44
52
|
end
|
45
53
|
|
54
|
+
if knew == :use_redis_obj
|
55
|
+
self::set_redis_obj(@@configuration[knew])
|
56
|
+
end
|
57
|
+
|
46
58
|
end
|
47
59
|
|
48
60
|
end
|
@@ -63,25 +75,30 @@ module Sir
|
|
63
75
|
|
64
76
|
case config(:mode)
|
65
77
|
when RAM
|
66
|
-
|
67
78
|
if x = @@ram_cache[key]
|
68
|
-
|
69
79
|
if x[:expiry].nil? || x[:expiry] > Time.now
|
70
80
|
to_ret = x[:value]
|
71
81
|
else
|
72
82
|
# cache entry is stale
|
73
83
|
puts (" SirCachealot: Cache entry <#{key}> expired at #{x[:expiry]}. Deleting...") if config(:debug)
|
74
84
|
@@ram_cache.delete(key)
|
75
|
-
|
76
85
|
end
|
77
|
-
|
78
86
|
end
|
79
|
-
|
87
|
+
|
88
|
+
when REDIS
|
89
|
+
key = self::nsed_key(key)
|
90
|
+
got = @@redis_driver.get(key)
|
91
|
+
|
92
|
+
unless got.nil?
|
93
|
+
to_ret = Marshal.load( got )
|
94
|
+
else
|
95
|
+
to_ret = nil
|
96
|
+
end
|
80
97
|
else
|
81
98
|
puke
|
82
99
|
end
|
83
100
|
|
84
|
-
if copy
|
101
|
+
if copy && config(:mode) == RAM
|
85
102
|
to_ret = self.crude_clone(to_ret)
|
86
103
|
end
|
87
104
|
|
@@ -104,6 +121,12 @@ module Sir
|
|
104
121
|
@@ram_cache.delete(key)
|
105
122
|
return true
|
106
123
|
end
|
124
|
+
when REDIS
|
125
|
+
if @@redis_driver.del( self::nsed_key(key) )
|
126
|
+
return true
|
127
|
+
end
|
128
|
+
else
|
129
|
+
puke
|
107
130
|
end
|
108
131
|
|
109
132
|
end
|
@@ -138,12 +161,18 @@ module Sir
|
|
138
161
|
else
|
139
162
|
case config(:mode)
|
140
163
|
when RAM
|
141
|
-
|
142
164
|
@@ram_cache[key] ||= { }
|
143
165
|
@@ram_cache[key][:value] = value
|
144
166
|
@@ram_cache[key][:expiry] = expiry
|
145
167
|
return value
|
146
168
|
|
169
|
+
when REDIS
|
170
|
+
key = self::nsed_key(key)
|
171
|
+
@@redis_driver.set(key, Marshal.dump(value).to_s )
|
172
|
+
#$stderr.puts "Will expire at #{expiry}"
|
173
|
+
@@redis_driver.expireat(key, expiry.to_i) unless expiry == nil
|
174
|
+
return value
|
175
|
+
|
147
176
|
else
|
148
177
|
puke
|
149
178
|
end
|
@@ -159,6 +188,8 @@ module Sir
|
|
159
188
|
case config(:mode)
|
160
189
|
when RAM
|
161
190
|
return @@ram_cache.count
|
191
|
+
when REDIS
|
192
|
+
return :not_possible
|
162
193
|
else
|
163
194
|
puke
|
164
195
|
end
|
@@ -174,6 +205,8 @@ module Sir
|
|
174
205
|
@@ram_cache.each do |k, v|
|
175
206
|
puts("%-20s %-20s %20s" % [k, v[:value].class, v[:expiry]])
|
176
207
|
end
|
208
|
+
when REDIS
|
209
|
+
raise ArgumentError, "This command not available in REDIS mode"
|
177
210
|
else
|
178
211
|
puke
|
179
212
|
end
|
@@ -190,6 +223,8 @@ module Sir
|
|
190
223
|
case config(:mode)
|
191
224
|
when RAM
|
192
225
|
@@ram_cache = { }
|
226
|
+
when REDIS
|
227
|
+
raise ArgumentError, "This command not available in REDIS mode"
|
193
228
|
else
|
194
229
|
puke
|
195
230
|
end
|
@@ -209,6 +244,8 @@ module Sir
|
|
209
244
|
@@ram_cache.delete(k)
|
210
245
|
end
|
211
246
|
end
|
247
|
+
when REDIS
|
248
|
+
raise ArgumentError, "This command not available in REDIS mode"
|
212
249
|
else
|
213
250
|
puke
|
214
251
|
end
|
@@ -218,13 +255,28 @@ module Sir
|
|
218
255
|
|
219
256
|
private
|
220
257
|
|
258
|
+
def self.set_redis_obj(value)
|
259
|
+
if value.class.name == "Redis"
|
260
|
+
@@configuration[:mode] = REDIS
|
261
|
+
@@redis_driver = @@configuration[:use_redis_obj]
|
262
|
+
else
|
263
|
+
if @@configuration[:mode] == REDIS
|
264
|
+
raise ArgumentError, "use_redis_obj must be of class Redis"
|
265
|
+
end
|
266
|
+
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
221
270
|
def self.puke
|
222
271
|
raise TypeError, "Invalid config(:mode). Check the inputs sent to Sir.configure()"
|
223
272
|
end
|
224
273
|
|
225
|
-
|
226
274
|
def self.crude_clone(obj)
|
227
275
|
return Marshal.load(Marshal.dump(obj))
|
228
276
|
end
|
229
|
-
|
230
|
-
|
277
|
+
|
278
|
+
# returns a namespaced key
|
279
|
+
def self.nsed_key(key)
|
280
|
+
return "SirCachealot-#{key}"
|
281
|
+
end
|
282
|
+
end
|
data/sir_cachealot.gemspec
CHANGED
data/spec/redis_spec.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'redis'
|
3
|
+
|
4
|
+
TEST = "test"
|
5
|
+
DEFAULT_EXPIRY = 600
|
6
|
+
|
7
|
+
redis_obj = Redis.new(:path => "/tmp/redis.sock")
|
8
|
+
|
9
|
+
describe "SirCachealot Redis support" do
|
10
|
+
|
11
|
+
it 'should connect and configure correctly' do
|
12
|
+
Sir.configure do |config|
|
13
|
+
config[:default_expiry] = DEFAULT_EXPIRY
|
14
|
+
config[:mode] = :redis_cache
|
15
|
+
config[:debug] = true
|
16
|
+
config[:use_redis_obj] = redis_obj
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should return the key that is put into it' do
|
21
|
+
Sir.put(:test, TEST).should == TEST
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should return an arbitrary key' do
|
25
|
+
(Sir.get(:test) == TEST).should == true
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should yield when given a block and a key that does not exist' do
|
29
|
+
(Sir.get(:asdoiajdoaijdaodijaodiajdoaidjaodijaodij) { 5 }).should == 5
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should return nil when not given a block and a key that does not exist' do
|
33
|
+
(Sir.get(:asdoiajdoaijdaodijaodiajdoaidjaodijaodij)).should == nil
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should immediately expire a 0-expiry key' do
|
37
|
+
Sir.put(:expire, TEST, 0)
|
38
|
+
sleep(1)
|
39
|
+
|
40
|
+
Sir.get(:expire).should == nil
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should report its size correctly' do
|
44
|
+
|
45
|
+
Sir.size?.should == :not_possible
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
data/spec/sir_cachealot_spec.rb
CHANGED
@@ -13,7 +13,7 @@ describe SirCachealot do
|
|
13
13
|
config[:debug] = true
|
14
14
|
end
|
15
15
|
|
16
|
-
(Sir.config(:default_expiry) == DEFAULT_EXPIRY && Sir.config(
|
16
|
+
(Sir.config(:default_expiry) == DEFAULT_EXPIRY && Sir.config(:mode) == :ram_cache).should == true
|
17
17
|
|
18
18
|
end
|
19
19
|
|
@@ -22,9 +22,7 @@ describe SirCachealot do
|
|
22
22
|
end
|
23
23
|
|
24
24
|
it 'should return an arbitrary key' do
|
25
|
-
|
26
25
|
(Sir.get(:test) == TEST).should == true
|
27
|
-
|
28
26
|
end
|
29
27
|
|
30
28
|
it 'should yield when given a block and a key that does not exist' do
|
@@ -104,6 +102,5 @@ describe SirCachealot do
|
|
104
102
|
(hash[:a][:aa]).should_not == newhash[:a][:aa]
|
105
103
|
|
106
104
|
end
|
107
|
-
|
108
|
-
|
105
|
+
|
109
106
|
end
|
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sir_cachealot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: '0.5'
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Lyjia
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2013-08-21 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rspec
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ~>
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,11 +20,24 @@ dependencies:
|
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ~>
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '2.5'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: redis
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ! '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
30
41
|
description: A dead simple RAM keystore
|
31
42
|
email:
|
32
43
|
- tom@tomcorelis.com
|
@@ -43,35 +54,36 @@ files:
|
|
43
54
|
- lib/sir_cachealot/version.rb
|
44
55
|
- sir_cachealot.gemspec
|
45
56
|
- sircachealot.png
|
57
|
+
- spec/redis_spec.rb
|
46
58
|
- spec/sir_cachealot_spec.rb
|
47
59
|
- spec/spec_helper.rb
|
48
60
|
homepage: http://www.lyjia.us
|
49
61
|
licenses: []
|
62
|
+
metadata: {}
|
50
63
|
post_install_message:
|
51
64
|
rdoc_options: []
|
52
65
|
require_paths:
|
53
66
|
- lib
|
54
67
|
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
-
none: false
|
56
68
|
requirements:
|
57
69
|
- - ! '>='
|
58
70
|
- !ruby/object:Gem::Version
|
59
71
|
version: '0'
|
60
72
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
|
-
none: false
|
62
73
|
requirements:
|
63
74
|
- - ! '>='
|
64
75
|
- !ruby/object:Gem::Version
|
65
76
|
version: '0'
|
66
77
|
requirements: []
|
67
78
|
rubyforge_project:
|
68
|
-
rubygems_version:
|
79
|
+
rubygems_version: 2.0.6
|
69
80
|
signing_key:
|
70
|
-
specification_version:
|
81
|
+
specification_version: 4
|
71
82
|
summary: SirCachealot is a drop-in memcache-like RAM cache for Ruby. Cache entries
|
72
83
|
are saved and recalled by a key string, and their values can be whatever a Ruby
|
73
84
|
hash can hold. Values can also expire, however expiration is only checked when the
|
74
85
|
key is called, or a manual sweeper is run.
|
75
86
|
test_files:
|
87
|
+
- spec/redis_spec.rb
|
76
88
|
- spec/sir_cachealot_spec.rb
|
77
89
|
- spec/spec_helper.rb
|