merb_activerecord 0.9.5 → 0.9.6
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/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
|