redis-namespace 1.2.2 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of redis-namespace might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fa794503f48ad056c80d9818eb87c16a415c192e
4
- data.tar.gz: 0bdecba8c61e4b22523efd01ae57f812b0c5b535
3
+ metadata.gz: e20a131134003e74cb1b40bcf3ad11c61dae9d9d
4
+ data.tar.gz: f7718c7e9ea9ce7e8a46889c78bebe9a7d4a09ff
5
5
  SHA512:
6
- metadata.gz: 2c1c8657d3fd3c5de3537f2c7569a6170b05bfa75b578343b345490d9c1c5c44c144b091cb70e32a92f7ff17eca3386c2ccafa76ea4dc2b8dd3db8da3f893c99
7
- data.tar.gz: 64d2c5f885c88482f599a77ecb30c5fe7fd4d756a980451bfa2d86a04898d2eed70d7d0ed68fadfdf16603aba180c9846ebb2064b7dafd8c73354ee2d3aa7eff
6
+ metadata.gz: 00d8dca8c63810e4029cfc5430bb1507f9a1736320633ab703b049fc249c35160d1018151e7f6825f0eba960e868b82e7bd1836c6130fe850941b2825d5dfafd
7
+ data.tar.gz: 0fd499ddcf3c019525f6393eb4ba5957ebee559727924ea3c827e20cd57f818cca7e246ace91cea209b3914c7c0dde57e57e334aeab1af4d3e26b88fa7a1a38e
data/Rakefile CHANGED
@@ -1,7 +1,13 @@
1
- task :default => :spec
2
- task :test => :spec
1
+ require 'rubygems'
2
+ require "rspec/core/rake_task"
3
+
4
+ require "bundler/gem_tasks"
3
5
 
4
- desc "Run specs"
5
- task :spec do
6
- exec "rspec spec/redis_spec.rb"
6
+ RSpec::Core::RakeTask.new(:spec) do |spec|
7
+ spec.pattern = 'spec/*_spec.rb'
8
+ spec.rspec_opts = ['--backtrace']
9
+ spec.ruby_opts = ['-w']
7
10
  end
11
+
12
+ task :default => :spec
13
+ task :test => :spec
@@ -64,6 +64,8 @@ class Redis
64
64
  "exists" => [ :first ],
65
65
  "expire" => [ :first ],
66
66
  "expireat" => [ :first ],
67
+ "eval" => [ :eval_style ],
68
+ "evalsha" => [ :eval_style ],
67
69
  "flushall" => [],
68
70
  "flushdb" => [],
69
71
  "get" => [ :first ],
@@ -102,6 +104,8 @@ class Redis
102
104
  "mapped_hmset" => [ :first ],
103
105
  "mapped_hmget" => [ :first ],
104
106
  "mapped_mget" => [ :all, :all ],
107
+ "mapped_mset" => [ :all ],
108
+ "mapped_msetnx" => [ :all ],
105
109
  "mget" => [ :all ],
106
110
  "monitor" => [ :monitor ],
107
111
  "move" => [ :first ],
@@ -182,12 +186,14 @@ class Redis
182
186
  else {}
183
187
  end
184
188
 
185
- attr_accessor :namespace
189
+ attr_writer :namespace
186
190
  attr_reader :redis
191
+ attr_accessor :warning
187
192
 
188
193
  def initialize(namespace, options = {})
189
194
  @namespace = namespace
190
195
  @redis = options[:redis] || Redis.current
196
+ @warning = options[:warning] || false
191
197
  end
192
198
 
193
199
  # Ruby defines a now deprecated type method so we need to override it here
@@ -210,8 +216,21 @@ class Redis
210
216
  query.nil? ? super("*") : super
211
217
  end
212
218
 
213
- def exec
214
- method_missing(:exec)
219
+ def multi(&block)
220
+ namespaced_block(:multi, &block)
221
+ end
222
+
223
+ def pipelined(&block)
224
+ namespaced_block(:pipelined, &block)
225
+ end
226
+
227
+ def namespace(desired_namespace = nil)
228
+ if desired_namespace
229
+ yield Redis::Namespace.new(desired_namespace,
230
+ :redis => @redis)
231
+ end
232
+
233
+ @namespace
215
234
  end
216
235
 
217
236
  def method_missing(command, *args, &block)
@@ -219,8 +238,10 @@ class Redis
219
238
  COMMANDS[ALIASES[command.to_s]]
220
239
 
221
240
  # redis-namespace does not know how to handle this command.
222
- # Passing it to @redis as is.
241
+ # Passing it to @redis as is, where redis-namespace shows
242
+ # a warning message if @warning is set.
223
243
  if handling.nil?
244
+ warn("Passing '#{command}' command to redis as is.") if @warning
224
245
  return @redis.send(command, *args, &block)
225
246
  end
226
247
 
@@ -237,7 +258,7 @@ class Redis
237
258
  args = add_namespace(args)
238
259
  args.unshift(first) if first
239
260
  when :exclude_last
240
- last = args.pop
261
+ last = args.pop unless args.length == 1
241
262
  args = add_namespace(args)
242
263
  args.push(last) if last
243
264
  when :exclude_options
@@ -252,9 +273,33 @@ class Redis
252
273
  args.each_with_index { |a, i| args[i] = add_namespace(a) if i.even? }
253
274
  when :sort
254
275
  args[0] = add_namespace(args[0]) if args[0]
255
- [:by, :get, :store].each do |key|
256
- args[1][key] = add_namespace(args[1][key]) if args[1][key]
257
- end if args[1].is_a?(Hash)
276
+ if args[1].is_a?(Hash)
277
+ [:by, :store].each do |key|
278
+ args[1][key] = add_namespace(args[1][key]) if args[1][key]
279
+ end
280
+
281
+ args[1][:get] = Array(args[1][:get])
282
+
283
+ args[1][:get].each_index do |i|
284
+ args[1][:get][i] = add_namespace(args[1][:get][i]) unless args[1][:get][i] == "#"
285
+ end
286
+ end
287
+ when :eval_style
288
+ # redis.eval() and evalsha() can either take the form:
289
+ #
290
+ # redis.eval(script, [key1, key2], [argv1, argv2])
291
+ #
292
+ # Or:
293
+ #
294
+ # redis.eval(script, :keys => ['k1', 'k2'], :argv => ['arg1', 'arg2'])
295
+ #
296
+ # This is a tricky + annoying special case, where we only want the `keys`
297
+ # argument to be namespaced.
298
+ if args.last.is_a?(Hash)
299
+ args.last[:keys] = add_namespace(args.last[:keys])
300
+ else
301
+ args[1] = add_namespace(args[1])
302
+ end
258
303
  end
259
304
 
260
305
  # Dispatch the command to Redis and store the result.
@@ -272,6 +317,17 @@ class Redis
272
317
  end
273
318
 
274
319
  private
320
+
321
+ def namespaced_block(command, &block)
322
+ original = @redis
323
+ result = redis.send(command) do |r|
324
+ @redis = r
325
+ yield self
326
+ end
327
+ @redis = original
328
+ result
329
+ end
330
+
275
331
  def add_namespace(key)
276
332
  return key unless key && @namespace
277
333
 
@@ -294,7 +350,7 @@ class Redis
294
350
  when Hash
295
351
  Hash[*key.map {|k, v| [ rem_namespace(k), v ]}.flatten]
296
352
  else
297
- key.to_s.gsub /^#{@namespace}:/, ""
353
+ key.to_s.gsub(/^#{@namespace}:/, "")
298
354
  end
299
355
  end
300
356
  end
data/spec/redis_spec.rb CHANGED
@@ -23,28 +23,30 @@ describe "redis" do
23
23
  end
24
24
 
25
25
  it "proxies `client` to the client" do
26
- @namespaced.client.should == @redis.client
26
+ @namespaced.client.should eq(@redis.client)
27
27
  end
28
28
 
29
29
  it "should be able to use a namespace" do
30
- @namespaced['foo'].should == nil
30
+ @namespaced['foo'].should eq(nil)
31
31
  @namespaced['foo'] = 'chris'
32
- @namespaced['foo'].should == 'chris'
32
+ @namespaced['foo'].should eq('chris')
33
33
  @redis['foo'] = 'bob'
34
- @redis['foo'].should == 'bob'
34
+ @redis['foo'].should eq('bob')
35
35
 
36
36
  @namespaced.incrby('counter', 2)
37
- @namespaced['counter'].to_i.should == 2
38
- @redis['counter'].should == nil
39
- @namespaced.type('counter').should == 'string'
37
+ @namespaced['counter'].to_i.should eq(2)
38
+ @redis['counter'].should eq(nil)
39
+ @namespaced.type('counter').should eq('string')
40
40
  end
41
41
 
42
42
  it "should be able to use a namespace with bpop" do
43
43
  @namespaced.rpush "foo", "string"
44
44
  @namespaced.rpush "foo", "ns:string"
45
- @namespaced.blpop("foo", 1).should == ["foo", "string"]
46
- @namespaced.blpop("foo", 1).should == ["foo", "ns:string"]
47
- @namespaced.blpop("foo", 1).should == nil
45
+ @namespaced.rpush "foo", "string_no_timeout"
46
+ @namespaced.blpop("foo", 1).should eq(["foo", "string"])
47
+ @namespaced.blpop("foo", 1).should eq(["foo", "ns:string"])
48
+ @namespaced.blpop("foo").should eq(["foo", "string_no_timeout"])
49
+ @namespaced.blpop("foo", 1).should eq(nil)
48
50
  end
49
51
 
50
52
  it "should be able to use a namespace with del" do
@@ -52,114 +54,126 @@ describe "redis" do
52
54
  @namespaced['bar'] = 2000
53
55
  @namespaced['baz'] = 3000
54
56
  @namespaced.del 'foo'
55
- @namespaced['foo'].should == nil
57
+ @namespaced['foo'].should eq(nil)
56
58
  @namespaced.del 'bar', 'baz'
57
- @namespaced['bar'].should == nil
58
- @namespaced['baz'].should == nil
59
+ @namespaced['bar'].should eq(nil)
60
+ @namespaced['baz'].should eq(nil)
59
61
  end
60
62
 
61
63
  it 'should be able to use a namespace with append' do
62
64
  @namespaced['foo'] = 'bar'
63
- @namespaced.append('foo','n').should == 4
64
- @namespaced['foo'].should == 'barn'
65
- @redis['foo'].should == 'bar'
65
+ @namespaced.append('foo','n').should eq(4)
66
+ @namespaced['foo'].should eq('barn')
67
+ @redis['foo'].should eq('bar')
66
68
  end
67
69
 
68
70
  it 'should be able to use a namespace with brpoplpush' do
69
71
  @namespaced.lpush('foo','bar')
70
- @namespaced.brpoplpush('foo','bar',0).should == 'bar'
71
- @namespaced.lrange('foo',0,-1).should == []
72
- @namespaced.lrange('bar',0,-1).should == ['bar']
72
+ @namespaced.brpoplpush('foo','bar',0).should eq('bar')
73
+ @namespaced.lrange('foo',0,-1).should eq([])
74
+ @namespaced.lrange('bar',0,-1).should eq(['bar'])
73
75
  end
74
76
 
75
77
  it 'should be able to use a namespace with getbit' do
76
78
  @namespaced.set('foo','bar')
77
- @namespaced.getbit('foo',1).should == 1
79
+ @namespaced.getbit('foo',1).should eq(1)
78
80
  end
79
81
 
80
82
  it 'should be able to use a namespace with getrange' do
81
83
  @namespaced.set('foo','bar')
82
- @namespaced.getrange('foo',0,-1).should == 'bar'
84
+ @namespaced.getrange('foo',0,-1).should eq('bar')
83
85
  end
84
86
 
85
87
  it 'should be able to use a namespace with linsert' do
86
88
  @namespaced.rpush('foo','bar')
87
89
  @namespaced.rpush('foo','barn')
88
90
  @namespaced.rpush('foo','bart')
89
- @namespaced.linsert('foo','BEFORE','barn','barf').should == 4
90
- @namespaced.lrange('foo',0,-1).should == ['bar','barf','barn','bart']
91
+ @namespaced.linsert('foo','BEFORE','barn','barf').should eq(4)
92
+ @namespaced.lrange('foo',0,-1).should eq(['bar','barf','barn','bart'])
91
93
  end
92
94
 
93
95
  it 'should be able to use a namespace with lpushx' do
94
- @namespaced.lpushx('foo','bar').should == 0
96
+ @namespaced.lpushx('foo','bar').should eq(0)
95
97
  @namespaced.lpush('foo','boo')
96
- @namespaced.lpushx('foo','bar').should == 2
97
- @namespaced.lrange('foo',0,-1).should == ['bar','boo']
98
+ @namespaced.lpushx('foo','bar').should eq(2)
99
+ @namespaced.lrange('foo',0,-1).should eq(['bar','boo'])
98
100
  end
99
101
 
100
102
  it 'should be able to use a namespace with rpushx' do
101
- @namespaced.rpushx('foo','bar').should == 0
103
+ @namespaced.rpushx('foo','bar').should eq(0)
102
104
  @namespaced.lpush('foo','boo')
103
- @namespaced.rpushx('foo','bar').should == 2
104
- @namespaced.lrange('foo',0,-1).should == ['boo','bar']
105
+ @namespaced.rpushx('foo','bar').should eq(2)
106
+ @namespaced.lrange('foo',0,-1).should eq(['boo','bar'])
105
107
  end
106
108
 
107
109
  it 'should be able to use a namespace with setbit' do
108
110
  @namespaced.setbit('virgin_key', 1, 1)
109
111
  @namespaced.exists('virgin_key').should be_true
110
- @namespaced.get('virgin_key').should == @namespaced.getrange('virgin_key',0,-1)
112
+ @namespaced.get('virgin_key').should eq(@namespaced.getrange('virgin_key',0,-1))
111
113
  end
112
114
 
113
115
  it 'should be able to use a namespace with setrange' do
114
116
  @namespaced.setrange('foo', 0, 'bar')
115
- @namespaced['foo'].should == 'bar'
117
+ @namespaced['foo'].should eq('bar')
116
118
 
117
119
  @namespaced.setrange('bar', 2, 'foo')
118
- @namespaced['bar'].should == "\000\000foo"
120
+ @namespaced['bar'].should eq("\000\000foo")
119
121
  end
120
122
 
121
123
  it "should be able to use a namespace with mget" do
122
124
  @namespaced['foo'] = 1000
123
125
  @namespaced['bar'] = 2000
124
- @namespaced.mapped_mget('foo', 'bar').should == { 'foo' => '1000', 'bar' => '2000' }
125
- @namespaced.mapped_mget('foo', 'baz', 'bar').should == {'foo'=>'1000', 'bar'=>'2000', 'baz' => nil}
126
+ @namespaced.mapped_mget('foo', 'bar').should eq({ 'foo' => '1000', 'bar' => '2000' })
127
+ @namespaced.mapped_mget('foo', 'baz', 'bar').should eq({'foo'=>'1000', 'bar'=>'2000', 'baz' => nil})
126
128
  end
127
129
 
128
130
  it "should be able to use a namespace with mset" do
129
131
  @namespaced.mset('foo', '1000', 'bar', '2000')
130
- @namespaced.mapped_mget('foo', 'bar').should == { 'foo' => '1000', 'bar' => '2000' }
131
- @namespaced.mapped_mget('foo', 'baz', 'bar').should == { 'foo' => '1000', 'bar' => '2000', 'baz' => nil}
132
+ @namespaced.mapped_mget('foo', 'bar').should eq({ 'foo' => '1000', 'bar' => '2000' })
133
+ @namespaced.mapped_mget('foo', 'baz', 'bar').should eq({ 'foo' => '1000', 'bar' => '2000', 'baz' => nil})
134
+ @namespaced.mapped_mset('foo' => '3000', 'bar' => '5000')
135
+ @namespaced.mapped_mget('foo', 'bar').should eq({ 'foo' => '3000', 'bar' => '5000' })
136
+ @namespaced.mapped_mget('foo', 'baz', 'bar').should eq({ 'foo' => '3000', 'bar' => '5000', 'baz' => nil})
132
137
  end
133
138
 
134
139
  it "should be able to use a namespace with msetnx" do
135
140
  @namespaced.msetnx('foo', '1000', 'bar', '2000')
136
- @namespaced.mapped_mget('foo', 'bar').should == { 'foo' => '1000', 'bar' => '2000' }
137
- @namespaced.mapped_mget('foo', 'baz', 'bar').should == { 'foo' => '1000', 'bar' => '2000', 'baz' => nil}
141
+ @namespaced.mapped_mget('foo', 'bar').should eq({ 'foo' => '1000', 'bar' => '2000' })
142
+ @namespaced.mapped_mget('foo', 'baz', 'bar').should eq({ 'foo' => '1000', 'bar' => '2000', 'baz' => nil})
143
+ end
144
+
145
+ it "should be able to use a namespace with mapped_msetnx" do
146
+ puts @namespaced.keys.inspect
147
+ @namespaced.set('foo','1')
148
+ @namespaced.mapped_msetnx('foo'=>'1000', 'bar'=>'2000').should be_false
149
+ @namespaced.mapped_mget('foo', 'bar').should == { 'foo' => '1', 'bar' => nil }
150
+ @namespaced.mapped_msetnx('bar'=>'2000', 'baz'=>'1000').should be_true
151
+ @namespaced.mapped_mget('foo', 'bar').should == { 'foo' => '1', 'bar' => '2000' }
138
152
  end
139
153
 
140
154
  it "should be able to use a namespace with hashes" do
141
155
  @namespaced.hset('foo', 'key', 'value')
142
156
  @namespaced.hset('foo', 'key1', 'value1')
143
- @namespaced.hget('foo', 'key').should == 'value'
144
- @namespaced.hgetall('foo').should == {'key' => 'value', 'key1' => 'value1'}
145
- @namespaced.hlen('foo').should == 2
146
- @namespaced.hkeys('foo').should == ['key', 'key1']
157
+ @namespaced.hget('foo', 'key').should eq('value')
158
+ @namespaced.hgetall('foo').should eq({'key' => 'value', 'key1' => 'value1'})
159
+ @namespaced.hlen('foo').should eq(2)
160
+ @namespaced.hkeys('foo').should eq(['key', 'key1'])
147
161
  @namespaced.hmset('bar', 'key', 'value', 'key1', 'value1')
148
162
  @namespaced.hmget('bar', 'key', 'key1')
149
163
  @namespaced.hmset('bar', 'a_number', 1)
150
- @namespaced.hmget('bar', 'a_number').should == ['1']
164
+ @namespaced.hmget('bar', 'a_number').should eq(['1'])
151
165
  @namespaced.hincrby('bar', 'a_number', 3)
152
- @namespaced.hmget('bar', 'a_number').should == ['4']
153
- @namespaced.hgetall('bar').should == {'key' => 'value', 'key1' => 'value1', 'a_number' => '4'}
166
+ @namespaced.hmget('bar', 'a_number').should eq(['4'])
167
+ @namespaced.hgetall('bar').should eq({'key' => 'value', 'key1' => 'value1', 'a_number' => '4'})
154
168
 
155
169
  @namespaced.hsetnx('foonx','nx',10).should be_true
156
170
  @namespaced.hsetnx('foonx','nx',12).should be_false
157
- @namespaced.hget('foonx','nx').should == "10"
158
- @namespaced.hkeys('foonx').should == %w{ nx }
159
- @namespaced.hvals('foonx').should == %w{ 10 }
171
+ @namespaced.hget('foonx','nx').should eq("10")
172
+ @namespaced.hkeys('foonx').should eq(%w{ nx })
173
+ @namespaced.hvals('foonx').should eq(%w{ 10 })
160
174
  @namespaced.mapped_hmset('baz', {'key' => 'value', 'key1' => 'value1', 'a_number' => 4})
161
- @namespaced.mapped_hmget('baz', 'key', 'key1', 'a_number').should == {'key' => 'value', 'key1' => 'value1', 'a_number' => '4'}
162
- @namespaced.hgetall('baz').should == {'key' => 'value', 'key1' => 'value1', 'a_number' => '4'}
175
+ @namespaced.mapped_hmget('baz', 'key', 'key1', 'a_number').should eq({'key' => 'value', 'key1' => 'value1', 'a_number' => '4'})
176
+ @namespaced.hgetall('baz').should eq({'key' => 'value', 'key1' => 'value1', 'a_number' => '4'})
163
177
  end
164
178
 
165
179
  it "should properly intersect three sets" do
@@ -170,7 +184,7 @@ describe "redis" do
170
184
  @namespaced.sadd('bar', 3)
171
185
  @namespaced.sadd('bar', 4)
172
186
  @namespaced.sadd('baz', 3)
173
- @namespaced.sinter('foo', 'bar', 'baz').should == %w( 3 )
187
+ @namespaced.sinter('foo', 'bar', 'baz').should eq(%w( 3 ))
174
188
  end
175
189
 
176
190
  it "should properly union two sets" do
@@ -179,7 +193,7 @@ describe "redis" do
179
193
  @namespaced.sadd('bar', 2)
180
194
  @namespaced.sadd('bar', 3)
181
195
  @namespaced.sadd('bar', 4)
182
- @namespaced.sunion('foo', 'bar').sort.should == %w( 1 2 3 4 )
196
+ @namespaced.sunion('foo', 'bar').sort.should eq(%w( 1 2 3 4 ))
183
197
  end
184
198
 
185
199
  it "should properly union two sorted sets with options" do
@@ -189,7 +203,7 @@ describe "redis" do
189
203
  @namespaced.zadd('sort2', 3, 3)
190
204
  @namespaced.zadd('sort2', 4, 4)
191
205
  @namespaced.zunionstore('union', ['sort1', 'sort2'], :weights => [2, 1])
192
- @namespaced.zrevrange('union', 0, -1).should == %w( 2 4 3 1 )
206
+ @namespaced.zrevrange('union', 0, -1).should eq(%w( 2 4 3 1 ))
193
207
  end
194
208
 
195
209
  it "should properly union two sorted sets without options" do
@@ -199,7 +213,7 @@ describe "redis" do
199
213
  @namespaced.zadd('sort2', 3, 3)
200
214
  @namespaced.zadd('sort2', 4, 4)
201
215
  @namespaced.zunionstore('union', ['sort1', 'sort2'])
202
- @namespaced.zrevrange('union', 0, -1).should == %w( 4 2 3 1 )
216
+ @namespaced.zrevrange('union', 0, -1).should eq(%w( 4 2 3 1 ))
203
217
  end
204
218
 
205
219
  it "should add namespace to sort" do
@@ -210,43 +224,99 @@ describe "redis" do
210
224
  @namespaced.set('value_1', 'a')
211
225
  @namespaced.set('value_2', 'b')
212
226
 
213
- @namespaced.sort('foo').should == %w( 1 2 )
214
- @namespaced.sort('foo', :limit => [0, 1]).should == %w( 1 )
215
- @namespaced.sort('foo', :order => 'desc').should == %w( 2 1 )
216
- @namespaced.sort('foo', :by => 'weight_*').should == %w( 2 1 )
217
- @namespaced.sort('foo', :get => 'value_*').should == %w( a b )
227
+ @namespaced.sort('foo').should eq(%w( 1 2 ))
228
+ @namespaced.sort('foo', :limit => [0, 1]).should eq(%w( 1 ))
229
+ @namespaced.sort('foo', :order => 'desc').should eq(%w( 2 1 ))
230
+ @namespaced.sort('foo', :by => 'weight_*').should eq(%w( 2 1 ))
231
+ @namespaced.sort('foo', :get => 'value_*').should eq(%w( a b ))
232
+ @namespaced.sort('foo', :get => '#').should eq(%w( 1 2 ))
233
+ @namespaced.sort('foo', :get => ['#', 'value_*']).should eq([["1", "a"], ["2", "b"]])
218
234
 
219
235
  @namespaced.sort('foo', :store => 'result')
220
- @namespaced.lrange('result', 0, -1).should == %w( 1 2 )
236
+ @namespaced.lrange('result', 0, -1).should eq(%w( 1 2 ))
221
237
  end
222
238
 
223
239
  it "should yield the correct list of keys" do
224
240
  @namespaced["foo"] = 1
225
241
  @namespaced["bar"] = 2
226
242
  @namespaced["baz"] = 3
227
- @namespaced.keys("*").sort.should == %w( bar baz foo )
228
- @namespaced.keys.sort.should == %w( bar baz foo )
243
+ @namespaced.keys("*").sort.should eq(%w( bar baz foo ))
244
+ @namespaced.keys.sort.should eq(%w( bar baz foo ))
245
+ end
246
+
247
+ it "should add namepsace to multi blocks" do
248
+ @namespaced.mapped_hmset "foo", {"key" => "value"}
249
+ @namespaced.multi do |r|
250
+ r.del "foo"
251
+ r.mapped_hmset "foo", {"key1" => "value1"}
252
+ end
253
+ @namespaced.hgetall("foo").should eq({"key1" => "value1"})
254
+ end
255
+
256
+ it "should add namespace to pipelined blocks" do
257
+ @namespaced.mapped_hmset "foo", {"key" => "value"}
258
+ @namespaced.pipelined do |r|
259
+ r.del "foo"
260
+ r.mapped_hmset "foo", {"key1" => "value1"}
261
+ end
262
+ @namespaced.hgetall("foo").should eq({"key1" => "value1"})
263
+ end
264
+
265
+ it "should returned response array from pipelined block" do
266
+ @namespaced.mset "foo", "bar", "key", "value"
267
+ result = @namespaced.pipelined do |r|
268
+ r["foo"]
269
+ r["key"]
270
+ end
271
+ result.should eq(["bar", "value"])
229
272
  end
230
273
 
231
274
  it "can change its namespace" do
232
- @namespaced['foo'].should == nil
275
+ @namespaced['foo'].should eq(nil)
233
276
  @namespaced['foo'] = 'chris'
234
- @namespaced['foo'].should == 'chris'
277
+ @namespaced['foo'].should eq('chris')
235
278
 
236
- @namespaced.namespace.should == :ns
279
+ @namespaced.namespace.should eq(:ns)
237
280
  @namespaced.namespace = :spec
238
- @namespaced.namespace.should == :spec
281
+ @namespaced.namespace.should eq(:spec)
239
282
 
240
- @namespaced['foo'].should == nil
283
+ @namespaced['foo'].should eq(nil)
241
284
  @namespaced['foo'] = 'chris'
242
- @namespaced['foo'].should == 'chris'
285
+ @namespaced['foo'].should eq('chris')
286
+ end
287
+
288
+ it "can accept a temporary namespace" do
289
+ @namespaced.namespace.should eq(:ns)
290
+ @namespaced['foo'].should eq(nil)
291
+
292
+ @namespaced.namespace(:spec) do |temp_ns|
293
+ temp_ns.namespace.should eq(:spec)
294
+ temp_ns['foo'].should eq(nil)
295
+ temp_ns['foo'] = 'jake'
296
+ temp_ns['foo'].should eq('jake')
297
+ end
298
+
299
+ @namespaced.namespace.should eq(:ns)
300
+ @namespaced['foo'].should eq(nil)
243
301
  end
244
302
 
245
303
  it "should respond to :namespace=" do
246
- @namespaced.respond_to?(:namespace=).should == true
304
+ @namespaced.respond_to?(:namespace=).should eq(true)
305
+ end
306
+
307
+ it "should respond to :warning=" do
308
+ @namespaced.respond_to?(:warning=).should == true
309
+ end
310
+
311
+ it "should warn against unknown commands if :warning is true" do
312
+ @namespaced.warning = true
313
+ capture_stderr {
314
+ @namespaced.unknown('foo')
315
+ }.should == "Passing 'unknown' command to redis as is."
247
316
  end
248
317
 
249
- if @redis_version >= Gem::Version.new("2.6.0")
318
+ # Redis 2.6 RC reports its version as 2.5.
319
+ if @redis_version >= Gem::Version.new("2.5.0")
250
320
  describe "redis 2.6 commands" do
251
321
  it "should namespace bitcount" do
252
322
  pending "awaiting implementaton of command in redis gem"
@@ -262,50 +332,80 @@ describe "redis" do
262
332
 
263
333
  it "should namespace hincrbyfloat" do
264
334
  @namespaced.hset('mykey', 'field', 10.50)
265
- @namespaced.hincrbyfloat('mykey', 'field', 0.1).should == 10.6
335
+ @namespaced.hincrbyfloat('mykey', 'field', 0.1).should eq(10.6)
266
336
  end
267
337
 
268
338
  it "should namespace incrbyfloat" do
269
339
  @namespaced.set('mykey', 10.50)
270
- @namespaced.incrbyfloat('mykey', 0.1).should == 10.6
340
+ @namespaced.incrbyfloat('mykey', 0.1).should eq(10.6)
271
341
  end
272
342
 
273
343
  it "should namespace object" do
274
344
  @namespaced.set('foo', 1000)
275
- @namespaced.object('encoding', 'foo').should == 'int'
345
+ @namespaced.object('encoding', 'foo').should eq('int')
276
346
  end
277
347
 
278
348
  it "should namespace persist" do
279
349
  @namespaced.set('mykey', 'Hello')
280
350
  @namespaced.expire('mykey', 60)
281
- @namespaced.persist('mykey').should == true
282
- @namespaced.ttl('mykey').should == -1
351
+ @namespaced.persist('mykey').should eq(true)
352
+ @namespaced.ttl('mykey').should eq(-1)
283
353
  end
284
354
 
285
355
  it "should namespace pexpire" do
286
356
  @namespaced.set('mykey', 'Hello')
287
- @namespaced.pexpire('mykey', 60000).should == true
357
+ @namespaced.pexpire('mykey', 60000).should eq(true)
288
358
  end
289
359
 
290
360
  it "should namespace pexpireat" do
291
361
  @namespaced.set('mykey', 'Hello')
292
- @namespaced.pexpire('mykey', 1555555555005).should == true
362
+ @namespaced.pexpire('mykey', 1555555555005).should eq(true)
293
363
  end
294
364
 
295
365
  it "should namespace psetex" do
296
- @namespaced.psetex('mykey', 10000, 'Hello').should == 'OK'
297
- @namespaced.get('mykey').should == 'Hello'
366
+ @namespaced.psetex('mykey', 10000, 'Hello').should eq('OK')
367
+ @namespaced.get('mykey').should eq('Hello')
298
368
  end
299
369
 
300
370
  it "should namespace pttl" do
301
371
  @namespaced.set('mykey', 'Hello')
302
372
  @namespaced.expire('mykey', 1)
303
- @namespaced.pttl('mykey').should == 1000
373
+ @namespaced.pttl('mykey').should >= 0
304
374
  end
305
375
 
306
376
  it "should namespace restore" do
307
377
  pending "awaiting implementaton of command in redis gem"
308
378
  end
379
+
380
+ it "should namespace eval keys passed in as array args" do
381
+ @namespaced.
382
+ eval("return {KEYS[1], KEYS[2]}", %w[k1 k2], %w[arg1 arg2]).
383
+ should eq(%w[ns:k1 ns:k2])
384
+ end
385
+
386
+ it "should namespace eval keys passed in as hash args" do
387
+ @namespaced.
388
+ eval("return {KEYS[1], KEYS[2]}", :keys => %w[k1 k2], :argv => %w[arg1 arg2]).
389
+ should eq(%w[ns:k1 ns:k2])
390
+ end
391
+
392
+ context '#evalsha' do
393
+ let!(:sha) do
394
+ @namespaced.script(:load, "return {KEYS[1], KEYS[2]}")
395
+ end
396
+
397
+ it "should namespace evalsha keys passed in as array args" do
398
+ @namespaced.
399
+ evalsha(sha, %w[k1 k2], %w[arg1 arg2]).
400
+ should eq(%w[ns:k1 ns:k2])
401
+ end
402
+
403
+ it "should namespace evalsha keys passed in as hash args" do
404
+ @namespaced.
405
+ evalsha(sha, :keys => %w[k1 k2], :argv => %w[arg1 arg2]).
406
+ should eq(%w[ns:k1 ns:k2])
407
+ end
408
+ end
309
409
  end
310
410
  end
311
411
 
@@ -323,12 +423,12 @@ describe "redis" do
323
423
 
324
424
  it "should support command aliases (push_head)" do
325
425
  @namespaced.push_head('bar', 'quux')
326
- @redis.llen('ns:bar').should == 1
426
+ @redis.llen('ns:bar').should eq(1)
327
427
  end
328
428
 
329
429
  it "should support command aliases (zset_add)" do
330
430
  @namespaced.zset_add('bar', 1, 'quux')
331
- @redis.zcard('ns:bar').should == 1
431
+ @redis.zcard('ns:bar').should eq(1)
332
432
  end
333
433
  end
334
434
  end
data/spec/spec_helper.rb CHANGED
@@ -11,6 +11,20 @@ $TESTING=true
11
11
  $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
12
12
  require 'redis/namespace'
13
13
 
14
+ def capture_stderr
15
+ require 'stringio'
16
+ begin
17
+ original, $stderr = $stderr, StringIO.new
18
+ yield
19
+ rescue Redis::CommandError
20
+ # ignore Redis::CommandError for test and
21
+ # return captured messages
22
+ $stderr.string.chomp
23
+ ensure
24
+ $stderr = original
25
+ end
26
+ end
27
+
14
28
  RSpec::Matchers.define :have_key do |expected|
15
29
  match do |redis|
16
30
  redis.exists(expected)
metadata CHANGED
@@ -1,15 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis-namespace
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Wanstrath
8
8
  - Terence Lee
9
+ - Steve Klabnik
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2013-08-03 00:00:00.000000000 Z
13
+ date: 2013-05-03 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: redis
@@ -57,7 +58,10 @@ description: |
57
58
  Adds a Redis::Namespace class which can be used to namespace calls
58
59
  to Redis. This is useful when using a single instance of Redis with
59
60
  multiple, different applications.
60
- email: chris@ozmm.org
61
+ email:
62
+ - chris@ozmm.org
63
+ - hone02@gmail.com
64
+ - steve@steveklabnik.com
61
65
  executables: []
62
66
  extensions: []
63
67
  extra_rdoc_files: []
@@ -69,7 +73,7 @@ files:
69
73
  - lib/redis-namespace.rb
70
74
  - spec/redis_spec.rb
71
75
  - spec/spec_helper.rb
72
- homepage: http://github.com/defunkt/redis-namespace
76
+ homepage: http://github.com/resque/redis-namespace
73
77
  licenses: []
74
78
  metadata: {}
75
79
  post_install_message:
@@ -88,8 +92,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
88
92
  version: '0'
89
93
  requirements: []
90
94
  rubyforge_project:
91
- rubygems_version: 2.0.2
95
+ rubygems_version: 2.0.0
92
96
  signing_key:
93
97
  specification_version: 4
94
98
  summary: Namespaces Redis commands.
95
99
  test_files: []
100
+ has_rdoc: false