redis-session-store 0.2.4 → 0.3.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/.gitignore +17 -0
- data/.rspec +3 -0
- data/.rubocop.yml +18 -0
- data/.simplecov +5 -0
- data/.travis.yml +18 -0
- data/AUTHORS.md +1 -0
- data/Gemfile +0 -4
- data/README.md +17 -11
- data/Rakefile +11 -7
- data/lib/redis-session-store.rb +35 -41
- data/redis-session-store.gemspec +29 -0
- data/{test/fake_action_controller_session_abstract_store.rb → spec/fake_action_dispatch_session_abstract_store.rb} +11 -9
- data/spec/redis_session_store_spec.rb +176 -0
- data/spec/spec_helper.rb +6 -0
- metadata +86 -9
- data/test/redis_session_store_test.rb +0 -103
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: add0c6376d9ff344003c7d062c3844bbe2400037
|
4
|
+
data.tar.gz: 7cd9506424bad86542695fc97f4072d91703ab0c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0c3cb9bde3e6cc1b979575615b91a19870c4570d3cc2d543f9d38120574f4275df6eab9fdac52779d5a8ec9432e8b95e3f58642c9f1266d27ff442fab915634e
|
7
|
+
data.tar.gz: 7dc45a9772b50b2b9ee73faa38ea34ae4784f979966d8a034be9a5193c5f34a904f3862563f09894f76bcc172d2534411bc80af6f1ffe795ed453229031a1163
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# This configuration was generated by `rubocop --auto-gen-config`
|
2
|
+
# on 2014-02-07 09:24:00 -0500 using RuboCop version 0.18.0.
|
3
|
+
# The point is for the user to remove these configuration records
|
4
|
+
# one by one as the offences are removed from the code base.
|
5
|
+
# Note that changes in the inspected code, or installation of new
|
6
|
+
# versions of RuboCop, may require this file to be generated again.
|
7
|
+
|
8
|
+
Documentation:
|
9
|
+
Enabled: false
|
10
|
+
|
11
|
+
# Offence count: 6
|
12
|
+
LineLength:
|
13
|
+
Max: 124
|
14
|
+
|
15
|
+
# Offence count: 2
|
16
|
+
# Configuration parameters: CountComments.
|
17
|
+
MethodLength:
|
18
|
+
Max: 12
|
data/.simplecov
ADDED
data/.travis.yml
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
---
|
2
|
+
language: ruby
|
3
|
+
rvm:
|
4
|
+
- 1.9.3
|
5
|
+
- 2.0.0
|
6
|
+
- 2.1.0
|
7
|
+
notifications:
|
8
|
+
email: false
|
9
|
+
deploy:
|
10
|
+
provider: rubygems
|
11
|
+
api_key:
|
12
|
+
secure: jL1lH/wfeRa5MoZRHvkXcZP/Ch7huFxqzbvhEV7UZhiDUBnApcJWkb346jeLEDYnFObUhqhaCZ1/l4fDeSFg2GgatSfEnoWATFVkIf1e4TTGAePlS+4qqsGOcr+XrjP6CEf4o4JACdLuSoT9dtUFj0xkFLnDWILxneXIrqDE9VU=
|
13
|
+
gem: redis-session-store
|
14
|
+
on:
|
15
|
+
tags: true
|
16
|
+
repo: roidrage/redis-session-store
|
17
|
+
branch: master
|
18
|
+
rvm: 2.0.0
|
data/AUTHORS.md
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
Redis Session Store
|
2
2
|
===================
|
3
3
|
|
4
|
+
[](https://travis-ci.org/roidrage/redis-session-store)
|
5
|
+
|
4
6
|
A simple Redis-based session store for Rails. But why, you ask,
|
5
7
|
when there's [redis-store](http://github.com/jodosha/redis-store/)?
|
6
8
|
redis-store is a one-size-fits-all solution, and I found it not to work
|
@@ -16,6 +18,16 @@ only suitable for Rails applications. For other frameworks or
|
|
16
18
|
drop-in support for caching, check out
|
17
19
|
[redis-store](http://github.com/jodosha/redis-store/)
|
18
20
|
|
21
|
+
Compatibility
|
22
|
+
-------------
|
23
|
+
|
24
|
+
This gem is currently only compatible with Rails 3+. If you need
|
25
|
+
Rails 2 compatibility, be sure to pin to a lower version like so:
|
26
|
+
|
27
|
+
``` ruby
|
28
|
+
gem 'redis-session-store', '< 0.3'
|
29
|
+
```
|
30
|
+
|
19
31
|
Installation
|
20
32
|
------------
|
21
33
|
|
@@ -27,28 +39,22 @@ Configuration
|
|
27
39
|
-------------
|
28
40
|
|
29
41
|
See `lib/redis-session-store.rb` for a list of valid options.
|
30
|
-
|
42
|
+
In your Rails app, throw in an initializer with the following contents:
|
31
43
|
|
32
44
|
``` ruby
|
33
|
-
|
45
|
+
My::Application.config.session_store = :redis_session_store, {
|
34
46
|
:key => 'your_session_key',
|
35
|
-
:secret => 'your_long_secret',
|
36
47
|
:redis => {
|
37
48
|
:db => 2,
|
38
49
|
:expire_after => 120.minutes,
|
39
|
-
:key_prefix => "myapp:session:"
|
50
|
+
:key_prefix => "myapp:session:",
|
51
|
+
:host => 'host', # Redis host name, default is localhost
|
52
|
+
:port => 12345 # Redis port, default is 6379
|
40
53
|
}
|
41
54
|
}
|
42
55
|
```
|
43
56
|
|
44
57
|
|
45
|
-
In your Rails app, throw in an initializer with the following contents
|
46
|
-
and the configuration above:
|
47
|
-
|
48
|
-
``` ruby
|
49
|
-
ActionController::Base.session_store = RedisSessionStore
|
50
|
-
```
|
51
|
-
|
52
58
|
Contributing, Authors, & License
|
53
59
|
--------------------------------
|
54
60
|
|
data/Rakefile
CHANGED
@@ -1,11 +1,15 @@
|
|
1
|
-
#!/usr/bin/env rake
|
2
1
|
require 'bundler/gem_tasks'
|
3
|
-
require '
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
require 'rubocop/rake_task'
|
4
4
|
|
5
|
-
task :
|
5
|
+
task default: [:rubocop, :coverage]
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
RSpec::Core::RakeTask.new
|
8
|
+
|
9
|
+
desc 'Run specs with coverage'
|
10
|
+
task :coverage do
|
11
|
+
ENV['COVERAGE'] = '1'
|
12
|
+
Rake::Task['spec'].invoke
|
11
13
|
end
|
14
|
+
|
15
|
+
Rubocop::RakeTask.new
|
data/lib/redis-session-store.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# vim:fileencoding=utf-8
|
1
2
|
require 'redis'
|
2
3
|
|
3
4
|
# Redis session storage for Rails, and for Rails only. Derived from
|
@@ -5,7 +6,6 @@ require 'redis'
|
|
5
6
|
#
|
6
7
|
# Options:
|
7
8
|
# :key => Same as with the other cookie stores, key name
|
8
|
-
# :secret => Encryption secret for the key
|
9
9
|
# :redis => {
|
10
10
|
# :host => Redis host name, default is localhost
|
11
11
|
# :port => Redis port, default is 6379
|
@@ -13,65 +13,59 @@ require 'redis'
|
|
13
13
|
# :key_prefix => Prefix for keys used in Redis, e.g. myapp-. Useful to separate session storage keys visibly from others
|
14
14
|
# :expire_after => A number in seconds to set the timeout interval for the session. Will map directly to expiry in Redis
|
15
15
|
# }
|
16
|
-
class RedisSessionStore <
|
16
|
+
class RedisSessionStore < ActionDispatch::Session::AbstractStore
|
17
|
+
VERSION = '0.3.0'
|
17
18
|
|
18
19
|
def initialize(app, options = {})
|
19
20
|
super
|
20
21
|
|
21
22
|
redis_options = options[:redis] || {}
|
22
23
|
|
23
|
-
@default_options.merge!(:
|
24
|
+
@default_options.merge!(namespace: 'rack:session')
|
24
25
|
@default_options.merge!(redis_options)
|
25
26
|
@redis = Redis.new(redis_options)
|
26
27
|
end
|
27
28
|
|
28
29
|
private
|
29
|
-
def prefixed(sid)
|
30
|
-
"#{@default_options[:key_prefix]}#{sid}"
|
31
|
-
end
|
32
30
|
|
33
|
-
|
34
|
-
loop do
|
35
|
-
sid = super
|
36
|
-
break sid unless @redis.get(prefixed(sid))
|
37
|
-
end
|
38
|
-
end
|
31
|
+
attr_reader :redis, :key, :default_options
|
39
32
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
session = {}
|
44
|
-
end
|
33
|
+
def prefixed(sid)
|
34
|
+
"#{default_options[:key_prefix]}#{sid}"
|
35
|
+
end
|
45
36
|
|
46
|
-
|
37
|
+
def get_session(env, sid)
|
38
|
+
sid ||= generate_sid
|
39
|
+
begin
|
40
|
+
data = redis.get(prefixed(sid))
|
41
|
+
session = data.nil? ? {} : Marshal.load(data)
|
47
42
|
rescue Errno::ECONNREFUSED
|
48
|
-
|
43
|
+
session = {}
|
49
44
|
end
|
45
|
+
[sid, session]
|
46
|
+
end
|
50
47
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
48
|
+
def set_session(env, sid, session_data, options)
|
49
|
+
expiry = options[:expire_after] || nil
|
50
|
+
if expiry
|
51
|
+
redis.setex(prefixed(sid), expiry, Marshal.dump(session_data))
|
52
|
+
else
|
53
|
+
redis.set(prefixed(sid), Marshal.dump(session_data))
|
55
54
|
end
|
55
|
+
return sid
|
56
|
+
rescue Errno::ECONNREFUSED
|
57
|
+
return false
|
58
|
+
end
|
56
59
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
if expiry
|
61
|
-
@redis.setex(prefixed(sid), expiry, Marshal.dump(session_data))
|
62
|
-
else
|
63
|
-
@redis.set(prefixed(sid), Marshal.dump(session_data))
|
64
|
-
end
|
65
|
-
return true
|
66
|
-
rescue Errno::ECONNREFUSED
|
67
|
-
return false
|
60
|
+
def destroy(env)
|
61
|
+
if env['rack.request.cookie_hash'] && env['rack.request.cookie_hash'][key]
|
62
|
+
redis.del(prefixed(env['rack.request.cookie_hash'][key]))
|
68
63
|
end
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
rescue Errno::ECONNREFUSED
|
75
|
-
Rails.logger.warn("RedisSessionStore#destroy: Connection to redis refused")
|
64
|
+
rescue Errno::ECONNREFUSED
|
65
|
+
if defined?(Rails)
|
66
|
+
Rails.logger.warn('RedisSessionStore#destroy: Connection to redis refused')
|
67
|
+
else
|
68
|
+
warn('RedisSessionStore#destroy: Connection to redis refused')
|
76
69
|
end
|
70
|
+
end
|
77
71
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# vim:fileencoding=utf-8
|
2
|
+
require 'English'
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.name = 'redis-session-store'
|
6
|
+
gem.authors = ['Mathias Meyer']
|
7
|
+
gem.email = ['meyer@paperplanes.de']
|
8
|
+
gem.summary = 'A drop-in replacement for e.g. MemCacheStore to ' <<
|
9
|
+
'store Rails sessions (and Rails sessions only) in Redis.'
|
10
|
+
gem.description = gem.summary
|
11
|
+
gem.homepage = 'https://github.com/roidrage/redis-session-store'
|
12
|
+
gem.license = 'MIT'
|
13
|
+
|
14
|
+
gem.has_rdoc = true
|
15
|
+
gem.extra_rdoc_files = %w(LICENSE AUTHORS.md CONTRIBUTING.md)
|
16
|
+
|
17
|
+
gem.files = `git ls-files`.split($RS)
|
18
|
+
gem.require_paths = ['lib']
|
19
|
+
gem.version = File.read('lib/redis-session-store.rb')
|
20
|
+
.match(/^ VERSION = '(.*)'/)[1]
|
21
|
+
|
22
|
+
gem.add_runtime_dependency 'redis'
|
23
|
+
|
24
|
+
gem.add_development_dependency 'fakeredis'
|
25
|
+
gem.add_development_dependency 'rake'
|
26
|
+
gem.add_development_dependency 'rspec'
|
27
|
+
gem.add_development_dependency 'rubocop'
|
28
|
+
gem.add_development_dependency 'simplecov'
|
29
|
+
end
|
@@ -1,17 +1,19 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# vim:fileencoding=utf-8
|
2
|
+
|
3
|
+
unless defined?(ActionDispatch::Session::AbstractStore)
|
4
|
+
module ActionDispatch
|
3
5
|
module Session
|
4
6
|
class AbstractStore
|
5
7
|
def initialize(app, options = {})
|
6
8
|
@app = app
|
7
9
|
@default_options = {
|
8
|
-
:
|
9
|
-
:
|
10
|
-
:
|
11
|
-
:
|
12
|
-
:
|
13
|
-
:
|
14
|
-
:
|
10
|
+
key: '_session_id',
|
11
|
+
path: '/',
|
12
|
+
domain: nil,
|
13
|
+
expire_after: nil,
|
14
|
+
secure: false,
|
15
|
+
httponly: true,
|
16
|
+
cookie_only: true
|
15
17
|
}.merge(options)
|
16
18
|
@key = @default_options[:key]
|
17
19
|
@cookie_only = @default_options[:cookie_only]
|
@@ -0,0 +1,176 @@
|
|
1
|
+
# vim:fileencoding=utf-8
|
2
|
+
|
3
|
+
describe RedisSessionStore do
|
4
|
+
let :random_string do
|
5
|
+
"#{rand}#{rand}#{rand}"
|
6
|
+
end
|
7
|
+
|
8
|
+
let :options do
|
9
|
+
{}
|
10
|
+
end
|
11
|
+
|
12
|
+
subject(:store) { RedisSessionStore.new(nil, options) }
|
13
|
+
|
14
|
+
let :default_options do
|
15
|
+
store.instance_variable_get(:@default_options)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'assigns a :namespace to @default_options' do
|
19
|
+
default_options[:namespace].should == 'rack:session'
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'when initializing with the redis sub-hash options' do
|
23
|
+
let :options do
|
24
|
+
{
|
25
|
+
key: random_string,
|
26
|
+
secret: random_string,
|
27
|
+
redis: {
|
28
|
+
host: 'hosty.local',
|
29
|
+
port: 16_379,
|
30
|
+
db: 2,
|
31
|
+
key_prefix: 'myapp:session:',
|
32
|
+
expire_after: 60 * 120
|
33
|
+
}
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'creates a redis instance' do
|
38
|
+
store.instance_variable_get(:@redis).should_not be_nil
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'assigns the :host option to @default_options' do
|
42
|
+
default_options[:host].should == 'hosty.local'
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'assigns the :port option to @default_options' do
|
46
|
+
default_options[:port].should == 16_379
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'assigns the :db option to @default_options' do
|
50
|
+
default_options[:db].should == 2
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'assigns the :key_prefix option to @default_options' do
|
54
|
+
default_options[:key_prefix].should == 'myapp:session:'
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'assigns the :expire_after option to @default_options' do
|
58
|
+
default_options[:expire_after].should == 60 * 120
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe 'when initializing with top-level redis options' do
|
63
|
+
let :options do
|
64
|
+
{
|
65
|
+
key: random_string,
|
66
|
+
secret: random_string,
|
67
|
+
host: 'hostersons.local',
|
68
|
+
port: 26_379,
|
69
|
+
db: 4,
|
70
|
+
key_prefix: 'appydoo:session:',
|
71
|
+
expire_after: 60 * 60
|
72
|
+
}
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'creates a redis instance' do
|
76
|
+
store.instance_variable_get(:@redis).should_not be_nil
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'assigns the :host option to @default_options' do
|
80
|
+
default_options[:host].should == 'hostersons.local'
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'assigns the :port option to @default_options' do
|
84
|
+
default_options[:port].should == 26_379
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'assigns the :db option to @default_options' do
|
88
|
+
default_options[:db].should == 4
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'assigns the :key_prefix option to @default_options' do
|
92
|
+
default_options[:key_prefix].should == 'appydoo:session:'
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'assigns the :expire_after option to @default_options' do
|
96
|
+
default_options[:expire_after].should == 60 * 60
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe 'rack 1.45 compatibility' do
|
101
|
+
# Rack 1.45 (which Rails 3.2.x depends on) uses the return value of set_session to set the cookie value
|
102
|
+
# See https://github.com/rack/rack/blob/1.4.5/lib/rack/session/abstract/id.rb
|
103
|
+
|
104
|
+
let(:env) { double('env') }
|
105
|
+
let(:session_id) { 12_345 }
|
106
|
+
let(:session_data) { double('session_data') }
|
107
|
+
let(:options) { { expire_after: 123 } }
|
108
|
+
|
109
|
+
context 'when successfully persisting the session' do
|
110
|
+
|
111
|
+
it 'returns the session id' do
|
112
|
+
store.send(:set_session, env, session_id, session_data, options).should eq(session_id)
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
|
117
|
+
context 'when unsuccessfully persisting the session' do
|
118
|
+
before do
|
119
|
+
store.stub(:redis).and_raise(Errno::ECONNREFUSED)
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'returns false' do
|
123
|
+
store.send(:set_session, env, session_id, session_data, options).should eq(false)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
|
129
|
+
describe 'fetching a session' do
|
130
|
+
let :options do
|
131
|
+
{
|
132
|
+
key_prefix: 'customprefix::'
|
133
|
+
}
|
134
|
+
end
|
135
|
+
let(:fake_key) { 'thisisarediskey' }
|
136
|
+
|
137
|
+
it 'should retrieve the prefixed key from redis' do
|
138
|
+
redis = double('redis')
|
139
|
+
store.stub(redis: redis)
|
140
|
+
expect(redis).to receive(:get).with("#{options[:key_prefix]}#{fake_key}")
|
141
|
+
|
142
|
+
store.send(:get_session, double('env'), fake_key)
|
143
|
+
end
|
144
|
+
|
145
|
+
context 'when redis is down' do
|
146
|
+
|
147
|
+
it 'should return an empty session hash' do
|
148
|
+
store.stub(:redis).and_raise(Errno::ECONNREFUSED)
|
149
|
+
|
150
|
+
expect(store.send(:get_session, double('env'), fake_key)).to eq([fake_key, {}])
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
describe 'destroying a session' do
|
156
|
+
context 'when the key is in the cookie hash' do
|
157
|
+
let(:env) { { 'rack.request.cookie_hash' => cookie_hash } }
|
158
|
+
let(:cookie_hash) { double('cookie hash') }
|
159
|
+
let(:fake_key) { 'thisisarediskey' }
|
160
|
+
|
161
|
+
before do
|
162
|
+
cookie_hash.stub(:[] => fake_key)
|
163
|
+
end
|
164
|
+
|
165
|
+
it 'should delete the prefixed key from redis' do
|
166
|
+
redis = double('redis')
|
167
|
+
store.stub(redis: redis)
|
168
|
+
expect(redis).to receive(:del).with("#{options[:key_prefix]}#{fake_key}")
|
169
|
+
|
170
|
+
store.send(:destroy, env)
|
171
|
+
end
|
172
|
+
|
173
|
+
end
|
174
|
+
|
175
|
+
end
|
176
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,27 +1,97 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis-session-store
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mathias Meyer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-02-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: fakeredis
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rubocop
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: simplecov
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
25
95
|
- !ruby/object:Gem::Version
|
26
96
|
version: '0'
|
27
97
|
description: A drop-in replacement for e.g. MemCacheStore to store Rails sessions
|
@@ -35,6 +105,11 @@ extra_rdoc_files:
|
|
35
105
|
- AUTHORS.md
|
36
106
|
- CONTRIBUTING.md
|
37
107
|
files:
|
108
|
+
- .gitignore
|
109
|
+
- .rspec
|
110
|
+
- .rubocop.yml
|
111
|
+
- .simplecov
|
112
|
+
- .travis.yml
|
38
113
|
- AUTHORS.md
|
39
114
|
- CONTRIBUTING.md
|
40
115
|
- Gemfile
|
@@ -42,8 +117,10 @@ files:
|
|
42
117
|
- README.md
|
43
118
|
- Rakefile
|
44
119
|
- lib/redis-session-store.rb
|
45
|
-
-
|
46
|
-
-
|
120
|
+
- redis-session-store.gemspec
|
121
|
+
- spec/fake_action_dispatch_session_abstract_store.rb
|
122
|
+
- spec/redis_session_store_spec.rb
|
123
|
+
- spec/spec_helper.rb
|
47
124
|
homepage: https://github.com/roidrage/redis-session-store
|
48
125
|
licenses:
|
49
126
|
- MIT
|
@@ -54,17 +131,17 @@ require_paths:
|
|
54
131
|
- lib
|
55
132
|
required_ruby_version: !ruby/object:Gem::Requirement
|
56
133
|
requirements:
|
57
|
-
- -
|
134
|
+
- - '>='
|
58
135
|
- !ruby/object:Gem::Version
|
59
136
|
version: '0'
|
60
137
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
138
|
requirements:
|
62
|
-
- -
|
139
|
+
- - '>='
|
63
140
|
- !ruby/object:Gem::Version
|
64
141
|
version: '0'
|
65
142
|
requirements: []
|
66
143
|
rubyforge_project:
|
67
|
-
rubygems_version: 2.
|
144
|
+
rubygems_version: 2.0.3
|
68
145
|
signing_key:
|
69
146
|
specification_version: 4
|
70
147
|
summary: A drop-in replacement for e.g. MemCacheStore to store Rails sessions (and
|
@@ -1,103 +0,0 @@
|
|
1
|
-
require 'minitest/autorun'
|
2
|
-
require File.expand_path('../fake_action_controller_session_abstract_store', __FILE__)
|
3
|
-
require 'redis-session-store'
|
4
|
-
|
5
|
-
describe RedisSessionStore do
|
6
|
-
def random_string
|
7
|
-
"#{rand}#{rand}#{rand}"
|
8
|
-
end
|
9
|
-
|
10
|
-
def options
|
11
|
-
{}
|
12
|
-
end
|
13
|
-
|
14
|
-
def store
|
15
|
-
RedisSessionStore.new(nil, options)
|
16
|
-
end
|
17
|
-
|
18
|
-
def default_options
|
19
|
-
store.instance_variable_get(:@default_options)
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'assigns a :namespace to @default_options' do
|
23
|
-
default_options[:namespace].must_equal 'rack:session'
|
24
|
-
end
|
25
|
-
|
26
|
-
describe 'when initializing with the redis sub-hash options' do
|
27
|
-
def options
|
28
|
-
{
|
29
|
-
:key => random_string,
|
30
|
-
:secret => random_string,
|
31
|
-
:redis => {
|
32
|
-
:host => 'hosty.local',
|
33
|
-
:port => 16379,
|
34
|
-
:db => 2,
|
35
|
-
:key_prefix => 'myapp:session:',
|
36
|
-
:expire_after => 60 * 120
|
37
|
-
}
|
38
|
-
}
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'creates a redis instance' do
|
42
|
-
store.instance_variable_get(:@redis).wont_equal nil
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'assigns the :host option to @default_options' do
|
46
|
-
default_options[:host].must_equal 'hosty.local'
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'assigns the :port option to @default_options' do
|
50
|
-
default_options[:port].must_equal 16379
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'assigns the :db option to @default_options' do
|
54
|
-
default_options[:db].must_equal 2
|
55
|
-
end
|
56
|
-
|
57
|
-
it 'assigns the :key_prefix option to @default_options' do
|
58
|
-
default_options[:key_prefix].must_equal 'myapp:session:'
|
59
|
-
end
|
60
|
-
|
61
|
-
it 'assigns the :expire_after option to @default_options' do
|
62
|
-
default_options[:expire_after].must_equal 60 * 120
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
describe 'when initializing with top-level redis options' do
|
67
|
-
def options
|
68
|
-
{
|
69
|
-
:key => random_string,
|
70
|
-
:secret => random_string,
|
71
|
-
:host => 'hostersons.local',
|
72
|
-
:port => 26379,
|
73
|
-
:db => 4,
|
74
|
-
:key_prefix => 'appydoo:session:',
|
75
|
-
:expire_after => 60 * 60
|
76
|
-
}
|
77
|
-
end
|
78
|
-
|
79
|
-
it 'creates a redis instance' do
|
80
|
-
store.instance_variable_get(:@redis).wont_equal nil
|
81
|
-
end
|
82
|
-
|
83
|
-
it 'assigns the :host option to @default_options' do
|
84
|
-
default_options[:host].must_equal 'hostersons.local'
|
85
|
-
end
|
86
|
-
|
87
|
-
it 'assigns the :port option to @default_options' do
|
88
|
-
default_options[:port].must_equal 26379
|
89
|
-
end
|
90
|
-
|
91
|
-
it 'assigns the :db option to @default_options' do
|
92
|
-
default_options[:db].must_equal 4
|
93
|
-
end
|
94
|
-
|
95
|
-
it 'assigns the :key_prefix option to @default_options' do
|
96
|
-
default_options[:key_prefix].must_equal 'appydoo:session:'
|
97
|
-
end
|
98
|
-
|
99
|
-
it 'assigns the :expire_after option to @default_options' do
|
100
|
-
default_options[:expire_after].must_equal 60 * 60
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|