ramaze 0.3.5 → 0.3.9

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.
Files changed (204) hide show
  1. data/Rakefile +5 -20
  2. data/bin/ramaze +0 -4
  3. data/doc/AUTHORS +5 -0
  4. data/doc/meta/announcement.txt +2 -1
  5. data/doc/tutorial/todolist.html +20 -21
  6. data/doc/tutorial/todolist.mkd +10 -9
  7. data/examples/blog/{src/controller.rb → controller/main.rb} +2 -0
  8. data/examples/blog/{src/model.rb → model/entry.rb} +0 -0
  9. data/examples/blog/spec/blog.rb +3 -3
  10. data/examples/blog/start.rb +2 -3
  11. data/examples/blog/view/edit.xhtml +17 -0
  12. data/examples/blog/view/index.xhtml +17 -0
  13. data/examples/blog/view/layout.xhtml +11 -0
  14. data/examples/blog/view/new.xhtml +16 -0
  15. data/examples/facebook.rb +15 -8
  16. data/examples/identity.rb +1 -1
  17. data/examples/memleak_detector.rb +1 -1
  18. data/examples/rammit/src/model.rb +1 -1
  19. data/examples/rapaste/controller/paste.rb +7 -7
  20. data/examples/rapaste/model/paste.rb +1 -3
  21. data/examples/rapaste/public/css/display.css +2 -1
  22. data/examples/rapaste/start.rb +2 -3
  23. data/examples/sourceview/sourceview.rb +1 -1
  24. data/examples/templates/template/external.tenjin +28 -0
  25. data/examples/templates/template_amrita2.rb +0 -3
  26. data/examples/templates/template_tenjin.rb +57 -0
  27. data/examples/todolist/spec/todolist.rb +13 -2
  28. data/examples/todolist/src/controller/main.rb +1 -1
  29. data/examples/todolist/template/index.xhtml +1 -1
  30. data/examples/wiktacular/spec/wiktacular.rb +18 -0
  31. data/examples/wiktacular/src/controller.rb +2 -2
  32. data/examples/wiktacular/src/model.rb +8 -2
  33. data/lib/proto/public/css/ramaze_error.css +4 -0
  34. data/lib/proto/public/dispatch.fcgi +11 -0
  35. data/lib/proto/spec/main.rb +1 -1
  36. data/lib/proto/start.ru +8 -0
  37. data/lib/proto/view/error.xhtml +2 -0
  38. data/lib/ramaze.rb +28 -5
  39. data/lib/ramaze/action.rb +9 -2
  40. data/lib/ramaze/action/render.rb +40 -24
  41. data/lib/ramaze/adapter.rb +10 -17
  42. data/lib/ramaze/adapter/base.rb +8 -12
  43. data/lib/ramaze/adapter/cgi.rb +14 -13
  44. data/lib/ramaze/adapter/ebb.rb +34 -0
  45. data/lib/ramaze/adapter/evented_mongrel.rb +1 -1
  46. data/lib/ramaze/adapter/fcgi.rb +14 -14
  47. data/lib/ramaze/adapter/lsws.rb +15 -11
  48. data/lib/ramaze/adapter/mongrel.rb +2 -1
  49. data/lib/ramaze/adapter/scgi.rb +24 -0
  50. data/lib/ramaze/adapter/swiftiplied_mongrel.rb +1 -1
  51. data/lib/ramaze/adapter/thin.rb +4 -5
  52. data/lib/ramaze/adapter/webrick.rb +5 -5
  53. data/lib/ramaze/cache.rb +1 -1
  54. data/lib/ramaze/cache/memcached.rb +1 -1
  55. data/lib/ramaze/contrib.rb +70 -10
  56. data/lib/ramaze/contrib/auto_params.rb +1 -1
  57. data/lib/ramaze/contrib/email.rb +15 -15
  58. data/lib/ramaze/contrib/facebook.rb +2 -2
  59. data/lib/ramaze/contrib/facebook/facebook.rb +7 -4
  60. data/lib/ramaze/contrib/file_cache.rb +65 -0
  61. data/lib/ramaze/contrib/gettext.rb +56 -55
  62. data/lib/ramaze/contrib/profiling.rb +36 -0
  63. data/lib/ramaze/contrib/sequel_cache.rb +92 -0
  64. data/lib/ramaze/controller.rb +80 -47
  65. data/lib/ramaze/controller/error.rb +10 -5
  66. data/lib/ramaze/controller/resolve.rb +36 -48
  67. data/lib/ramaze/current.rb +70 -0
  68. data/lib/ramaze/{trinity → current}/request.rb +62 -15
  69. data/lib/ramaze/current/response.rb +19 -0
  70. data/lib/ramaze/{trinity → current}/session.rb +32 -110
  71. data/lib/ramaze/current/session/flash.rb +67 -0
  72. data/lib/ramaze/current/session/hash.rb +65 -0
  73. data/lib/ramaze/dispatcher.rb +1 -28
  74. data/lib/ramaze/dispatcher/action.rb +6 -3
  75. data/lib/ramaze/dispatcher/directory.rb +1 -1
  76. data/lib/ramaze/dispatcher/error.rb +26 -5
  77. data/lib/ramaze/dispatcher/file.rb +13 -2
  78. data/lib/ramaze/gestalt.rb +3 -1
  79. data/lib/ramaze/global.rb +6 -3
  80. data/lib/ramaze/global/globalstruct.rb +3 -1
  81. data/lib/ramaze/helper.rb +66 -20
  82. data/lib/ramaze/helper/aspect.rb +25 -17
  83. data/lib/ramaze/helper/auth.rb +4 -3
  84. data/lib/ramaze/helper/cache.rb +5 -4
  85. data/lib/ramaze/helper/cgi.rb +11 -9
  86. data/lib/ramaze/helper/flash.rb +28 -3
  87. data/lib/ramaze/helper/formatting.rb +1 -3
  88. data/lib/ramaze/helper/identity.rb +2 -3
  89. data/lib/ramaze/helper/inform.rb +7 -6
  90. data/lib/ramaze/helper/link.rb +15 -17
  91. data/lib/ramaze/helper/markaby.rb +2 -4
  92. data/lib/ramaze/helper/maruku.rb +1 -1
  93. data/lib/ramaze/helper/nitroform.rb +4 -4
  94. data/lib/ramaze/helper/pager.rb +4 -6
  95. data/lib/ramaze/helper/partial.rb +24 -21
  96. data/lib/ramaze/helper/redirect.rb +8 -5
  97. data/lib/ramaze/helper/{file.rb → sendfile.rb} +1 -3
  98. data/lib/ramaze/helper/sequel.rb +1 -3
  99. data/lib/ramaze/helper/stack.rb +1 -3
  100. data/lib/ramaze/helper/tagz.rb +19 -0
  101. data/lib/ramaze/helper/user.rb +63 -0
  102. data/lib/ramaze/inform.rb +2 -24
  103. data/lib/ramaze/log.rb +28 -0
  104. data/lib/ramaze/{inform → log}/analogger.rb +3 -3
  105. data/lib/ramaze/{inform → log}/growl.rb +2 -2
  106. data/lib/ramaze/{inform → log}/hub.rb +4 -6
  107. data/lib/ramaze/{inform → log}/informer.rb +4 -4
  108. data/lib/ramaze/{inform → log}/knotify.rb +2 -2
  109. data/lib/ramaze/log/logger.rb +22 -0
  110. data/lib/ramaze/{inform/informing.rb → log/logging.rb} +16 -16
  111. data/lib/ramaze/{inform → log}/syslog.rb +0 -0
  112. data/lib/ramaze/{inform → log}/xosd.rb +2 -2
  113. data/lib/ramaze/route.rb +64 -36
  114. data/lib/ramaze/snippets/array/put_within.rb +13 -0
  115. data/lib/ramaze/snippets/binding/locals.rb +13 -0
  116. data/lib/ramaze/snippets/kernel/__dir__.rb +10 -8
  117. data/lib/ramaze/snippets/kernel/aquire.rb +1 -1
  118. data/lib/ramaze/snippets/kernel/constant.rb +1 -1
  119. data/lib/ramaze/snippets/object/pretty.rb +6 -0
  120. data/lib/ramaze/snippets/object/scope.rb +11 -0
  121. data/lib/ramaze/snippets/object/thread_accessor.rb +5 -0
  122. data/lib/ramaze/snippets/ordered_set.rb +1 -1
  123. data/lib/ramaze/snippets/proc/locals.rb +11 -0
  124. data/lib/ramaze/snippets/ramaze/thread_accessor.rb +44 -0
  125. data/lib/ramaze/snippets/string/esc.rb +29 -0
  126. data/lib/ramaze/snippets/string/start_with.rb +7 -0
  127. data/lib/ramaze/snippets/string/unindent.rb +6 -1
  128. data/lib/ramaze/snippets/struct/values_at.rb +1 -5
  129. data/lib/ramaze/sourcereload.rb +16 -14
  130. data/lib/ramaze/spec.rb +1 -0
  131. data/lib/ramaze/spec/helper.rb +11 -3
  132. data/lib/ramaze/spec/helper/browser.rb +25 -1
  133. data/lib/ramaze/spec/helper/pretty_output.rb +11 -11
  134. data/lib/ramaze/template.rb +5 -4
  135. data/lib/ramaze/template/amrita2.rb +2 -3
  136. data/lib/ramaze/template/ezamar/element.rb +2 -3
  137. data/lib/ramaze/template/ezamar/morpher.rb +1 -2
  138. data/lib/ramaze/template/ezamar/render_partial.rb +1 -1
  139. data/lib/ramaze/template/haml.rb +5 -2
  140. data/lib/ramaze/template/markaby.rb +2 -0
  141. data/lib/ramaze/template/tagz.rb +79 -0
  142. data/lib/ramaze/template/tenjin.rb +34 -0
  143. data/lib/ramaze/tool/create.rb +0 -3
  144. data/lib/ramaze/tool/localize.rb +107 -105
  145. data/lib/ramaze/tool/mime.rb +0 -2
  146. data/lib/ramaze/trinity.rb +1 -26
  147. data/lib/ramaze/version.rb +1 -1
  148. data/lib/vendor/bacon.rb +47 -41
  149. data/rake_tasks/conf.rake +18 -0
  150. data/rake_tasks/darcs.rake +5 -0
  151. data/rake_tasks/maintenance.rake +37 -24
  152. data/rake_tasks/spec.rake +1 -1
  153. data/spec/contrib/auto_params.rb +3 -1
  154. data/spec/contrib/profiling.rb +26 -0
  155. data/spec/examples/templates/template_redcloth.rb +1 -1
  156. data/spec/examples/templates/template_tenjin.rb +28 -0
  157. data/spec/helper.rb +0 -1
  158. data/spec/ramaze/action/layout.rb +28 -0
  159. data/spec/ramaze/controller/actionless_templates.rb +32 -0
  160. data/spec/ramaze/controller/template/other_wrapper.xhtml +1 -0
  161. data/spec/ramaze/controller/template_resolving.rb +37 -0
  162. data/spec/ramaze/{trinity → current}/request.rb +12 -2
  163. data/spec/ramaze/current/session.rb +97 -0
  164. data/spec/ramaze/dispatcher/directory.rb +2 -1
  165. data/spec/ramaze/dispatcher/file.rb +8 -3
  166. data/spec/ramaze/dispatcher/public/file name.txt +1 -0
  167. data/spec/ramaze/gestalt.rb +11 -0
  168. data/spec/ramaze/helper/aspect.rb +28 -22
  169. data/spec/ramaze/helper/cgi.rb +2 -2
  170. data/spec/ramaze/helper/flash.rb +33 -15
  171. data/spec/ramaze/helper/formatting.rb +2 -2
  172. data/spec/ramaze/helper/link.rb +46 -18
  173. data/spec/ramaze/helper/pager.rb +8 -5
  174. data/spec/ramaze/helper/partial.rb +8 -1
  175. data/spec/ramaze/helper/template/recursive_local_ivars.xhtml +7 -0
  176. data/spec/ramaze/helper/user.rb +46 -0
  177. data/spec/ramaze/{inform → log}/informer.rb +0 -0
  178. data/spec/ramaze/{inform → log}/syslog.rb +1 -1
  179. data/spec/ramaze/request.rb +14 -10
  180. data/spec/ramaze/route.rb +23 -0
  181. data/spec/ramaze/template.rb +48 -1
  182. data/spec/ramaze/template/haml.rb +6 -16
  183. data/spec/ramaze/template/haml/locals.haml +2 -1
  184. data/spec/ramaze/template/tagz.rb +62 -0
  185. data/spec/ramaze/template/tagz/external.tagz +8 -0
  186. data/spec/ramaze/template/tagz/sum.tagz +1 -0
  187. data/spec/ramaze/template/tenjin.rb +49 -0
  188. data/spec/ramaze/template/tenjin/external.tenjin +1 -0
  189. data/spec/snippets/string/unindent.rb +15 -0
  190. metadata +509 -475
  191. data/doc/README.html +0 -729
  192. data/doc/changes.txt +0 -5757
  193. data/doc/changes.xml +0 -5759
  194. data/examples/blog/src/view.rb +0 -16
  195. data/examples/blog/template/edit.xhtml +0 -19
  196. data/examples/blog/template/index.xhtml +0 -19
  197. data/examples/blog/template/new.xhtml +0 -18
  198. data/examples/wiktacular/mkd/newpagename/current.mkd +0 -1
  199. data/examples/wiktacular/mkd/newpagename/current.mkd.bak +0 -1
  200. data/lib/ramaze/contrib/email.rb-darcs-backup0 +0 -81
  201. data/lib/ramaze/template/bijou.rb +0 -39
  202. data/lib/ramaze/trinity/response.rb +0 -32
  203. data/spec/ramaze/template/bijou.rb +0 -25
  204. data/spec/ramaze/trinity/session.rb +0 -29
@@ -0,0 +1,70 @@
1
+ require 'ramaze/current/request'
2
+ require 'ramaze/current/response'
3
+ require 'ramaze/current/session'
4
+
5
+ module Ramaze
6
+ module Current
7
+ class << self
8
+ include Trinity
9
+
10
+ def call(env)
11
+ setup(env)
12
+ before_call
13
+
14
+ if filter = Global.record
15
+ request = Current.request
16
+ Record << request if filter[request]
17
+ end
18
+
19
+ Dispatcher.handle
20
+
21
+ finish
22
+ ensure
23
+ after_call
24
+ end
25
+
26
+ def setup(env)
27
+ self.request = Request.new(env)
28
+ self.response = Response.new
29
+ self.session = Session.new
30
+ end
31
+
32
+ def finish
33
+ session.finish if session
34
+ response.finish
35
+ end
36
+
37
+ def before(&block)
38
+ @before = block if block
39
+ @before
40
+ end
41
+
42
+ def before_call
43
+ if before
44
+ begin
45
+ before.call
46
+ rescue Object => e
47
+ Ramaze::Log.error e
48
+ raise
49
+ end
50
+ end
51
+ end
52
+
53
+ def after(&block)
54
+ @after = block if block
55
+ @after
56
+ end
57
+
58
+ def after_call
59
+ if after
60
+ begin
61
+ after.call
62
+ rescue Object => e
63
+ Ramaze::Log.error e
64
+ raise
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -1,11 +1,6 @@
1
1
  # Copyright (c) 2008 Michael Fellinger m.fellinger@gmail.com
2
2
  # All files in this distribution are subject to the terms of the Ruby license.
3
3
 
4
- require 'cgi'
5
- require 'tmpdir'
6
- require 'digest/md5'
7
- require 'ipaddr'
8
- require 'rack'
9
4
  require 'rack/request'
10
5
 
11
6
  module Ramaze
@@ -20,9 +15,7 @@ module Ramaze
20
15
  #
21
16
  # You can call this from everywhere with Ramaze::Request.current
22
17
 
23
- def current
24
- Thread.current[:request]
25
- end
18
+ def current() Current.request end
26
19
  end
27
20
 
28
21
  # you can access the original @request via this method_missing,
@@ -48,7 +41,7 @@ module Ramaze
48
41
 
49
42
  ipv4 = %w[ 127.0.0.1/32 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8 169.254.0.0/16 ]
50
43
  ipv6 = %w[ fc00::/7 fe80::/10 fec0::/10 ::1 ]
51
- LOCAL = (ipv4 + ipv6).map{|a| IPAddr.new(a)}
44
+ LOCAL = (ipv4 + ipv6).map{|a| IPAddr.new(a)} unless defined?(LOCAL)
52
45
 
53
46
  # --
54
47
  # Mongrel somehow puts together multiple IPs when proxy is involved.
@@ -99,7 +92,7 @@ module Ramaze
99
92
  # # In your Controller:
100
93
  #
101
94
  # def paste
102
- # name, syntax = request.params['paste'].values_at('name', 'syntax')
95
+ # name, syntax = request['paste'].values_at('name', 'syntax')
103
96
  # paste = Paste.create_with(:name => name, :syntax => syntax)
104
97
  # redirect '/'
105
98
  # end
@@ -107,7 +100,7 @@ module Ramaze
107
100
  # # Or, easier:
108
101
  #
109
102
  # def paste
110
- # paste = Paste.create_with(request.params)
103
+ # paste = Paste.create_with(request['paste'])
111
104
  # redirect '/'
112
105
  # end
113
106
 
@@ -118,10 +111,20 @@ module Ramaze
118
111
  @ramaze_params = {}
119
112
 
120
113
  @rack_params.each do |key, value|
121
- outer_key, inner_key = key.scan(/^(.+)\[(.*?)\]$/).first
122
- if outer_key and inner_key
123
- @ramaze_params[outer_key] ||= {}
124
- @ramaze_params[outer_key][inner_key] = value
114
+ if key =~ /^(.*?)(\[.*\])/
115
+ prim, nested = $~.captures
116
+ ref = @ramaze_params
117
+
118
+ keys = nested.scan(/\[([^\]]+)\]/).flatten
119
+ keys.unshift prim
120
+
121
+ keys.each_with_index do |k, i|
122
+ if i + 1 >= keys.size
123
+ ref[k] = value
124
+ else
125
+ ref = ref[k] ||= {}
126
+ end
127
+ end
125
128
  else
126
129
  @ramaze_params[key] = value
127
130
  end
@@ -130,5 +133,49 @@ module Ramaze
130
133
  @ramaze_params
131
134
  end
132
135
  end
136
+
137
+ # Interesting HTTP variables from env
138
+
139
+ def http_vars
140
+ env.reject{ |k,v|
141
+ k.to_s !~ /USER|HOST|REQUEST|REMOTE|FORWARD|REFER|PATH|QUERY|VERSION|KEEP|CACHE/
142
+ }
143
+ end
144
+
145
+ def to_s
146
+ p, c, e = params.inspect, cookies.inspect, http_vars.inspect
147
+ %{#<Ramaze::Request params=#{p} cookies=#{c} env=#{e}>}
148
+ end
149
+ alias inspect to_s
150
+
151
+ def pretty_print pp
152
+ p, c, e = params, cookies, http_vars
153
+ pp.object_group(self){
154
+ { 'params' => params,
155
+ 'cookies' => cookies,
156
+ 'env' => http_vars }.each do |name, hash|
157
+ pp.breakable
158
+ pp.text " @#{name}="
159
+ pp.nest(name.length+3){ pp.pp_hash hash }
160
+ end
161
+ }
162
+ end
163
+
164
+ # Answers with a subset of request.params with only the key/value pairs for
165
+ # which you pass the keys.
166
+ # Valid keys are objects that respond to :to_s
167
+ #
168
+ # Example:
169
+ # request.params
170
+ # # => {'name' => 'jason', 'age' => '45', 'job' => 'lumberjack'}
171
+ # request.sub('name')
172
+ # # => {'name' => 'jason'}
173
+ # request.sub(:name, :job)
174
+ # # => {'name' => 'jason', 'job' => 'lumberjack'}
175
+
176
+ def subset(*keys)
177
+ keys = keys.map{|k| k.to_s }
178
+ params.reject{|k,v| not keys.include?(k) }
179
+ end
133
180
  end
134
181
  end
@@ -0,0 +1,19 @@
1
+ # Copyright (c) 2008 Michael Fellinger m.fellinger@gmail.com
2
+ # All files in this distribution are subject to the terms of the Ruby license.
3
+
4
+ module Ramaze
5
+ class Response < Rack::Response
6
+ class << self
7
+ def current() Current.response end
8
+ end
9
+
10
+ def build(body = body, status = status, header = header)
11
+ header.each do |key, value|
12
+ self[key] = value
13
+ end
14
+
15
+ self.body, self.status = body, status
16
+ self
17
+ end
18
+ end
19
+ end
@@ -7,39 +7,10 @@ else
7
7
  require 'digest/sha2'
8
8
  end
9
9
 
10
- module Ramaze
11
-
12
- # The SessionHash acts as the wrapper for a simple Hash
13
- #
14
- # Its purpose is to notify the underlying cache, in which the sessions
15
- # are stored, about updates.
16
-
17
- class SessionHash
18
-
19
- # Sets @hash to an empty Hash
20
-
21
- def initialize
22
- @hash = {}
23
- end
24
-
25
- # relays all the methods to the @hash and updates the session_cache in
26
- # Session.current.sessions if anything changes.
10
+ require 'ramaze/current/session/flash'
11
+ require 'ramaze/current/session/hash'
27
12
 
28
- def method_missing(*args, &block)
29
- old = @hash.dup
30
- result = @hash.send(*args, &block)
31
- unless old == @hash
32
- Cache.sessions[Session.current.session_id] = self
33
- end
34
- result
35
- end
36
-
37
- # Calls #inspect on the wrapped @hash
38
-
39
- def inspect
40
- @hash.inspect
41
- end
42
- end
13
+ module Ramaze
43
14
 
44
15
  # The purpose of Session is to hold key/value pairs like a Hash for a series
45
16
  # of # request/response cycles from the same client.
@@ -49,7 +20,6 @@ module Ramaze
49
20
  # deleted or expires.
50
21
 
51
22
  class Session
52
-
53
23
  # The unique id for the current session which is also passed on to the cookie.
54
24
 
55
25
  attr_accessor :session_id
@@ -58,13 +28,17 @@ module Ramaze
58
28
 
59
29
  attr_accessor :flash
60
30
 
31
+ # secret salt for client-side session data
32
+
33
+ trait :secret => 'change_me_please_123'
34
+
61
35
  # the key used for the cookie
62
36
 
63
37
  SESSION_KEY = '_ramaze_session_id' unless defined?(SESSION_KEY)
64
38
 
65
39
  # Holds counter for IPs
66
40
 
67
- IP_COUNT = Hash.new{|h,k| h[k] = OrderedSet.new} unless defined?(IP_COUNT)
41
+ IP_COUNT = ::Hash.new{|h,k| h[k] = OrderedSet.new} unless defined?(IP_COUNT)
68
42
 
69
43
  # Limit the number of sessions one IP is allowed to hold.
70
44
 
@@ -75,6 +49,9 @@ module Ramaze
75
49
  COOKIE = { :path => '/' }
76
50
 
77
51
  class << self
52
+ def current
53
+ Current.session
54
+ end
78
55
 
79
56
  # called from Ramaze::startup and adds Cache.sessions if cookies are
80
57
  # enabled
@@ -82,13 +59,6 @@ module Ramaze
82
59
  def startup(options = {})
83
60
  Cache.add(:sessions) if Global.sessions
84
61
  end
85
-
86
- # answers with Thread.current[:session] which holds the current session
87
- # set by the Dispatcher#setup_environment.
88
-
89
- def current
90
- Thread.current[:session]
91
- end
92
62
  end
93
63
 
94
64
  # Initialize a new Session, requires the original Rack::Request instance
@@ -96,16 +66,17 @@ module Ramaze
96
66
  #
97
67
  # sets @session_id and @session_flash
98
68
 
99
- def initialize request
69
+ def initialize(request = Current.request)
70
+ return unless Global.sessions
100
71
  @session_id = (request.cookies[SESSION_KEY] || random_key)
101
72
 
102
73
  unless IP_COUNT.nil?
103
- ip = request.remote_addr
74
+ ip = request.ip
104
75
  IP_COUNT[ip] << @session_id
105
76
  sessions.delete(IP_COUNT[ip].shift) if IP_COUNT[ip].size > IP_COUNT_LIMIT
106
77
  end
107
78
 
108
- @flash = Ramaze::SessionFlash.new
79
+ @flash = Ramaze::Session::Flash.new
109
80
  end
110
81
 
111
82
  # relay all messages we don't understand to the currently active session
@@ -118,7 +89,7 @@ module Ramaze
118
89
  # existing already, the session itself is an instance of SessionHash
119
90
 
120
91
  def current
121
- sessions[session_id] ||= SessionHash.new
92
+ sessions[session_id] ||= Session::Hash.new
122
93
  end
123
94
 
124
95
  # shortcut to Cache.sessions
@@ -138,7 +109,7 @@ module Ramaze
138
109
  def random_key
139
110
  h = [
140
111
  Time.now.to_f.to_s, rand,
141
- Thread.current[:request].hash, rand,
112
+ Current.request.hash, rand,
142
113
  Process.pid, rand,
143
114
  object_id, rand
144
115
  ].join
@@ -156,76 +127,27 @@ module Ramaze
156
127
  #
157
128
  # this is needed so flash can iterate over requests
158
129
  # and always just keep the current and previous key/value pairs.
130
+ #
131
+ # finalizes the session and assigns the key to the response via
132
+ # set_cookie.
133
+
134
+ def finish
135
+ return unless Global.sessions
159
136
 
160
- def finalize
161
137
  old = current.delete(:FLASH)
162
138
  current[:FLASH_PREVIOUS] = old if old
163
- end
164
- end
165
-
166
- # The purpose of this class is to act as a unifier of the previous
167
- # and current flash.
168
- #
169
- # Flash means pairs of keys and values that are held only over one
170
- # request/response cycle. So you can assign a key/value in the current
171
- # session and retrieve it in the current and following request.
172
- #
173
- # Please see the FlashHelper for details on the usage as you won't need
174
- # to touch this class at all.
175
139
 
176
- class SessionFlash
140
+ request, response = Current.request, Current.response
177
141
 
178
- # the current session[:FLASH_PREVIOUS]
142
+ hash = {:value => session_id}.merge(COOKIE)
143
+ response.set_cookie(SESSION_KEY, hash)
179
144
 
180
- def previous
181
- session[:FLASH_PREVIOUS] || {}
182
- end
183
-
184
- # the current session[:FLASH]
185
-
186
- def current
187
- session[:FLASH] ||= {}
188
- end
189
-
190
- # combined key/value pairs of previous and current
191
- # current keys overshadow the old ones.
192
-
193
- def combined
194
- previous.merge(current)
195
- end
196
-
197
- # flash[key] in your Controller
198
-
199
- def [](key)
200
- combined[key]
201
- end
202
-
203
- # flash[key] = value in your Controller
204
-
205
- def []=(key, value)
206
- prev = session[:FLASH] || {}
207
- prev[key] = value
208
- session[:FLASH] = prev
209
- end
210
-
211
- # Inspects the combined SessionFlash
212
-
213
- def inspect
214
- combined.inspect
215
- end
216
-
217
- # Delete a key
218
-
219
- def delete(key)
220
- session[:FLASH].delete(key)
221
- end
222
-
223
- private
224
-
225
- # Session.current or {}
226
-
227
- def session
228
- Session.current || {}
145
+ # set client side session cookie
146
+ if val = request['session.client'] and
147
+ (!val.empty? or request.cookies["#{SESSION_KEY}-client"])
148
+ cookie = hash.merge(:value => marshal(val))
149
+ response.set_cookie("#{SESSION_KEY}-client", cookie)
150
+ end
229
151
  end
230
152
  end
231
153
  end
@@ -0,0 +1,67 @@
1
+ module Ramaze
2
+ class Session
3
+ # The purpose of this class is to act as a unifier of the previous
4
+ # and current flash.
5
+ #
6
+ # Flash means pairs of keys and values that are held only over one
7
+ # request/response cycle. So you can assign a key/value in the current
8
+ # session and retrieve it in the current and following request.
9
+ #
10
+ # Please see the FlashHelper for details on the usage as you won't need
11
+ # to touch this class at all.
12
+ class Flash
13
+ include Enumerable
14
+ def each(&block)
15
+ combined.each(&block)
16
+ end
17
+
18
+ # the current session[:FLASH_PREVIOUS]
19
+ def previous
20
+ session[:FLASH_PREVIOUS] || {}
21
+ end
22
+
23
+ # the current session[:FLASH]
24
+ def current
25
+ session[:FLASH] ||= {}
26
+ end
27
+
28
+ # combined key/value pairs of previous and current
29
+ # current keys overshadow the old ones.
30
+ def combined
31
+ previous.merge(current)
32
+ end
33
+
34
+ # flash[key] in your Controller
35
+ def [](key)
36
+ combined[key]
37
+ end
38
+
39
+ # flash[key] = value in your Controller
40
+ def []=(key, value)
41
+ prev = session[:FLASH] || {}
42
+ prev[key] = value
43
+ session[:FLASH] = prev
44
+ end
45
+
46
+ # Inspects the combined SessionFlash
47
+
48
+ def inspect
49
+ combined.inspect
50
+ end
51
+
52
+ # Delete a key
53
+
54
+ def delete(key)
55
+ current.delete(key)
56
+ end
57
+
58
+ private
59
+
60
+ # Session.current or {}
61
+
62
+ def session
63
+ Current.session || {}
64
+ end
65
+ end
66
+ end
67
+ end