redis_wrapper 0.1.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.
- data/CHANGELOG +0 -0
- data/MIT-LICENSE +20 -0
- data/README.md +0 -0
- data/Rakefile +9 -0
- data/lib/redis_wrapper/entry.rb +99 -0
- data/lib/redis_wrapper/redis_wrapper.rb +37 -0
- data/lib/redis_wrapper/version.rb +6 -0
- data/lib/redis_wrapper.rb +7 -0
- data/redis_wrapper.gemspec +39 -0
- data/spec/entry_spec.rb +356 -0
- data/spec/redis_wrapper_spec.rb +61 -0
- metadata +81 -0
data/CHANGELOG
ADDED
File without changes
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2012 Cameron Hurst
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
File without changes
|
data/Rakefile
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
module RedisWrapper
|
2
|
+
class Entry
|
3
|
+
attr_accessor :flags, :value
|
4
|
+
FLAG_MARSHALED = "0x1"
|
5
|
+
FLAG_COMPRESSED = "0x2"
|
6
|
+
DEFAULT_COMPRESS_LIMIT = 16 * 1024 #16 kilobytes
|
7
|
+
|
8
|
+
def self.option_keys
|
9
|
+
[:expire_in,:flags, :raw]
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(value, options = {})
|
13
|
+
@flags = options[:flags] || {}
|
14
|
+
@value = value
|
15
|
+
@options = options
|
16
|
+
flag_extraction if @value.class == String
|
17
|
+
end
|
18
|
+
|
19
|
+
def extracted_result
|
20
|
+
@value = demarshal(decompress(@value))
|
21
|
+
end
|
22
|
+
|
23
|
+
def prepared_result
|
24
|
+
prepare(@value) + flags_string
|
25
|
+
end
|
26
|
+
|
27
|
+
def prepare(value)
|
28
|
+
compress(marshal(value)) if value
|
29
|
+
end
|
30
|
+
|
31
|
+
def flags_string
|
32
|
+
string = ""
|
33
|
+
string += FLAG_MARSHALED if @flags[:marshaled]
|
34
|
+
string += FLAG_COMPRESSED if @flags[:compressed]
|
35
|
+
string
|
36
|
+
end
|
37
|
+
|
38
|
+
def demarshal(val)
|
39
|
+
if marshaled?
|
40
|
+
@flags[:marshaled] = false
|
41
|
+
return Marshal.load(val)
|
42
|
+
end
|
43
|
+
val
|
44
|
+
end
|
45
|
+
|
46
|
+
def decompress(val)
|
47
|
+
if compressed?
|
48
|
+
@flags[:compressed] = false
|
49
|
+
return Zlib::Inflate.inflate(val)
|
50
|
+
end
|
51
|
+
val
|
52
|
+
end
|
53
|
+
|
54
|
+
def compress(val)
|
55
|
+
if should_compress?(val) && !compressed?
|
56
|
+
@flags[:compressed] = true
|
57
|
+
return Zlib::Deflate.deflate(val)
|
58
|
+
end
|
59
|
+
val
|
60
|
+
end
|
61
|
+
|
62
|
+
def marshal(val)
|
63
|
+
if val && !marshaled?
|
64
|
+
@flags[:marshaled] = true
|
65
|
+
Marshal.dump(val)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def flag_extraction
|
70
|
+
if @value
|
71
|
+
pflag = @value.slice(@value.length-3..@value.length)
|
72
|
+
if pflag == FLAG_MARSHALED
|
73
|
+
@flags[:marshaled] = true
|
74
|
+
@value = @value.slice(0..-4)
|
75
|
+
flag_extraction
|
76
|
+
elsif pflag == FLAG_COMPRESSED
|
77
|
+
@flags[:compressed] = true
|
78
|
+
@value = @value.slice(0..-4)
|
79
|
+
flag_extraction
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
def compressed?
|
86
|
+
@flags[:compressed] == true
|
87
|
+
end
|
88
|
+
def marshaled?
|
89
|
+
@flags[:marshaled] == true
|
90
|
+
end
|
91
|
+
def should_compress?(val)
|
92
|
+
unless @options[:raw] || val.nil?
|
93
|
+
compression_threshold = @options[:compression_threshold] || DEFAULT_COMPRESS_LIMIT
|
94
|
+
return true if val.size >= compression_threshold
|
95
|
+
end
|
96
|
+
false
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module RedisWrapper
|
2
|
+
class RedisWrapper
|
3
|
+
def initialize(options={})
|
4
|
+
@client = Redis.new(options)
|
5
|
+
end
|
6
|
+
def method_missing(method, *args, &block)
|
7
|
+
if @client.respond_to? method
|
8
|
+
options, args = get_options(*args) || [{}, args]
|
9
|
+
key, args = get_key(*args)
|
10
|
+
args = handle(*args)
|
11
|
+
args = [key] + args if args && key
|
12
|
+
result = Entry.new(@client.send(method, *args, &block), options).extracted_result
|
13
|
+
@client.send(:expire, key, options[:expire_in].to_i) if options[:expire_in]
|
14
|
+
result
|
15
|
+
else
|
16
|
+
raise NameError, :message=> "method #{method} is not defined"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
def get_options(*args)
|
22
|
+
if args.last.kind_of?(Hash)
|
23
|
+
if Entry.option_keys.map{|key| args.last.keys.include?(key)}.compact.include?(true)
|
24
|
+
return args.pop, args
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_key(*args)
|
30
|
+
args.first.kind_of?(String) ? [args.shift, args] : [nil, args]
|
31
|
+
end
|
32
|
+
|
33
|
+
def handle(*args)
|
34
|
+
args.map{|u| Entry.new(u).prepared_result} if args
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require './lib/redis_wrapper/version'
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "redis_wrapper"
|
5
|
+
s.version = RedisWrapper::VERSION
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["wakemaster39"]
|
9
|
+
s.date = "2012-01-17"
|
10
|
+
s.description = "A high level wrapper around the redis-rb gem and API. Designed to be a drop in replacement for Redis class while handling object marshaling and compression, setting key expiries, and namespacing your keys"
|
11
|
+
s.email = "wakemaster39@gmail.com"
|
12
|
+
s.extra_rdoc_files = [
|
13
|
+
"README.md"
|
14
|
+
]
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {spec,spec,features}/*`.split("\n")
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
|
19
|
+
s.homepage = "http://github.com/wakemaster39/redis-wrapper"
|
20
|
+
s.licenses = ["MIT"]
|
21
|
+
s.rubygems_version = "1.8.10"
|
22
|
+
s.summary = "High level wrapper around redis API"
|
23
|
+
|
24
|
+
if s.respond_to? :specification_version then
|
25
|
+
s.specification_version = 3
|
26
|
+
|
27
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
28
|
+
s.add_runtime_dependency(%q<redis>, ["~>2.2.1"])
|
29
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
30
|
+
else
|
31
|
+
s.add_dependency(%q<redis>, ["~>2.2.1"])
|
32
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
33
|
+
end
|
34
|
+
else
|
35
|
+
s.add_dependency(%q<redis>, ["~>2.2.1"])
|
36
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
data/spec/entry_spec.rb
ADDED
@@ -0,0 +1,356 @@
|
|
1
|
+
require 'redis_wrapper/entry.rb'
|
2
|
+
require 'zlib'
|
3
|
+
|
4
|
+
describe RedisWrapper::Entry do
|
5
|
+
describe '#flag_extraction' do
|
6
|
+
context 'raw object' do
|
7
|
+
before do
|
8
|
+
@teststring = "teststring"
|
9
|
+
@wrapper = RedisWrapper::Entry.new(@teststring,:raw=>true)
|
10
|
+
end
|
11
|
+
it 'should extract no flags' do
|
12
|
+
@wrapper.flag_extraction
|
13
|
+
@wrapper.flags.should eq({})
|
14
|
+
end
|
15
|
+
it 'should not alter the string' do
|
16
|
+
@wrapper.flag_extraction
|
17
|
+
@wrapper.value.should eq(@teststring)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
context 'marshaled object' do
|
21
|
+
before do
|
22
|
+
@teststring = "teststring0x1"
|
23
|
+
@wrapper = RedisWrapper::Entry.new(@teststring)
|
24
|
+
end
|
25
|
+
it 'should determine object is marshaled' do
|
26
|
+
@wrapper.flags.should include(:marshaled=>true) #include hash key
|
27
|
+
end
|
28
|
+
it 'should not need deflating' do
|
29
|
+
@wrapper.flags.should_not include(:compressed=>true) #include hash key
|
30
|
+
end
|
31
|
+
it 'should not pick flag if string contains flag not at end' do
|
32
|
+
@wrapper = RedisWrapper::Entry.new("0x10x10x10x1test",:raw=>true)
|
33
|
+
@wrapper.flag_extraction
|
34
|
+
@wrapper.flags.should_not include(:marshaled=>true)
|
35
|
+
end
|
36
|
+
it 'should not matter if double flagged' do
|
37
|
+
@wrapper = RedisWrapper::Entry.new("teststring0x10x1")
|
38
|
+
@wrapper.flags.should include(:marshaled=>true)
|
39
|
+
@wrapper.flags.should_not include(:compressed=>true)
|
40
|
+
end
|
41
|
+
it 'should remove the flag' do
|
42
|
+
@wrapper.value.should eq(@teststring.slice(0..-4))
|
43
|
+
end
|
44
|
+
end
|
45
|
+
context 'compressed object' do
|
46
|
+
before do
|
47
|
+
@teststring = "teststring0x2"
|
48
|
+
@wrapper = RedisWrapper::Entry.new(@teststring)
|
49
|
+
end
|
50
|
+
it 'should determine object is compressed' do
|
51
|
+
@wrapper.flags.should include(:compressed=>true) #include hash key
|
52
|
+
end
|
53
|
+
it 'should not need to be marshal dumped' do
|
54
|
+
@wrapper.flags.should_not include(:marshaled=>true) #include hash key
|
55
|
+
end
|
56
|
+
it 'should not pick flag if string contains flag not at end' do
|
57
|
+
@wrapper = RedisWrapper::Entry.new("0x20x20x20x2test")
|
58
|
+
@wrapper.flags.should_not include(:compressed=>true)
|
59
|
+
end
|
60
|
+
it 'should not matter if double flagged' do
|
61
|
+
@wrapper = RedisWrapper::Entry.new("teststring0x20x2")
|
62
|
+
@wrapper.flags.should_not include(:marshaled=>true)
|
63
|
+
@wrapper.flags.should include(:compressed=>true)
|
64
|
+
end
|
65
|
+
it 'should remove the flag' do
|
66
|
+
@wrapper.value.should eq(@teststring.slice(0..-4))
|
67
|
+
end
|
68
|
+
end
|
69
|
+
context 'marshaled and compressed object' do
|
70
|
+
before do
|
71
|
+
@teststring = "teststring0x10x2"
|
72
|
+
@wrapper = RedisWrapper::Entry.new(@teststring)
|
73
|
+
end
|
74
|
+
it 'should determine value is compressed and marshaled' do
|
75
|
+
@wrapper.flag_extraction
|
76
|
+
@wrapper.flags.should include(:compressed=>true,:marshaled=>true)
|
77
|
+
end
|
78
|
+
it 'should be based on order of flags' do
|
79
|
+
@wrapper.value = "teststring0x20x1"
|
80
|
+
@wrapper.flag_extraction
|
81
|
+
@wrapper.flags.should include(:compressed=>true,:marshaled=>true)
|
82
|
+
end
|
83
|
+
it 'should remove the flags' do
|
84
|
+
@wrapper.flag_extraction
|
85
|
+
@wrapper.value.should eq(@teststring.slice(0..-7))
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe '#compressed?' do
|
91
|
+
before do
|
92
|
+
@wrapper = RedisWrapper::Entry.new(nil)
|
93
|
+
end
|
94
|
+
it 'should return true if compression flag true' do
|
95
|
+
@wrapper.flags = {:compressed=>true}
|
96
|
+
@wrapper.send(:compressed?).should eq(true)
|
97
|
+
end
|
98
|
+
it 'should return false if anything else' do
|
99
|
+
@wrapper.send(:compressed?).should eq(false)
|
100
|
+
@wrapper.flags = {:compressed=>"true"}
|
101
|
+
@wrapper.send(:compressed?).should eq(false)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
describe '#marshaled?' do
|
105
|
+
before do
|
106
|
+
@wrapper = RedisWrapper::Entry.new(nil)
|
107
|
+
end
|
108
|
+
it 'should return true if compression flag true' do
|
109
|
+
@wrapper.flags = {:marshaled=>true}
|
110
|
+
@wrapper.send(:marshaled?).should eq(true)
|
111
|
+
end
|
112
|
+
it 'should return false if anything else' do
|
113
|
+
@wrapper.send(:marshaled?).should eq(false)
|
114
|
+
@wrapper.flags = {:compressed=>"true"}
|
115
|
+
@wrapper.send(:marshaled?).should eq(false)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe '#decompress' do
|
120
|
+
before do
|
121
|
+
@wrapper = RedisWrapper::Entry.new(nil)
|
122
|
+
@raw = "teststring"
|
123
|
+
@wrapper.value = Zlib::Deflate.deflate(@raw)
|
124
|
+
@wrapper.flags[:compressed] = true
|
125
|
+
end
|
126
|
+
it 'should decompress a compressed object' do
|
127
|
+
result = @wrapper.decompress(@wrapper.value)
|
128
|
+
result.should eq(@raw)
|
129
|
+
end
|
130
|
+
it 'should return original value if compression flag is not true' do
|
131
|
+
@wrapper.flags[:compressed] = false
|
132
|
+
@wrapper.decompress("test").should eq("test")
|
133
|
+
end
|
134
|
+
it 'should return error if value is not compressed' do
|
135
|
+
lambda {@wrapper.decompress("test")}.should raise_error
|
136
|
+
end
|
137
|
+
it 'should unset flag' do
|
138
|
+
@wrapper.decompress(@wrapper.value)
|
139
|
+
@wrapper.flags[:compressed].should_not eq(true)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
describe '#demarshal' do
|
144
|
+
before do
|
145
|
+
@wrapper = RedisWrapper::Entry.new(nil)
|
146
|
+
@raw = "teststring"
|
147
|
+
@wrapper.value = Marshal.dump(@raw)
|
148
|
+
@wrapper.flags[:marshaled] = true
|
149
|
+
end
|
150
|
+
it 'should demarshal a marshaled object' do
|
151
|
+
result = @wrapper.demarshal(@wrapper.value)
|
152
|
+
result.should eq(@raw)
|
153
|
+
end
|
154
|
+
it 'should return original value if marshaled flag is not true' do
|
155
|
+
@wrapper.flags[:marshaled] = false
|
156
|
+
@wrapper.demarshal("test").should eq("test")
|
157
|
+
end
|
158
|
+
it 'should return error if value is not marshaled' do
|
159
|
+
lambda {@wrapper.demarshal("test")}.should raise_error
|
160
|
+
end
|
161
|
+
it 'should unset flag' do
|
162
|
+
@wrapper.demarshal(@wrapper.value)
|
163
|
+
@wrapper.flags[:marshaled].should_not eq(true)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
describe '#extracted_result' do
|
168
|
+
before do
|
169
|
+
@wrapper = RedisWrapper::Entry.new(nil)
|
170
|
+
@obj = Array.new
|
171
|
+
end
|
172
|
+
context 'should return original value if' do
|
173
|
+
it 'marshaled' do
|
174
|
+
@wrapper.value = Marshal.dump(@obj)
|
175
|
+
@wrapper.flags[:marshaled] = true
|
176
|
+
@wrapper.extracted_result.should eq(@obj)
|
177
|
+
end
|
178
|
+
it 'compressed' do
|
179
|
+
@wrapper.value = Zlib::Deflate.deflate("test")
|
180
|
+
@wrapper.flags[:compressed] = true
|
181
|
+
@wrapper.extracted_result.should eq("test")
|
182
|
+
end
|
183
|
+
it 'compressed and marshaled' do
|
184
|
+
@wrapper.value = Zlib::Deflate.deflate(Marshal.dump(Array.new))
|
185
|
+
@wrapper.flags = {:compressed=>true,:marshaled=>true}
|
186
|
+
@wrapper.extracted_result.should eq(Array.new)
|
187
|
+
end
|
188
|
+
it 'should clear flags' do
|
189
|
+
@wrapper.value = Zlib::Deflate.deflate(Marshal.dump(@bj)) + "0x10x2"
|
190
|
+
@wrapper.flags = {:compressed=>true, :marshaled=>true}
|
191
|
+
@wrapper.extracted_result
|
192
|
+
@wrapper.flags.should eq({:compressed=>false, :marshaled=>false})
|
193
|
+
end
|
194
|
+
it 'should change stored value' do
|
195
|
+
@wrapper = RedisWrapper::Entry.new(Marshal.dump(@obj)+"0x1")
|
196
|
+
@wrapper.value.should_not eq(@obj)
|
197
|
+
@wrapper.extracted_result
|
198
|
+
@wrapper.value.should eq(@obj)
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
describe '#should_compress?' do
|
204
|
+
before do
|
205
|
+
@wrapper = RedisWrapper::Entry.new(nil)
|
206
|
+
@teststring = (0..10000).map{|u| u*u}.to_s
|
207
|
+
end
|
208
|
+
it 'should return false if :raw is set to true even if over threshold' do
|
209
|
+
@wrapper = RedisWrapper::Entry.new(nil,{:raw=>true})
|
210
|
+
@wrapper.value = @teststring
|
211
|
+
@wrapper.send(:should_compress?, @wrapper.value).should eq(false)
|
212
|
+
end
|
213
|
+
it 'should return true if over threshold without bypass' do
|
214
|
+
@wrapper.value = @teststring
|
215
|
+
@wrapper.send(:should_compress?, @wrapper.value).should eq(true)
|
216
|
+
end
|
217
|
+
it 'should accept a change in thershold in object creation' do
|
218
|
+
@wrapper = RedisWrapper::Entry.new(nil,{:compression_threshold=>100000})
|
219
|
+
@wrapper.value = @teststring
|
220
|
+
@wrapper.send(:should_compress?, @wrapper.value).should eq(false)
|
221
|
+
end
|
222
|
+
it 'should return true if greater than threshold' do
|
223
|
+
@wrapper.value = @teststring
|
224
|
+
@wrapper.send(:should_compress?, @wrapper.value).should eq(true)
|
225
|
+
end
|
226
|
+
it 'should not compress nil values' do
|
227
|
+
@wrapper.send(:should_compress?, @wrapper.value).should eq(false)
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
describe '#marshal' do
|
232
|
+
before do
|
233
|
+
@obj = Array.new
|
234
|
+
@wrapper = RedisWrapper::Entry.new(@obj)
|
235
|
+
end
|
236
|
+
it 'should marshal an object' do
|
237
|
+
@wrapper.marshal(@obj).should eq(Marshal.dump(@obj))
|
238
|
+
end
|
239
|
+
it 'should set marshal flag to true' do
|
240
|
+
@wrapper.marshal(@obj)
|
241
|
+
@wrapper.flags[:marshaled].should eq(true)
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
describe '#compress' do
|
246
|
+
before do
|
247
|
+
@wrapper = RedisWrapper::Entry.new("teststring1",:compression_threshold=>10)
|
248
|
+
end
|
249
|
+
it 'should compress object if above threshold' do
|
250
|
+
@wrapper.compress(@wrapper.value).should eq(Zlib::Deflate.deflate(@wrapper.value))
|
251
|
+
end
|
252
|
+
it "shouldn't compress if below threshold" do
|
253
|
+
@wrapper = RedisWrapper::Entry.new("teststring1")
|
254
|
+
@wrapper.compress(@wrapper.value).should eq(@wrapper.value)
|
255
|
+
end
|
256
|
+
it "should set compression flag true" do
|
257
|
+
@wrapper.compress(@wrapper.value)
|
258
|
+
@wrapper.flags[:compressed].should eq(true)
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
describe '#new' do
|
263
|
+
context 'passed a string' do
|
264
|
+
before do
|
265
|
+
@teststring = "teststring"
|
266
|
+
end
|
267
|
+
it 'should extract flags if passed an ecoded string' do
|
268
|
+
@wrapper = RedisWrapper::Entry.new(@teststring + "0x10x2")
|
269
|
+
@wrapper.flags.should include(:compressed=>true, :marshaled=>true)
|
270
|
+
@wrapper.value.should eq(@teststring)
|
271
|
+
end
|
272
|
+
end
|
273
|
+
context 'passed an object' do
|
274
|
+
before do
|
275
|
+
@obj = Array.new
|
276
|
+
@options = {:compression_threshold=>0}
|
277
|
+
end
|
278
|
+
it 'should respect the raw flag' do
|
279
|
+
@wrapper = RedisWrapper::Entry.new(@obj,@options.merge(:raw=>true))
|
280
|
+
@wrapper.value.should eq(@obj)
|
281
|
+
@wrapper.flags.should eq({})
|
282
|
+
end
|
283
|
+
end
|
284
|
+
context 'passed nil' do
|
285
|
+
before do
|
286
|
+
@wrapper = RedisWrapper::Entry.new(nil,:compression_threshold=>2)
|
287
|
+
end
|
288
|
+
it 'should skip compression and marshalling' do
|
289
|
+
@wrapper.flags.should eq({})
|
290
|
+
end
|
291
|
+
it 'should leave object alone' do
|
292
|
+
@wrapper.value.should eq(nil)
|
293
|
+
end
|
294
|
+
end
|
295
|
+
context 'options should' do
|
296
|
+
it 'allow manual setting of flags' do
|
297
|
+
@wrapper = RedisWrapper::Entry.new(nil,:flags=>{:compressed=>true})
|
298
|
+
@wrapper.flags.should eq(:compressed=>true)
|
299
|
+
end
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
describe "#flags_string" do
|
304
|
+
before do
|
305
|
+
@wrapper = RedisWrapper::Entry.new(nil)
|
306
|
+
end
|
307
|
+
it 'should return 0x1 if marshaled' do
|
308
|
+
@wrapper.flags = {:marshaled => true}
|
309
|
+
@wrapper.flags_string.should eq("0x1")
|
310
|
+
end
|
311
|
+
it 'should return 0x2 if compressed' do
|
312
|
+
@wrapper.flags = {:compressed => true}
|
313
|
+
@wrapper.flags_string.should eq("0x2")
|
314
|
+
end
|
315
|
+
it 'should return 0x10x2 if marshaled and compressed' do
|
316
|
+
@wrapper.flags = {:compressed => true, :marshaled => true}
|
317
|
+
@wrapper.flags_string.should eq("0x10x2")
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
321
|
+
describe "#prepare" do
|
322
|
+
before do
|
323
|
+
@obj = Array.new
|
324
|
+
@wrapper = RedisWrapper::Entry.new(@obj, :compression_threshold => 0)
|
325
|
+
end
|
326
|
+
it "should marshal when needed" do
|
327
|
+
@wrapper.should_receive(:marshal).with(@obj)
|
328
|
+
@wrapper.prepare(@obj)
|
329
|
+
end
|
330
|
+
it "should compress when needed" do
|
331
|
+
@wrapper.should_receive(:compress).with(Marshal.dump(@obj))
|
332
|
+
@wrapper.prepare(@obj)
|
333
|
+
end
|
334
|
+
it "should return nil if passed nil" do
|
335
|
+
@wrapper.prepare(nil).should eq(nil)
|
336
|
+
end
|
337
|
+
end
|
338
|
+
|
339
|
+
describe "#prepared_result" do
|
340
|
+
before do
|
341
|
+
@obj = Array.new
|
342
|
+
@wrapper = RedisWrapper::Entry.new(@obj, :compression_threshold => 0)
|
343
|
+
end
|
344
|
+
it 'should return a string' do
|
345
|
+
@wrapper.prepared_result.class.should eq(String)
|
346
|
+
end
|
347
|
+
it 'should be compressed and marshalled' do
|
348
|
+
@wrapper.prepared_result.should eq(Zlib::Deflate.deflate(Marshal.dump(@obj))+"0x10x2")
|
349
|
+
end
|
350
|
+
it 'should have flags' do
|
351
|
+
@flags = RedisWrapper::Entry.new(@wrapper.prepared_result).flags
|
352
|
+
@flags.should_not eq({})
|
353
|
+
@flags.class.should eq(Hash)
|
354
|
+
end
|
355
|
+
end
|
356
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'redis_wrapper/redis_wrapper'
|
2
|
+
require 'redis'
|
3
|
+
describe RedisWrapper::RedisWrapper do
|
4
|
+
describe '#get_options' do
|
5
|
+
before do
|
6
|
+
@wrapper = RedisWrapper::RedisWrapper.new()
|
7
|
+
end
|
8
|
+
it 'should return nil if last object is not a hash' do
|
9
|
+
@wrapper.send(:get_options, [],{},[]).should eq(nil)
|
10
|
+
end
|
11
|
+
it 'should return nil if object is a hash without a proper key' do
|
12
|
+
@wrapper.send(:get_options, [],{},{}).should eq(nil)
|
13
|
+
end
|
14
|
+
it 'should return args without last hash and the hash if contains proper key' do
|
15
|
+
@wrapper.send(:get_options, [],{},{:expire_in => 1}).should eq([{:expire_in => 1}, [[], {}]])
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '#get_key' do
|
20
|
+
before do
|
21
|
+
@wrapper = RedisWrapper::RedisWrapper.new()
|
22
|
+
@key = "test"
|
23
|
+
@other = [[1,2,3],{:expire_in=>1}]
|
24
|
+
end
|
25
|
+
it 'should return nil and args if first object is not a string' do
|
26
|
+
@wrapper.send(:get_key, *@other).should eq([nil,@other])
|
27
|
+
end
|
28
|
+
it 'should return string and args without string if first object is a string' do
|
29
|
+
@wrapper.send(:get_key, @key, *@other).should eq([@key,@other])
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#handle' do
|
34
|
+
before do
|
35
|
+
@wrapper = RedisWrapper::RedisWrapper.new()
|
36
|
+
@args = [[1,2,3],{:test=>1}]
|
37
|
+
end
|
38
|
+
it 'should return an array of string independent of what was passed' do
|
39
|
+
@wrapper.send(:handle,*@args).map{|u| u.class == String}.uniq.should eq([true])
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe '#method_missing' do
|
44
|
+
before do
|
45
|
+
@wrapper = RedisWrapper::RedisWrapper.new()
|
46
|
+
@redis = Redis.new()
|
47
|
+
end
|
48
|
+
it 'should set a TTL if options hash contains a :expire_in key' do
|
49
|
+
@wrapper.set "test", "test", :expire_in => 100
|
50
|
+
@redis.ttl("test").should_not eq(-1)
|
51
|
+
end
|
52
|
+
it 'should return response from server' do
|
53
|
+
@wrapper.set("test", "test").should eq(@redis.set("test", "test"))
|
54
|
+
end
|
55
|
+
it 'should have no expiry if none was passed or previously set' do
|
56
|
+
@redis.ttl("test1").should eq(-1)
|
57
|
+
@wrapper.set("test1", "test")
|
58
|
+
@redis.ttl("test1").should eq(-1)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
metadata
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: redis_wrapper
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- wakemaster39
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-01-17 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: redis
|
16
|
+
requirement: &24307320 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 2.2.1
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *24307320
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rspec
|
27
|
+
requirement: &24306720 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *24306720
|
36
|
+
description: A high level wrapper around the redis-rb gem and API. Designed to be
|
37
|
+
a drop in replacement for Redis class while handling object marshaling and compression,
|
38
|
+
setting key expiries, and namespacing your keys
|
39
|
+
email: wakemaster39@gmail.com
|
40
|
+
executables: []
|
41
|
+
extensions: []
|
42
|
+
extra_rdoc_files:
|
43
|
+
- README.md
|
44
|
+
files:
|
45
|
+
- CHANGELOG
|
46
|
+
- MIT-LICENSE
|
47
|
+
- README.md
|
48
|
+
- Rakefile
|
49
|
+
- lib/redis_wrapper.rb
|
50
|
+
- lib/redis_wrapper/entry.rb
|
51
|
+
- lib/redis_wrapper/redis_wrapper.rb
|
52
|
+
- lib/redis_wrapper/version.rb
|
53
|
+
- redis_wrapper.gemspec
|
54
|
+
- spec/entry_spec.rb
|
55
|
+
- spec/redis_wrapper_spec.rb
|
56
|
+
homepage: http://github.com/wakemaster39/redis-wrapper
|
57
|
+
licenses:
|
58
|
+
- MIT
|
59
|
+
post_install_message:
|
60
|
+
rdoc_options: []
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ! '>='
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
requirements: []
|
76
|
+
rubyforge_project:
|
77
|
+
rubygems_version: 1.8.10
|
78
|
+
signing_key:
|
79
|
+
specification_version: 3
|
80
|
+
summary: High level wrapper around redis API
|
81
|
+
test_files: []
|