rack-session-memcached 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3413535d13e1b9e12e7bc589108e97e3457944e3
4
+ data.tar.gz: 081ededfc512ca4d95be1ffc26961146e86e6f14
5
+ SHA512:
6
+ metadata.gz: cc63dd1924d1a3d98f4caf007ccbe471c22d871a7c4d5e500a72f31335b4e8e50409946151ecce618440e8799eacec9ec961a260720213a501042c01bd5ec6b8
7
+ data.tar.gz: b6eebea038361d08cd84bf330a80c2204ae2a6f1528377a7970aeaa35190509c1ab66645ac4e39116091a033647dacd2db69720a2364dcbe64a8bb8b1b5d7a39
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.0
4
+ services:
5
+ - memcached
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rack-session-memcached.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 SAKAI, Kazuaki
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,44 @@
1
+ # Rack::Session::Memcached [![Build Status](https://travis-ci.org/send/rack-session-memcached.svg?branch=master)](https://travis-ci.org/send/rack-session-memcached)
2
+
3
+ Rack::Session::Memcached provides cookie based session.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'rack-session-memcached'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install rack-session-memcached
20
+
21
+ ## Usage
22
+
23
+ ### Sinatra
24
+
25
+ ```ruby
26
+ use Rack::Session::Memcached,
27
+ memcache_server: 'localhost:11211',
28
+ namespace: 'rack:session',
29
+ key: 'rack.session'
30
+ ```
31
+
32
+ ## Development
33
+
34
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
35
+
36
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
37
+
38
+ ## Contributing
39
+
40
+ 1. Fork it ( https://github.com/[my-github-username]/rack-session-memcached/fork )
41
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
42
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
43
+ 4. Push to the branch (`git push origin my-new-feature`)
44
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ task default: [:spec]
3
+
4
+ desc 'run RSpec specs'
5
+ task :spec do
6
+ sh 'bundle exec rspec spec'
7
+ end
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "rack/session/memcached"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,96 @@
1
+ require 'memcached'
2
+ require 'rack/session/abstract/id'
3
+
4
+ module Rack
5
+ module Session
6
+ class Memcached < Abstract::ID
7
+ DEFAULT_OPTIONS = Abstract::ID::DEFAULT_OPTIONS.merge(
8
+ namespace: 'rack.session',
9
+ memcached_server: 'localhost:11211',
10
+ codec: ::Memcached::MarshalCodec,
11
+ prefix_delimiter: ':'
12
+ )
13
+
14
+ attr_reader :mutex, :pool
15
+
16
+ def initialize(app, options = {})
17
+ super
18
+ @mutex = Mutex.new
19
+ # For compatibility other Rack::Session modules
20
+ unless @default_options.key? :prefix_key
21
+ @default_options[:prefix_key] = @default_options[:namespace]
22
+ end
23
+ mserv = @default_options[:memcached_server]
24
+ mopts = @default_options.reject{|k, v| !::Memcached::DEFAULTS.key? k}
25
+ @pool = options[:cache] || ::Memcached.new(mserv, mopts)
26
+ end
27
+
28
+ def safe_get(sid, decode = true)
29
+ begin
30
+ @pool.get(sid, decode)
31
+ rescue ::Memcached::NotFound
32
+ nil
33
+ end
34
+ end
35
+
36
+ def generate_sid
37
+ loop do
38
+ sid = super
39
+ break sid if safe_get(sid).nil?
40
+ end
41
+ end
42
+
43
+ def create_new_session
44
+ sid, session = generate_sid, {}
45
+ @pool.add sid, session
46
+ [sid, session]
47
+ end
48
+
49
+ def get_session(env, sid)
50
+ with_lock(env) do
51
+ if sid.nil? || sid == ""
52
+ sid, session = create_new_session
53
+ else
54
+ session = safe_get(sid)
55
+ sid, session = create_new_session if session.nil?
56
+ end
57
+ [sid, session]
58
+ end
59
+ end
60
+
61
+ def set_session(env, session_id, new_session, options)
62
+ expiry = options[:expire_after]
63
+ expiry = expiry.nil? ? 0 : expiry + 1
64
+ with_lock(env) do
65
+ @pool.set session_id, new_session, expiry
66
+ session_id
67
+ end
68
+ end
69
+
70
+ def destroy_session(env, session_id, options)
71
+ with_lock(env) do
72
+ @pool.delete session_id
73
+ generate_sid unless options[:drop]
74
+ end
75
+ end
76
+
77
+ def with_lock(env, default = nil)
78
+ @mutex.lock if env['rack.multithread']
79
+ yield
80
+ rescue ::Memcached::Error
81
+ warn $!
82
+ default
83
+ ensure
84
+ @mutex.unlock if @mutex.locked?
85
+ end
86
+
87
+ def clone
88
+ me = super
89
+ memcached = @pool.clone
90
+ me.instance_variable_set('@pool', memcached)
91
+ me
92
+ end
93
+ end
94
+ end
95
+
96
+ end
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "rack-session-memcached"
7
+ spec.version = "0.1.0"
8
+ spec.authors = ["SAKAI, Kazuaki"]
9
+ spec.email = ["kaz.july.7@gmail.com"]
10
+
11
+ spec.summary = %q{Rack::Session::Memcached provides cookie based session stored in memcached.}
12
+ spec.description = %q{Rack::Session::Memcached provides cookie based session stored in memcached. It depends on memcached(libmemcached).}
13
+ spec.homepage = "https://github.com/send/rack-session-memcached"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = "exe"
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "> 1.7"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "pry"
25
+ spec.add_development_dependency "rack-test"
26
+ spec.add_dependency "memcached"
27
+ spec.add_dependency "rack"
28
+ end
metadata ADDED
@@ -0,0 +1,154 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack-session-memcached
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - SAKAI, Kazuaki
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-04-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
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: pry
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: rack-test
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: memcached
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rack
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: Rack::Session::Memcached provides cookie based session stored in memcached.
112
+ It depends on memcached(libmemcached).
113
+ email:
114
+ - kaz.july.7@gmail.com
115
+ executables: []
116
+ extensions: []
117
+ extra_rdoc_files: []
118
+ files:
119
+ - ".gitignore"
120
+ - ".rspec"
121
+ - ".travis.yml"
122
+ - Gemfile
123
+ - LICENSE.txt
124
+ - README.md
125
+ - Rakefile
126
+ - bin/console
127
+ - bin/setup
128
+ - lib/rack/session/memcached.rb
129
+ - rack-session-memcached.gemspec
130
+ homepage: https://github.com/send/rack-session-memcached
131
+ licenses:
132
+ - MIT
133
+ metadata: {}
134
+ post_install_message:
135
+ rdoc_options: []
136
+ require_paths:
137
+ - lib
138
+ required_ruby_version: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ required_rubygems_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ requirements: []
149
+ rubyforge_project:
150
+ rubygems_version: 2.4.5
151
+ signing_key:
152
+ specification_version: 4
153
+ summary: Rack::Session::Memcached provides cookie based session stored in memcached.
154
+ test_files: []