merb_sequel 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/merb/orms/sequel/connection.rb +2 -19
- data/lib/merb/session/sequel_session.rb +62 -112
- data/lib/merb_sequel.rb +4 -1
- data/specs/merb_sequel_session_spec.rb +46 -0
- metadata +4 -3
data/Rakefile
CHANGED
@@ -18,7 +18,7 @@ GEM_EMAIL = "wayneeseguin@gmail.com, lancecarlson@gmail.com"
|
|
18
18
|
|
19
19
|
GEM_NAME = "merb_sequel"
|
20
20
|
PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
|
21
|
-
GEM_VERSION = (Merb::MORE_VERSION rescue "0.9.
|
21
|
+
GEM_VERSION = (Merb::MORE_VERSION rescue "0.9.6") + PKG_BUILD
|
22
22
|
|
23
23
|
RELEASE_NAME = "REL #{GEM_VERSION}"
|
24
24
|
|
@@ -36,7 +36,7 @@ spec = Gem::Specification.new do |s|
|
|
36
36
|
s.author = GEM_AUTHOR
|
37
37
|
s.email = GEM_EMAIL
|
38
38
|
s.homepage = PROJECT_URL
|
39
|
-
s.add_dependency("merb-core", ">= 0.9.
|
39
|
+
s.add_dependency("merb-core", ">= 0.9.6")
|
40
40
|
s.add_dependency("sequel", ">= 1.4.0")
|
41
41
|
s.files = %w(LICENSE README Rakefile TODO) + Dir.glob("{lib,specs,sequel_generators}/**/*")
|
42
42
|
end
|
@@ -50,13 +50,13 @@ end
|
|
50
50
|
##############################################################################
|
51
51
|
desc "Install the gem"
|
52
52
|
task :install => [:package] do
|
53
|
-
sh
|
53
|
+
sh install_command(GEM_NAME, GEM_VERSION)
|
54
54
|
end
|
55
55
|
|
56
56
|
namespace :jruby do
|
57
57
|
desc "Run :package and install the resulting .gem with jruby"
|
58
58
|
task :install => :package do
|
59
|
-
sh
|
59
|
+
sh jinstall_command(GEM_NAME, GEM_VERSION)
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require "fileutils"
|
2
|
+
require "sequel"
|
2
3
|
|
3
4
|
module Merb
|
4
5
|
module Orms
|
@@ -15,9 +16,7 @@ module Merb
|
|
15
16
|
end
|
16
17
|
|
17
18
|
def config
|
18
|
-
|
19
|
-
@config ||=
|
20
|
-
begin
|
19
|
+
@config ||= begin
|
21
20
|
# Convert string keys to symbols
|
22
21
|
full_config = Erubis.load_yaml_file(config_file)
|
23
22
|
config = (Merb::Plugins.config[:merb_sequel] = {})
|
@@ -26,14 +25,10 @@ module Merb
|
|
26
25
|
end
|
27
26
|
config
|
28
27
|
end
|
29
|
-
|
30
28
|
end
|
31
29
|
|
32
30
|
# Database connects as soon as the gem is loaded
|
33
31
|
def connect
|
34
|
-
|
35
|
-
require "sequel"
|
36
|
-
|
37
32
|
if File.exists?(config_file)
|
38
33
|
Merb.logger.info!("Connecting to the '#{config[:database]}' database on '#{config[:host]}' using '#{config[:adapter]}' ...")
|
39
34
|
connection = ::Sequel.connect(config_options(config))
|
@@ -46,11 +41,9 @@ module Merb
|
|
46
41
|
Merb.logger.error! "A sample file was created called config/database.yml.sample for you to copy and edit."
|
47
42
|
exit(1)
|
48
43
|
end
|
49
|
-
|
50
44
|
end
|
51
45
|
|
52
46
|
def config_options(config = {})
|
53
|
-
|
54
47
|
options = {}
|
55
48
|
options[:adapter] = (config[:adapter] || "sqlite")
|
56
49
|
options[:host] = (config[:host] || "localhost")
|
@@ -63,16 +56,6 @@ module Merb
|
|
63
56
|
options[:logger] = Merb.logger
|
64
57
|
options
|
65
58
|
end
|
66
|
-
|
67
|
-
# Registering this ORM lets the user choose sequel as a session store
|
68
|
-
# in merb.yml's session_store: option.
|
69
|
-
def register_session_type
|
70
|
-
Merb.register_session_type(
|
71
|
-
"sequel",
|
72
|
-
"merb/session/sequel_session",
|
73
|
-
"Using Sequel database sessions"
|
74
|
-
)
|
75
|
-
end
|
76
59
|
|
77
60
|
end
|
78
61
|
|
@@ -1,156 +1,106 @@
|
|
1
|
-
require
|
1
|
+
require 'sequel'
|
2
|
+
require 'merb-core/dispatch/session'
|
3
|
+
require 'base64'
|
2
4
|
|
3
5
|
module Merb
|
4
6
|
|
5
|
-
module SessionMixin
|
6
|
-
def setup_session
|
7
|
-
before = cookies[_session_id_key]
|
8
|
-
request.session, cookies[_session_id_key] = Merb::SequelSession.persist(cookies[_session_id_key])
|
9
|
-
@_fingerprint = Marshal.dump(request.session.data).hash
|
10
|
-
@_new_cookie = cookies[_session_id_key] != before
|
11
|
-
end
|
12
|
-
|
13
|
-
def finalize_session
|
14
|
-
request.session.save if @_fingerprint != Marshal.dump(request.session.data).hash
|
15
|
-
set_cookie(_session_id_key, request.session.values[:session_id], Time.now + _session_expiry) if (@_new_cookie || request.session.needs_new_cookie)
|
16
|
-
end
|
17
|
-
|
18
|
-
def session_store_type
|
19
|
-
"sequel"
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
7
|
table_name = (Merb::Plugins.config[:merb_sequel][:session_table_name] || "sessions")
|
25
8
|
|
26
|
-
|
9
|
+
# Sessions stored in Sequel model.
|
10
|
+
#
|
11
|
+
# To use Sequel based sessions add the following to config/init.rb:
|
12
|
+
#
|
13
|
+
# Merb::Config[:session_store] = 'sequel'
|
14
|
+
|
15
|
+
class SequelSessionStore < Sequel::Model(table_name.to_sym)
|
27
16
|
|
28
17
|
set_schema do
|
29
18
|
primary_key :id
|
30
19
|
varchar :session_id
|
31
|
-
|
20
|
+
text :data
|
32
21
|
timestamp :created_at
|
33
22
|
end
|
34
23
|
|
35
|
-
attr_accessor :needs_new_cookie
|
36
|
-
|
37
24
|
class << self
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
25
|
+
|
26
|
+
# ==== Parameters
|
27
|
+
# session_id<String>:: ID of the session to retrieve.
|
28
|
+
#
|
29
|
+
# ==== Returns
|
30
|
+
# ContainerSession:: The session corresponding to the ID.
|
31
|
+
def retrieve_session(session_id)
|
32
|
+
if item = find(:session_id => session_id)
|
33
|
+
item.data
|
34
|
+
end
|
42
35
|
end
|
43
36
|
|
44
|
-
#
|
45
|
-
#
|
46
|
-
|
47
|
-
|
48
|
-
|
37
|
+
# ==== Parameters
|
38
|
+
# session_id<String>:: ID of the session to set.
|
39
|
+
# data<ContainerSession>:: The session to set.
|
40
|
+
def store_session(session_id, data)
|
41
|
+
if item = find(:session_id => session_id)
|
42
|
+
item.update(:data => data)
|
43
|
+
else
|
44
|
+
create(:session_id => session_id, :data => data, :created_at => Time.now)
|
49
45
|
end
|
50
|
-
unless session
|
51
|
-
session = generate
|
52
|
-
end
|
53
|
-
[session, session.values[:session_id]]
|
54
46
|
end
|
55
47
|
|
56
|
-
#
|
57
|
-
|
58
|
-
|
48
|
+
# ==== Parameters
|
49
|
+
# session_id<String>:: ID of the session to delete.
|
50
|
+
def delete_session(session_id)
|
51
|
+
if item = find(:session_id => session_id)
|
52
|
+
item.delete
|
53
|
+
end
|
59
54
|
end
|
60
|
-
|
55
|
+
|
56
|
+
# ==== Returns
|
57
|
+
# Integer:: The maximum length of the 'data' column.
|
61
58
|
def data_column_size_limit
|
62
|
-
|
63
|
-
end
|
64
|
-
|
65
|
-
def marshal(data)
|
66
|
-
Base64.encode64(Marshal.dump(data)) if data
|
67
|
-
end
|
68
|
-
|
69
|
-
def unmarshal(data)
|
70
|
-
Marshal.load(Base64.decode64(data)) if data
|
59
|
+
512 # TODO - figure out how much space we actually have
|
71
60
|
end
|
72
61
|
|
73
62
|
alias :create_table! :create_table
|
74
63
|
alias :drop_table! :drop_table
|
75
64
|
end
|
76
65
|
|
77
|
-
#
|
78
|
-
def
|
79
|
-
|
80
|
-
self.needs_new_cookie = true
|
81
|
-
end
|
82
|
-
|
83
|
-
# Recreates the cookie with the default expiration time
|
84
|
-
# Useful during log in for pushing back the expiration date
|
85
|
-
def refresh_expiration
|
86
|
-
self.needs_new_cookie = true
|
87
|
-
end
|
88
|
-
|
89
|
-
# Lazy-delete of session data
|
90
|
-
def delete(key = nil)
|
91
|
-
key ? self.data.delete(key) : self.data.clear
|
92
|
-
end
|
93
|
-
|
94
|
-
def [](key)
|
95
|
-
data[key]
|
96
|
-
end
|
97
|
-
|
98
|
-
def []=(key, val)
|
99
|
-
data[key] = val
|
100
|
-
end
|
101
|
-
|
102
|
-
def empty?
|
103
|
-
data.empty?
|
104
|
-
end
|
105
|
-
|
106
|
-
def each(&b)
|
107
|
-
data.each(&b)
|
66
|
+
# Lazy-unserialize session state.
|
67
|
+
def data
|
68
|
+
@data ||= (@values[:data] ? Marshal.load(@values[:data]) : {})
|
108
69
|
end
|
109
70
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
# Lazy-unmarshal session state.
|
115
|
-
def data
|
116
|
-
@data ||= self.class.unmarshal(@values[:data]) || {}
|
71
|
+
# Virtual attribute writer - override.
|
72
|
+
def data=(hsh)
|
73
|
+
@data = hsh if hsh.is_a?(Hash)
|
117
74
|
end
|
118
75
|
|
119
76
|
# Has the session been loaded yet?
|
120
77
|
def loaded?
|
121
|
-
|
78
|
+
!!@data
|
122
79
|
end
|
123
80
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
# return false if !loaded?
|
130
|
-
@values[:data] = self.class.marshal(self.data)
|
81
|
+
before_save do
|
82
|
+
@values[:data] = Marshal.dump(self.data)
|
83
|
+
if @values[:data].size > self.class.data_column_size_limit
|
84
|
+
raise Merb::SessionMixin::SessionOverflow
|
85
|
+
end
|
131
86
|
end
|
132
|
-
|
133
|
-
# Ensures that the data about to be stored in the database is not
|
134
|
-
# larger than the data storage column. Raises
|
135
|
-
# ActionController::SessionOverflowError.
|
136
|
-
# before_save do # raise_on_session_data_overflow!
|
137
|
-
# return false if !loaded?
|
138
|
-
# limit = self.class.data_column_size_limit
|
139
|
-
# if loaded? and limit and read_attribute(@@data_column_name).size > limit
|
140
|
-
# raise MerbController::SessionOverflowError
|
141
|
-
# end
|
142
|
-
# end
|
143
87
|
|
144
88
|
end
|
145
89
|
|
146
90
|
unless Sequel::Model.db.table_exists?(table_name.to_sym)
|
147
91
|
puts "Warning: The database did not contain a '#{table_name}' table for sessions."
|
148
|
-
|
149
|
-
SequelSession.class_eval do
|
150
|
-
create_table unless table_exists?
|
151
|
-
end
|
152
|
-
|
92
|
+
SequelSessionStore.class_eval { create_table unless table_exists? }
|
153
93
|
puts "Created sessions table."
|
154
94
|
end
|
95
|
+
|
96
|
+
class SequelSession < SessionStoreContainer
|
97
|
+
|
98
|
+
# The session store type
|
99
|
+
self.session_store_type = :sequel
|
100
|
+
|
101
|
+
# The store object is the model class itself
|
102
|
+
self.store = SequelSessionStore
|
103
|
+
|
104
|
+
end
|
155
105
|
|
156
106
|
end
|
data/lib/merb_sequel.rb
CHANGED
@@ -9,7 +9,10 @@ if defined?(Merb::Plugins)
|
|
9
9
|
|
10
10
|
def self.run
|
11
11
|
Merb::Orms::Sequel.connect
|
12
|
-
Merb::
|
12
|
+
if Merb::Config.session_stores.include?(:sequel)
|
13
|
+
Merb.logger.debug "Using Sequel sessions"
|
14
|
+
require File.join(File.dirname(__FILE__) / "merb" / "session" / "sequel_session")
|
15
|
+
end
|
13
16
|
end
|
14
17
|
|
15
18
|
end
|
@@ -0,0 +1,46 @@
|
|
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 'sequel'
|
8
|
+
DB = Sequel.sqlite
|
9
|
+
require "merb/session/sequel_session"
|
10
|
+
end
|
11
|
+
|
12
|
+
Merb.start :environment => 'test', :adapter => 'runner', :session_store => 'sequel'
|
13
|
+
|
14
|
+
Spec::Runner.configure do |config|
|
15
|
+
config.include Merb::Test::RequestHelper
|
16
|
+
end
|
17
|
+
|
18
|
+
# Load up the shared specs from merb-core
|
19
|
+
if (gem_spec = Gem.source_index.search('merb-core').last) &&
|
20
|
+
gem_spec.files.include?('spec/public/session/controllers/sessions.rb')
|
21
|
+
require gem_spec.full_gem_path / 'spec/public/session/controllers/sessions.rb'
|
22
|
+
require gem_spec.full_gem_path / 'spec/public/session/session_spec.rb'
|
23
|
+
end
|
24
|
+
|
25
|
+
describe Merb::SequelSession do
|
26
|
+
|
27
|
+
before do
|
28
|
+
@session_class = Merb::SequelSession
|
29
|
+
@session = @session_class.generate
|
30
|
+
end
|
31
|
+
|
32
|
+
it_should_behave_like "All session-store backends"
|
33
|
+
|
34
|
+
it "should have a session_store_type class attribute" do
|
35
|
+
@session.class.session_store_type.should == :sequel
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
describe Merb::SequelSession, "mixed into Merb::Controller" do
|
41
|
+
|
42
|
+
before(:all) { @session_class = Merb::SequelSession }
|
43
|
+
|
44
|
+
it_should_behave_like "All session-stores mixed into Merb::Controller"
|
45
|
+
|
46
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: merb_sequel
|
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
|
- Wayne E. Seguin, Lance Carlson
|
@@ -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
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: sequel
|
@@ -85,6 +85,7 @@ files:
|
|
85
85
|
- lib/merb_sequel
|
86
86
|
- lib/merb_sequel/merbtasks.rb
|
87
87
|
- lib/merb_sequel.rb
|
88
|
+
- specs/merb_sequel_session_spec.rb
|
88
89
|
- specs/merb_sequel_spec.rb
|
89
90
|
- specs/spec_helper.rb
|
90
91
|
has_rdoc: true
|