redis-namespace 1.5.2 → 1.5.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d8a331998a5b4c5b9f5f323da912dc2e4555a2db
4
+ data.tar.gz: da08789df8269adf261ff47f7c1da894718ddc88
5
+ SHA512:
6
+ metadata.gz: 68d3325257b3c5a9ba0a7e461c39d30ce9de639304e8926e809e5f51256c5da41a8cdb2f29a5c2cd5c700032dc6d4e5b42be3e29327bcdaf0439c93f4db03f0a
7
+ data.tar.gz: cffdb70935cade3a38e66e46a71ad9082afb074ebbbc05627113b6504e5b6337ec8c917734eeaf871e6dea271e9483bdfa11b22bdf1b772eab04e0f973fc3bdc
data/README.md CHANGED
@@ -1,38 +1,106 @@
1
1
  redis-namespace
2
- ---------------
2
+ ===============
3
3
 
4
- Requires the redis gem.
4
+ Redis::Namespace provides an interface to a namespaced subset of your [redis][] keyspace (e.g., keys with a common beginning), and requires the [redis-rb][] gem.
5
5
 
6
- Namespaces all Redis calls.
6
+ ~~~ irb
7
+ require 'redis-namespace'
8
+ # => true
7
9
 
8
- ``` ruby
9
- r = Redis::Namespace.new(:ns, :redis => @r)
10
- r['foo'] = 1000
11
- ```
10
+ redis_connection = Redis.new
11
+ # => #<Redis client v3.1.0 for redis://127.0.0.1:6379/0>
12
+ namespaced_redis = Redis::Namespace.new(:ns, :redis => redis_connection)
13
+ # => #<Redis::Namespace v1.5.0 with client v3.1.0 for redis://127.0.0.1:6379/0/ns>
12
14
 
13
- This will perform the equivalent of:
15
+ namespaced_redis.set('foo', 'bar') # redis_connection.set('ns:foo', 'bar')
16
+ # => "OK"
14
17
 
15
- redis-cli set ns:foo 1000
18
+ # Redis::Namespace automatically prepended our namespace to the key
19
+ # before sending it to our redis client.
16
20
 
17
- Useful when you have multiple systems using Redis differently in your app.
21
+ namespaced_redis.get('foo')
22
+ # => "bar"
23
+ redis_connection.get('ns:foo')
24
+ # => "bar"
18
25
 
26
+ namespaced_redis.del('foo')
27
+ # => 1
28
+ namespaced_redis.get('foo')
29
+ # => nil
30
+ redis_connection.get('ns:foo')
31
+ # => nil
32
+ ~~~
19
33
 
20
34
  Installation
21
35
  ============
22
36
 
37
+ Redis::Namespace is packaged as the redis-namespace gem, and hosted on rubygems.org.
38
+
39
+ From the command line:
40
+
23
41
  $ gem install redis-namespace
24
42
 
43
+ Or in your Gemfile:
25
44
 
45
+ ~~~ ruby
46
+ gem 'redis-namespace'
47
+ ~~~
26
48
 
27
- Testing
49
+ Caveats
28
50
  =======
29
51
 
30
- $ bundle install
31
- $ rake
52
+ `Redis::Namespace` provides a namespaced interface to `Redis` by keeping an internal registry of the method signatures in `Redis` provided by the redis-rb gem;
53
+ we keep track of which arguments need the namespace added, and which return values need the namespace removed.
54
+
55
+ Blind Passthrough
56
+ -----------------
57
+ If your version of this gem doesn't know about a particular command, it can't namespace it.
58
+ Historically, this has meant that Redis::Namespace blindly passes unknown commands on to the underlying redis connection without modification which can lead to surprising effects.
59
+
60
+ As of v1.5.0, blind passthrough has been deprecated, and the functionality will be removed entirely in 2.0.
61
+
62
+ If you come across a command that is not yet supported, please open an issue on the [issue tracker][] or submit a pull-request.
63
+
64
+ Administrative Commands
65
+ -----------------------
66
+ The effects of some redis commands cannot be limited to a particular namespace (e.g., `FLUSHALL`, which literally truncates all databases in your redis server, regardless of keyspace).
67
+ Historically, this has meant that Redis::Namespace intentionally passes administrative commands on to the underlying redis connection without modification, which can lead to surprising effects.
68
+
69
+ As of v1.6.0, the direct use of administrative commands has been deprecated, and the functionality will be removed entirely in 2.0;
70
+ while such commands are often useful for testing or administration, their meaning is inherently hidden when placed behind an interface that implies it will namespace everything.
71
+
72
+ The prefered way to send an administrative command is on the redis connection
73
+ itself, which is publicly exposed as `Redis::Namespace#redis`:
74
+
75
+ ~~~ ruby
76
+ namespaced.redis.flushall()
77
+ # => "OK"
78
+ ~~~
79
+
80
+ 2.x Planned Breaking Changes
81
+ ============================
82
+
83
+ As mentioned above, 2.0 will remove blind passthrough and the administrative command passthrough.
84
+ By default in 1.5+, deprecation warnings are present and enabled;
85
+ they can be silenced by initializing `Redis::Namespace` with `warnings: false` or by setting the `REDIS_NAMESPACE_QUIET` environment variable.
86
+
87
+ Early opt-in
88
+ ------------
89
+
90
+ To enable testing against the 2.x interface before its release, in addition to deprecation warnings, early opt-in to these changes can be enabled by initializing `Redis::Namespace` with `deprecations: true` or by setting the `REDIS_NAMESPACE_DEPRECATIONS` environment variable.
91
+ This should only be done once all warnings have been addressed.
92
+
93
+ Authors
94
+ =======
32
95
 
96
+ While there are many authors who have contributed to this project, the following have done so on an ongoing basis with at least 5 commits:
33
97
 
34
- Author
35
- =====
98
+ - Chris Wanstrath (@defunkt)
99
+ - Ryan Biesemeyer (@yaauie)
100
+ - Steve Klabnik (@steveklabnik)
101
+ - Terence Lee (@hone)
102
+ - Eoin Coffey (@ecoffey)
36
103
 
37
- Chris Wanstrath :: chris@ozmm.org
38
- Terence Lee :: hone02@gmail.com
104
+ [redis]: http://redis.io
105
+ [redis-rb]: https://github.com/redis/redis-rb
106
+ [issue tracker]: https://github.com/resque/redis-namespace/issues
@@ -3,7 +3,7 @@ require 'redis/namespace/version'
3
3
 
4
4
  class Redis
5
5
  class Namespace
6
- # The following table defines how input parameters and result
6
+ # The following tables define how input parameters and result
7
7
  # values should be modified for the namespace.
8
8
  #
9
9
  # COMMANDS is a hash. Each key is the name of a command and each
@@ -53,34 +53,23 @@ class Redis
53
53
  # :all
54
54
  # Add the namespace to all elements returned, e.g.
55
55
  # key1 key2 => namespace:key1 namespace:key2
56
- COMMANDS = {
57
- "append" => [:first],
58
- "auth" => [],
59
- "bgrewriteaof" => [],
60
- "bgsave" => [],
56
+ NAMESPACED_COMMANDS = {
57
+ "append" => [ :first ],
61
58
  "bitcount" => [ :first ],
62
59
  "bitop" => [ :exclude_first ],
63
60
  "blpop" => [ :exclude_last, :first ],
64
61
  "brpop" => [ :exclude_last, :first ],
65
62
  "brpoplpush" => [ :exclude_last ],
66
- "config" => [],
67
- "dbsize" => [],
68
63
  "debug" => [ :exclude_first ],
69
64
  "decr" => [ :first ],
70
65
  "decrby" => [ :first ],
71
66
  "del" => [ :all ],
72
- "discard" => [],
73
- "disconnect!" => [],
74
67
  "dump" => [ :first ],
75
- "echo" => [],
76
68
  "exists" => [ :first ],
77
69
  "expire" => [ :first ],
78
70
  "expireat" => [ :first ],
79
71
  "eval" => [ :eval_style ],
80
72
  "evalsha" => [ :eval_style ],
81
- "exec" => [],
82
- "flushall" => [],
83
- "flushdb" => [],
84
73
  "get" => [ :first ],
85
74
  "getbit" => [ :first ],
86
75
  "getrange" => [ :first ],
@@ -103,9 +92,7 @@ class Redis
103
92
  "incr" => [ :first ],
104
93
  "incrby" => [ :first ],
105
94
  "incrbyfloat" => [ :first ],
106
- "info" => [],
107
95
  "keys" => [ :first, :all ],
108
- "lastsave" => [],
109
96
  "lindex" => [ :first ],
110
97
  "linsert" => [ :first ],
111
98
  "llen" => [ :first ],
@@ -124,7 +111,6 @@ class Redis
124
111
  "mget" => [ :all ],
125
112
  "monitor" => [ :monitor ],
126
113
  "move" => [ :first ],
127
- "multi" => [],
128
114
  "mset" => [ :alternate ],
129
115
  "msetnx" => [ :alternate ],
130
116
  "object" => [ :exclude_first ],
@@ -134,14 +120,11 @@ class Redis
134
120
  "pfadd" => [ :first ],
135
121
  "pfcount" => [ :all ],
136
122
  "pfmerge" => [ :all ],
137
- "ping" => [],
138
123
  "psetex" => [ :first ],
139
124
  "psubscribe" => [ :all ],
140
125
  "pttl" => [ :first ],
141
126
  "publish" => [ :first ],
142
127
  "punsubscribe" => [ :all ],
143
- "quit" => [],
144
- "randomkey" => [],
145
128
  "rename" => [ :all ],
146
129
  "renamenx" => [ :all ],
147
130
  "restore" => [ :first ],
@@ -150,24 +133,19 @@ class Redis
150
133
  "rpush" => [ :first ],
151
134
  "rpushx" => [ :first ],
152
135
  "sadd" => [ :first ],
153
- "save" => [],
154
136
  "scard" => [ :first ],
155
137
  "scan" => [ :scan_style, :second ],
156
138
  "scan_each" => [ :scan_style, :all ],
157
- "script" => [],
158
139
  "sdiff" => [ :all ],
159
140
  "sdiffstore" => [ :all ],
160
- "select" => [],
161
141
  "set" => [ :first ],
162
142
  "setbit" => [ :first ],
163
143
  "setex" => [ :first ],
164
144
  "setnx" => [ :first ],
165
145
  "setrange" => [ :first ],
166
- "shutdown" => [],
167
146
  "sinter" => [ :all ],
168
147
  "sinterstore" => [ :all ],
169
148
  "sismember" => [ :first ],
170
- "slaveof" => [],
171
149
  "smembers" => [ :first ],
172
150
  "smove" => [ :exclude_last ],
173
151
  "sort" => [ :sort ],
@@ -183,8 +161,6 @@ class Redis
183
161
  "ttl" => [ :first ],
184
162
  "type" => [ :first ],
185
163
  "unsubscribe" => [ :all ],
186
- "unwatch" => [ :all ],
187
- "watch" => [ :all ],
188
164
  "zadd" => [ :first ],
189
165
  "zcard" => [ :first ],
190
166
  "zcount" => [ :first ],
@@ -206,6 +182,48 @@ class Redis
206
182
  "[]" => [ :first ],
207
183
  "[]=" => [ :first ]
208
184
  }
185
+ TRANSACTION_COMMANDS = {
186
+ "discard" => [],
187
+ "exec" => [],
188
+ "multi" => [],
189
+ "unwatch" => [ :all ],
190
+ "watch" => [ :all ],
191
+ }
192
+ HELPER_COMMANDS = {
193
+ "auth" => [],
194
+ "disconnect!" => [],
195
+ "echo" => [],
196
+ "ping" => [],
197
+ "time" => [],
198
+ }
199
+ ADMINISTRATIVE_COMMANDS = {
200
+ "bgrewriteaof" => [],
201
+ "bgsave" => [],
202
+ "config" => [],
203
+ "dbsize" => [],
204
+ "flushall" => [],
205
+ "flushdb" => [],
206
+ "info" => [],
207
+ "lastsave" => [],
208
+ "quit" => [],
209
+ "randomkey" => [],
210
+ "save" => [],
211
+ "script" => [],
212
+ "select" => [],
213
+ "shutdown" => [],
214
+ "slaveof" => [],
215
+ }
216
+
217
+ DEPRECATED_COMMANDS = [
218
+ ADMINISTRATIVE_COMMANDS
219
+ ].compact.reduce(:merge)
220
+
221
+ COMMANDS = [
222
+ NAMESPACED_COMMANDS,
223
+ TRANSACTION_COMMANDS,
224
+ HELPER_COMMANDS,
225
+ ADMINISTRATIVE_COMMANDS,
226
+ ].compact.reduce(:merge)
209
227
 
210
228
  # Support 1.8.7 by providing a namespaced reference to Enumerable::Enumerator
211
229
  Enumerator = Enumerable::Enumerator unless defined?(::Enumerator)
@@ -286,7 +304,20 @@ class Redis
286
304
  def method_missing(command, *args, &block)
287
305
  normalized_command = command.to_s.downcase
288
306
 
289
- if COMMANDS.include?(normalized_command)
307
+ if ADMINISTRATIVE_COMMANDS.include?(normalized_command)
308
+ # administrative commands usage is deprecated and will be removed in 2.0
309
+ # redis-namespace cannot safely apply a namespace to their effects.
310
+ return super if deprecations?
311
+ if warning?
312
+ warn("Passing '#{normalized_command}' command to redis as is; " +
313
+ "administrative commands cannot be effectively namespaced " +
314
+ "and should be called on the redis connection directly; " +
315
+ "passthrough has been deprecated and will be removed in " +
316
+ "redis-namespace 2.0 (at #{call_site})"
317
+ )
318
+ end
319
+ call_with_namespace(command, *args, &block)
320
+ elsif COMMANDS.include?(normalized_command)
290
321
  call_with_namespace(command, *args, &block)
291
322
  elsif @redis.respond_to?(normalized_command) && !deprecations?
292
323
  # blind passthrough is deprecated and will be removed in 2.0
@@ -294,7 +325,6 @@ class Redis
294
325
  # Passing it to @redis as is, where redis-namespace shows
295
326
  # a warning message if @warning is set.
296
327
  if warning?
297
- call_site = caller.reject { |l| l.start_with?(__FILE__) }.first
298
328
  warn("Passing '#{command}' command to redis as is; blind " +
299
329
  "passthrough has been deprecated and will be removed in " +
300
330
  "redis-namespace 2.0 (at #{call_site})")
@@ -305,15 +335,24 @@ class Redis
305
335
  end
306
336
  end
307
337
 
338
+ def inspect
339
+ "<#{self.class.name} v#{VERSION} with client v#{Redis::VERSION} "\
340
+ "for #{@redis.id}/#{@namespace}>"
341
+ end
342
+
308
343
  def respond_to_missing?(command, include_all=false)
309
- return true if COMMANDS.include?(command.to_s.downcase)
344
+ normalized_command = command.to_s.downcase
310
345
 
311
- # blind passthrough is deprecated and will be removed in 2.0
312
- if @redis.respond_to?(command, include_all) && !deprecations?
313
- return true
346
+ case
347
+ when DEPRECATED_COMMANDS.include?(normalized_command)
348
+ !deprecations?
349
+ when COMMANDS.include?(normalized_command)
350
+ true
351
+ when !deprecations? && redis.respond_to?(command, include_all)
352
+ true
353
+ else
354
+ defined?(super) && super
314
355
  end
315
-
316
- defined?(super) && super
317
356
  end
318
357
 
319
358
  def call_with_namespace(command, *args, &block)
@@ -325,6 +364,9 @@ class Redis
325
364
 
326
365
  (before, after) = handling
327
366
 
367
+ # Modify the local *args array in-place, no need to copy it.
368
+ args.map! {|arg| clone_args(arg)}
369
+
328
370
  # Add the namespace to any parameters that are keys.
329
371
  case before
330
372
  when :first
@@ -410,6 +452,21 @@ class Redis
410
452
 
411
453
  private
412
454
 
455
+ # Avoid modifying the caller's (pass-by-reference) arguments.
456
+ def clone_args(arg)
457
+ if arg.is_a?(Array)
458
+ arg.map {|sub_arg| clone_args(sub_arg)}
459
+ elsif arg.is_a?(Hash)
460
+ Hash[arg.map {|k, v| [clone_args(k), clone_args(v)]}]
461
+ else
462
+ arg # Some objects (e.g. symbol) can't be dup'd.
463
+ end
464
+ end
465
+
466
+ def call_site
467
+ caller.reject { |l| l.start_with?(__FILE__) }.first
468
+ end
469
+
413
470
  def namespaced_block(command, &block)
414
471
  redis.send(command) do |r|
415
472
  begin
@@ -426,9 +483,10 @@ class Redis
426
483
 
427
484
  case key
428
485
  when Array
429
- key.map {|k| add_namespace k}
486
+ key.map! {|k| add_namespace k}
430
487
  when Hash
431
- Hash[*key.map {|k, v| [ add_namespace(k), v ]}.flatten]
488
+ key.keys.each {|k| key[add_namespace(k)] = key.delete(k)}
489
+ key
432
490
  else
433
491
  "#{@namespace}:#{key}"
434
492
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  class Redis
4
4
  class Namespace
5
- VERSION = '1.5.2'
5
+ VERSION = '1.5.3'
6
6
  end
7
7
  end
@@ -34,6 +34,7 @@ describe Redis::Namespace do
34
34
  allow(redis).to receive(:unhandled) do |*args|
35
35
  "unhandled(#{args.inspect})"
36
36
  end
37
+ allow(redis).to receive(:flushdb).and_return("OK")
37
38
  end
38
39
 
39
40
  # This behaviour will hold true after the 2.x migration
@@ -50,6 +51,16 @@ describe Redis::Namespace do
50
51
  end.to raise_exception NoMethodError
51
52
  end
52
53
  end
54
+
55
+ context('with an administrative command') do
56
+ it { should_not respond_to :flushdb }
57
+
58
+ it('raises a NoMethodError') do
59
+ expect do
60
+ namespaced.flushdb
61
+ end.to raise_exception NoMethodError
62
+ end
63
+ end
53
64
  end
54
65
 
55
66
  # This behaviour will no longer be available after the 2.x migration
@@ -77,6 +88,7 @@ describe Redis::Namespace do
77
88
 
78
89
  expect(warning).to_not be_empty
79
90
  expect(warning).to include %q(Passing 'unhandled' command to redis as is)
91
+ expect(warning).to include %q(blind passthrough)
80
92
  expect(warning).to include __FILE__
81
93
  end
82
94
 
@@ -87,10 +99,30 @@ describe Redis::Namespace do
87
99
  namespaced.unhandled('bar')
88
100
  end
89
101
  warning = stderr.tap(&:rewind).read
102
+
90
103
  expect(warning).to be_empty
91
104
  end
92
105
  end
93
106
  end
107
+
108
+ context('with an administrative command') do
109
+ it { should respond_to :flushdb }
110
+ it 'processes the command' do
111
+ expect(redis).to receive(:flushdb)
112
+ capture_stderr { namespaced.flushdb }
113
+ end
114
+ it 'warns with helpful output' do
115
+ capture_stderr(stderr = StringIO.new) do
116
+ namespaced.flushdb
117
+ end
118
+ warning = stderr.tap(&:rewind).read
119
+
120
+ expect(warning).to_not be_empty
121
+ expect(warning).to include %q(Passing 'flushdb' command to redis as is)
122
+ expect(warning).to include %q(administrative)
123
+ expect(warning).to include __FILE__
124
+ end
125
+ end
94
126
  end
95
127
  end
96
128
  end
@@ -12,7 +12,7 @@ describe "redis" do
12
12
 
13
13
  before(:each) do
14
14
  @namespaced = Redis::Namespace.new(:ns, :redis => @redis)
15
- @namespaced.flushdb
15
+ @redis.flushdb
16
16
  @redis['foo'] = 'bar'
17
17
  end
18
18
 
@@ -485,9 +485,17 @@ describe "redis" do
485
485
  should eq(%w[ns:k1 ns:k2])
486
486
  end
487
487
 
488
+ it "should namespace eval keys passed in as hash args unmodified" do
489
+ args = { :keys => %w[k1 k2], :argv => %w[arg1 arg2] }
490
+ args.freeze
491
+ @namespaced.
492
+ eval("return {KEYS[1], KEYS[2]}", args).
493
+ should eq(%w[ns:k1 ns:k2])
494
+ end
495
+
488
496
  context '#evalsha' do
489
497
  let!(:sha) do
490
- @namespaced.script(:load, "return {KEYS[1], KEYS[2]}")
498
+ @redis.script(:load, "return {KEYS[1], KEYS[2]}")
491
499
  end
492
500
 
493
501
  it "should namespace evalsha keys passed in as array args" do
@@ -501,11 +509,19 @@ describe "redis" do
501
509
  evalsha(sha, :keys => %w[k1 k2], :argv => %w[arg1 arg2]).
502
510
  should eq(%w[ns:k1 ns:k2])
503
511
  end
512
+
513
+ it "should namespace evalsha keys passed in as hash args unmodified" do
514
+ args = { :keys => %w[k1 k2], :argv => %w[arg1 arg2] }
515
+ args.freeze
516
+ @namespaced.
517
+ evalsha(sha, args).
518
+ should eq(%w[ns:k1 ns:k2])
519
+ end
504
520
  end
505
521
 
506
522
  context "in a nested namespace" do
507
523
  let(:nested_namespace) { Redis::Namespace.new(:nest, :redis => @namespaced) }
508
- let(:sha) { nested_namespace.script(:load, "return {KEYS[1], KEYS[2]}") }
524
+ let(:sha) { @redis.script(:load, "return {KEYS[1], KEYS[2]}") }
509
525
 
510
526
  it "should namespace eval keys passed in as hash args" do
511
527
  nested_namespace.
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis-namespace
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.2
5
- prerelease:
4
+ version: 1.5.3
6
5
  platform: ruby
7
6
  authors:
8
7
  - Chris Wanstrath
@@ -12,69 +11,60 @@ authors:
12
11
  autorequire:
13
12
  bindir: bin
14
13
  cert_chain: []
15
- date: 2015-03-30 00:00:00.000000000 Z
14
+ date: 2017-02-16 00:00:00.000000000 Z
16
15
  dependencies:
17
16
  - !ruby/object:Gem::Dependency
18
17
  name: redis
19
18
  requirement: !ruby/object:Gem::Requirement
20
- none: false
21
19
  requirements:
22
- - - ~>
20
+ - - "~>"
23
21
  - !ruby/object:Gem::Version
24
22
  version: '3.0'
25
- - - ! '>='
23
+ - - ">="
26
24
  - !ruby/object:Gem::Version
27
25
  version: 3.0.4
28
26
  type: :runtime
29
27
  prerelease: false
30
28
  version_requirements: !ruby/object:Gem::Requirement
31
- none: false
32
29
  requirements:
33
- - - ~>
30
+ - - "~>"
34
31
  - !ruby/object:Gem::Version
35
32
  version: '3.0'
36
- - - ! '>='
33
+ - - ">="
37
34
  - !ruby/object:Gem::Version
38
35
  version: 3.0.4
39
36
  - !ruby/object:Gem::Dependency
40
37
  name: rake
41
38
  requirement: !ruby/object:Gem::Requirement
42
- none: false
43
39
  requirements:
44
- - - ~>
40
+ - - "~>"
45
41
  - !ruby/object:Gem::Version
46
42
  version: '10.1'
47
43
  type: :development
48
44
  prerelease: false
49
45
  version_requirements: !ruby/object:Gem::Requirement
50
- none: false
51
46
  requirements:
52
- - - ~>
47
+ - - "~>"
53
48
  - !ruby/object:Gem::Version
54
49
  version: '10.1'
55
50
  - !ruby/object:Gem::Dependency
56
51
  name: rspec
57
52
  requirement: !ruby/object:Gem::Requirement
58
- none: false
59
53
  requirements:
60
- - - ~>
54
+ - - "~>"
61
55
  - !ruby/object:Gem::Version
62
56
  version: '2.14'
63
57
  type: :development
64
58
  prerelease: false
65
59
  version_requirements: !ruby/object:Gem::Requirement
66
- none: false
67
60
  requirements:
68
- - - ~>
61
+ - - "~>"
69
62
  - !ruby/object:Gem::Version
70
63
  version: '2.14'
71
- description: ! 'Adds a Redis::Namespace class which can be used to namespace calls
72
-
64
+ description: |
65
+ Adds a Redis::Namespace class which can be used to namespace calls
73
66
  to Redis. This is useful when using a single instance of Redis with
74
-
75
67
  multiple, different applications.
76
-
77
- '
78
68
  email:
79
69
  - chris@ozmm.org
80
70
  - hone02@gmail.com
@@ -84,39 +74,37 @@ executables: []
84
74
  extensions: []
85
75
  extra_rdoc_files: []
86
76
  files:
77
+ - LICENSE
87
78
  - README.md
88
79
  - Rakefile
89
- - LICENSE
90
- - lib/redis/namespace/version.rb
91
- - lib/redis/namespace.rb
92
80
  - lib/redis-namespace.rb
81
+ - lib/redis/namespace.rb
82
+ - lib/redis/namespace/version.rb
93
83
  - spec/deprecation_spec.rb
94
84
  - spec/redis_spec.rb
95
85
  - spec/spec_helper.rb
96
86
  homepage: http://github.com/resque/redis-namespace
97
87
  licenses:
98
88
  - MIT
89
+ metadata: {}
99
90
  post_install_message:
100
91
  rdoc_options: []
101
92
  require_paths:
102
93
  - lib
103
94
  required_ruby_version: !ruby/object:Gem::Requirement
104
- none: false
105
95
  requirements:
106
- - - ! '>='
96
+ - - ">="
107
97
  - !ruby/object:Gem::Version
108
98
  version: '0'
109
99
  required_rubygems_version: !ruby/object:Gem::Requirement
110
- none: false
111
100
  requirements:
112
- - - ! '>='
101
+ - - ">="
113
102
  - !ruby/object:Gem::Version
114
103
  version: '0'
115
104
  requirements: []
116
105
  rubyforge_project:
117
- rubygems_version: 1.8.23
106
+ rubygems_version: 2.5.1
118
107
  signing_key:
119
- specification_version: 3
108
+ specification_version: 4
120
109
  summary: Namespaces Redis commands.
121
110
  test_files: []
122
- has_rdoc: false