Skip to content

Commit 1f1999c

Browse files
committed
Merge pull request #66 from Partyista/master
Fix compatibility issue with Rails 5.0
2 parents e6380ab + 523a0c8 commit 1f1999c

17 files changed

+251
-113
lines changed

.travis.yml

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,36 @@
11
language: ruby
22
sudo: false
3-
3+
cache: bundler
44
rvm:
5-
- 1.9.3
5+
- 1.9
66
- 2.0
77
- 2.1
8-
- 2.2
8+
- 2.2.4
9+
- 2.3.0
910
- ruby-head
10-
1111
gemfile:
12-
- gemfiles/4.0.gemfile
13-
- gemfiles/4.1.gemfile
14-
- gemfiles/4.2.gemfile
15-
- gemfiles/edge.gemfile
16-
17-
notifications:
18-
email: false
19-
20-
before_install:
21-
- gem install bundler
22-
12+
- gemfiles/rails_4.0.gemfile
13+
- gemfiles/rails_4.1.gemfile
14+
- gemfiles/rails_4.2.gemfile
15+
- gemfiles/rails_5.0.gemfile
16+
- gemfiles/rails_edge.gemfile
2317
matrix:
2418
fast_finish: true
2519
exclude:
26-
- rvm: 1.9.3
27-
gemfile: gemfiles/edge.gemfile
20+
- rvm: 1.9
21+
gemfile: gemfiles/rails_5.0.gemfile
22+
- rvm: 2.0
23+
gemfile: gemfiles/rails_5.0.gemfile
24+
- rvm: 2.1
25+
gemfile: gemfiles/rails_5.0.gemfile
26+
- rvm: 1.9
27+
gemfile: gemfiles/rails_edge.gemfile
2828
- rvm: 2.0
29-
gemfile: gemfiles/edge.gemfile
29+
gemfile: gemfiles/rails_edge.gemfile
3030
- rvm: 2.1
31-
gemfile: gemfiles/edge.gemfile
31+
gemfile: gemfiles/rails_edge.gemfile
3232
allow_failures:
3333
- rvm: ruby-head
34-
- gemfile: gemfiles/edge.gemfile
34+
- gemfile: gemfiles/rails_edge.gemfile
35+
notifications:
36+
email: false

Appraisals

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,26 @@
1-
%w(4.0 4.1 4.2).each do |version|
2-
appraise version do
3-
gem "actionpack", "~> #{version}.0"
4-
gem "activerecord", "~> #{version}.0"
5-
gem "railties", "~> #{version}.0"
1+
[ '4.0', '4.1', '4.2' ].each do |ver|
2+
appraise "rails-#{ver}" do
3+
gem 'actionpack', "~> #{ver}.0"
4+
gem 'activerecord', "~> #{ver}.0"
5+
gem 'railties', "~> #{ver}.0"
6+
gem 'rack', '~> 1.5'
67
end
78
end
89

9-
appraise "edge" do
10-
git "https://github.com/rails/rails.git" do
11-
gem "actionpack"
12-
gem "activerecord"
13-
gem "railties"
10+
appraise 'rails-5.0' do
11+
gem 'actionpack', '>= 5.0.0.alpha', '< 5.1'
12+
gem 'activerecord', '>= 5.0.0.alpha', '< 5.1'
13+
gem 'railties', '>= 5.0.0.alpha', '< 5.1'
14+
gem 'rack', '>= 2.0.0.alpha', '< 3'
15+
end
16+
17+
appraise "rails-edge" do
18+
git 'https://github.com/rails/rails.git', :branch => 'master' do
19+
gem 'actionpack'
20+
gem 'activerecord'
21+
gem 'railties'
1422
end
1523

16-
gem "arel", github: "rails/arel"
24+
gem 'rack', :git => 'https://github.com/rack/rack.git', :branch => 'master'
25+
gem 'arel', :git => 'https://github.com/rails/arel.git', :branch => 'master'
1726
end

activerecord-session_store.gemspec

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ Gem::Specification.new do |s|
1717
s.extra_rdoc_files = %w( README.md )
1818
s.rdoc_options.concat ['--main', 'README.md']
1919

20-
s.add_dependency('activerecord', '>= 4.0.0', '< 5')
21-
s.add_dependency('actionpack', '>= 4.0.0', '< 5')
22-
s.add_dependency('railties', '>= 4.0.0', '< 5')
20+
s.add_dependency('activerecord', '>= 4.0', '< 5.1')
21+
s.add_dependency('actionpack', '>= 4.0', '< 5.1')
22+
s.add_dependency('railties', '>= 4.0', '< 5.1')
23+
s.add_dependency('rack', '>= 1.5.2', '< 3')
2324

2425
s.add_development_dependency('sqlite3')
25-
s.add_development_dependency('appraisal')
26+
s.add_development_dependency('appraisal', '~> 2.1.0')
2627
end

gemfiles/edge.gemfile

Lines changed: 0 additions & 13 deletions
This file was deleted.

gemfiles/4.0.gemfile renamed to gemfiles/rails_4.0.gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ source "https://rubygems.org"
55
gem "actionpack", "~> 4.0.0"
66
gem "activerecord", "~> 4.0.0"
77
gem "railties", "~> 4.0.0"
8+
gem "rack", "~> 1.5"
89

910
gemspec :path => "../"

gemfiles/4.1.gemfile renamed to gemfiles/rails_4.1.gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ source "https://rubygems.org"
55
gem "actionpack", "~> 4.1.0"
66
gem "activerecord", "~> 4.1.0"
77
gem "railties", "~> 4.1.0"
8+
gem "rack", "~> 1.5"
89

910
gemspec :path => "../"

gemfiles/4.2.gemfile renamed to gemfiles/rails_4.2.gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ source "https://rubygems.org"
55
gem "actionpack", "~> 4.2.0"
66
gem "activerecord", "~> 4.2.0"
77
gem "railties", "~> 4.2.0"
8+
gem "rack", "~> 1.5"
89

910
gemspec :path => "../"

gemfiles/rails_5.0.gemfile

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# This file was generated by Appraisal
2+
3+
source "https://rubygems.org"
4+
5+
gem "actionpack", ">= 5.0.0.alpha", "< 5.1"
6+
gem "activerecord", ">= 5.0.0.alpha", "< 5.1"
7+
gem "railties", ">= 5.0.0.alpha", "< 5.1"
8+
gem "rack", ">= 2.0.0.alpha", "< 3"
9+
10+
gemspec :path => "../"

gemfiles/rails_edge.gemfile

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# This file was generated by Appraisal
2+
3+
source "https://rubygems.org"
4+
5+
git "https://github.com/rails/rails.git", :branch => "master" do
6+
gem "actionpack"
7+
gem "activerecord"
8+
gem "railties"
9+
end
10+
11+
gem "rack", :git => "https://github.com/rack/rack.git", :branch => "master"
12+
gem "arel", :git => "https://github.com/rails/arel.git", :branch => "master"
13+
14+
gemspec :path => "../"

lib/action_dispatch/session/active_record_store.rb

Lines changed: 60 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -58,66 +58,83 @@ class ActiveRecordStore < ActionDispatch::Session::AbstractStore
5858
cattr_accessor :session_class
5959

6060
SESSION_RECORD_KEY = 'rack.session.record'
61-
ENV_SESSION_OPTIONS_KEY = Rack::Session::Abstract::ENV_SESSION_OPTIONS_KEY
61+
if Rack.const_defined?(:RACK_SESSION_OPTIONS)
62+
ENV_SESSION_OPTIONS_KEY = Rack::RACK_SESSION_OPTIONS
63+
else
64+
ENV_SESSION_OPTIONS_KEY = Rack::Session::Abstract::ENV_SESSION_OPTIONS_KEY
65+
end
6266

63-
private
64-
def get_session(env, sid)
65-
logger.silence_logger do
66-
unless sid and session = @@session_class.find_by_session_id(sid)
67-
# If the sid was nil or if there is no pre-existing session under the sid,
68-
# force the generation of a new sid and associate a new session associated with the new sid
69-
sid = generate_sid
70-
session = @@session_class.new(:session_id => sid, :data => {})
71-
end
72-
env[SESSION_RECORD_KEY] = session
73-
[sid, session.data]
67+
private
68+
def get_session(request, sid)
69+
logger.silence_logger do
70+
unless sid and session = @@session_class.find_by_session_id(sid)
71+
# If the sid was nil or if there is no pre-existing session under the sid,
72+
# force the generation of a new sid and associate a new session associated with the new sid
73+
sid = generate_sid
74+
session = @@session_class.new(:session_id => sid, :data => {})
7475
end
76+
request.env[SESSION_RECORD_KEY] = session
77+
[sid, session.data]
7578
end
79+
end
7680

77-
def set_session(env, sid, session_data, options)
78-
logger.silence_logger do
79-
record = get_session_model(env, sid)
80-
record.data = session_data
81-
return false unless record.save
81+
def write_session(request, sid, session_data, options)
82+
logger.silence_logger do
83+
record = get_session_model(request, sid)
84+
record.data = session_data
85+
return false unless record.save
8286

83-
session_data = record.data
84-
if session_data && session_data.respond_to?(:each_value)
85-
session_data.each_value do |obj|
86-
obj.clear_association_cache if obj.respond_to?(:clear_association_cache)
87-
end
87+
session_data = record.data
88+
if session_data && session_data.respond_to?(:each_value)
89+
session_data.each_value do |obj|
90+
obj.clear_association_cache if obj.respond_to?(:clear_association_cache)
8891
end
89-
90-
sid
9192
end
92-
end
9393

94-
def destroy_session(env, session_id, options)
95-
logger.silence_logger do
96-
if sid = current_session_id(env)
97-
get_session_model(env, sid).destroy
98-
env[SESSION_RECORD_KEY] = nil
99-
end
94+
sid
95+
end
96+
end
10097

101-
generate_sid unless options[:drop]
98+
def delete_session(request, session_id, options)
99+
logger.silence_logger do
100+
if sid = current_session_id(request)
101+
get_session_model(request, sid).destroy
102+
request.env[SESSION_RECORD_KEY] = nil
102103
end
104+
generate_sid unless options[:drop]
103105
end
106+
end
104107

105-
def get_session_model(env, sid)
106-
if env[ENV_SESSION_OPTIONS_KEY][:id].nil?
107-
env[SESSION_RECORD_KEY] = find_session(sid)
108+
def get_session_model(request, id)
109+
logger.silence_logger do
110+
model = @@session_class.find_by_session_id(id)
111+
if !model
112+
id = generate_sid
113+
model = @@session_class.new(:session_id => id, :data => {})
114+
model.save
115+
end
116+
if request.env[ENV_SESSION_OPTIONS_KEY][:id].nil?
117+
request.env[SESSION_RECORD_KEY] = model
108118
else
109-
env[SESSION_RECORD_KEY] ||= find_session(sid)
119+
request.env[SESSION_RECORD_KEY] ||= model
110120
end
121+
model
111122
end
123+
end
112124

113-
def find_session(id)
114-
@@session_class.find_by_session_id(id) ||
115-
@@session_class.new(:session_id => id, :data => {})
116-
end
125+
def find_session(request, id)
126+
model = get_session_model(request, id)
127+
[model.session_id, model.data]
128+
end
117129

118-
def logger
119-
ActiveRecord::Base.logger || ActiveRecord::SessionStore::NilLogger
120-
end
130+
def logger
131+
ActiveRecord::Base.logger || ActiveRecord::SessionStore::NilLogger
132+
end
121133
end
122134
end
123135
end
136+
137+
if ActiveRecord::VERSION::MAJOR == 4
138+
require 'action_dispatch/session/legacy_support'
139+
ActionDispatch::Session::ActiveRecordStore.send(:include, ActionDispatch::Session::LegacySupport)
140+
end
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
module ActionDispatch
2+
module Session
3+
module LegacySupport
4+
EnvWrapper = Struct.new(:env)
5+
6+
def self.included(klass)
7+
[
8+
:get_session,
9+
:get_session_model,
10+
:write_session,
11+
:delete_session,
12+
:find_session
13+
].each do |m|
14+
klass.send(:alias_method, "#{m}_rails5".to_sym, m)
15+
klass.send(:remove_method, m)
16+
end
17+
end
18+
19+
def get_session(env, sid)
20+
request = EnvWrapper.new(env)
21+
get_session_rails5(request, sid)
22+
end
23+
24+
def set_session(env, sid, session_data, options)
25+
request = EnvWrapper.new(env)
26+
write_session_rails5(request, sid, session_data, options)
27+
end
28+
29+
def destroy_session(env, session_id, options)
30+
request = EnvWrapper.new(env)
31+
if sid = current_session_id(request.env)
32+
get_session_model(request, sid).destroy
33+
request.env[self.class::SESSION_RECORD_KEY] = nil
34+
end
35+
generate_sid unless options[:drop]
36+
end
37+
38+
def get_session_model(request, sid)
39+
if request.env[self.class::ENV_SESSION_OPTIONS_KEY][:id].nil?
40+
request.env[self.class::SESSION_RECORD_KEY] = find_session(sid)
41+
else
42+
request.env[self.class::SESSION_RECORD_KEY] ||= find_session(sid)
43+
end
44+
end
45+
46+
def find_session(id)
47+
self.class.session_class.find_by_session_id(id) || self.class.session_class.new(:session_id => id, :data => {})
48+
end
49+
end
50+
end
51+
end

lib/active_record/session_store.rb

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,20 @@ def unmarshal(data)
1313
end
1414

1515
def drop_table!
16-
connection.schema_cache.clear_table_cache!(table_name)
16+
if connection.schema_cache.respond_to?(:clear_data_source_cache!)
17+
connection.schema_cache.clear_data_source_cache!(table_name)
18+
else
19+
connection.schema_cache.clear_table_cache!(table_name)
20+
end
1721
connection.drop_table table_name
1822
end
1923

2024
def create_table!
21-
connection.schema_cache.clear_table_cache!(table_name)
25+
if connection.schema_cache.respond_to?(:clear_data_source_cache!)
26+
connection.schema_cache.clear_data_source_cache!(table_name)
27+
else
28+
connection.schema_cache.clear_table_cache!(table_name)
29+
end
2230
connection.create_table(table_name) do |t|
2331
t.string session_id_column, :limit => 255
2432
t.text data_column_name

lib/active_record/session_store/extension/logger_silencer.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ module LoggerSilencer
1313
included do
1414
cattr_accessor :silencer
1515
self.silencer = true
16-
alias_method_chain :level, :threadsafety
17-
alias_method_chain :add, :threadsafety
16+
alias_method :level_without_threadsafety, :level
17+
alias_method :level, :level_with_threadsafety
18+
alias_method :add_without_threadsafety, :add
19+
alias_method :add, :add_with_threadsafety
1820
end
1921

2022
def thread_level

0 commit comments

Comments
 (0)