redis-store 1.5.0 → 1.6.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 +5 -5
- data/.codeclimate.yml +6 -0
- data/.rubocop.yml +138 -0
- data/.travis.yml +14 -8
- data/CHANGELOG.md +15 -0
- data/README.md +1 -1
- data/Rakefile +2 -0
- data/lib/redis/distributed_store.rb +5 -5
- data/lib/redis/store.rb +1 -2
- data/lib/redis/store/factory.rb +15 -15
- data/lib/redis/store/namespace.rb +6 -6
- data/lib/redis/store/redis_version.rb +0 -1
- data/lib/redis/store/version.rb +1 -1
- data/redis-store.gemspec +5 -3
- data/test/redis/distributed_store_test.rb +8 -8
- data/test/redis/store/factory_test.rb +49 -17
- data/test/redis/store/interface_test.rb +4 -4
- data/test/redis/store/namespace_test.rb +27 -27
- data/test/redis/store/redis_version_test.rb +1 -2
- data/test/redis/store/serialization_test.rb +4 -4
- data/test/redis/store/ttl_test.rb +1 -2
- data/test/test_helper.rb +1 -1
- metadata +19 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7d09e598db500a23547cfabf8b0ee023aa473aa5
|
4
|
+
data.tar.gz: 34fea83415585fe81210982d30f1f8891e4f90c5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a50a647e8edc5a25a1a2d9c2038bac4bec7d77cdc4b68734004c9f5cf4aec105a6d737172cf2a4759239309484aaf9470f73a0db14f0b08bec76718d8a5bd242
|
7
|
+
data.tar.gz: 24c45f122e99129e14c8dc352875ed7be76c3461623f4b101f955fa2322a4eb16ed0c53c62e1da936480c6e0d096284c77fed18c816f95c64957a9e8776396ad
|
data/.codeclimate.yml
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
---
|
2
|
+
AllCops:
|
3
|
+
TargetRubyVersion: 2.4
|
4
|
+
# RuboCop has a bunch of cops enabled by default. This setting tells RuboCop
|
5
|
+
# to ignore them, so only the ones explicitly set in this file are enabled.
|
6
|
+
DisabledByDefault: true
|
7
|
+
Exclude:
|
8
|
+
- '**/vendor/**/*'
|
9
|
+
|
10
|
+
# Prefer &&/|| over and/or.
|
11
|
+
Style/AndOr:
|
12
|
+
Enabled: true
|
13
|
+
|
14
|
+
# Do not use braces for hash literals when they are the last argument of a
|
15
|
+
# method call.
|
16
|
+
Style/BracesAroundHashParameters:
|
17
|
+
Enabled: true
|
18
|
+
EnforcedStyle: context_dependent
|
19
|
+
|
20
|
+
# Align comments with method definitions.
|
21
|
+
Layout/CommentIndentation:
|
22
|
+
Enabled: true
|
23
|
+
|
24
|
+
Layout/ElseAlignment:
|
25
|
+
Enabled: true
|
26
|
+
|
27
|
+
Layout/EmptyLineAfterMagicComment:
|
28
|
+
Enabled: true
|
29
|
+
|
30
|
+
# In a regular class definition, no empty lines around the body.
|
31
|
+
Layout/EmptyLinesAroundClassBody:
|
32
|
+
Enabled: true
|
33
|
+
|
34
|
+
# In a regular method definition, no empty lines around the body.
|
35
|
+
Layout/EmptyLinesAroundMethodBody:
|
36
|
+
Enabled: true
|
37
|
+
|
38
|
+
# In a regular module definition, no empty lines around the body.
|
39
|
+
Layout/EmptyLinesAroundModuleBody:
|
40
|
+
Enabled: true
|
41
|
+
|
42
|
+
Layout/FirstParameterIndentation:
|
43
|
+
Enabled: true
|
44
|
+
|
45
|
+
# Method definitions after `private` or `protected` isolated calls need one
|
46
|
+
# extra level of indentation.
|
47
|
+
Layout/IndentationConsistency:
|
48
|
+
Enabled: true
|
49
|
+
EnforcedStyle: rails
|
50
|
+
|
51
|
+
# Two spaces, no tabs (for indentation).
|
52
|
+
Layout/IndentationWidth:
|
53
|
+
Enabled: true
|
54
|
+
|
55
|
+
Layout/LeadingCommentSpace:
|
56
|
+
Enabled: true
|
57
|
+
|
58
|
+
Layout/SpaceAfterColon:
|
59
|
+
Enabled: true
|
60
|
+
|
61
|
+
Layout/SpaceAfterComma:
|
62
|
+
Enabled: true
|
63
|
+
|
64
|
+
Layout/SpaceAroundEqualsInParameterDefault:
|
65
|
+
Enabled: true
|
66
|
+
|
67
|
+
Layout/SpaceAroundKeyword:
|
68
|
+
Enabled: true
|
69
|
+
|
70
|
+
Layout/SpaceAroundOperators:
|
71
|
+
Enabled: true
|
72
|
+
|
73
|
+
Layout/SpaceBeforeComma:
|
74
|
+
Enabled: true
|
75
|
+
|
76
|
+
Layout/SpaceBeforeFirstArg:
|
77
|
+
Enabled: true
|
78
|
+
|
79
|
+
Style/DefWithParentheses:
|
80
|
+
Enabled: true
|
81
|
+
|
82
|
+
# Defining a method with parameters needs parentheses.
|
83
|
+
Style/MethodDefParentheses:
|
84
|
+
Enabled: true
|
85
|
+
|
86
|
+
# Use `foo {}` not `foo{}`.
|
87
|
+
Layout/SpaceBeforeBlockBraces:
|
88
|
+
Enabled: true
|
89
|
+
|
90
|
+
# Use `foo { bar }` not `foo {bar}`.
|
91
|
+
Layout/SpaceInsideBlockBraces:
|
92
|
+
Enabled: true
|
93
|
+
|
94
|
+
# Use `{ a: 1 }` not `{a:1}`.
|
95
|
+
Layout/SpaceInsideHashLiteralBraces:
|
96
|
+
Enabled: true
|
97
|
+
|
98
|
+
Layout/SpaceInsideParens:
|
99
|
+
Enabled: true
|
100
|
+
|
101
|
+
# Detect hard tabs, no hard tabs.
|
102
|
+
Layout/Tab:
|
103
|
+
Enabled: true
|
104
|
+
|
105
|
+
# Blank lines should not have any spaces.
|
106
|
+
Layout/TrailingBlankLines:
|
107
|
+
Enabled: true
|
108
|
+
|
109
|
+
# No trailing whitespace.
|
110
|
+
Layout/TrailingWhitespace:
|
111
|
+
Enabled: true
|
112
|
+
|
113
|
+
# Use quotes for string literals when they are enough.
|
114
|
+
Style/UnneededPercentQ:
|
115
|
+
Enabled: true
|
116
|
+
|
117
|
+
# Align `end` with the matching keyword or starting expression except for
|
118
|
+
# assignments, where it should be aligned with the LHS.
|
119
|
+
Layout/EndAlignment:
|
120
|
+
Enabled: true
|
121
|
+
EnforcedStyleAlignWith: variable
|
122
|
+
AutoCorrect: true
|
123
|
+
|
124
|
+
# Use my_method(my_arg) not my_method( my_arg ) or my_method my_arg.
|
125
|
+
Lint/RequireParentheses:
|
126
|
+
Enabled: true
|
127
|
+
|
128
|
+
Style/RedundantReturn:
|
129
|
+
Enabled: true
|
130
|
+
AllowMultipleReturnValues: true
|
131
|
+
|
132
|
+
Style/Semicolon:
|
133
|
+
Enabled: true
|
134
|
+
AllowAsExpressionSeparator: true
|
135
|
+
|
136
|
+
# Prefer Foo.method over Foo::method
|
137
|
+
Style/ColonMethodCall:
|
138
|
+
Enabled: true
|
data/.travis.yml
CHANGED
@@ -5,12 +5,14 @@ notifications:
|
|
5
5
|
webhooks: https://www.travisbuddy.com
|
6
6
|
on_success: never
|
7
7
|
|
8
|
-
|
9
|
-
|
8
|
+
before_install:
|
9
|
+
# Install Code Climate test reporter
|
10
|
+
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
11
|
+
- chmod +x ./cc-test-reporter
|
12
|
+
# 1.9.3 has Bundler 1.7.6 with the "undefined method `spec' for nil" bug
|
13
|
+
- gem install bundler
|
10
14
|
|
11
15
|
rvm:
|
12
|
-
- 1.9.3
|
13
|
-
- 2.0
|
14
16
|
- 2.1
|
15
17
|
- 2.2
|
16
18
|
- 2.3
|
@@ -22,14 +24,18 @@ gemfile:
|
|
22
24
|
- gemfiles/redis_3_x.gemfile
|
23
25
|
- gemfiles/redis_4_x.gemfile
|
24
26
|
|
27
|
+
before_script: ./cc-test-reporter before-build
|
28
|
+
|
29
|
+
# Pipe the coverage data to Code Climate if tests pass
|
30
|
+
after_script:
|
31
|
+
- ./cc-test-reporter after-build --exit-code $EXIT_CODE
|
32
|
+
- ./cc-test-reporter format-coverage -t simplecov -o coverage/codeclimate.json
|
33
|
+
- if [[ "$TRAVIS_TEST_RESULT" == 0 ]]; then ./cc-test-reporter upload-coverage; fi # Upload coverage/codeclimate.json
|
34
|
+
|
25
35
|
matrix:
|
26
36
|
allow_failures:
|
27
37
|
- rvm: jruby-head
|
28
38
|
- rvm: ruby-head
|
29
39
|
exclude:
|
30
|
-
- rvm: 1.9.3
|
31
|
-
gemfile: gemfiles/redis_4_x.gemfile
|
32
|
-
- rvm: 2.0
|
33
|
-
gemfile: gemfiles/redis_4_x.gemfile
|
34
40
|
- rvm: 2.1
|
35
41
|
gemfile: gemfiles/redis_4_x.gemfile
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,20 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 1.6.0
|
4
|
+
|
5
|
+
Breaking Changes
|
6
|
+
|
7
|
+
* None
|
8
|
+
|
9
|
+
Added
|
10
|
+
|
11
|
+
* [SSL/TLS Support with the rediss:// URI scheme](https://github.com/redis-store/redis-store/pull/306)
|
12
|
+
* [Use Code Style Guide For New Contributions](https://github.com/redis-store/redis-store/pull/309)
|
13
|
+
|
14
|
+
Fixed
|
15
|
+
|
16
|
+
* None
|
17
|
+
|
3
18
|
## 1.5.0
|
4
19
|
|
5
20
|
Breaking Changes
|
data/README.md
CHANGED
data/Rakefile
CHANGED
@@ -5,7 +5,7 @@ class Redis
|
|
5
5
|
@@timeout = 5
|
6
6
|
attr_reader :ring
|
7
7
|
|
8
|
-
def initialize(addresses, options = {
|
8
|
+
def initialize(addresses, options = {})
|
9
9
|
_extend_namespace options
|
10
10
|
@ring = options[:ring] || Redis::HashRing.new([], options[:replicas] || Redis::HashRing::POINTS_PER_SERVER)
|
11
11
|
|
@@ -19,7 +19,7 @@ class Redis
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def reconnect
|
22
|
-
nodes.each {|node| node.reconnect }
|
22
|
+
nodes.each { |node| node.reconnect }
|
23
23
|
end
|
24
24
|
|
25
25
|
def set(key, value, options = nil)
|
@@ -57,10 +57,10 @@ class Redis
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def _merge_options(address, options)
|
60
|
-
address.merge(
|
61
|
-
:timeout => options[:timeout] || @@timeout,
|
60
|
+
address.merge(
|
61
|
+
:timeout => options[:timeout] || @@timeout,
|
62
62
|
:namespace => options[:namespace]
|
63
|
-
|
63
|
+
)
|
64
64
|
end
|
65
65
|
end
|
66
66
|
end
|
data/lib/redis/store.rb
CHANGED
data/lib/redis/store/factory.rb
CHANGED
@@ -3,7 +3,6 @@ require 'uri'
|
|
3
3
|
class Redis
|
4
4
|
class Store < self
|
5
5
|
class Factory
|
6
|
-
|
7
6
|
DEFAULT_PORT = 6379
|
8
7
|
|
9
8
|
def self.create(*options)
|
@@ -41,7 +40,7 @@ class Redis
|
|
41
40
|
if host_options?(options)
|
42
41
|
options
|
43
42
|
else
|
44
|
-
nil
|
43
|
+
nil
|
45
44
|
end
|
46
45
|
end
|
47
46
|
|
@@ -57,12 +56,12 @@ class Redis
|
|
57
56
|
!options[:marshalling]
|
58
57
|
else
|
59
58
|
false
|
60
|
-
|
59
|
+
end
|
61
60
|
options
|
62
61
|
end
|
63
62
|
|
64
63
|
def self.host_options?(options)
|
65
|
-
options.keys.any? {|n| [:host, :db, :port, :path].include?(n) }
|
64
|
+
options.keys.any? { |n| [:host, :db, :port, :path].include?(n) }
|
66
65
|
end
|
67
66
|
|
68
67
|
def self.extract_host_options_from_uri(uri)
|
@@ -71,13 +70,14 @@ class Redis
|
|
71
70
|
options = { :path => uri.path }
|
72
71
|
else
|
73
72
|
_, db, namespace = if uri.path
|
74
|
-
|
75
|
-
|
73
|
+
uri.path.split(/\//)
|
74
|
+
end
|
76
75
|
|
77
76
|
options = {
|
77
|
+
:scheme => uri.scheme,
|
78
78
|
:host => uri.hostname,
|
79
79
|
:port => uri.port || DEFAULT_PORT,
|
80
|
-
:password => uri.password.nil? ? nil : CGI
|
80
|
+
:password => uri.password.nil? ? nil : CGI.unescape(uri.password.to_s)
|
81
81
|
}
|
82
82
|
|
83
83
|
options[:db] = db.to_i if db
|
@@ -95,16 +95,16 @@ class Redis
|
|
95
95
|
|
96
96
|
private
|
97
97
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
98
|
+
def extract_addresses_and_options(*options)
|
99
|
+
options.flatten.compact.each do |token|
|
100
|
+
resolved = self.class.resolve(token)
|
101
|
+
if resolved
|
102
|
+
@addresses << resolved
|
103
|
+
else
|
104
|
+
@options.merge!(self.class.normalize_key_names(token))
|
105
|
+
end
|
105
106
|
end
|
106
107
|
end
|
107
|
-
end
|
108
108
|
end
|
109
109
|
end
|
110
110
|
end
|
@@ -36,15 +36,15 @@ class Redis
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def keys(pattern = "*")
|
39
|
-
namespace(pattern) { |p| super(p).map{|key| strip_namespace(key) } }
|
39
|
+
namespace(pattern) { |p| super(p).map { |key| strip_namespace(key) } }
|
40
40
|
end
|
41
41
|
|
42
42
|
def del(*keys)
|
43
|
-
super(*keys.map {|key| interpolate(key) }) if keys.any?
|
43
|
+
super(*keys.map { |key| interpolate(key) }) if keys.any?
|
44
44
|
end
|
45
45
|
|
46
46
|
def watch(*keys)
|
47
|
-
super(*keys.map {|key| interpolate(key) }) if keys.any?
|
47
|
+
super(*keys.map { |key| interpolate(key) }) if keys.any?
|
48
48
|
end
|
49
49
|
|
50
50
|
def mget(*keys, &blk)
|
@@ -52,15 +52,15 @@ class Redis
|
|
52
52
|
if keys.any?
|
53
53
|
# Serialization gets extended before Namespace does, so we need to pass options further
|
54
54
|
if singleton_class.ancestors.include? Serialization
|
55
|
-
super(*keys.map {|key| interpolate(key) }, options, &blk)
|
55
|
+
super(*keys.map { |key| interpolate(key) }, options, &blk)
|
56
56
|
else
|
57
|
-
super(*keys.map {|key| interpolate(key) }, &blk)
|
57
|
+
super(*keys.map { |key| interpolate(key) }, &blk)
|
58
58
|
end
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
62
|
def expire(key, ttl)
|
63
|
-
|
63
|
+
namespace(key) { |k| super(k, ttl) }
|
64
64
|
end
|
65
65
|
|
66
66
|
def to_s
|
data/lib/redis/store/version.rb
CHANGED
data/redis-store.gemspec
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
|
2
3
|
$:.push File.expand_path('../lib', __FILE__)
|
3
4
|
require 'redis/store/version'
|
4
5
|
|
@@ -8,14 +9,14 @@ Gem::Specification.new do |s|
|
|
8
9
|
s.authors = ['Luca Guidi']
|
9
10
|
s.email = ['me@lucaguidi.com']
|
10
11
|
s.homepage = 'http://redis-store.org/redis-store'
|
11
|
-
s.summary =
|
12
|
-
s.description =
|
12
|
+
s.summary = 'Redis stores for Ruby frameworks'
|
13
|
+
s.description = 'Namespaced Rack::Session, Rack::Cache, I18n and cache Redis stores for Ruby web frameworks.'
|
13
14
|
|
14
15
|
s.rubyforge_project = 'redis-store'
|
15
16
|
|
16
17
|
s.files = `git ls-files`.split("\n")
|
17
18
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
-
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
19
20
|
s.require_paths = ["lib"]
|
20
21
|
s.license = 'MIT'
|
21
22
|
|
@@ -30,4 +31,5 @@ Gem::Specification.new do |s|
|
|
30
31
|
s.add_development_dependency 'pry', '~> 0.10.4'
|
31
32
|
s.add_development_dependency 'redis-store-testing'
|
32
33
|
s.add_development_dependency 'appraisal', '~> 2.0'
|
34
|
+
s.add_development_dependency 'rubocop', '~> 0.54'
|
33
35
|
end
|
@@ -3,8 +3,8 @@ require 'test_helper'
|
|
3
3
|
describe "Redis::DistributedStore" do
|
4
4
|
def setup
|
5
5
|
@dmr = Redis::DistributedStore.new [
|
6
|
-
{:host => "localhost", :port => "6380", :db => 0},
|
7
|
-
{:host => "localhost", :port => "6381", :db => 0}
|
6
|
+
{ :host => "localhost", :port => "6380", :db => 0 },
|
7
|
+
{ :host => "localhost", :port => "6381", :db => 0 }
|
8
8
|
]
|
9
9
|
@rabbit = OpenStruct.new :name => "bunny"
|
10
10
|
@white_rabbit = OpenStruct.new :color => "white"
|
@@ -67,8 +67,8 @@ describe "Redis::DistributedStore" do
|
|
67
67
|
|
68
68
|
it "passes through ring replica options" do
|
69
69
|
dmr = Redis::DistributedStore.new [
|
70
|
-
{:host => "localhost", :port => "6380", :db => 0},
|
71
|
-
{:host => "localhost", :port => "6381", :db => 0}
|
70
|
+
{ :host => "localhost", :port => "6380", :db => 0 },
|
71
|
+
{ :host => "localhost", :port => "6381", :db => 0 }
|
72
72
|
], replicas: 1024
|
73
73
|
dmr.ring.replicas.must_equal 1024
|
74
74
|
end
|
@@ -76,8 +76,8 @@ describe "Redis::DistributedStore" do
|
|
76
76
|
it "uses a custom ring object" do
|
77
77
|
my_ring = Redis::HashRing.new
|
78
78
|
dmr = Redis::DistributedStore.new [
|
79
|
-
{:host => "localhost", :port => "6380", :db => 0},
|
80
|
-
{:host => "localhost", :port => "6381", :db => 0}
|
79
|
+
{ :host => "localhost", :port => "6380", :db => 0 },
|
80
|
+
{ :host => "localhost", :port => "6381", :db => 0 }
|
81
81
|
], ring: my_ring
|
82
82
|
dmr.ring.must_equal my_ring
|
83
83
|
dmr.ring.nodes.length.must_equal 2
|
@@ -100,8 +100,8 @@ describe "Redis::DistributedStore" do
|
|
100
100
|
describe "namespace" do
|
101
101
|
it "uses namespaced key" do
|
102
102
|
@dmr = Redis::DistributedStore.new [
|
103
|
-
{:host => "localhost", :port => "6380", :db => 0},
|
104
|
-
{:host => "localhost", :port => "6381", :db => 0}
|
103
|
+
{ :host => "localhost", :port => "6380", :db => 0 },
|
104
|
+
{ :host => "localhost", :port => "6381", :db => 0 }
|
105
105
|
], :namespace => "theplaylist"
|
106
106
|
|
107
107
|
@dmr.expects(:node_for).with("theplaylist:rabbit").returns(@dmr.nodes.first)
|
@@ -22,6 +22,11 @@ describe "Redis::Store::Factory" do
|
|
22
22
|
store.to_s.must_equal("Redis Client connected to localhost:6380 against DB 0")
|
23
23
|
end
|
24
24
|
|
25
|
+
it "uses specified scheme" do
|
26
|
+
store = Redis::Store::Factory.create :scheme => "rediss"
|
27
|
+
store.instance_variable_get(:@client).scheme.must_equal('rediss')
|
28
|
+
end
|
29
|
+
|
25
30
|
it "uses specified path" do
|
26
31
|
store = Redis::Store::Factory.create :path => "/var/run/redis.sock"
|
27
32
|
store.to_s.must_equal("Redis Client connected to /var/run/redis.sock against DB 0")
|
@@ -69,6 +74,23 @@ describe "Redis::Store::Factory" do
|
|
69
74
|
store.instance_variable_get(:@options)[:raw].must_equal(false)
|
70
75
|
end
|
71
76
|
|
77
|
+
describe "defaults" do
|
78
|
+
it "defaults to localhost if no host specified" do
|
79
|
+
store = Redis::Store::Factory.create
|
80
|
+
store.instance_variable_get(:@client).host.must_equal('127.0.0.1')
|
81
|
+
end
|
82
|
+
|
83
|
+
it "defaults to 6379 if no port specified" do
|
84
|
+
store = Redis::Store::Factory.create
|
85
|
+
store.instance_variable_get(:@client).port.must_equal(6379)
|
86
|
+
end
|
87
|
+
|
88
|
+
it "defaults to redis:// if no scheme specified" do
|
89
|
+
store = Redis::Store::Factory.create
|
90
|
+
store.instance_variable_get(:@client).scheme.must_equal('redis')
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
72
94
|
describe 'with stdout disabled' do
|
73
95
|
before do
|
74
96
|
@original_stderr = $stderr
|
@@ -98,11 +120,11 @@ describe "Redis::Store::Factory" do
|
|
98
120
|
|
99
121
|
it "should instantiate a Redis::DistributedStore store" do
|
100
122
|
store = Redis::Store::Factory.create(
|
101
|
-
{:host => "localhost", :port => 6379},
|
102
|
-
{:host => "localhost", :port => 6380}
|
123
|
+
{ :host => "localhost", :port => 6379 },
|
124
|
+
{ :host => "localhost", :port => 6380 }
|
103
125
|
)
|
104
126
|
store.must_be_kind_of(Redis::DistributedStore)
|
105
|
-
store.nodes.map {|node| node.to_s }.must_equal([
|
127
|
+
store.nodes.map { |node| node.to_s }.must_equal([
|
106
128
|
"Redis Client connected to localhost:6379 against DB 0",
|
107
129
|
"Redis Client connected to localhost:6380 against DB 0",
|
108
130
|
])
|
@@ -120,6 +142,16 @@ describe "Redis::Store::Factory" do
|
|
120
142
|
store.to_s.must_equal("Redis Client connected to 127.0.0.1:6380 against DB 0")
|
121
143
|
end
|
122
144
|
|
145
|
+
it "uses specified scheme" do
|
146
|
+
store = Redis::Store::Factory.create "rediss://127.0.0.1:6380"
|
147
|
+
store.instance_variable_get(:@client).scheme.must_equal('rediss')
|
148
|
+
end
|
149
|
+
|
150
|
+
it "correctly defaults to redis:// when relative scheme specified" do
|
151
|
+
store = Redis::Store::Factory.create "//127.0.0.1:6379"
|
152
|
+
store.instance_variable_get(:@client).scheme.must_equal('redis')
|
153
|
+
end
|
154
|
+
|
123
155
|
it "uses specified path" do
|
124
156
|
store = Redis::Store::Factory.create "unix:///var/run/redis.sock"
|
125
157
|
store.to_s.must_equal("Redis Client connected to /var/run/redis.sock against DB 0")
|
@@ -174,50 +206,50 @@ describe "Redis::Store::Factory" do
|
|
174
206
|
it "instantiates Redis::DistributedStore" do
|
175
207
|
store = Redis::Store::Factory.create "redis://127.0.0.1:6379", "redis://127.0.0.1:6380"
|
176
208
|
store.must_be_kind_of(Redis::DistributedStore)
|
177
|
-
store.nodes.map {|node| node.to_s }.must_equal([
|
209
|
+
store.nodes.map { |node| node.to_s }.must_equal([
|
178
210
|
"Redis Client connected to 127.0.0.1:6379 against DB 0",
|
179
211
|
"Redis Client connected to 127.0.0.1:6380 against DB 0",
|
180
212
|
])
|
181
213
|
end
|
182
214
|
end
|
183
215
|
|
184
|
-
describe 'when given host Hash and options Hash' do
|
216
|
+
describe 'when given host Hash and options Hash' do
|
185
217
|
it 'instantiates Redis::Store and merges options' do
|
186
218
|
store = Redis::Store::Factory.create(
|
187
|
-
{ :host => '127.0.0.1', :port => '6379' },
|
219
|
+
{ :host => '127.0.0.1', :port => '6379' },
|
188
220
|
{ :namespace => 'theplaylist' }
|
189
221
|
)
|
190
222
|
end
|
191
223
|
|
192
|
-
it 'instantiates Redis::DistributedStore and merges options' do
|
224
|
+
it 'instantiates Redis::DistributedStore and merges options' do
|
193
225
|
store = Redis::Store::Factory.create(
|
194
|
-
{ :host => '127.0.0.1', :port => '6379' },
|
195
|
-
{ :host => '127.0.0.1', :port => '6380' },
|
226
|
+
{ :host => '127.0.0.1', :port => '6379' },
|
227
|
+
{ :host => '127.0.0.1', :port => '6380' },
|
196
228
|
{ :namespace => 'theplaylist' }
|
197
229
|
)
|
198
|
-
store.nodes.map {|node| node.to_s }.must_equal([
|
230
|
+
store.nodes.map { |node| node.to_s }.must_equal([
|
199
231
|
"Redis Client connected to 127.0.0.1:6379 against DB 0 with namespace theplaylist",
|
200
232
|
"Redis Client connected to 127.0.0.1:6380 against DB 0 with namespace theplaylist"
|
201
233
|
])
|
202
234
|
end
|
203
235
|
end
|
204
236
|
|
205
|
-
describe 'when given host String and options Hash' do
|
206
|
-
it 'instantiates Redis::Store and merges options' do
|
207
|
-
store = Redis::Store::Factory.create "redis://127.0.0.1",
|
237
|
+
describe 'when given host String and options Hash' do
|
238
|
+
it 'instantiates Redis::Store and merges options' do
|
239
|
+
store = Redis::Store::Factory.create "redis://127.0.0.1", :namespace => 'theplaylist'
|
208
240
|
store.to_s.must_equal("Redis Client connected to 127.0.0.1:6379 against DB 0 with namespace theplaylist")
|
209
241
|
end
|
210
242
|
|
211
|
-
it 'instantiates Redis::DistributedStore and merges options' do
|
212
|
-
store = Redis::Store::Factory.create "redis://127.0.0.1:6379", "redis://127.0.0.1:6380",
|
213
|
-
store.nodes.map {|node| node.to_s }.must_equal([
|
243
|
+
it 'instantiates Redis::DistributedStore and merges options' do
|
244
|
+
store = Redis::Store::Factory.create "redis://127.0.0.1:6379", "redis://127.0.0.1:6380", :namespace => 'theplaylist'
|
245
|
+
store.nodes.map { |node| node.to_s }.must_equal([
|
214
246
|
"Redis Client connected to 127.0.0.1:6379 against DB 0 with namespace theplaylist",
|
215
247
|
"Redis Client connected to 127.0.0.1:6380 against DB 0 with namespace theplaylist",
|
216
248
|
])
|
217
249
|
end
|
218
250
|
|
219
251
|
it 'instantiates Redis::Store and sets namespace from String' do
|
220
|
-
store = Redis::Store::Factory.create "redis://127.0.0.1:6379/0/theplaylist",
|
252
|
+
store = Redis::Store::Factory.create "redis://127.0.0.1:6379/0/theplaylist", :expire_after => 5
|
221
253
|
store.to_s.must_equal("Redis Client connected to 127.0.0.1:6379 against DB 0 with namespace theplaylist")
|
222
254
|
end
|
223
255
|
end
|
@@ -10,18 +10,18 @@ describe Redis::Store::Interface do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
it "should get an element" do
|
13
|
-
lambda { @r.get("key", :option => true) }
|
13
|
+
lambda { @r.get("key", :option => true) } # .wont_raise ArgumentError
|
14
14
|
end
|
15
15
|
|
16
16
|
it "should set an element" do
|
17
|
-
lambda { @r.set("key", "value", :option => true) }
|
17
|
+
lambda { @r.set("key", "value", :option => true) } # .wont_raise ArgumentError
|
18
18
|
end
|
19
19
|
|
20
20
|
it "should setnx an element" do
|
21
|
-
lambda { @r.setnx("key", "value", :option => true) }
|
21
|
+
lambda { @r.setnx("key", "value", :option => true) } # .wont_raise ArgumentError
|
22
22
|
end
|
23
23
|
|
24
24
|
it "should setex an element" do
|
25
|
-
lambda { @r.setex("key", 1, "value", :option => true) }
|
25
|
+
lambda { @r.setex("key", 1, "value", :option => true) } # .wont_raise ArgumentError
|
26
26
|
end
|
27
27
|
end
|
@@ -90,52 +90,52 @@ describe "Redis::Store::Namespace" do
|
|
90
90
|
end
|
91
91
|
|
92
92
|
describe 'method calls' do
|
93
|
-
let(:store){Redis::Store.new :namespace => @namespace, :serializer => nil}
|
94
|
-
let(:client){store.instance_variable_get(:@client)}
|
93
|
+
let(:store) { Redis::Store.new :namespace => @namespace, :serializer => nil }
|
94
|
+
let(:client) { store.instance_variable_get(:@client) }
|
95
95
|
|
96
96
|
it "should namespace get" do
|
97
|
-
|
98
|
-
|
97
|
+
client.expects(:call).with([:get, "#{@namespace}:rabbit"]).once
|
98
|
+
store.get("rabbit")
|
99
99
|
end
|
100
100
|
|
101
101
|
it "should namespace set" do
|
102
|
-
|
103
|
-
|
102
|
+
client.expects(:call).with([:set, "#{@namespace}:rabbit", @rabbit])
|
103
|
+
store.set "rabbit", @rabbit
|
104
104
|
end
|
105
105
|
|
106
106
|
it "should namespace setnx" do
|
107
|
-
|
108
|
-
|
107
|
+
client.expects(:call).with([:setnx, "#{@namespace}:rabbit", @rabbit])
|
108
|
+
store.setnx "rabbit", @rabbit
|
109
109
|
end
|
110
110
|
|
111
111
|
it "should namespace del with single key" do
|
112
|
-
|
113
|
-
|
112
|
+
client.expects(:call).with([:del, "#{@namespace}:rabbit"])
|
113
|
+
store.del "rabbit"
|
114
114
|
end
|
115
115
|
|
116
116
|
it "should namespace del with multiple keys" do
|
117
|
-
|
118
|
-
|
117
|
+
client.expects(:call).with([:del, "#{@namespace}:rabbit", "#{@namespace}:white_rabbit"])
|
118
|
+
store.del "rabbit", "white_rabbit"
|
119
119
|
end
|
120
120
|
|
121
121
|
it "should namespace keys" do
|
122
|
-
|
123
|
-
|
122
|
+
store.set "rabbit", @rabbit
|
123
|
+
store.keys("rabb*").must_equal [ "rabbit" ]
|
124
124
|
end
|
125
125
|
|
126
126
|
it "should namespace exists" do
|
127
|
-
|
128
|
-
|
127
|
+
client.expects(:call).with([:exists, "#{@namespace}:rabbit"])
|
128
|
+
store.exists "rabbit"
|
129
129
|
end
|
130
130
|
|
131
131
|
it "should namespace incrby" do
|
132
|
-
|
133
|
-
|
132
|
+
client.expects(:call).with([:incrby, "#{@namespace}:counter", 1])
|
133
|
+
store.incrby "counter", 1
|
134
134
|
end
|
135
135
|
|
136
136
|
it "should namespace decrby" do
|
137
|
-
|
138
|
-
|
137
|
+
client.expects(:call).with([:decrby, "#{@namespace}:counter", 1])
|
138
|
+
store.decrby "counter", 1
|
139
139
|
end
|
140
140
|
|
141
141
|
it "should namespace mget" do
|
@@ -154,24 +154,24 @@ describe "Redis::Store::Namespace" do
|
|
154
154
|
end
|
155
155
|
|
156
156
|
it "should namespace expire" do
|
157
|
-
|
158
|
-
|
157
|
+
client.expects(:call).with([:expire, "#{@namespace}:rabbit", 60]).once
|
158
|
+
store.expire("rabbit", 60)
|
159
159
|
end
|
160
160
|
|
161
161
|
it "should namespace ttl" do
|
162
|
-
|
163
|
-
|
162
|
+
client.expects(:call).with([:ttl, "#{@namespace}:rabbit"]).once
|
163
|
+
store.ttl("rabbit")
|
164
164
|
end
|
165
165
|
|
166
166
|
it "should namespace watch" do
|
167
|
-
client.expects(:call).with([:watch,"#{@namespace}:rabbit"]).once
|
167
|
+
client.expects(:call).with([:watch, "#{@namespace}:rabbit"]).once
|
168
168
|
store.watch("rabbit")
|
169
169
|
end
|
170
170
|
|
171
171
|
it "wraps flushdb with appropriate KEYS * calls" do
|
172
172
|
client.expects(:call).with([:flushdb]).never
|
173
|
-
client.expects(:call).with([:keys,"#{@namespace}:*"]).once.returns(["rabbit"])
|
174
|
-
client.expects(:call).with([:del,"#{@namespace}:rabbit"]).once
|
173
|
+
client.expects(:call).with([:keys, "#{@namespace}:*"]).once.returns(["rabbit"])
|
174
|
+
client.expects(:call).with([:del, "#{@namespace}:rabbit"]).once
|
175
175
|
store.flushdb
|
176
176
|
end
|
177
177
|
|
@@ -81,8 +81,8 @@ describe "Redis::Serialization" do
|
|
81
81
|
|
82
82
|
it "marshals setex (over a distributed store)" do
|
83
83
|
@store = Redis::DistributedStore.new [
|
84
|
-
{:host => "localhost", :port => "6380", :db => 0},
|
85
|
-
{:host => "localhost", :port => "6381", :db => 0}
|
84
|
+
{ :host => "localhost", :port => "6380", :db => 0 },
|
85
|
+
{ :host => "localhost", :port => "6381", :db => 0 }
|
86
86
|
]
|
87
87
|
@store.setex "rabbit", 50, @white_rabbit
|
88
88
|
@store.get("rabbit").must_equal(@white_rabbit)
|
@@ -90,8 +90,8 @@ describe "Redis::Serialization" do
|
|
90
90
|
|
91
91
|
it "doesn't marshal setex if raw option is true (over a distributed store)" do
|
92
92
|
@store = Redis::DistributedStore.new [
|
93
|
-
{:host => "localhost", :port => "6380", :db => 0},
|
94
|
-
{:host => "localhost", :port => "6381", :db => 0}
|
93
|
+
{ :host => "localhost", :port => "6380", :db => 0 },
|
94
|
+
{ :host => "localhost", :port => "6381", :db => 0 }
|
95
95
|
]
|
96
96
|
@store.setex "rabbit", 50, @white_rabbit, :raw => true
|
97
97
|
@store.get("rabbit", :raw => true).must_equal(%(#<OpenStruct color="white">))
|
@@ -50,7 +50,6 @@ class MockRedis
|
|
50
50
|
def has_expire?(*a)
|
51
51
|
@expires.include?(a)
|
52
52
|
end
|
53
|
-
|
54
53
|
end
|
55
54
|
|
56
55
|
class MockTtlStore < MockRedis
|
@@ -80,7 +79,7 @@ describe MockTtlStore do
|
|
80
79
|
|
81
80
|
describe 'with nx and ex option' do
|
82
81
|
it 'must call super with key and value and options' do
|
83
|
-
set_options = {nx: true, ex: 3600}
|
82
|
+
set_options = { nx: true, ex: 3600 }
|
84
83
|
redis.set(key, mock_value, set_options)
|
85
84
|
redis.has_set?(key, mock_value, set_options).must_equal true
|
86
85
|
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis-store
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Guidi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-10-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
@@ -156,6 +156,20 @@ dependencies:
|
|
156
156
|
- - "~>"
|
157
157
|
- !ruby/object:Gem::Version
|
158
158
|
version: '2.0'
|
159
|
+
- !ruby/object:Gem::Dependency
|
160
|
+
name: rubocop
|
161
|
+
requirement: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - "~>"
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0.54'
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
requirements:
|
170
|
+
- - "~>"
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: '0.54'
|
159
173
|
description: Namespaced Rack::Session, Rack::Cache, I18n and cache Redis stores for
|
160
174
|
Ruby web frameworks.
|
161
175
|
email:
|
@@ -164,7 +178,9 @@ executables: []
|
|
164
178
|
extensions: []
|
165
179
|
extra_rdoc_files: []
|
166
180
|
files:
|
181
|
+
- ".codeclimate.yml"
|
167
182
|
- ".gitignore"
|
183
|
+
- ".rubocop.yml"
|
168
184
|
- ".travis.yml"
|
169
185
|
- Appraisals
|
170
186
|
- CHANGELOG.md
|
@@ -215,7 +231,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
215
231
|
version: '0'
|
216
232
|
requirements: []
|
217
233
|
rubyforge_project: redis-store
|
218
|
-
rubygems_version: 2.
|
234
|
+
rubygems_version: 2.6.14
|
219
235
|
signing_key:
|
220
236
|
specification_version: 4
|
221
237
|
summary: Redis stores for Ruby frameworks
|