redis-namespace 1.5.2 → 1.5.3

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.
@@ -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