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 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: []