redis-namespace 1.8.0 → 1.9.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.
- checksums.yaml +4 -4
- data/README.md +8 -1
- data/lib/redis/namespace/version.rb +1 -1
- data/lib/redis/namespace.rb +24 -14
- data/spec/redis_spec.rb +57 -22
- metadata +14 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 88bd88ddb249a9424c8bcc002b84f097a96b4de6450944bc66096e6524115431
|
4
|
+
data.tar.gz: 1b9b4d59744b77a65ec523a77ea438de1f0923494a838c94a8c312893dce1fa6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2007d2f5396aec757c50d77de437dc01630b10de02eaeb852f7858233729476582036cf8214ba6e893f3e26b574c22169530a44bf9fb24c39fa2f2d5958e7ee5
|
7
|
+
data.tar.gz: af47dc4b2ce8357f8751c99ed71d05dc213a75a8092a3d54f016cef36b327967445b915bfaed32565639b0b2c16dbd02ef0026fbabcbf07c8965d3bb42b04f16
|
data/README.md
CHANGED
@@ -33,6 +33,13 @@ redis_connection.get('ns:foo')
|
|
33
33
|
# => nil
|
34
34
|
```
|
35
35
|
|
36
|
+
Redis::Namespace also supports `Proc` as a namespace and will take the result string as namespace at runtime.
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
redis_connection = Redis.new
|
40
|
+
namespaced_redis = Redis::Namespace.new(Proc.new { Tenant.current_tenant }, redis: redis_connection)
|
41
|
+
```
|
42
|
+
|
36
43
|
Installation
|
37
44
|
============
|
38
45
|
|
@@ -79,7 +86,7 @@ namespaced.redis.flushall()
|
|
79
86
|
|
80
87
|
As mentioned above, 2.0 will remove blind passthrough and the administrative command passthrough.
|
81
88
|
By default in 1.5+, deprecation warnings are present and enabled;
|
82
|
-
they can be silenced by initializing `Redis::Namespace` with `
|
89
|
+
they can be silenced by initializing `Redis::Namespace` with `warning: false` or by setting the `REDIS_NAMESPACE_QUIET` environment variable.
|
83
90
|
|
84
91
|
Early opt-in
|
85
92
|
------------
|
data/lib/redis/namespace.rb
CHANGED
@@ -75,6 +75,7 @@ class Redis
|
|
75
75
|
"eval" => [ :eval_style ],
|
76
76
|
"evalsha" => [ :eval_style ],
|
77
77
|
"get" => [ :first ],
|
78
|
+
"getex" => [ :first ],
|
78
79
|
"getbit" => [ :first ],
|
79
80
|
"getrange" => [ :first ],
|
80
81
|
"getset" => [ :first ],
|
@@ -151,6 +152,7 @@ class Redis
|
|
151
152
|
"sinterstore" => [ :all ],
|
152
153
|
"sismember" => [ :first ],
|
153
154
|
"smembers" => [ :first ],
|
155
|
+
"smismember" => [ :first ],
|
154
156
|
"smove" => [ :exclude_last ],
|
155
157
|
"sort" => [ :sort ],
|
156
158
|
"spop" => [ :first ],
|
@@ -242,7 +244,7 @@ class Redis
|
|
242
244
|
|
243
245
|
def initialize(namespace, options = {})
|
244
246
|
@namespace = namespace
|
245
|
-
@redis = options[:redis] || Redis.
|
247
|
+
@redis = options[:redis] || Redis.new
|
246
248
|
@warning = !!options.fetch(:warning) do
|
247
249
|
!ENV['REDIS_NAMESPACE_QUIET']
|
248
250
|
end
|
@@ -261,7 +263,7 @@ class Redis
|
|
261
263
|
end
|
262
264
|
|
263
265
|
def client
|
264
|
-
warn("The client method is deprecated as of redis-rb 4.0.0, please use the new _client" +
|
266
|
+
warn("The client method is deprecated as of redis-rb 4.0.0, please use the new _client " +
|
265
267
|
"method instead. Support for the old method will be removed in redis-namespace 2.0.") if @has_new_client_method && deprecations?
|
266
268
|
_client
|
267
269
|
end
|
@@ -307,7 +309,7 @@ class Redis
|
|
307
309
|
:redis => @redis)
|
308
310
|
end
|
309
311
|
|
310
|
-
@namespace
|
312
|
+
@namespace.respond_to?(:call) ? @namespace.call : @namespace
|
311
313
|
end
|
312
314
|
|
313
315
|
def full_namespace
|
@@ -315,7 +317,7 @@ class Redis
|
|
315
317
|
end
|
316
318
|
|
317
319
|
def connection
|
318
|
-
@redis.connection.tap { |info| info[:namespace] =
|
320
|
+
@redis.connection.tap { |info| info[:namespace] = namespace }
|
319
321
|
end
|
320
322
|
|
321
323
|
def exec
|
@@ -430,6 +432,7 @@ class Redis
|
|
430
432
|
args = add_namespace(args)
|
431
433
|
end
|
432
434
|
when :alternate
|
435
|
+
args = args.flatten
|
433
436
|
args.each_with_index { |a, i| args[i] = add_namespace(a) if i.even? }
|
434
437
|
when :sort
|
435
438
|
args[0] = add_namespace(args[0]) if args[0]
|
@@ -492,6 +495,12 @@ class Redis
|
|
492
495
|
end
|
493
496
|
ruby2_keywords(:call_with_namespace) if respond_to?(:ruby2_keywords, true)
|
494
497
|
|
498
|
+
protected
|
499
|
+
|
500
|
+
def redis=(redis)
|
501
|
+
@redis = redis
|
502
|
+
end
|
503
|
+
|
495
504
|
private
|
496
505
|
|
497
506
|
if Hash.respond_to?(:ruby2_keywords_hash)
|
@@ -520,18 +529,19 @@ class Redis
|
|
520
529
|
end
|
521
530
|
|
522
531
|
def namespaced_block(command, &block)
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
532
|
+
if block.arity == 0
|
533
|
+
redis.send(command, &block)
|
534
|
+
else
|
535
|
+
redis.send(command) do |r|
|
536
|
+
copy = dup
|
537
|
+
copy.redis = r
|
538
|
+
yield copy
|
529
539
|
end
|
530
540
|
end
|
531
541
|
end
|
532
542
|
|
533
543
|
def add_namespace(key)
|
534
|
-
return key unless key &&
|
544
|
+
return key unless key && namespace
|
535
545
|
|
536
546
|
case key
|
537
547
|
when Array
|
@@ -540,12 +550,12 @@ class Redis
|
|
540
550
|
key.keys.each {|k| key[add_namespace(k)] = key.delete(k)}
|
541
551
|
key
|
542
552
|
else
|
543
|
-
"#{
|
553
|
+
"#{namespace}:#{key}"
|
544
554
|
end
|
545
555
|
end
|
546
556
|
|
547
557
|
def rem_namespace(key)
|
548
|
-
return key unless key &&
|
558
|
+
return key unless key && namespace
|
549
559
|
|
550
560
|
case key
|
551
561
|
when Array
|
@@ -557,7 +567,7 @@ class Redis
|
|
557
567
|
key.each { |k| yielder.yield rem_namespace(k) }
|
558
568
|
end
|
559
569
|
else
|
560
|
-
key.to_s.sub(/\A#{
|
570
|
+
key.to_s.sub(/\A#{namespace}:/, '')
|
561
571
|
end
|
562
572
|
end
|
563
573
|
|
data/spec/redis_spec.rb
CHANGED
@@ -3,28 +3,17 @@
|
|
3
3
|
require File.dirname(__FILE__) + '/spec_helper'
|
4
4
|
|
5
5
|
describe "redis" do
|
6
|
-
@redis_version = Gem::Version.new(Redis.
|
6
|
+
@redis_version = Gem::Version.new(Redis.new.info["redis_version"])
|
7
7
|
let(:redis_client) { @redis.respond_to?(:_client) ? @redis._client : @redis.client}
|
8
8
|
|
9
|
-
before(:
|
9
|
+
before(:each) do
|
10
10
|
# use database 15 for testing so we dont accidentally step on your real data
|
11
11
|
@redis = Redis.new :db => 15
|
12
|
-
end
|
13
|
-
|
14
|
-
before(:each) do
|
15
|
-
@namespaced = Redis::Namespace.new(:ns, :redis => @redis)
|
16
12
|
@redis.flushdb
|
13
|
+
@namespaced = Redis::Namespace.new(:ns, :redis => @redis)
|
17
14
|
@redis.set('foo', 'bar')
|
18
15
|
end
|
19
16
|
|
20
|
-
after(:each) do
|
21
|
-
@redis.flushdb
|
22
|
-
end
|
23
|
-
|
24
|
-
after(:all) do
|
25
|
-
@redis.quit
|
26
|
-
end
|
27
|
-
|
28
17
|
# redis-rb 3.3.4+
|
29
18
|
it "should inject :namespace into connection info" do
|
30
19
|
info = @redis.connection.merge(:namespace => :ns)
|
@@ -52,6 +41,17 @@ describe "redis" do
|
|
52
41
|
expect(@namespaced.type('counter')).to eq('string')
|
53
42
|
end
|
54
43
|
|
44
|
+
it "should work with Proc namespaces" do
|
45
|
+
namespace = Proc.new { :dynamic_ns }
|
46
|
+
namespaced = Redis::Namespace.new(namespace, redis: @redis)
|
47
|
+
|
48
|
+
expect(namespaced.get('foo')).to eq(nil)
|
49
|
+
namespaced.set('foo', 'chris')
|
50
|
+
expect(namespaced.get('foo')).to eq('chris')
|
51
|
+
@redis.set('foo', 'bob')
|
52
|
+
expect(@redis.get('foo')).to eq('bob')
|
53
|
+
end
|
54
|
+
|
55
55
|
context 'when sending capital commands (issue 68)' do
|
56
56
|
it 'should be able to use a namespace' do
|
57
57
|
@namespaced.send('SET', 'fubar', 'quux')
|
@@ -106,6 +106,13 @@ describe "redis" do
|
|
106
106
|
expect(@namespaced.lrange('bar',0,-1)).to eq(['bar'])
|
107
107
|
end
|
108
108
|
|
109
|
+
it "should be able to use a namespace with getex" do
|
110
|
+
expect(@namespaced.set('mykey', 'Hello')).to eq('OK')
|
111
|
+
expect(@namespaced.getex('mykey', ex: 50)).to eq('Hello')
|
112
|
+
expect(@namespaced.get('mykey')).to eq('Hello')
|
113
|
+
expect(@namespaced.ttl('mykey')).to eq(50)
|
114
|
+
end
|
115
|
+
|
109
116
|
it 'should be able to use a namespace with getbit' do
|
110
117
|
@namespaced.set('foo','bar')
|
111
118
|
expect(@namespaced.getbit('foo',1)).to eq(1)
|
@@ -181,15 +188,22 @@ describe "redis" do
|
|
181
188
|
@namespaced.mset('foo', '1000', 'bar', '2000')
|
182
189
|
expect(@namespaced.mapped_mget('foo', 'bar')).to eq({ 'foo' => '1000', 'bar' => '2000' })
|
183
190
|
expect(@namespaced.mapped_mget('foo', 'baz', 'bar')).to eq({ 'foo' => '1000', 'bar' => '2000', 'baz' => nil})
|
191
|
+
|
184
192
|
@namespaced.mapped_mset('foo' => '3000', 'bar' => '5000')
|
185
193
|
expect(@namespaced.mapped_mget('foo', 'bar')).to eq({ 'foo' => '3000', 'bar' => '5000' })
|
186
194
|
expect(@namespaced.mapped_mget('foo', 'baz', 'bar')).to eq({ 'foo' => '3000', 'bar' => '5000', 'baz' => nil})
|
195
|
+
|
196
|
+
@namespaced.mset(['foo', '4000'], ['baz', '6000'])
|
197
|
+
expect(@namespaced.mapped_mget('foo', 'bar', 'baz')).to eq({ 'foo' => '4000', 'bar' => '5000', 'baz' => '6000' })
|
187
198
|
end
|
188
199
|
|
189
200
|
it "should be able to use a namespace with msetnx" do
|
190
201
|
@namespaced.msetnx('foo', '1000', 'bar', '2000')
|
191
202
|
expect(@namespaced.mapped_mget('foo', 'bar')).to eq({ 'foo' => '1000', 'bar' => '2000' })
|
192
203
|
expect(@namespaced.mapped_mget('foo', 'baz', 'bar')).to eq({ 'foo' => '1000', 'bar' => '2000', 'baz' => nil})
|
204
|
+
|
205
|
+
@namespaced.msetnx(['baz', '4000'])
|
206
|
+
expect(@namespaced.mapped_mget('foo', 'baz', 'bar')).to eq({ 'foo' => '1000', 'bar' => '2000', 'baz' => '4000'})
|
193
207
|
end
|
194
208
|
|
195
209
|
it "should be able to use a namespace with mapped_msetnx" do
|
@@ -398,6 +412,27 @@ describe "redis" do
|
|
398
412
|
expect(result).to eq(["bar", "value"])
|
399
413
|
end
|
400
414
|
|
415
|
+
it "is thread safe for multi blocks" do
|
416
|
+
mon = Monitor.new
|
417
|
+
entered = false
|
418
|
+
entered_cond = mon.new_cond
|
419
|
+
|
420
|
+
thread = Thread.new do
|
421
|
+
mon.synchronize do
|
422
|
+
entered_cond.wait_until { entered }
|
423
|
+
@namespaced.multi
|
424
|
+
end
|
425
|
+
end
|
426
|
+
|
427
|
+
@namespaced.multi do |transaction|
|
428
|
+
entered = true
|
429
|
+
mon.synchronize { entered_cond.signal }
|
430
|
+
thread.join(0.1)
|
431
|
+
transaction.get("foo")
|
432
|
+
end
|
433
|
+
thread.join
|
434
|
+
end
|
435
|
+
|
401
436
|
it "should add namespace to strlen" do
|
402
437
|
@namespaced.set("mykey", "123456")
|
403
438
|
expect(@namespaced.strlen("mykey")).to eq(6)
|
@@ -677,7 +712,7 @@ describe "redis" do
|
|
677
712
|
expect(result).to match_array(namespaced_keys)
|
678
713
|
end
|
679
714
|
end
|
680
|
-
end if Redis.
|
715
|
+
end if Redis.new.respond_to?(:scan)
|
681
716
|
|
682
717
|
context '#scan_each' do
|
683
718
|
context 'when :match supplied' do
|
@@ -710,7 +745,7 @@ describe "redis" do
|
|
710
745
|
end
|
711
746
|
end
|
712
747
|
end
|
713
|
-
end if Redis.
|
748
|
+
end if Redis.new.respond_to?(:scan_each)
|
714
749
|
end
|
715
750
|
|
716
751
|
context 'hash scan methods' do
|
@@ -738,7 +773,7 @@ describe "redis" do
|
|
738
773
|
expect(results).to match_array(@redis.hgetall('ns:hsh').to_a)
|
739
774
|
end
|
740
775
|
end
|
741
|
-
end if Redis.
|
776
|
+
end if Redis.new.respond_to?(:hscan)
|
742
777
|
|
743
778
|
context '#hscan_each' do
|
744
779
|
context 'when :match supplied' do
|
@@ -771,7 +806,7 @@ describe "redis" do
|
|
771
806
|
end
|
772
807
|
end
|
773
808
|
end
|
774
|
-
end if Redis.
|
809
|
+
end if Redis.new.respond_to?(:hscan_each)
|
775
810
|
end
|
776
811
|
|
777
812
|
context 'set scan methods' do
|
@@ -799,7 +834,7 @@ describe "redis" do
|
|
799
834
|
expect(results).to match_array(set)
|
800
835
|
end
|
801
836
|
end
|
802
|
-
end if Redis.
|
837
|
+
end if Redis.new.respond_to?(:sscan)
|
803
838
|
|
804
839
|
context '#sscan_each' do
|
805
840
|
context 'when :match supplied' do
|
@@ -832,7 +867,7 @@ describe "redis" do
|
|
832
867
|
end
|
833
868
|
end
|
834
869
|
end
|
835
|
-
end if Redis.
|
870
|
+
end if Redis.new.respond_to?(:sscan_each)
|
836
871
|
end
|
837
872
|
|
838
873
|
context 'zset scan methods' do
|
@@ -862,7 +897,7 @@ describe "redis" do
|
|
862
897
|
expect(results).to match_array(hash.to_a)
|
863
898
|
end
|
864
899
|
end
|
865
|
-
end if Redis.
|
900
|
+
end if Redis.new.respond_to?(:zscan)
|
866
901
|
|
867
902
|
context '#zscan_each' do
|
868
903
|
context 'when :match supplied' do
|
@@ -895,7 +930,7 @@ describe "redis" do
|
|
895
930
|
end
|
896
931
|
end
|
897
932
|
end
|
898
|
-
end if Redis.
|
933
|
+
end if Redis.new.respond_to?(:zscan_each)
|
899
934
|
end
|
900
935
|
end
|
901
936
|
end
|
metadata
CHANGED
@@ -1,17 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis-namespace
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Wanstrath
|
8
8
|
- Terence Lee
|
9
9
|
- Steve Klabnik
|
10
10
|
- Ryan Biesemeyer
|
11
|
-
|
11
|
+
- Mike Bianco
|
12
|
+
autorequire:
|
12
13
|
bindir: bin
|
13
14
|
cert_chain: []
|
14
|
-
date:
|
15
|
+
date: 2022-08-13 00:00:00.000000000 Z
|
15
16
|
dependencies:
|
16
17
|
- !ruby/object:Gem::Dependency
|
17
18
|
name: redis
|
@@ -19,14 +20,14 @@ dependencies:
|
|
19
20
|
requirements:
|
20
21
|
- - ">="
|
21
22
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
23
|
+
version: '4'
|
23
24
|
type: :runtime
|
24
25
|
prerelease: false
|
25
26
|
version_requirements: !ruby/object:Gem::Requirement
|
26
27
|
requirements:
|
27
28
|
- - ">="
|
28
29
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
30
|
+
version: '4'
|
30
31
|
- !ruby/object:Gem::Dependency
|
31
32
|
name: rake
|
32
33
|
requirement: !ruby/object:Gem::Requirement
|
@@ -78,6 +79,7 @@ email:
|
|
78
79
|
- hone02@gmail.com
|
79
80
|
- steve@steveklabnik.com
|
80
81
|
- me@yaauie.com
|
82
|
+
- mike@mikebian.co
|
81
83
|
executables: []
|
82
84
|
extensions: []
|
83
85
|
extra_rdoc_files: []
|
@@ -97,15 +99,16 @@ licenses:
|
|
97
99
|
metadata:
|
98
100
|
bug_tracker_uri: https://github.com/resque/redis-namespace/issues
|
99
101
|
changelog_uri: https://github.com/resque/redis-namespace/blob/master/CHANGELOG.md
|
100
|
-
documentation_uri: https://www.rubydoc.info/gems/redis-namespace/1.
|
101
|
-
source_code_uri: https://github.com/resque/redis-namespace/tree/v1.
|
102
|
-
|
102
|
+
documentation_uri: https://www.rubydoc.info/gems/redis-namespace/1.9.0
|
103
|
+
source_code_uri: https://github.com/resque/redis-namespace/tree/v1.9.0
|
104
|
+
rubygems_mfa_required: 'true'
|
105
|
+
post_install_message:
|
103
106
|
rdoc_options: []
|
104
107
|
require_paths:
|
105
108
|
- lib
|
106
109
|
required_ruby_version: !ruby/object:Gem::Requirement
|
107
110
|
requirements:
|
108
|
-
- - "
|
111
|
+
- - ">="
|
109
112
|
- !ruby/object:Gem::Version
|
110
113
|
version: '2.4'
|
111
114
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
@@ -114,8 +117,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
114
117
|
- !ruby/object:Gem::Version
|
115
118
|
version: '0'
|
116
119
|
requirements: []
|
117
|
-
rubygems_version: 3.1.
|
118
|
-
signing_key:
|
120
|
+
rubygems_version: 3.1.6
|
121
|
+
signing_key:
|
119
122
|
specification_version: 4
|
120
123
|
summary: Namespaces Redis commands.
|
121
124
|
test_files: []
|