merb_activerecord 0.9.5 → 0.9.6
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +4 -4
- data/lib/active_record/merbtasks.rb +0 -9
- data/lib/generators/session_migration.rb +2 -2
- data/lib/generators/templates/migration/schema/migrations/%file_name%.rb +3 -3
- data/lib/generators/templates/session_migration/schema/migrations/{%version%_sessions.rb → %version%_database_sessions.rb} +1 -0
- data/lib/merb/orms/active_record/connection.rb +1 -8
- data/lib/merb/session/active_record_session.rb +50 -127
- data/lib/merb_activerecord.rb +6 -1
- data/specs/merb_active_record_session_spec.rb +57 -0
- data/specs/merb_active_record_spec.rb +2 -9
- data/specs/spec_helper.rb +1 -2
- metadata +5 -4
data/Rakefile
CHANGED
@@ -17,7 +17,7 @@ GEM_EMAIL = "canadaduane@gmail.com"
|
|
17
17
|
|
18
18
|
GEM_NAME = "merb_activerecord"
|
19
19
|
PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
|
20
|
-
GEM_VERSION = (Merb::MORE_VERSION rescue "0.9.
|
20
|
+
GEM_VERSION = (Merb::MORE_VERSION rescue "0.9.6") + PKG_BUILD
|
21
21
|
|
22
22
|
RELEASE_NAME = "REL #{GEM_VERSION}"
|
23
23
|
|
@@ -35,7 +35,7 @@ spec = Gem::Specification.new do |s|
|
|
35
35
|
s.author = GEM_AUTHOR
|
36
36
|
s.email = GEM_EMAIL
|
37
37
|
s.homepage = PROJECT_URL
|
38
|
-
s.add_dependency('merb-core', '>= 0.9.
|
38
|
+
s.add_dependency('merb-core', '>= 0.9.6')
|
39
39
|
s.require_path = 'lib'
|
40
40
|
s.files = %w(LICENSE README Rakefile TODO) + Dir.glob("{lib,specs}/**/*") end
|
41
41
|
|
@@ -45,14 +45,14 @@ end
|
|
45
45
|
|
46
46
|
desc "Install the gem"
|
47
47
|
task :install => [:package] do
|
48
|
-
sh
|
48
|
+
sh install_command(GEM_NAME, GEM_VERSION)
|
49
49
|
end
|
50
50
|
|
51
51
|
namespace :jruby do
|
52
52
|
|
53
53
|
desc "Run :package and install the resulting .gem with jruby"
|
54
54
|
task :install => :package do
|
55
|
-
sh
|
55
|
+
sh jinstall_command(GEM_NAME, GEM_VERSION)
|
56
56
|
end
|
57
57
|
|
58
58
|
end
|
@@ -316,11 +316,6 @@ namespace :db do
|
|
316
316
|
end
|
317
317
|
|
318
318
|
namespace :sessions do
|
319
|
-
desc "Create sessions table"
|
320
|
-
task :create => :merb_start do
|
321
|
-
Merb::ActiveRecordSession.create_table!
|
322
|
-
end
|
323
|
-
|
324
319
|
desc "Clear the sessions table"
|
325
320
|
task :clear => :merb_start do
|
326
321
|
session_table = 'session'
|
@@ -330,10 +325,6 @@ namespace :db do
|
|
330
325
|
end
|
331
326
|
end
|
332
327
|
|
333
|
-
def session_table_name
|
334
|
-
ActiveRecord::Base.pluralize_table_names ? :sessions : :session
|
335
|
-
end
|
336
|
-
|
337
328
|
def set_firebird_env(config)
|
338
329
|
ENV["ISC_USER"] = config["username"].to_s if config["username"]
|
339
330
|
ENV["ISC_PASSWORD"] = config["password"].to_s if config["password"]
|
@@ -1,4 +1,4 @@
|
|
1
1
|
Merb::Generators::SessionMigrationGenerator.template :session_migration_activerecord, :orm => :activerecord do
|
2
|
-
source(File.dirname(__FILE__), 'templates/session_migration/schema/migrations/%version%
|
3
|
-
destination("schema/migrations/#{version}
|
2
|
+
source(File.dirname(__FILE__), 'templates/session_migration/schema/migrations/%version%_database_sessions.rb')
|
3
|
+
destination("schema/migrations/#{version}_database_sessions.rb")
|
4
4
|
end
|
@@ -3,12 +3,12 @@ class <%= class_name %> < ActiveRecord::Migration
|
|
3
3
|
<% if model -%>
|
4
4
|
create_table :<%= table_name %> do |t|
|
5
5
|
<% attributes.each do |name, type| -%>
|
6
|
-
t.<%= name %> :<%= type %>
|
6
|
+
t.<%= name %> :<%= type %>
|
7
7
|
<% end -%>
|
8
|
-
|
8
|
+
|
9
9
|
t.timestamps
|
10
10
|
end
|
11
|
-
<% end -%>
|
11
|
+
<% end -%>
|
12
12
|
end
|
13
13
|
|
14
14
|
def self.down
|
@@ -59,7 +59,7 @@ module Merb
|
|
59
59
|
if File.exists?(config_file)
|
60
60
|
Merb.logger.info!("Connecting to database...")
|
61
61
|
|
62
|
-
Thread.new{ loop{ sleep(60*60); ::ActiveRecord::Base.verify_active_connections! } }
|
62
|
+
Thread.new{ loop{ sleep(60*60); ::ActiveRecord::Base.verify_active_connections! } }
|
63
63
|
|
64
64
|
::ActiveRecord::Base.verification_timeout = 14400
|
65
65
|
::ActiveRecord::Base.logger = Merb.logger
|
@@ -73,13 +73,6 @@ module Merb
|
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
|
-
# Registering this ORM lets the user choose active_record as a session
|
77
|
-
# in merb.yml's session_store: option.
|
78
|
-
def register_session_type
|
79
|
-
Merb.register_session_type("activerecord",
|
80
|
-
"merb/session/active_record_session",
|
81
|
-
"Using ActiveRecord database sessions")
|
82
|
-
end
|
83
76
|
end
|
84
77
|
end
|
85
78
|
end
|
@@ -1,142 +1,65 @@
|
|
1
|
-
require
|
1
|
+
require 'active_record'
|
2
|
+
require 'merb-core/dispatch/session'
|
3
|
+
require 'base64'
|
2
4
|
|
3
5
|
module Merb
|
4
|
-
module SessionMixin
|
5
|
-
def setup_session
|
6
|
-
before = cookies[_session_id_key]
|
7
|
-
request.session, cookies[_session_id_key] = Merb::ActiveRecordSession.persist(cookies[_session_id_key])
|
8
|
-
@_fingerprint = Marshal.dump(request.session.data).hash
|
9
|
-
@_new_cookie = cookies[_session_id_key] != before
|
10
|
-
end
|
11
6
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
7
|
+
# Sessions stored in ActiveRecord model.
|
8
|
+
#
|
9
|
+
# To use ActiveRecord based sessions add the following to config/init.rb:
|
10
|
+
#
|
11
|
+
# Merb::Config[:session_store] = 'activerecord'
|
12
|
+
|
13
|
+
class ActiveRecordSessionStore < ::ActiveRecord::Base
|
14
|
+
|
15
|
+
table_name = (Merb::Plugins.config[:merb_active_record][:session_table_name] || "sessions")
|
16
|
+
|
17
|
+
set_table_name table_name
|
16
18
|
|
17
|
-
|
18
|
-
|
19
|
-
end
|
20
|
-
end # ActiveRecordMixin
|
21
|
-
|
22
|
-
class ActiveRecordSession < ::ActiveRecord::Base
|
23
|
-
set_table_name 'sessions'
|
24
|
-
# Customizable data column name. Defaults to 'data'.
|
25
|
-
cattr_accessor :data_column_name
|
26
|
-
self.data_column_name = 'data'
|
27
|
-
before_save :marshal_data!
|
28
|
-
before_save :raise_on_session_data_overflow!
|
29
|
-
attr_accessor :needs_new_cookie
|
30
|
-
|
19
|
+
serialize :data
|
20
|
+
|
31
21
|
class << self
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
#
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
session = find_by_session_id(session_id)
|
42
|
-
end
|
43
|
-
unless session
|
44
|
-
session = generate
|
22
|
+
|
23
|
+
# ==== Parameters
|
24
|
+
# session_id<String>:: ID of the session to retrieve.
|
25
|
+
#
|
26
|
+
# ==== Returns
|
27
|
+
# ContainerSession:: The session corresponding to the ID.
|
28
|
+
def retrieve_session(session_id)
|
29
|
+
if item = find_by_session_id(session_id)
|
30
|
+
item.data
|
45
31
|
end
|
46
|
-
[session, session.session_id]
|
47
|
-
end
|
48
|
-
|
49
|
-
# Don't try to reload ARStore::Session in dev mode.
|
50
|
-
def reloadable?
|
51
|
-
false
|
52
|
-
end
|
53
|
-
|
54
|
-
def data_column_size_limit
|
55
|
-
@data_column_size_limit ||= columns_hash[@@data_column_name].limit
|
56
32
|
end
|
57
33
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
def
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
)
|
68
|
-
end_sql
|
34
|
+
# ==== Parameters
|
35
|
+
# session_id<String>:: ID of the session to set.
|
36
|
+
# data<ContainerSession>:: The session to set.
|
37
|
+
def store_session(session_id, data)
|
38
|
+
if item = find_by_session_id(session_id)
|
39
|
+
item.update_attributes!(:data => data)
|
40
|
+
else
|
41
|
+
create(:session_id => session_id, :data => data)
|
42
|
+
end
|
69
43
|
end
|
70
44
|
|
71
|
-
|
72
|
-
|
45
|
+
# ==== Parameters
|
46
|
+
# session_id<String>:: ID of the session to delete.
|
47
|
+
def delete_session(session_id)
|
48
|
+
delete_all(["#{connection.quote_column_name('session_id')} IN (?)", session_id])
|
73
49
|
end
|
74
|
-
|
75
|
-
|
76
|
-
# Regenerate the Session ID
|
77
|
-
def regenerate
|
78
|
-
update_attributes(:session_id => Merb::SessionMixin::rand_uuid)
|
79
|
-
self.needs_new_cookie = true
|
80
|
-
end
|
81
|
-
|
82
|
-
# Recreates the cookie with the default expiration time
|
83
|
-
# Useful during log in for pushing back the expiration date
|
84
|
-
def refresh_expiration
|
85
|
-
self.needs_new_cookie = true
|
86
|
-
end
|
87
|
-
|
88
|
-
# Lazy-delete of session data
|
89
|
-
def delete(key = nil)
|
90
|
-
key ? self.data.delete(key) : self.data.clear
|
91
|
-
end
|
92
|
-
|
93
|
-
def [](key)
|
94
|
-
data[key]
|
95
|
-
end
|
96
|
-
|
97
|
-
def empty?
|
98
|
-
data.empty?
|
99
|
-
end
|
100
|
-
|
101
|
-
def each(&b)
|
102
|
-
data.each(&b)
|
50
|
+
|
103
51
|
end
|
104
52
|
|
105
|
-
|
106
|
-
data.each_with_index(&b)
|
107
|
-
end
|
53
|
+
end
|
108
54
|
|
109
|
-
|
110
|
-
data[key] = val
|
111
|
-
end
|
55
|
+
class ActiveRecordSession < SessionStoreContainer
|
112
56
|
|
113
|
-
#
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
private
|
124
|
-
attr_writer :data
|
125
|
-
|
126
|
-
def marshal_data!
|
127
|
-
return false if !loaded?
|
128
|
-
write_attribute(@@data_column_name, self.class.marshal(self.data))
|
129
|
-
end
|
130
|
-
|
131
|
-
# Ensures that the data about to be stored in the database is not
|
132
|
-
# larger than the data storage column. Raises
|
133
|
-
# ActionController::SessionOverflowError.
|
134
|
-
def raise_on_session_data_overflow!
|
135
|
-
return false if !loaded?
|
136
|
-
limit = self.class.data_column_size_limit
|
137
|
-
if loaded? and limit and read_attribute(@@data_column_name).size > limit
|
138
|
-
raise MerbController::SessionOverflowError
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end # ActiveRecordSessionMixin
|
142
|
-
end # Merb
|
57
|
+
# The session store type
|
58
|
+
self.session_store_type = :activerecord
|
59
|
+
|
60
|
+
# The store object is the model class itself
|
61
|
+
self.store = ActiveRecordSessionStore
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
data/lib/merb_activerecord.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
if defined?(Merb::Plugins)
|
2
|
+
|
2
3
|
dependency "activerecord"
|
4
|
+
|
3
5
|
require File.join(File.dirname(__FILE__) / "merb" / "orms" / "active_record" / "connection")
|
4
6
|
Merb::Plugins.add_rakefiles(File.join(File.dirname(__FILE__) / "active_record" / "merbtasks"))
|
5
7
|
|
@@ -9,7 +11,10 @@ if defined?(Merb::Plugins)
|
|
9
11
|
|
10
12
|
def self.run
|
11
13
|
Merb::Orms::ActiveRecord.connect
|
12
|
-
Merb::
|
14
|
+
if Merb::Config.session_stores.include?(:activerecord)
|
15
|
+
Merb.logger.debug "Using ActiveRecord sessions"
|
16
|
+
require File.join(File.dirname(__FILE__) / "merb" / "session" / "active_record_session")
|
17
|
+
end
|
13
18
|
end
|
14
19
|
|
15
20
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
$:.push File.join(File.dirname(__FILE__), '..', 'lib')
|
2
|
+
require 'merb-core'
|
3
|
+
require 'merb-core/test'
|
4
|
+
require 'merb-core/test/helpers'
|
5
|
+
|
6
|
+
Merb::BootLoader.before_app_loads do
|
7
|
+
require "merb/session/active_record_session"
|
8
|
+
end
|
9
|
+
|
10
|
+
Merb.start_environment( :environment => 'test', :adapter => 'runner',
|
11
|
+
:session_store => 'activerecord')
|
12
|
+
|
13
|
+
Spec::Runner.configure do |config|
|
14
|
+
config.include Merb::Test::RequestHelper
|
15
|
+
end
|
16
|
+
|
17
|
+
require 'merb_activerecord'
|
18
|
+
ActiveRecord::Base.establish_connection(:adapter => "sqlite3",
|
19
|
+
:dbfile => ":memory:")
|
20
|
+
|
21
|
+
ActiveRecord::Schema.define do
|
22
|
+
create_table :sessions do |t|
|
23
|
+
t.column :session_id, :string
|
24
|
+
t.column :data, :text
|
25
|
+
t.column :created_at, :datetime
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Load up the shared specs from merb-core
|
30
|
+
if (gem_spec = Gem.source_index.search('merb-core').last) &&
|
31
|
+
gem_spec.files.include?('spec/public/session/controllers/sessions.rb')
|
32
|
+
require gem_spec.full_gem_path / 'spec/public/session/controllers/sessions.rb'
|
33
|
+
require gem_spec.full_gem_path / 'spec/public/session/session_spec.rb'
|
34
|
+
end
|
35
|
+
|
36
|
+
describe Merb::ActiveRecordSession do
|
37
|
+
|
38
|
+
before do
|
39
|
+
@session_class = Merb::ActiveRecordSession
|
40
|
+
@session = @session_class.generate
|
41
|
+
end
|
42
|
+
|
43
|
+
it_should_behave_like "All session-store backends"
|
44
|
+
|
45
|
+
it "should have a session_store_type class attribute" do
|
46
|
+
@session.class.session_store_type.should == :activerecord
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
describe Merb::ActiveRecordSession, "mixed into Merb::Controller" do
|
52
|
+
|
53
|
+
before(:all) { @session_class = Merb::ActiveRecordSession }
|
54
|
+
|
55
|
+
it_should_behave_like "All session-stores mixed into Merb::Controller"
|
56
|
+
|
57
|
+
end
|
@@ -10,14 +10,12 @@ describe Merb::Orms::ActiveRecord::Connect do
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
|
15
13
|
describe "Merb ActiveRecord extension" do
|
16
14
|
before :all do
|
17
15
|
@wd = Dir.pwd
|
18
16
|
Merb.stub!(:dir_for).with(:config).and_return(@wd)
|
19
|
-
@config_file_path = @wd / "database.yml"
|
20
|
-
@sample_file_path = @wd / "database.yml.sample"
|
17
|
+
@config_file_path = @wd / "config" / "database.yml"
|
18
|
+
@sample_file_path = @wd / "config" / "database.yml.sample"
|
21
19
|
|
22
20
|
@sample_source = Merb::Orms::ActiveRecord.sample_source
|
23
21
|
@config_sample = Erubis.load_yaml_file(@sample_source)
|
@@ -52,11 +50,6 @@ describe "Merb ActiveRecord extension" do
|
|
52
50
|
@config_sample[:development][:encoding].should == "utf8"
|
53
51
|
end
|
54
52
|
|
55
|
-
it "stores configurations from config file" do
|
56
|
-
Erubis.should_receive(:load_yaml_file).with(@config_file_path).and_return(@config_sample)
|
57
|
-
Merb::Orms::ActiveRecord.configurations[:development][:database].should == "sample_development"
|
58
|
-
end
|
59
|
-
|
60
53
|
it "provides Rack with a way to start a transcantion" do
|
61
54
|
Merb::Orms::ActiveRecord.should respond_to(:open_sandbox!)
|
62
55
|
end
|
data/specs/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: merb_activerecord
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Duane Johnson
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-08
|
12
|
+
date: 2008-09-08 00:00:00 +03:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -20,7 +20,7 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 0.9.
|
23
|
+
version: 0.9.6
|
24
24
|
version:
|
25
25
|
description: Merb plugin that provides ActiveRecord support for Merb
|
26
26
|
email: canadaduane@gmail.com
|
@@ -66,7 +66,7 @@ files:
|
|
66
66
|
- lib/generators/templates/session_migration
|
67
67
|
- lib/generators/templates/session_migration/schema
|
68
68
|
- lib/generators/templates/session_migration/schema/migrations
|
69
|
-
- lib/generators/templates/session_migration/schema/migrations/%version%
|
69
|
+
- lib/generators/templates/session_migration/schema/migrations/%version%_database_sessions.rb
|
70
70
|
- lib/merb
|
71
71
|
- lib/merb/orms
|
72
72
|
- lib/merb/orms/active_record
|
@@ -75,6 +75,7 @@ files:
|
|
75
75
|
- lib/merb/session
|
76
76
|
- lib/merb/session/active_record_session.rb
|
77
77
|
- lib/merb_activerecord.rb
|
78
|
+
- specs/merb_active_record_session_spec.rb
|
78
79
|
- specs/merb_active_record_spec.rb
|
79
80
|
- specs/spec_helper.rb
|
80
81
|
has_rdoc: true
|