redis_wrapper 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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,9 @@
1
+ require 'rspec/core/rake_task'
2
+
3
+ desc "Run all tests"
4
+ RSpec::Core::RakeTask.new(:spec) do |t|
5
+ t.rspec_opts = '--format documentation'
6
+ t.ruby_opts = "-W1"
7
+ end
8
+
9
+ task :default => :spec
@@ -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,6 @@
1
+ module RedisWrapper
2
+ MAJOR = 0
3
+ MINOR = 1
4
+ PATCH = 0
5
+ VERSION = [MAJOR, MINOR, PATCH].compact.join('.')
6
+ end
@@ -0,0 +1,7 @@
1
+ require "redis"
2
+ require "redis_wrapper/version"
3
+
4
+ module RedisWrapper
5
+ autoload :RedisWrapper, File.join(File.dirname(__FILE__), "redis_wrapper", "redis_wrapper")
6
+ autoload :Entry, File.join(File.dirname(__FILE__), "redis_wrapper", "entry")
7
+ 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
+
@@ -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: []