redis-session-store 0.1.9 → 0.2.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.
data/AUTHORS.md ADDED
@@ -0,0 +1,12 @@
1
+ Redis Session Store authors
2
+ ===========================
3
+
4
+ - Ben Marini
5
+ - Dan Buch
6
+ - Donald Plummer
7
+ - Edwin Cruz
8
+ - Gonçalo Silva
9
+ - Jorge Pardiñas
10
+ - Mathias Meyer
11
+ - Michael Fields
12
+ - Tim Lossen
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,6 @@
1
+ Redis Session Store contribution guidelines
2
+ ===========================================
3
+
4
+ - Pull requests welcome!
5
+ - Please add yourself to the [AUTHORS.md](AUTHORS.md) file
6
+ alphabetically by first name.
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in redis-session-store.gemspec
4
+ gemspec
5
+
6
+ gem 'rake', :group => :test
7
+ gem 'minitest', :group => :test, :platform => :ruby_18
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009 Mathias Meyer
1
+ Copyright (c) 2013 Mathias Meyer
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -1,12 +1,15 @@
1
- A simple Redis-based session store for Redis. But why, you ask,
1
+ Redis Session Store
2
+ ===================
3
+
4
+ A simple Redis-based session store for Rails. But why, you ask,
2
5
  when there's [redis-store](http://github.com/jodosha/redis-store/)?
3
- redis-store is a one-fits-all solution, and I found it not to work
6
+ redis-store is a one-size-fits-all solution, and I found it not to work
4
7
  properly with Rails, mostly due to a problem that seemed to lie in
5
- Rack's Abstract::ID class. I wanted something that worked, so I
6
- blatantly stole the code from Rails' MemCacheStore and turned it
8
+ Rack's `Abstract::ID` class. I wanted something that worked, so I
9
+ blatantly stole the code from Rails' `MemCacheStore` and turned it
7
10
  into a Redis version. No support for fancy stuff like distributed
8
11
  storage across several Redis instances. Feel free to add what you
9
- seem fit.
12
+ see fit.
10
13
 
11
14
  This library doesn't offer anything related to caching, and is
12
15
  only suitable for Rails applications. For other frameworks or
@@ -14,29 +17,40 @@ drop-in support for caching, check out
14
17
  [redis-store](http://github.com/jodosha/redis-store/)
15
18
 
16
19
  Installation
17
- ============
20
+ ------------
18
21
 
19
- gem install redis-session-store
22
+ ``` bash
23
+ gem install redis-session-store
24
+ ```
20
25
 
21
26
  Configuration
22
- =============
27
+ -------------
23
28
 
24
- See lib/redis-session-store.rb for a list of valid options.
29
+ See `lib/redis-session-store.rb` for a list of valid options.
25
30
  Set them using:
26
31
 
27
- ActionController::Base.session = {
28
- :db => 2,
29
- :expire_after => 120.minutes,
30
- :key_prefix => "myapp:session:"
31
- }
32
+ ``` ruby
33
+ ActionController::Base.session = {
34
+ :key => 'your_session_key',
35
+ :secret => 'your_long_secret',
36
+ :redis => {
37
+ :db => 2,
38
+ :expire_after => 120.minutes,
39
+ :key_prefix => "myapp:session:"
40
+ }
41
+ }
42
+ ```
32
43
 
33
44
 
34
45
  In your Rails app, throw in an initializer with the following contents
35
46
  and the configuration above:
36
47
 
37
- ActionController::Base.session_store = RedisSessionStore
48
+ ``` ruby
49
+ ActionController::Base.session_store = RedisSessionStore
50
+ ```
38
51
 
39
- Changes
40
- =======
52
+ Contributing, Authors, & License
53
+ --------------------------------
41
54
 
42
- * Use setex for a single command instead of sending two commands. (Thanks dplummer)
55
+ See [CONTRIBUTING.md](CONTRIBUTING.md), [AUTHORS.md](AUTHORS.md), and
56
+ [LICENSE](LICENSE), respectively.
data/Rakefile CHANGED
@@ -1,2 +1,11 @@
1
1
  #!/usr/bin/env rake
2
- require "bundler/gem_tasks"
2
+ require 'bundler/gem_tasks'
3
+ require 'rake/testtask'
4
+
5
+ task :default => :test
6
+
7
+ Rake::TestTask.new do |t|
8
+ t.pattern = 'test/*_test.rb'
9
+ t.verbose = true
10
+ t.options = '-v'
11
+ end
@@ -6,22 +6,23 @@ require 'redis'
6
6
  # Options:
7
7
  # :key => Same as with the other cookie stores, key name
8
8
  # :secret => Encryption secret for the key
9
- # :host => Redis host name, default is localhost
10
- # :port => Redis port, default is 6379
11
- # :db => Database number, defaults to 0. Useful to separate your session storage from other data
12
- # :key_prefix => Prefix for keys used in Redis, e.g. myapp-. Useful to separate session storage keys visibly from others
13
- # :expire_after => A number in seconds to set the timeout interval for the session. Will map directly to expiry in Redis
14
-
9
+ # :redis => {
10
+ # :host => Redis host name, default is localhost
11
+ # :port => Redis port, default is 6379
12
+ # :db => Database number, defaults to 0. Useful to separate your session storage from other data
13
+ # :key_prefix => Prefix for keys used in Redis, e.g. myapp-. Useful to separate session storage keys visibly from others
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 < ActionController::Session::AbstractStore
16
17
 
17
18
  def initialize(app, options = {})
18
19
  super
19
20
 
20
- @default_options = {
21
- :namespace => 'rack:session'
22
- }.merge(options)
21
+ redis_options = options[:redis] || {}
23
22
 
24
- @redis = Redis.new(@default_options)
23
+ @default_options.merge!(:namespace => 'rack:session')
24
+ @default_options.merge!(redis_options)
25
+ @redis = Redis.new(redis_options)
25
26
  end
26
27
 
27
28
  private
@@ -52,4 +53,12 @@ class RedisSessionStore < ActionController::Session::AbstractStore
52
53
  rescue Errno::ECONNREFUSED
53
54
  return false
54
55
  end
56
+
57
+ def destroy(env)
58
+ if env['rack.request.cookie_hash'] && env['rack.request.cookie_hash'][@key]
59
+ @redis.del( prefixed(env['rack.request.cookie_hash'][@key]) )
60
+ end
61
+ rescue Errno::ECONNREFUSED
62
+ Rails.logger.warn("RedisSessionStore#destroy: Connection to redis refused")
63
+ end
55
64
  end
@@ -0,0 +1,22 @@
1
+ unless defined?(ActionController::Session::AbstractStore)
2
+ module ActionController
3
+ module Session
4
+ class AbstractStore
5
+ def initialize(app, options = {})
6
+ @app = app
7
+ @default_options = {
8
+ :key => '_session_id',
9
+ :path => '/',
10
+ :domain => nil,
11
+ :expire_after => nil,
12
+ :secure => false,
13
+ :httponly => true,
14
+ :cookie_only => true
15
+ }.merge(options)
16
+ @key = @default_options[:key]
17
+ @cookie_only = @default_options[:cookie_only]
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,103 @@
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
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis-session-store
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-03-06 00:00:00.000000000 Z
12
+ date: 2013-09-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: redis
16
- requirement: &70198775254380 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,7 +21,12 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70198775254380
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
25
30
  description: A drop-in replacement for e.g. MemCacheStore to store Rails sessions
26
31
  (and Rails sessions only) in Redis.
27
32
  email:
@@ -30,12 +35,19 @@ executables: []
30
35
  extensions: []
31
36
  extra_rdoc_files:
32
37
  - LICENSE
38
+ - AUTHORS.md
39
+ - CONTRIBUTING.md
33
40
  files:
41
+ - AUTHORS.md
42
+ - CONTRIBUTING.md
43
+ - Gemfile
44
+ - LICENSE
34
45
  - README.md
35
46
  - Rakefile
36
47
  - lib/redis-session-store.rb
37
- - LICENSE
38
- homepage: http://github.com/mattmatt/redis-session-store
48
+ - test/fake_action_controller_session_abstract_store.rb
49
+ - test/redis_session_store_test.rb
50
+ homepage: https://github.com/roidrage/redis-session-store
39
51
  licenses: []
40
52
  post_install_message:
41
53
  rdoc_options: []
@@ -47,18 +59,23 @@ required_ruby_version: !ruby/object:Gem::Requirement
47
59
  - - ! '>='
48
60
  - !ruby/object:Gem::Version
49
61
  version: '0'
62
+ segments:
63
+ - 0
64
+ hash: -3400927729934589322
50
65
  required_rubygems_version: !ruby/object:Gem::Requirement
51
66
  none: false
52
67
  requirements:
53
68
  - - ! '>='
54
69
  - !ruby/object:Gem::Version
55
70
  version: '0'
71
+ segments:
72
+ - 0
73
+ hash: -3400927729934589322
56
74
  requirements: []
57
75
  rubyforge_project:
58
- rubygems_version: 1.8.11
76
+ rubygems_version: 1.8.23
59
77
  signing_key:
60
78
  specification_version: 3
61
79
  summary: A drop-in replacement for e.g. MemCacheStore to store Rails sessions (and
62
80
  Rails sessions only) in Redis.
63
81
  test_files: []
64
- has_rdoc: true