redis-namespace 1.1.1 → 1.2.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.
- data/README.md +1 -0
- data/lib/redis/namespace.rb +40 -10
- data/spec/redis_spec.rb +90 -1
- metadata +85 -32
- checksums.yaml +0 -7
data/README.md
CHANGED
data/lib/redis/namespace.rb
CHANGED
@@ -25,6 +25,11 @@ class Redis
|
|
25
25
|
# Add the namespace to all arguments but the last, e.g.
|
26
26
|
# BLPOP key1 key2 timeout =>
|
27
27
|
# BLPOP namespace:key1 namespace:key2 timeout
|
28
|
+
# :exclude_options
|
29
|
+
# Add the namespace to all arguments, except the last argument,
|
30
|
+
# if the last argument is a hash of options.
|
31
|
+
# ZUNIONSTORE key1 2 key2 key3 WEIGHTS 2 1 =>
|
32
|
+
# ZUNIONSTORE namespace:key1 2 namespace:key2 namespace:key3 WEIGHTS 2 1
|
28
33
|
# :alternate
|
29
34
|
# Add the namespace to every other argument, e.g.
|
30
35
|
# MSET key1 value1 key2 value2 =>
|
@@ -39,11 +44,14 @@ class Redis
|
|
39
44
|
# Add the namespace to all elements returned, e.g.
|
40
45
|
# key1 key2 => namespace:key1 namespace:key2
|
41
46
|
COMMANDS = {
|
47
|
+
"append" => [:first],
|
42
48
|
"auth" => [],
|
43
49
|
"bgrewriteaof" => [],
|
44
50
|
"bgsave" => [],
|
45
|
-
"blpop" => [ :exclude_last ],
|
51
|
+
"blpop" => [ :exclude_last, :first ],
|
46
52
|
"brpop" => [ :exclude_last ],
|
53
|
+
"brpoplpush" => [ :exclude_last ],
|
54
|
+
"config" => [],
|
47
55
|
"dbsize" => [],
|
48
56
|
"debug" => [ :exclude_first ],
|
49
57
|
"decr" => [ :first ],
|
@@ -51,9 +59,12 @@ class Redis
|
|
51
59
|
"del" => [ :all ],
|
52
60
|
"exists" => [ :first ],
|
53
61
|
"expire" => [ :first ],
|
62
|
+
"expireat" => [ :first ],
|
54
63
|
"flushall" => [],
|
55
64
|
"flushdb" => [],
|
56
65
|
"get" => [ :first ],
|
66
|
+
"getbit" => [ :first ],
|
67
|
+
"getrange" => [ :first ],
|
57
68
|
"getset" => [ :first ],
|
58
69
|
"hset" => [ :first ],
|
59
70
|
"hsetnx" => [ :first ],
|
@@ -73,20 +84,24 @@ class Redis
|
|
73
84
|
"keys" => [ :first, :all ],
|
74
85
|
"lastsave" => [],
|
75
86
|
"lindex" => [ :first ],
|
87
|
+
"linsert" => [ :first ],
|
76
88
|
"llen" => [ :first ],
|
77
89
|
"lpop" => [ :first ],
|
78
90
|
"lpush" => [ :first ],
|
91
|
+
"lpushx" => [ :first ],
|
79
92
|
"lrange" => [ :first ],
|
80
93
|
"lrem" => [ :first ],
|
81
94
|
"lset" => [ :first ],
|
82
95
|
"ltrim" => [ :first ],
|
83
96
|
"mapped_hmset" => [ :first ],
|
97
|
+
"mapped_hmget" => [ :first ],
|
84
98
|
"mapped_mget" => [ :all, :all ],
|
85
99
|
"mget" => [ :all ],
|
86
100
|
"monitor" => [ :monitor ],
|
87
101
|
"move" => [ :first ],
|
88
102
|
"mset" => [ :alternate ],
|
89
103
|
"msetnx" => [ :alternate ],
|
104
|
+
"ping" => [],
|
90
105
|
"psubscribe" => [ :all ],
|
91
106
|
"publish" => [ :first ],
|
92
107
|
"punsubscribe" => [ :all ],
|
@@ -97,6 +112,7 @@ class Redis
|
|
97
112
|
"rpop" => [ :first ],
|
98
113
|
"rpoplpush" => [ :all ],
|
99
114
|
"rpush" => [ :first ],
|
115
|
+
"rpushx" => [ :first ],
|
100
116
|
"sadd" => [ :first ],
|
101
117
|
"save" => [],
|
102
118
|
"scard" => [ :first ],
|
@@ -104,8 +120,10 @@ class Redis
|
|
104
120
|
"sdiffstore" => [ :all ],
|
105
121
|
"select" => [],
|
106
122
|
"set" => [ :first ],
|
123
|
+
"setbit" => [ :first ],
|
107
124
|
"setex" => [ :first ],
|
108
125
|
"setnx" => [ :first ],
|
126
|
+
"setrange" => [ :first ],
|
109
127
|
"shutdown" => [],
|
110
128
|
"sinter" => [ :all ],
|
111
129
|
"sinterstore" => [ :all ],
|
@@ -128,6 +146,7 @@ class Redis
|
|
128
146
|
"zcard" => [ :first ],
|
129
147
|
"zcount" => [ :first ],
|
130
148
|
"zincrby" => [ :first ],
|
149
|
+
"zinterstore" => [ :exclude_options ],
|
131
150
|
"zrange" => [ :first ],
|
132
151
|
"zrangebyscore" => [ :first ],
|
133
152
|
"zrank" => [ :first ],
|
@@ -135,8 +154,10 @@ class Redis
|
|
135
154
|
"zremrangebyrank" => [ :first ],
|
136
155
|
"zremrangebyscore" => [ :first ],
|
137
156
|
"zrevrange" => [ :first ],
|
157
|
+
"zrevrangebyscore" => [ :first ],
|
138
158
|
"zrevrank" => [ :first ],
|
139
159
|
"zscore" => [ :first ],
|
160
|
+
"zunionstore" => [ :exclude_options ],
|
140
161
|
"[]" => [ :first ],
|
141
162
|
"[]=" => [ :first ]
|
142
163
|
}
|
@@ -152,7 +173,7 @@ class Redis
|
|
152
173
|
|
153
174
|
def initialize(namespace, options = {})
|
154
175
|
@namespace = namespace
|
155
|
-
@redis = options[:redis]
|
176
|
+
@redis = options[:redis] || Redis.current
|
156
177
|
end
|
157
178
|
|
158
179
|
# Ruby defines a now deprecated type method so we need to override it here
|
@@ -163,11 +184,11 @@ class Redis
|
|
163
184
|
|
164
185
|
alias_method :self_respond_to?, :respond_to?
|
165
186
|
|
166
|
-
def respond_to?(
|
167
|
-
if self_respond_to?(
|
187
|
+
def respond_to?(command, include_private=false)
|
188
|
+
if self_respond_to?(command, include_private)
|
168
189
|
true
|
169
190
|
else
|
170
|
-
@redis.respond_to?(
|
191
|
+
@redis.respond_to?(command, include_private)
|
171
192
|
end
|
172
193
|
end
|
173
194
|
|
@@ -175,10 +196,6 @@ class Redis
|
|
175
196
|
query.nil? ? super("*") : super
|
176
197
|
end
|
177
198
|
|
178
|
-
def exec
|
179
|
-
method_missing(:exec)
|
180
|
-
end
|
181
|
-
|
182
199
|
def method_missing(command, *args, &block)
|
183
200
|
handling = COMMANDS[command.to_s] ||
|
184
201
|
COMMANDS[ALIASES[command.to_s]]
|
@@ -205,6 +222,14 @@ class Redis
|
|
205
222
|
last = args.pop
|
206
223
|
args = add_namespace(args)
|
207
224
|
args.push(last) if last
|
225
|
+
when :exclude_options
|
226
|
+
if args.last.is_a?(Hash)
|
227
|
+
last = args.pop
|
228
|
+
args = add_namespace(args)
|
229
|
+
args.push(last)
|
230
|
+
else
|
231
|
+
args = add_namespace(args)
|
232
|
+
end
|
208
233
|
when :alternate
|
209
234
|
args.each_with_index { |a, i| args[i] = add_namespace(a) if i.even? }
|
210
235
|
when :sort
|
@@ -218,7 +243,12 @@ class Redis
|
|
218
243
|
result = @redis.send(command, *args, &block)
|
219
244
|
|
220
245
|
# Remove the namespace from results that are keys.
|
221
|
-
|
246
|
+
case after
|
247
|
+
when :all
|
248
|
+
result = rem_namespace(result)
|
249
|
+
when :first
|
250
|
+
result[0] = rem_namespace(result[0]) if result
|
251
|
+
end
|
222
252
|
|
223
253
|
result
|
224
254
|
end
|
data/spec/redis_spec.rb
CHANGED
@@ -2,7 +2,7 @@ require File.dirname(__FILE__) + '/spec_helper'
|
|
2
2
|
|
3
3
|
describe "redis" do
|
4
4
|
before(:all) do
|
5
|
-
# use database 15 for testing so we dont accidentally step on
|
5
|
+
# use database 15 for testing so we dont accidentally step on your real data
|
6
6
|
@redis = Redis.new :db => 15
|
7
7
|
end
|
8
8
|
|
@@ -37,6 +37,14 @@ describe "redis" do
|
|
37
37
|
@namespaced.type('counter').should == 'string'
|
38
38
|
end
|
39
39
|
|
40
|
+
it "should be able to use a namespace with bpop" do
|
41
|
+
@namespaced.rpush "foo", "string"
|
42
|
+
@namespaced.rpush "foo", "ns:string"
|
43
|
+
@namespaced.blpop("foo", 1).should == ["foo", "string"]
|
44
|
+
@namespaced.blpop("foo", 1).should == ["foo", "ns:string"]
|
45
|
+
@namespaced.blpop("foo", 1).should == nil
|
46
|
+
end
|
47
|
+
|
40
48
|
it "should be able to use a namespace with del" do
|
41
49
|
@namespaced['foo'] = 1000
|
42
50
|
@namespaced['bar'] = 2000
|
@@ -48,6 +56,66 @@ describe "redis" do
|
|
48
56
|
@namespaced['baz'].should == nil
|
49
57
|
end
|
50
58
|
|
59
|
+
it 'should be able to use a namespace with append' do
|
60
|
+
@namespaced['foo'] = 'bar'
|
61
|
+
@namespaced.append('foo','n').should == 4
|
62
|
+
@namespaced['foo'].should == 'barn'
|
63
|
+
@redis['foo'].should == 'bar'
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should be able to use a namespace with brpoplpush' do
|
67
|
+
@namespaced.lpush('foo','bar')
|
68
|
+
@namespaced.brpoplpush('foo','bar',0).should == 'bar'
|
69
|
+
@namespaced.lrange('foo',0,-1).should == []
|
70
|
+
@namespaced.lrange('bar',0,-1).should == ['bar']
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'should be able to use a namespace with getbit' do
|
74
|
+
@namespaced.set('foo','bar')
|
75
|
+
@namespaced.getbit('foo',1).should == 1
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'should be able to use a namespace with getrange' do
|
79
|
+
@namespaced.set('foo','bar')
|
80
|
+
@namespaced.getrange('foo',0,-1).should == 'bar'
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'should be able to use a namespace with linsert' do
|
84
|
+
@namespaced.rpush('foo','bar')
|
85
|
+
@namespaced.rpush('foo','barn')
|
86
|
+
@namespaced.rpush('foo','bart')
|
87
|
+
@namespaced.linsert('foo','BEFORE','barn','barf').should == 4
|
88
|
+
@namespaced.lrange('foo',0,-1).should == ['bar','barf','barn','bart']
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'should be able to use a namespace with lpushx' do
|
92
|
+
@namespaced.lpushx('foo','bar').should == 0
|
93
|
+
@namespaced.lpush('foo','boo')
|
94
|
+
@namespaced.lpushx('foo','bar').should == 2
|
95
|
+
@namespaced.lrange('foo',0,-1).should == ['bar','boo']
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'should be able to use a namespace with rpushx' do
|
99
|
+
@namespaced.rpushx('foo','bar').should == 0
|
100
|
+
@namespaced.lpush('foo','boo')
|
101
|
+
@namespaced.rpushx('foo','bar').should == 2
|
102
|
+
@namespaced.lrange('foo',0,-1).should == ['boo','bar']
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'should be able to use a namespace with setbit' do
|
106
|
+
@namespaced.setbit('virgin_key', 1, 1)
|
107
|
+
@namespaced.exists('virgin_key').should be_true
|
108
|
+
@namespaced.get('virgin_key').should == @namespaced.getrange('virgin_key',0,-1)
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'should be able to use a namespace with setrange' do
|
112
|
+
@namespaced.setrange('foo', 0, 'bar')
|
113
|
+
@namespaced['foo'].should == 'bar'
|
114
|
+
|
115
|
+
@namespaced.setrange('bar', 2, 'foo')
|
116
|
+
@namespaced['bar'].should == "\000\000foo"
|
117
|
+
end
|
118
|
+
|
51
119
|
it "should be able to use a namespace with mget" do
|
52
120
|
@namespaced['foo'] = 1000
|
53
121
|
@namespaced['bar'] = 2000
|
@@ -88,6 +156,7 @@ describe "redis" do
|
|
88
156
|
@namespaced.hkeys('foonx').should == %w{ nx }
|
89
157
|
@namespaced.hvals('foonx').should == %w{ 10 }
|
90
158
|
@namespaced.mapped_hmset('baz', {'key' => 'value', 'key1' => 'value1', 'a_number' => 4})
|
159
|
+
@namespaced.mapped_hmget('baz', 'key', 'key1', 'a_number').should == {'key' => 'value', 'key1' => 'value1', 'a_number' => '4'}
|
91
160
|
@namespaced.hgetall('baz').should == {'key' => 'value', 'key1' => 'value1', 'a_number' => '4'}
|
92
161
|
end
|
93
162
|
|
@@ -111,6 +180,26 @@ describe "redis" do
|
|
111
180
|
@namespaced.sunion('foo', 'bar').sort.should == %w( 1 2 3 4 )
|
112
181
|
end
|
113
182
|
|
183
|
+
it "should properly union two sorted sets with options" do
|
184
|
+
@namespaced.zadd('sort1', 1, 1)
|
185
|
+
@namespaced.zadd('sort1', 2, 2)
|
186
|
+
@namespaced.zadd('sort2', 2, 2)
|
187
|
+
@namespaced.zadd('sort2', 3, 3)
|
188
|
+
@namespaced.zadd('sort2', 4, 4)
|
189
|
+
@namespaced.zunionstore('union', ['sort1', 'sort2'], :weights => [2, 1])
|
190
|
+
@namespaced.zrevrange('union', 0, -1).should == %w( 2 4 3 1 )
|
191
|
+
end
|
192
|
+
|
193
|
+
it "should properly union two sorted sets without options" do
|
194
|
+
@namespaced.zadd('sort1', 1, 1)
|
195
|
+
@namespaced.zadd('sort1', 2, 2)
|
196
|
+
@namespaced.zadd('sort2', 2, 2)
|
197
|
+
@namespaced.zadd('sort2', 3, 3)
|
198
|
+
@namespaced.zadd('sort2', 4, 4)
|
199
|
+
@namespaced.zunionstore('union', ['sort1', 'sort2'])
|
200
|
+
@namespaced.zrevrange('union', 0, -1).should == %w( 4 2 3 1 )
|
201
|
+
end
|
202
|
+
|
114
203
|
it "should add namespace to sort" do
|
115
204
|
@namespaced.sadd('foo', 1)
|
116
205
|
@namespaced.sadd('foo', 2)
|
metadata
CHANGED
@@ -1,66 +1,119 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis-namespace
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 31
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 1.2.0
|
5
11
|
platform: ruby
|
6
|
-
authors:
|
12
|
+
authors:
|
7
13
|
- Chris Wanstrath
|
14
|
+
- Terence Lee
|
8
15
|
autorequire:
|
9
16
|
bindir: bin
|
10
17
|
cert_chain: []
|
11
|
-
|
12
|
-
|
13
|
-
|
18
|
+
|
19
|
+
date: 2012-05-25 00:00:00 Z
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
14
22
|
name: redis
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 7
|
30
|
+
segments:
|
31
|
+
- 3
|
32
|
+
- 0
|
33
|
+
- 0
|
19
34
|
version: 3.0.0
|
20
35
|
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rake
|
21
39
|
prerelease: false
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 3
|
46
|
+
segments:
|
47
|
+
- 0
|
48
|
+
version: "0"
|
49
|
+
type: :development
|
50
|
+
version_requirements: *id002
|
51
|
+
- !ruby/object:Gem::Dependency
|
52
|
+
name: rspec
|
53
|
+
prerelease: false
|
54
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
hash: 3
|
60
|
+
segments:
|
61
|
+
- 0
|
62
|
+
version: "0"
|
63
|
+
type: :development
|
64
|
+
version_requirements: *id003
|
27
65
|
description: |
|
28
66
|
Adds a Redis::Namespace class which can be used to namespace calls
|
29
67
|
to Redis. This is useful when using a single instance of Redis with
|
30
68
|
multiple, different applications.
|
69
|
+
|
31
70
|
email: chris@ozmm.org
|
32
71
|
executables: []
|
72
|
+
|
33
73
|
extensions: []
|
74
|
+
|
34
75
|
extra_rdoc_files: []
|
35
|
-
|
76
|
+
|
77
|
+
files:
|
36
78
|
- README.md
|
37
79
|
- Rakefile
|
38
80
|
- LICENSE
|
39
|
-
- lib/redis/namespace.rb
|
40
81
|
- lib/redis-namespace.rb
|
82
|
+
- lib/redis/namespace.rb
|
41
83
|
- spec/redis_spec.rb
|
42
84
|
- spec/spec_helper.rb
|
43
85
|
homepage: http://github.com/defunkt/redis-namespace
|
44
86
|
licenses: []
|
45
|
-
|
87
|
+
|
46
88
|
post_install_message:
|
47
89
|
rdoc_options: []
|
48
|
-
|
90
|
+
|
91
|
+
require_paths:
|
49
92
|
- lib
|
50
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
93
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
hash: 3
|
99
|
+
segments:
|
100
|
+
- 0
|
101
|
+
version: "0"
|
102
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
|
+
none: false
|
104
|
+
requirements:
|
105
|
+
- - ">="
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
hash: 3
|
108
|
+
segments:
|
109
|
+
- 0
|
110
|
+
version: "0"
|
60
111
|
requirements: []
|
112
|
+
|
61
113
|
rubyforge_project:
|
62
|
-
rubygems_version:
|
114
|
+
rubygems_version: 1.8.21
|
63
115
|
signing_key:
|
64
|
-
specification_version:
|
116
|
+
specification_version: 3
|
65
117
|
summary: Namespaces Redis commands.
|
66
118
|
test_files: []
|
119
|
+
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 4e21c69c01d7d32407ce889f986494a8d8bf5d5d
|
4
|
-
data.tar.gz: 29e559ef8ee02ebf2ef626df363b7ce20856d405
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: dad2aa13dfce40202b9c4ddb0ac2a7e53596f4d5264ac10e3e6e722c4ce01dc15fb7d37cc27ba47f9c63f44ac4a776f65d2f9c6075db24cccaaf3de048808801
|
7
|
-
data.tar.gz: afcb9eb9c96f1384791c841cfe8bcfcff9e0e2566067c9e295e01e36c22f0442e3a7b395b85f1ce4b71aa781cd72f4ab6ad78a0cc435a15e45c116e43bae6de8
|