merb-core 0.9.6 → 0.9.7
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/CHANGELOG +67 -0
- data/CONTRIBUTORS +1 -0
- data/PUBLIC_CHANGELOG +34 -0
- data/Rakefile +7 -4
- data/bin/merb +1 -31
- data/lib/merb-core.rb +17 -6
- data/lib/merb-core/config.rb +0 -7
- data/lib/merb-core/controller/abstract_controller.rb +6 -3
- data/lib/merb-core/dispatch/cookies.rb +11 -10
- data/lib/merb-core/dispatch/dispatcher.rb +11 -5
- data/lib/merb-core/dispatch/request.rb +7 -2
- data/lib/merb-core/dispatch/session.rb +33 -17
- data/lib/merb-core/dispatch/session/container.rb +19 -9
- data/lib/merb-core/dispatch/session/cookie.rb +27 -12
- data/lib/merb-core/dispatch/session/memcached.rb +47 -27
- data/lib/merb-core/dispatch/session/memory.rb +10 -6
- data/lib/merb-core/dispatch/session/store_container.rb +25 -20
- data/lib/merb-core/test/helpers/request_helper.rb +6 -3
- data/lib/merb-core/test/helpers/route_helper.rb +1 -1
- data/lib/merb-core/test/matchers/view_matchers.rb +5 -1
- data/lib/merb-core/version.rb +1 -1
- data/spec/private/dispatch/fixture/log/merb_test.log +144 -0
- data/spec/private/router/fixture/log/merb_test.log +16 -0
- data/spec/public/controller/controllers/cookies.rb +14 -3
- data/spec/public/controller/cookies_spec.rb +53 -10
- data/spec/public/controller/url_spec.rb +6 -0
- data/spec/public/directory_structure/directory/log/merb_test.log +112 -0
- data/spec/public/reloading/directory/log/merb_test.log +16 -0
- data/spec/public/request/request_spec.rb +19 -10
- data/spec/public/router/fixture/log/merb_test.log +224 -0
- data/spec/public/session/controllers/sessions.rb +4 -0
- data/spec/public/session/memcached_session_spec.rb +2 -2
- data/spec/public/session/multiple_sessions_spec.rb +2 -2
- data/spec/public/session/session_spec.rb +15 -0
- data/spec/public/test/request_helper_spec.rb +21 -0
- data/spec/public/test/route_helper_spec.rb +7 -0
- metadata +6 -17
- data/lib/merb-core/script.rb +0 -112
data/CHANGELOG
CHANGED
@@ -1,3 +1,70 @@
|
|
1
|
+
== 0.9.7 "Universe In A Bundle" 2008-09-13
|
2
|
+
|
3
|
+
* Made the post body available to the routing when testing a request.
|
4
|
+
* Better local gems dir detection and end-user feedback
|
5
|
+
* Updated PUBLIC_CHANGELOG regarding gem management and merb.thor
|
6
|
+
* Fixed compatibility with the *new* bundle logic
|
7
|
+
* Made request('/path', {}, {:post_body => 'some XML'}) not setting the post body to nil.
|
8
|
+
* Added two specs for setting request.raw_post. Passes for #dispatch_to, fails for #request.
|
9
|
+
* You can now use request_to with a post body:
|
10
|
+
* It's official: Thor is now a dependency
|
11
|
+
* Removed MerbScriptHelper - simplified loading bundled gems - see merb.thor
|
12
|
+
* Bug Fix: Cookie headers not being formatted correctly
|
13
|
+
* Added request.session.clear! method to clear and destroy the session (including the _session_id cookie itself)
|
14
|
+
* Both memcache-client and memcached gems are supported by the session store
|
15
|
+
* Added better query param parsing (naive but adequate) for nested params
|
16
|
+
* Added specs to make sure blank cookie options aren't used for Set-Cookie
|
17
|
+
* Fixed cookie issues in WebKit/Safari browsers
|
18
|
+
* Log ControllerExceptions with error level and only ServerErrors with info.
|
19
|
+
* Modified absolute_url to handle an object as well as a Hash
|
20
|
+
* Touches to new sessions: doc and minor code improvements.
|
21
|
+
* More meaningful exception message when no session container is configured.
|
22
|
+
* Make it clear how session mixin makes it's way into controller.
|
23
|
+
* Leave a note where new sessions doc needs to be improved.
|
24
|
+
* Fix smart formatting.
|
25
|
+
* Give smart people proper credit when you use their work.
|
26
|
+
* Loosen extlib dependency a bit.
|
27
|
+
* Meaningful message when Memcached session store can't be loaded because of load error.
|
28
|
+
* Remove libxml-ruby and memcache-client dev dependencies.
|
29
|
+
* Require memcached gem where memcached session store is defined (it's lazy loaded).
|
30
|
+
* Meaninful message when have_xpath matcher is used but libxml-ruby fails to load.
|
31
|
+
* Don't blow up when there are no system paths.
|
32
|
+
|
33
|
+
== 0.9.6 "Therapy session" 2008-09-08
|
34
|
+
|
35
|
+
* Merge in simple conditional get support at controller level.
|
36
|
+
* Merged in new bundling (aka freezer) branch
|
37
|
+
* Merged in new-sessions branch
|
38
|
+
* Simplify one more clever line.
|
39
|
+
* Trenary operator is always hard to read.
|
40
|
+
* Added PUBLIC_CHANGELOG note on Language::English::Inflector => English::Inflect
|
41
|
+
* Filters with procs created via class methods have identical signatures regardless if they handle content differently or not. So modified add_filter to just append procs to the filter list.
|
42
|
+
* Consolidating raw Rakefile commands to merb-core/tasks/merb_rake_helper.rb
|
43
|
+
* Update contributors list.
|
44
|
+
* Ticket #461 - This simply adds output for what host and port the adapter has started on.
|
45
|
+
* More Language::English::Inflect to English::Inflect changes - getting ready for Extlib move soon
|
46
|
+
* Language::English::Inflect => English::Inflect name changes
|
47
|
+
* Use frozen strings where possible.
|
48
|
+
* First pass at adding in CSRF protection in to Rack middleware.
|
49
|
+
* Query string of the format "foo=bar&foo=baz" should return params {"foo" => "baz"}
|
50
|
+
* Fixed multiple select not honored in params bug
|
51
|
+
* Public specs for 'fragment' changes in url.
|
52
|
+
* AbstractController now uniformly uses instance_eval for Procs where previously
|
53
|
+
* Renamed anchor to fragment along with some minor tweeks to follow rfc2396 better.
|
54
|
+
* Add support for :anchor when generating url's. Ex. url(:root, :anchor => :lower_half).
|
55
|
+
* Revert "Make Merb::Request#protocol return valid protocol names (http, not http://)."
|
56
|
+
* Adds specs for previous commit
|
57
|
+
* Fixes display @object, :template => "path/to/foo"
|
58
|
+
* Clean up Rakefile.
|
59
|
+
* Remove a line of extra code
|
60
|
+
* Set cookie expires to nil when session_expiry is set to 0.
|
61
|
+
* ConditionalGet refactoring.
|
62
|
+
* Fix: ConditionalGet should not return the message body when the status code is 304.
|
63
|
+
* Rescue Exception subclasses, not only StandardError subclasses.
|
64
|
+
* Make Merb::Request#protocol return valid protocol names (http, not http://).
|
65
|
+
* Add :protocol and :host options to absolute_url
|
66
|
+
* extends basic authentication a bit to allow usage outside of before filters
|
67
|
+
|
1
68
|
== 0.9.5 "Knife and Spoons" 2008-26-08
|
2
69
|
* Add Hpricot to dependencies: provided RSpec matchers depend on it.
|
3
70
|
* Documentation fixes
|
data/CONTRIBUTORS
CHANGED
data/PUBLIC_CHANGELOG
CHANGED
@@ -1,3 +1,37 @@
|
|
1
|
+
9/13/2008:
|
2
|
+
* Merb apps will always give priority to gems that are available locally in
|
3
|
+
Merb.root / gems. Because of the specific load order, you will need to use
|
4
|
+
bin/merb to load merb-core from local gems, as detailed below. This is also
|
5
|
+
the case for bin/merb-gen, bin/rake and bin/spec for example. The added
|
6
|
+
advantage is that your app will be completely independent from system gems.
|
7
|
+
|
8
|
+
* Thor tasks 'merb.thor' have been added for newly generated apps; regenerate
|
9
|
+
your app to get them; alternatively these are available on merbivore.com:
|
10
|
+
|
11
|
+
http://merbivore.com/merb.thor
|
12
|
+
|
13
|
+
* Release 0.9.6 introduced 'merb-gen scripts' which added script/merb and
|
14
|
+
script/merb-gen. However, now that merb.thor provides tasks to manage
|
15
|
+
bundled gems, we can directly extract the correct executables. To follow the
|
16
|
+
standard convention, these will be installed in ./bin instead of ./script.
|
17
|
+
|
18
|
+
With merb.thor installed, run the following to get started:
|
19
|
+
|
20
|
+
$ thor merb:tasks:setup # adds bin/thor, bin/rake etc.
|
21
|
+
|
22
|
+
As soon as you install other gems using merb.thor you'll have the required
|
23
|
+
bin executables available; these are setup so that running them will load
|
24
|
+
merb-core from the local gems dir, not from the system-wide rubygems.
|
25
|
+
|
26
|
+
To get bin/merb and bin/merb-gen for a fresh application, you can use:
|
27
|
+
|
28
|
+
$ thor merb:stable -a mongrel # install a full merb stack from stable rubygems
|
29
|
+
|
30
|
+
Alternatively, you can install from the bleeding edge:
|
31
|
+
|
32
|
+
$ thor merb:edge --install # install a full merb stack from github
|
33
|
+
$ thor merb:gems:install mongrel # or ebb, thin...
|
34
|
+
|
1
35
|
9/5/2008:
|
2
36
|
* Language::English::Inflector is now English::Inflect - be sure to change your
|
3
37
|
custom inflections in config/init.rb. Additionally, the merb-gen template
|
data/Rakefile
CHANGED
@@ -58,16 +58,19 @@ spec = Gem::Specification.new do |s|
|
|
58
58
|
s.extra_rdoc_files = %w( README LICENSE TODO )
|
59
59
|
|
60
60
|
# Dependencies
|
61
|
-
s.add_dependency "extlib", ">= 0.9.
|
61
|
+
s.add_dependency "extlib", ">= 0.9.6"
|
62
62
|
s.add_dependency "erubis"
|
63
63
|
s.add_dependency "rake"
|
64
64
|
s.add_dependency "json_pure"
|
65
65
|
s.add_dependency "rspec"
|
66
66
|
s.add_dependency "rack"
|
67
67
|
s.add_dependency "mime-types"
|
68
|
-
s.add_dependency "hpricot"
|
69
|
-
s.
|
70
|
-
|
68
|
+
s.add_dependency "hpricot"
|
69
|
+
s.add_dependency "thor", ">= 0.9.6"
|
70
|
+
# this escalates to "regular" dependencies, comment it out
|
71
|
+
# for now. RubyGems need some love.
|
72
|
+
#s.add_development_dependency "libxml-ruby"
|
73
|
+
#s.add_development_dependency "memcache-client"
|
71
74
|
# Requirements
|
72
75
|
s.requirements << "install the json gem to get faster json parsing"
|
73
76
|
s.required_ruby_version = ">= 1.8.6"
|
data/bin/merb
CHANGED
@@ -1,36 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
# Try to use minigems instead of the fully rubygems library
|
6
|
-
begin
|
7
|
-
require 'minigems'
|
8
|
-
rescue LoadError
|
9
|
-
require 'rubygems'
|
10
|
-
end
|
11
|
-
|
12
|
-
# Load script helpers if available - either local or system-wide.
|
13
|
-
begin
|
14
|
-
# Figure out the merb root - defaults to the current directory.
|
15
|
-
root_key = %w[-m --merb-root].detect { |o| ARGV.index(o) }
|
16
|
-
root = ARGV[ARGV.index(root_key) + 1] if root_key
|
17
|
-
__DIR__ = root.to_a.empty? ? Dir.getwd : root
|
18
|
-
|
19
|
-
# Piggyback on the merb-core rubygem for initial setup scripts.
|
20
|
-
# Requiring it doesn't affect the local gem version of merb-core
|
21
|
-
# we might effectively want to load here after.
|
22
|
-
if merb_core_dir = Dir[File.join(__DIR__, 'gems', 'gems', 'merb-core-*')].last
|
23
|
-
require File.join(merb_core_dir, 'lib', 'merb-core', 'script')
|
24
|
-
else
|
25
|
-
require 'merb-core/script'
|
26
|
-
end
|
27
|
-
# Now setup local gems to be incorporated into the normal loaded gems.
|
28
|
-
# Unless the option --no-bundle is given, bundled gems are enabled.
|
29
|
-
include Merb::ScriptHelpers
|
30
|
-
setup_local_gems!(__DIR__)
|
31
|
-
rescue LoadError
|
32
|
-
end
|
33
|
-
|
3
|
+
require 'rubygems'
|
34
4
|
require 'merb-core'
|
35
5
|
|
36
6
|
ARGV.push '-H' if ARGV[0] && ARGV[0] =~ /^[^-]/
|
data/lib/merb-core.rb
CHANGED
@@ -1,6 +1,21 @@
|
|
1
1
|
#---
|
2
2
|
# require 'merb' must happen after Merb::Config is instantiated
|
3
3
|
require 'rubygems'
|
4
|
+
|
5
|
+
# Add the local gems dir if found within the app root; any dependencies loaded
|
6
|
+
# hereafter will try to load from the local gems before loading system gems.
|
7
|
+
root_key = %w[-m --merb-root].detect { |o| ARGV.index(o) }
|
8
|
+
root = ARGV[ARGV.index(root_key) + 1] if root_key
|
9
|
+
root = root.to_a.empty? ? Dir.getwd : root
|
10
|
+
if File.directory?(gems_dir = File.join(root, 'gems'))
|
11
|
+
$BUNDLE = true; Gem.clear_paths; Gem.path.unshift(gems_dir)
|
12
|
+
# Warn if local merb-core is available but not loaded.
|
13
|
+
if !($0 =~ /^(\.\/)?bin\/merb$/) &&
|
14
|
+
(local_mc = Dir[File.join(gems_dir, 'specifications', 'merb-core-*.gemspec')].last)
|
15
|
+
puts "Warning: please use bin/merb to load #{File.basename(local_mc, '.gemspec')} from ./gems"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
4
19
|
require 'set'
|
5
20
|
require 'fileutils'
|
6
21
|
require 'socket'
|
@@ -356,12 +371,8 @@ module Merb
|
|
356
371
|
|
357
372
|
Merb.klass_hashes = []
|
358
373
|
|
359
|
-
attr_accessor :frozen
|
360
|
-
|
361
374
|
# ==== Returns
|
362
375
|
# Boolean:: True if Merb is running as an application with bundled gems.
|
363
|
-
# Can only be disabled by --no-bundle option on startup (or for Rakefile
|
364
|
-
# use NO_BUNDLE=true to disable local gems).
|
365
376
|
#
|
366
377
|
# ==== Notes
|
367
378
|
# Bundling required gems makes your application independent from the
|
@@ -369,7 +380,7 @@ module Merb
|
|
369
380
|
# framework and gems it uses and very useful when application is run in
|
370
381
|
# some sort of sandbox, for instance, shared hosting with preconfigured gems.
|
371
382
|
def bundled?
|
372
|
-
|
383
|
+
$BUNDLE || ENV.key?("BUNDLE")
|
373
384
|
end
|
374
385
|
|
375
386
|
# Load configuration and assign logger.
|
@@ -577,4 +588,4 @@ require 'merb-core/version'
|
|
577
588
|
require 'merb-core/controller/mime'
|
578
589
|
|
579
590
|
# Set the environment if it hasn't already been set.
|
580
|
-
Merb.environment ||= ENV['MERB_ENV'] || Merb::Config[:environment] || (Merb.testing? ? 'test' : 'development')
|
591
|
+
Merb.environment ||= ENV['MERB_ENV'] || Merb::Config[:environment] || (Merb.testing? ? 'test' : 'development')
|
data/lib/merb-core/config.rb
CHANGED
@@ -116,9 +116,6 @@ module Merb
|
|
116
116
|
# Environment variables always win
|
117
117
|
options[:environment] = ENV["MERB_ENV"] if ENV["MERB_ENV"]
|
118
118
|
|
119
|
-
# Enable bundled gems by default; used by bundled?
|
120
|
-
options[:bundle] = true
|
121
|
-
|
122
119
|
# Build a parser for the command line arguments
|
123
120
|
opts = OptionParser.new do |opts|
|
124
121
|
opts.version = Merb::VERSION
|
@@ -242,10 +239,6 @@ module Merb
|
|
242
239
|
options[:verbose] = true
|
243
240
|
end
|
244
241
|
|
245
|
-
opts.on("-B", "--[no-]bundle", "Run application using bundled gems. Enabled by default.") do |b|
|
246
|
-
options[:bundle] = b
|
247
|
-
end
|
248
|
-
|
249
242
|
opts.on("-?", "-H", "--help", "Show this help message") do
|
250
243
|
puts opts
|
251
244
|
exit
|
@@ -461,11 +461,14 @@ class Merb::AbstractController
|
|
461
461
|
def absolute_url(name, rparams={})
|
462
462
|
# FIXME: arrgh, why request.protocol returns http://?
|
463
463
|
# :// is not part of protocol name
|
464
|
-
|
465
|
-
|
464
|
+
if rparams.is_a?(Hash)
|
465
|
+
protocol = rparams.delete(:protocol)
|
466
|
+
protocol << "://" if protocol
|
467
|
+
host = rparams.delete(:host)
|
468
|
+
end
|
466
469
|
|
467
470
|
(protocol || request.protocol) +
|
468
|
-
(
|
471
|
+
(host || request.host) +
|
469
472
|
url(name, rparams)
|
470
473
|
end
|
471
474
|
|
@@ -2,9 +2,9 @@ module Merb
|
|
2
2
|
|
3
3
|
class Cookies < Mash
|
4
4
|
|
5
|
-
def initialize(constructor = {}
|
6
|
-
@_options_lookup
|
7
|
-
@_cookie_defaults =
|
5
|
+
def initialize(constructor = {})
|
6
|
+
@_options_lookup = Mash.new
|
7
|
+
@_cookie_defaults = { "domain" => Merb::Controller._default_cookie_domain, "path" => '/' }
|
8
8
|
super constructor
|
9
9
|
end
|
10
10
|
|
@@ -50,7 +50,7 @@ module Merb
|
|
50
50
|
# name<~to_s>:: Name of the cookie to delete.
|
51
51
|
# options<Hash>:: Additional options to pass to +set_cookie+.
|
52
52
|
def delete(name, options = {})
|
53
|
-
set_cookie(name, "", options.merge(
|
53
|
+
set_cookie(name, "", options.merge("expires" => Time.at(0)))
|
54
54
|
end
|
55
55
|
|
56
56
|
# Generate any necessary headers.
|
@@ -64,12 +64,13 @@ module Merb
|
|
64
64
|
# Only set cookies that marked for inclusion in the response header.
|
65
65
|
next unless @_options_lookup[name]
|
66
66
|
options = defaults.merge(@_options_lookup[name])
|
67
|
-
if (expiry = options[
|
68
|
-
options[
|
67
|
+
if (expiry = options["expires"]).respond_to?(:gmtime)
|
68
|
+
options["expires"] = expiry.gmtime.strftime(Merb::Const::COOKIE_EXPIRATION_FORMAT)
|
69
69
|
end
|
70
|
-
secure = options.delete(
|
70
|
+
secure = options.delete("secure")
|
71
71
|
kookie = "#{name}=#{Merb::Request.escape(value)}; "
|
72
|
-
|
72
|
+
# WebKit in particular doens't like empty cookie options - skip them.
|
73
|
+
options.each { |k, v| kookie << "#{k}=#{v}; " unless v.blank? }
|
73
74
|
kookie << 'secure' if secure
|
74
75
|
cookies << kookie.rstrip
|
75
76
|
end
|
@@ -87,7 +88,7 @@ module Merb
|
|
87
88
|
|
88
89
|
# Add a callback to enable Set-Cookie headers
|
89
90
|
base._after_dispatch_callbacks << lambda do |c|
|
90
|
-
headers = c.request.cookies.extract_headers(
|
91
|
+
headers = c.request.cookies.extract_headers("domain" => c._default_cookie_domain)
|
91
92
|
c.headers.update(headers)
|
92
93
|
end
|
93
94
|
end
|
@@ -116,7 +117,7 @@ module Merb
|
|
116
117
|
def cookies
|
117
118
|
@cookies ||= begin
|
118
119
|
values = self.class.query_parse(@env[Merb::Const::HTTP_COOKIE], ';,')
|
119
|
-
cookies = Merb::Cookies.new(values
|
120
|
+
cookies = Merb::Cookies.new(values)
|
120
121
|
cookies.update(default_cookies) if respond_to?(:default_cookies)
|
121
122
|
cookies
|
122
123
|
end
|
@@ -139,12 +139,18 @@ module Merb
|
|
139
139
|
# Exceptions::
|
140
140
|
# The Merb::Controller that was dispatched to.
|
141
141
|
def dispatch_exception(exception)
|
142
|
-
|
142
|
+
if(exception.is_a?(Merb::ControllerExceptions::Base) &&
|
143
|
+
!exception.is_a?(Merb::ControllerExceptions::ServerError))
|
144
|
+
Merb.logger.info(Merb.exception(exception))
|
145
|
+
else
|
146
|
+
Merb.logger.error(Merb.exception(exception))
|
147
|
+
end
|
148
|
+
|
143
149
|
self.exceptions = [exception]
|
144
|
-
|
150
|
+
|
145
151
|
begin
|
146
152
|
e = exceptions.first
|
147
|
-
|
153
|
+
|
148
154
|
if action_name = e.action_name
|
149
155
|
dispatch_action(Exceptions, action_name, e.class.status)
|
150
156
|
else
|
@@ -156,11 +162,11 @@ module Merb
|
|
156
162
|
else
|
157
163
|
Merb.logger.error("Dispatching #{e.class} raised another error.")
|
158
164
|
Merb.logger.error(Merb.exception(dispatch_issue))
|
159
|
-
|
165
|
+
|
160
166
|
exceptions.unshift dispatch_issue
|
161
167
|
retry
|
162
168
|
end
|
163
169
|
end
|
164
170
|
end
|
165
171
|
end
|
166
|
-
end
|
172
|
+
end
|
@@ -652,9 +652,14 @@ module Merb
|
|
652
652
|
parms[key] = val
|
653
653
|
elsif after == "[]"
|
654
654
|
(parms[key] ||= []) << val
|
655
|
-
elsif after =~ %r(^\[\])
|
655
|
+
elsif after =~ %r(^\[\]\[([^\[\]]+)\]$)
|
656
|
+
child_key = $1
|
656
657
|
parms[key] ||= []
|
657
|
-
parms[key]
|
658
|
+
if parms[key].last.is_a?(Hash) && !parms[key].last.key?(child_key)
|
659
|
+
parms[key].last.update(child_key => val)
|
660
|
+
else
|
661
|
+
parms[key] << { child_key => val }
|
662
|
+
end
|
658
663
|
else
|
659
664
|
parms[key] ||= {}
|
660
665
|
parms[key] = normalize_params(parms[key], after, val)
|
@@ -2,10 +2,10 @@ require 'merb-core/dispatch/session/container'
|
|
2
2
|
require 'merb-core/dispatch/session/store_container'
|
3
3
|
|
4
4
|
module Merb
|
5
|
-
|
6
5
|
class Config
|
7
|
-
|
8
|
-
#
|
6
|
+
# Returns stores list constructed from
|
7
|
+
# configured session stores (:session_stores config option)
|
8
|
+
# or default one (:session_store config option).
|
9
9
|
def self.session_stores
|
10
10
|
@session_stores ||= begin
|
11
11
|
config_stores = Array(
|
@@ -14,16 +14,20 @@ module Merb
|
|
14
14
|
config_stores.map { |name| name.to_sym }
|
15
15
|
end
|
16
16
|
end
|
17
|
-
|
18
|
-
end
|
17
|
+
end # Config
|
19
18
|
|
20
19
|
# The Merb::Session module gets mixed into Merb::SessionContainer to allow
|
21
|
-
# app-level functionality (usually found in app/models/merb/session.rb)
|
20
|
+
# app-level functionality (usually found in app/models/merb/session.rb) for
|
21
|
+
# session.
|
22
|
+
#
|
23
|
+
# You can use this module to implement additional methods to simplify
|
24
|
+
# building wizard-like application components,
|
25
|
+
# authentication frameworks, etc.
|
22
26
|
module Session
|
23
27
|
end
|
24
28
|
|
29
|
+
# This is mixed into Merb::Controller on framework boot.
|
25
30
|
module SessionMixin
|
26
|
-
|
27
31
|
# Raised when no suitable session store has been setup.
|
28
32
|
class NoSessionContainer < StandardError; end
|
29
33
|
|
@@ -42,7 +46,6 @@ module Merb
|
|
42
46
|
# session data; min. 16 chars
|
43
47
|
#
|
44
48
|
# :default_cookie_domain The default domain to write cookies for.
|
45
|
-
|
46
49
|
def self.included(base)
|
47
50
|
# Register a callback to finalize sessions - needs to run before the cookie
|
48
51
|
# callback extracts Set-Cookie headers from request.cookies.
|
@@ -54,7 +57,9 @@ module Merb
|
|
54
57
|
#
|
55
58
|
# ==== Returns
|
56
59
|
# SessionContainer:: The session that was extracted from the request object.
|
57
|
-
def session(session_store = nil)
|
60
|
+
def session(session_store = nil)
|
61
|
+
request.session(session_store)
|
62
|
+
end
|
58
63
|
|
59
64
|
# Module methods
|
60
65
|
|
@@ -125,6 +130,9 @@ module Merb
|
|
125
130
|
@session_stores ||= {}
|
126
131
|
end
|
127
132
|
|
133
|
+
# Returns session container. Merb is able to handle multiple session
|
134
|
+
# stores, hence a parameter to pick it.
|
135
|
+
#
|
128
136
|
# ==== Parameters
|
129
137
|
# session_store<String>:: The type of session store to access,
|
130
138
|
# defaults to default_session_store.
|
@@ -137,12 +145,13 @@ module Merb
|
|
137
145
|
if class_name = self.class.registered_session_types[session_store]
|
138
146
|
session_stores[session_store] ||= Object.full_const_get(class_name).setup(self)
|
139
147
|
elsif fallback = self.class.registered_session_types.keys.first
|
140
|
-
Merb.logger.warn "Session store
|
141
|
-
Merb.logger.warn "
|
148
|
+
Merb.logger.warn "Session store '#{session_store}' not found. Check your configuration in init file."
|
149
|
+
Merb.logger.warn "Falling back to #{fallback} session store."
|
142
150
|
session(fallback)
|
143
151
|
else
|
144
|
-
|
145
|
-
|
152
|
+
msg = "No session store set. Set it in init file like this: c[:session_store] = 'activerecord'"
|
153
|
+
Merb.logger.error!(msg)
|
154
|
+
raise NoSessionContainer, msg
|
146
155
|
end
|
147
156
|
end
|
148
157
|
|
@@ -184,12 +193,13 @@ module Merb
|
|
184
193
|
defaults
|
185
194
|
end
|
186
195
|
|
196
|
+
# Sets session cookie value.
|
197
|
+
#
|
187
198
|
# ==== Parameters
|
188
199
|
# value<String>:: The value of the session cookie; either the session id or the actual encoded data.
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
cookies.set_cookie(_session_id_key, value, options)
|
200
|
+
# options<Hash>:: Cookie options like domain, path and expired.
|
201
|
+
def set_session_cookie_value(value, options = {})
|
202
|
+
cookies.set_cookie(_session_id_key, value, { :expires => Time.now + _session_expiry }.merge(options))
|
193
203
|
end
|
194
204
|
alias :set_session_id_cookie :set_session_cookie_value
|
195
205
|
|
@@ -199,6 +209,12 @@ module Merb
|
|
199
209
|
cookies[_session_id_key]
|
200
210
|
end
|
201
211
|
alias :session_id :session_cookie_value
|
212
|
+
|
213
|
+
# Destroy the session cookie.
|
214
|
+
def destroy_session_cookie
|
215
|
+
cookies.delete(_session_id_key)
|
216
|
+
end
|
217
|
+
|
202
218
|
end
|
203
219
|
end
|
204
220
|
end
|