redis-namespace 1.2.2 → 1.3.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.

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