ramaze 0.3.9.1 → 2008.06

Sign up to get free protection for your applications and to get access to all the features.
Files changed (400) hide show
  1. data/{doc/README → README.markdown} +78 -32
  2. data/Rakefile +53 -50
  3. data/benchmark/results.txt +131 -0
  4. data/benchmark/run.rb +362 -0
  5. data/benchmark/suite/minimal.rb +13 -0
  6. data/benchmark/suite/no_informer.rb +9 -0
  7. data/benchmark/suite/no_sessions.rb +10 -0
  8. data/benchmark/suite/no_template.rb +9 -0
  9. data/benchmark/suite/simple.rb +7 -0
  10. data/benchmark/suite/template_amrita2.rb +17 -0
  11. data/benchmark/suite/template_builder.rb +12 -0
  12. data/benchmark/suite/template_erubis.rb +10 -0
  13. data/benchmark/suite/template_ezamar.rb +10 -0
  14. data/benchmark/suite/template_haml.rb +15 -0
  15. data/benchmark/suite/template_liquid.rb +13 -0
  16. data/benchmark/suite/template_markaby.rb +11 -0
  17. data/benchmark/suite/template_nagoro.rb +10 -0
  18. data/benchmark/suite/template_redcloth.rb +15 -0
  19. data/benchmark/suite/template_tenjin.rb +10 -0
  20. data/benchmark/test.rb +35 -0
  21. data/bin/ramaze +32 -122
  22. data/cache.yaml +7 -0
  23. data/doc/AUTHORS +26 -22
  24. data/doc/CHANGELOG +16720 -3907
  25. data/doc/INSTALL +77 -19
  26. data/doc/LEGAL +0 -4
  27. data/doc/meta/announcement.txt +43 -54
  28. data/doc/meta/configuration.txt +3 -2
  29. data/doc/readme_chunks/examples.txt +2 -2
  30. data/doc/readme_chunks/installing.txt +66 -20
  31. data/doc/tutorial/todolist.html +338 -520
  32. data/doc/tutorial/todolist.mkd +36 -2
  33. data/examples/{auth → app/auth}/auth.rb +0 -0
  34. data/examples/{auth → app/auth}/template/layout.haml +0 -0
  35. data/examples/{auth → app/auth}/template/login.haml +0 -0
  36. data/examples/{blog → app/blog}/README +0 -0
  37. data/examples/{blog → app/blog}/controller/main.rb +1 -1
  38. data/examples/{blog → app/blog}/model/entry.rb +1 -1
  39. data/examples/{blog → app/blog}/public/styles/blog.css +0 -0
  40. data/examples/{blog → app/blog}/spec/blog.rb +2 -2
  41. data/examples/{blog → app/blog}/start.rb +0 -0
  42. data/examples/{blog → app/blog}/view/edit.xhtml +0 -0
  43. data/examples/{blog → app/blog}/view/index.xhtml +0 -0
  44. data/examples/{blog → app/blog}/view/layout.xhtml +0 -0
  45. data/examples/{blog → app/blog}/view/new.xhtml +0 -0
  46. data/examples/app/chat/model/history.rb +36 -0
  47. data/examples/app/chat/model/message.rb +7 -0
  48. data/examples/app/chat/public/css/chat.css +13 -0
  49. data/examples/app/chat/public/js/chat.js +22 -0
  50. data/examples/app/chat/public/js/jquery.js +3436 -0
  51. data/examples/app/chat/start.rb +40 -0
  52. data/examples/app/chat/view/chat.xhtml +9 -0
  53. data/examples/app/chat/view/index.xhtml +7 -0
  54. data/examples/app/chat/view/layout.xhtml +13 -0
  55. data/examples/app/localization/start.rb +35 -0
  56. data/examples/{rammit → app/rammit}/spec/rammit.rb +2 -1
  57. data/examples/{rammit → app/rammit}/src/controller/main.rb +0 -0
  58. data/examples/{rammit → app/rammit}/src/controller/page.rb +0 -0
  59. data/examples/{rammit → app/rammit}/src/model.rb +0 -0
  60. data/examples/{rammit → app/rammit}/start.rb +0 -0
  61. data/examples/{rammit → app/rammit}/template/index.xhtml +0 -0
  62. data/examples/{rammit → app/rammit}/template/page/view.xhtml +0 -0
  63. data/examples/{rapaste → app/rapaste}/Rakefile +0 -1
  64. data/examples/{rapaste → app/rapaste}/controller/paste.rb +3 -3
  65. data/examples/{rapaste → app/rapaste}/model/paste.rb +0 -0
  66. data/examples/{rapaste → app/rapaste}/public/css/active4d.css +0 -0
  67. data/examples/{rapaste → app/rapaste}/public/css/all_hallows_eve.css +0 -0
  68. data/examples/{rapaste → app/rapaste}/public/css/amy.css +0 -0
  69. data/examples/{rapaste → app/rapaste}/public/css/blackboard.css +0 -0
  70. data/examples/{rapaste → app/rapaste}/public/css/brilliance_black.css +0 -0
  71. data/examples/{rapaste → app/rapaste}/public/css/brilliance_dull.css +0 -0
  72. data/examples/{rapaste → app/rapaste}/public/css/cobalt.css +0 -0
  73. data/examples/{rapaste → app/rapaste}/public/css/dawn.css +0 -0
  74. data/examples/{rapaste → app/rapaste}/public/css/display.css +0 -0
  75. data/examples/{rapaste → app/rapaste}/public/css/eiffel.css +0 -0
  76. data/examples/{rapaste → app/rapaste}/public/css/espresso_libre.css +0 -0
  77. data/examples/{rapaste → app/rapaste}/public/css/idle.css +0 -0
  78. data/examples/{rapaste → app/rapaste}/public/css/iplastic.css +0 -0
  79. data/examples/{rapaste → app/rapaste}/public/css/lazy.css +0 -0
  80. data/examples/{rapaste → app/rapaste}/public/css/mac_classic.css +0 -0
  81. data/examples/{rapaste → app/rapaste}/public/css/magicwb_amiga.css +0 -0
  82. data/examples/{rapaste → app/rapaste}/public/css/pastels_on_dark.css +0 -0
  83. data/examples/{rapaste → app/rapaste}/public/css/slush_poppies.css +0 -0
  84. data/examples/{rapaste → app/rapaste}/public/css/spacecadet.css +0 -0
  85. data/examples/{rapaste → app/rapaste}/public/css/sunburst.css +0 -0
  86. data/examples/{rapaste → app/rapaste}/public/css/twilight.css +0 -0
  87. data/examples/{rapaste → app/rapaste}/public/css/zenburnesque.css +0 -0
  88. data/examples/{rapaste → app/rapaste}/public/js/jquery.js +0 -0
  89. data/examples/{rapaste → app/rapaste}/spec/rapaste.rb +2 -2
  90. data/examples/{rapaste → app/rapaste}/start.rb +0 -0
  91. data/examples/{rapaste → app/rapaste}/view/copy.xhtml +0 -0
  92. data/examples/{rapaste → app/rapaste}/view/index.xhtml +0 -0
  93. data/examples/{rapaste → app/rapaste}/view/layout.xhtml +0 -0
  94. data/examples/{rapaste → app/rapaste}/view/list.xhtml +0 -0
  95. data/examples/{rapaste → app/rapaste}/view/search.xhtml +0 -0
  96. data/examples/{rapaste → app/rapaste}/view/view.xhtml +0 -0
  97. data/examples/{sourceview → app/sourceview}/public/coderay.css +0 -0
  98. data/examples/{sourceview → app/sourceview}/public/images/file.gif +0 -0
  99. data/examples/{sourceview → app/sourceview}/public/images/folder.gif +0 -0
  100. data/examples/{sourceview → app/sourceview}/public/images/tv-collapsable-last.gif +0 -0
  101. data/examples/{sourceview → app/sourceview}/public/images/tv-collapsable.gif +0 -0
  102. data/examples/{sourceview → app/sourceview}/public/images/tv-expandable-last.gif +0 -0
  103. data/examples/{sourceview → app/sourceview}/public/images/tv-expandable.gif +0 -0
  104. data/examples/{sourceview → app/sourceview}/public/images/tv-item-last.gif +0 -0
  105. data/examples/{sourceview → app/sourceview}/public/images/tv-item.gif +0 -0
  106. data/examples/{sourceview → app/sourceview}/public/jquery.js +0 -0
  107. data/examples/{sourceview → app/sourceview}/public/jquery.treeview.css +0 -0
  108. data/examples/{sourceview → app/sourceview}/public/jquery.treeview.js +0 -0
  109. data/examples/{sourceview → app/sourceview}/public/sourceview.js +0 -0
  110. data/examples/{sourceview → app/sourceview}/sourceview.rb +1 -1
  111. data/examples/{sourceview → app/sourceview}/template/index.haml +0 -0
  112. data/examples/{todolist → app/todolist}/README +0 -0
  113. data/examples/{todolist → app/todolist}/public/favicon.ico +0 -0
  114. data/examples/{todolist → app/todolist}/public/js/jquery.js +0 -0
  115. data/examples/{todolist → app/todolist}/public/ramaze.png +0 -0
  116. data/examples/{todolist → app/todolist}/spec/todolist.rb +2 -2
  117. data/examples/{todolist → app/todolist}/src/controller/main.rb +0 -0
  118. data/examples/{todolist → app/todolist}/src/element/page.rb +0 -0
  119. data/examples/{todolist → app/todolist}/src/model.rb +0 -0
  120. data/examples/{todolist → app/todolist}/start.rb +0 -0
  121. data/examples/{todolist → app/todolist}/template/index.xhtml +0 -0
  122. data/examples/{todolist → app/todolist}/template/new.xhtml +0 -0
  123. data/examples/{upload → app/upload}/start.rb +0 -0
  124. data/examples/{upload → app/upload}/view/index.xhtml +0 -0
  125. data/examples/{whywiki → app/whywiki}/spec/whywiki.rb +3 -3
  126. data/examples/{whywiki → app/whywiki}/start.rb +0 -0
  127. data/examples/{whywiki → app/whywiki}/template/edit.xhtml +0 -0
  128. data/examples/{whywiki → app/whywiki}/template/show.xhtml +0 -0
  129. data/examples/{wikore → app/wikore}/spec/wikore.rb +2 -2
  130. data/examples/{wikore → app/wikore}/src/controller.rb +0 -0
  131. data/examples/{wikore → app/wikore}/src/model.rb +0 -0
  132. data/examples/{wikore → app/wikore}/start.rb +0 -0
  133. data/examples/{wikore → app/wikore}/template/index.xhtml +0 -0
  134. data/examples/{wiktacular → app/wiktacular}/README +0 -0
  135. data/examples/{wiktacular → app/wiktacular}/mkd/link/2007-07-20_19-45-51.mkd +0 -0
  136. data/examples/{wiktacular → app/wiktacular}/mkd/link/current.mkd +0 -0
  137. data/examples/{wiktacular → app/wiktacular}/mkd/main/2007-07-20_16-31-33.mkd +0 -0
  138. data/examples/{wiktacular → app/wiktacular}/mkd/main/2007-07-20_19-21-12.mkd +0 -0
  139. data/examples/{wiktacular → app/wiktacular}/mkd/main/2007-07-20_19-23-10.mkd +0 -0
  140. data/examples/{wiktacular → app/wiktacular}/mkd/main/2007-07-20_19-45-07.mkd +0 -0
  141. data/examples/{wiktacular → app/wiktacular}/mkd/main/current.mkd +0 -0
  142. data/examples/{wiktacular → app/wiktacular}/mkd/markdown/current.mkd +0 -0
  143. data/examples/{wiktacular → app/wiktacular}/mkd/testing/2007-07-20_16-43-46.mkd +0 -0
  144. data/examples/{wiktacular → app/wiktacular}/mkd/testing/2007-07-20_19-43-50.mkd +0 -0
  145. data/examples/{wiktacular → app/wiktacular}/mkd/testing/2007-07-21_18-46-01.mkd +0 -0
  146. data/examples/{wiktacular → app/wiktacular}/mkd/testing/2007-07-21_18-46-32.mkd +0 -0
  147. data/examples/{wiktacular → app/wiktacular}/mkd/testing/2007-07-21_18-47-08.mkd +0 -0
  148. data/examples/{wiktacular → app/wiktacular}/mkd/testing/2007-07-21_18-47-54.mkd +0 -0
  149. data/examples/{wiktacular → app/wiktacular}/mkd/testing/current.mkd +0 -0
  150. data/examples/{wiktacular → app/wiktacular}/public/favicon.ico +0 -0
  151. data/examples/{wiktacular → app/wiktacular}/public/screen.css +0 -0
  152. data/examples/{wiktacular → app/wiktacular}/spec/wiktacular.rb +4 -5
  153. data/examples/{wiktacular → app/wiktacular}/src/controller.rb +0 -0
  154. data/examples/{wiktacular → app/wiktacular}/src/model.rb +0 -0
  155. data/examples/{wiktacular → app/wiktacular}/start.rb +0 -0
  156. data/examples/{wiktacular → app/wiktacular}/template/edit.xhtml +0 -0
  157. data/examples/{wiktacular → app/wiktacular}/template/html_layout.xhtml +0 -0
  158. data/examples/{wiktacular → app/wiktacular}/template/index.xhtml +0 -0
  159. data/examples/{wiktacular → app/wiktacular}/template/new.xhtml +0 -0
  160. data/examples/{element.rb → basic/element.rb} +0 -0
  161. data/examples/basic/gestalt.rb +27 -0
  162. data/examples/{hello.rb → basic/hello.rb} +0 -0
  163. data/examples/{layout.rb → basic/layout.rb} +0 -0
  164. data/examples/{linking.rb → basic/linking.rb} +0 -0
  165. data/examples/{simple.rb → basic/simple.rb} +3 -3
  166. data/examples/{caching.rb → helpers/cache.rb} +0 -0
  167. data/examples/helpers/form_with_sequel.rb +24 -0
  168. data/examples/helpers/httpdigest.rb +50 -0
  169. data/examples/{identity.rb → helpers/identity.rb} +0 -0
  170. data/examples/{nitro_form.rb → helpers/nitro_form.rb} +0 -0
  171. data/examples/helpers/provide.rb +23 -0
  172. data/examples/helpers/rest.rb +28 -0
  173. data/examples/helpers/simple_captcha.rb +29 -0
  174. data/examples/{css.rb → misc/css.rb} +0 -0
  175. data/examples/{facebook.rb → misc/facebook.rb} +0 -0
  176. data/examples/{memleak_detector.rb → misc/memleak_detector.rb} +0 -0
  177. data/examples/misc/nagoro_element.rb +43 -0
  178. data/examples/{ramaise.rb → misc/ramaise.rb} +0 -0
  179. data/examples/misc/rapp.rb +45 -0
  180. data/examples/misc/sequel_scaffolding.rb +34 -0
  181. data/examples/{simple_auth.rb → misc/simple_auth.rb} +0 -0
  182. data/examples/templates/template_amrita2.rb +1 -1
  183. data/examples/templates/template_erubis.rb +2 -2
  184. data/examples/templates/template_ezamar.rb +1 -1
  185. data/examples/templates/template_haml.rb +2 -2
  186. data/examples/templates/template_liquid.rb +2 -2
  187. data/examples/templates/template_markaby.rb +1 -1
  188. data/examples/templates/template_nagoro.rb +1 -1
  189. data/examples/templates/template_redcloth.rb +2 -2
  190. data/examples/templates/template_remarkably.rb +1 -1
  191. data/examples/templates/template_tenjin.rb +5 -9
  192. data/examples/templates/template_xslt.rb +1 -1
  193. data/lib/proto/public/dispatch.fcgi +0 -0
  194. data/lib/proto/public/js/jquery.js +750 -577
  195. data/lib/proto/spec/main.rb +1 -1
  196. data/lib/proto/start.ru +8 -0
  197. data/lib/proto/view/page.xhtml +13 -1
  198. data/lib/ramaze.rb +32 -15
  199. data/lib/ramaze/action.rb +18 -1
  200. data/lib/ramaze/action/render.rb +45 -17
  201. data/lib/ramaze/adapter.rb +8 -7
  202. data/lib/ramaze/adapter/base.rb +79 -13
  203. data/lib/ramaze/adapter/cgi.rb +5 -10
  204. data/lib/ramaze/adapter/ebb.rb +6 -20
  205. data/lib/ramaze/adapter/fake.rb +12 -0
  206. data/lib/ramaze/adapter/fcgi.rb +5 -11
  207. data/lib/ramaze/adapter/lsws.rb +5 -9
  208. data/lib/ramaze/adapter/mongrel.rb +5 -9
  209. data/lib/ramaze/adapter/scgi.rb +4 -8
  210. data/lib/ramaze/adapter/thin.rb +6 -11
  211. data/lib/ramaze/adapter/webrick.rb +13 -22
  212. data/lib/ramaze/cache.rb +36 -10
  213. data/lib/ramaze/cache/memcached.rb +3 -2
  214. data/lib/ramaze/contrib.rb +1 -1
  215. data/lib/ramaze/contrib/email.rb +1 -1
  216. data/lib/ramaze/contrib/file_cache.rb +1 -1
  217. data/lib/ramaze/contrib/gems.rb +79 -0
  218. data/lib/ramaze/contrib/gettext/po.rb +0 -0
  219. data/lib/ramaze/contrib/profiling.rb +1 -1
  220. data/lib/ramaze/contrib/rest.rb +14 -0
  221. data/lib/ramaze/controller.rb +45 -12
  222. data/lib/ramaze/controller/error.rb +4 -4
  223. data/lib/ramaze/controller/resolve.rb +61 -42
  224. data/lib/ramaze/current.rb +2 -2
  225. data/lib/ramaze/current/request.rb +25 -2
  226. data/lib/ramaze/current/response.rb +8 -0
  227. data/lib/ramaze/current/session.rb +64 -36
  228. data/lib/ramaze/current/session/flash.rb +14 -2
  229. data/lib/ramaze/current/session/hash.rb +3 -2
  230. data/lib/ramaze/dispatcher.rb +25 -12
  231. data/lib/ramaze/dispatcher/action.rb +12 -3
  232. data/lib/ramaze/dispatcher/directory.rb +4 -1
  233. data/lib/ramaze/dispatcher/error.rb +3 -3
  234. data/lib/ramaze/dispatcher/file.rb +11 -3
  235. data/lib/ramaze/gestalt.rb +1 -1
  236. data/lib/ramaze/helper.rb +17 -21
  237. data/lib/ramaze/helper/aspect.rb +20 -14
  238. data/lib/ramaze/helper/auth.rb +1 -1
  239. data/lib/ramaze/helper/cache.rb +3 -6
  240. data/lib/ramaze/helper/cgi.rb +6 -2
  241. data/lib/ramaze/helper/flash.rb +7 -7
  242. data/lib/ramaze/helper/form.rb +281 -0
  243. data/lib/ramaze/helper/formatting.rb +76 -0
  244. data/lib/ramaze/helper/gestalt.rb +15 -0
  245. data/lib/ramaze/helper/gravatar.rb +15 -0
  246. data/lib/ramaze/helper/httpdigest.rb +48 -0
  247. data/lib/ramaze/helper/identity.rb +87 -62
  248. data/lib/ramaze/helper/partial.rb +11 -2
  249. data/lib/ramaze/helper/redirect.rb +12 -3
  250. data/lib/ramaze/helper/rest.rb +43 -0
  251. data/lib/ramaze/helper/sendfile.rb +1 -3
  252. data/lib/ramaze/helper/sequel.rb +3 -0
  253. data/lib/ramaze/helper/simple_captcha.rb +31 -0
  254. data/lib/ramaze/helper/stack.rb +14 -5
  255. data/lib/ramaze/helper/user.rb +86 -34
  256. data/lib/ramaze/helper/xhtml.rb +23 -0
  257. data/lib/ramaze/log.rb +1 -2
  258. data/lib/ramaze/log/analogger.rb +24 -19
  259. data/lib/ramaze/log/growl.rb +24 -19
  260. data/lib/ramaze/log/hub.rb +25 -22
  261. data/lib/ramaze/log/informer.rb +104 -99
  262. data/lib/ramaze/log/knotify.rb +17 -12
  263. data/lib/ramaze/log/logger.rb +14 -8
  264. data/lib/ramaze/log/logging.rb +63 -60
  265. data/lib/ramaze/log/syslog.rb +24 -19
  266. data/lib/ramaze/log/xosd.rb +77 -71
  267. data/lib/ramaze/option.rb +153 -0
  268. data/lib/ramaze/option/dsl.rb +45 -0
  269. data/lib/ramaze/option/holder.rb +153 -0
  270. data/lib/ramaze/option/merger.rb +108 -0
  271. data/lib/ramaze/route.rb +15 -2
  272. data/lib/ramaze/setup.rb +50 -0
  273. data/lib/ramaze/snippets/binding/locals.rb +1 -1
  274. data/lib/ramaze/snippets/dictionary.rb +3 -3
  275. data/lib/ramaze/snippets/divide.rb +7 -7
  276. data/lib/ramaze/snippets/kernel/__dir__.rb +1 -1
  277. data/lib/ramaze/snippets/kernel/acquire.rb +0 -5
  278. data/lib/ramaze/snippets/metaid.rb +1 -1
  279. data/lib/ramaze/snippets/numeric/filesize_format.rb +11 -5
  280. data/lib/ramaze/snippets/object/instance_variable_defined.rb +8 -0
  281. data/lib/ramaze/snippets/object/scope.rb +1 -1
  282. data/lib/ramaze/snippets/object/thread_accessor.rb +1 -1
  283. data/lib/ramaze/snippets/ordered_set.rb +5 -1
  284. data/lib/ramaze/snippets/ramaze/deprecated.rb +7 -0
  285. data/lib/ramaze/snippets/ramaze/thread_accessor.rb +15 -1
  286. data/lib/ramaze/snippets/string/esc.rb +2 -2
  287. data/lib/ramaze/snippets/string/start_with.rb +1 -0
  288. data/lib/ramaze/snippets/string/unindent.rb +9 -1
  289. data/lib/ramaze/snippets/struct/values_at.rb +17 -1
  290. data/lib/ramaze/snippets/thread/into.rb +1 -1
  291. data/lib/ramaze/sourcereload.rb +83 -76
  292. data/lib/ramaze/spec/helper.rb +39 -26
  293. data/lib/ramaze/spec/helper/bacon.rb +5 -5
  294. data/lib/ramaze/spec/helper/mock_http.rb +1 -7
  295. data/lib/ramaze/spec/helper/pretty_output.rb +10 -2
  296. data/lib/ramaze/spec/helper/requester.rb +14 -0
  297. data/lib/ramaze/template.rb +6 -3
  298. data/lib/ramaze/template/amrita2.rb +1 -0
  299. data/lib/ramaze/template/erubis.rb +7 -1
  300. data/lib/ramaze/template/ezamar/render_partial.rb +1 -1
  301. data/lib/ramaze/template/nagoro.rb +1 -0
  302. data/lib/ramaze/template/redcloth.rb +1 -0
  303. data/lib/ramaze/template/tagz.rb +8 -8
  304. data/lib/ramaze/template/tenjin.rb +42 -2
  305. data/lib/ramaze/template/xslt.rb +4 -0
  306. data/lib/ramaze/tool/daemonize.rb +37 -0
  307. data/lib/ramaze/tool/localize.rb +142 -106
  308. data/lib/ramaze/version.rb +2 -10
  309. data/rake_tasks/conf.rake +11 -13
  310. data/rake_tasks/gem.rake +59 -37
  311. data/rake_tasks/git.rake +41 -0
  312. data/rake_tasks/maintenance.rake +263 -299
  313. data/rake_tasks/release.rake +63 -0
  314. data/rake_tasks/spec.rake +1 -1
  315. data/ramaze.gemspec +731 -0
  316. data/spec/contrib/profiling.rb +5 -2
  317. data/spec/examples/caching.rb +1 -1
  318. data/spec/examples/css.rb +1 -1
  319. data/spec/examples/element.rb +1 -1
  320. data/spec/examples/hello.rb +1 -1
  321. data/spec/examples/linking.rb +1 -1
  322. data/spec/examples/simple.rb +1 -1
  323. data/spec/examples/simple_auth.rb +1 -1
  324. data/spec/ramaze/action/cache.rb +58 -14
  325. data/spec/ramaze/action/file_cache.rb +48 -0
  326. data/spec/ramaze/action/layout.rb +2 -2
  327. data/spec/ramaze/action/render.rb +1 -2
  328. data/spec/ramaze/action/{template → view}/bar.xhtml +0 -0
  329. data/spec/ramaze/action/{template → view}/instancevars/layout.xhtml +0 -0
  330. data/spec/ramaze/action/{template → view}/other_wrapper.xhtml +0 -0
  331. data/spec/ramaze/action/{template → view}/single_wrapper.xhtml +0 -0
  332. data/spec/ramaze/action/{template → view}/sub/sub_wrapper.xhtml +0 -0
  333. data/spec/ramaze/adapter.rb +29 -2
  334. data/spec/ramaze/adapter/ebb.rb +12 -0
  335. data/spec/ramaze/cache.rb +82 -15
  336. data/spec/ramaze/controller.rb +6 -3
  337. data/spec/ramaze/controller/actionless_templates.rb +2 -2
  338. data/spec/ramaze/controller/resolve.rb +1 -1
  339. data/spec/ramaze/controller/template_resolving.rb +4 -6
  340. data/spec/ramaze/controller/{template → view}/greet.xhtml +0 -0
  341. data/spec/ramaze/controller/{template → view}/list.xhtml +0 -0
  342. data/spec/ramaze/controller/{template → view}/other/greet/other.xhtml +0 -0
  343. data/spec/ramaze/controller/{template → view}/other_wrapper.xhtml +0 -0
  344. data/spec/ramaze/error.rb +1 -1
  345. data/spec/ramaze/helper/aspect.rb +4 -4
  346. data/spec/ramaze/helper/cache.rb +56 -39
  347. data/spec/ramaze/helper/flash.rb +14 -1
  348. data/spec/ramaze/helper/form.rb +118 -0
  349. data/spec/ramaze/helper/formatting.rb +21 -0
  350. data/spec/ramaze/helper/link.rb +2 -2
  351. data/spec/ramaze/helper/pager.rb +2 -2
  352. data/spec/ramaze/helper/partial.rb +13 -1
  353. data/spec/ramaze/helper/simple_captcha.rb +22 -0
  354. data/spec/ramaze/helper/user.rb +7 -10
  355. data/spec/ramaze/helper/{template → view}/locals.xhtml +0 -0
  356. data/spec/ramaze/helper/{template → view}/loop.xhtml +0 -0
  357. data/spec/ramaze/helper/{template → view}/num.xhtml +0 -0
  358. data/spec/ramaze/helper/{template → view}/partial.xhtml +0 -0
  359. data/spec/ramaze/helper/{template → view}/recursive.xhtml +0 -0
  360. data/spec/ramaze/helper/{template → view}/recursive_local_ivars.xhtml +0 -0
  361. data/spec/ramaze/helper/{template → view}/recursive_locals.xhtml +0 -0
  362. data/spec/ramaze/helper/{template → view}/test_template.xhtml +0 -0
  363. data/spec/ramaze/localize.rb +22 -0
  364. data/spec/ramaze/log/informer.rb +10 -10
  365. data/spec/ramaze/log/syslog.rb +1 -1
  366. data/spec/ramaze/request.rb +13 -1
  367. data/spec/ramaze/request/ebb.rb +9 -0
  368. data/spec/ramaze/rewrite.rb +36 -0
  369. data/spec/ramaze/rewrite/file.css +1 -0
  370. data/spec/ramaze/route.rb +1 -0
  371. data/spec/ramaze/template.rb +5 -5
  372. data/spec/ramaze/template/amrita2.rb +1 -1
  373. data/spec/ramaze/template/builder.rb +18 -22
  374. data/spec/ramaze/template/erubis.rb +1 -1
  375. data/spec/ramaze/template/ezamar.rb +1 -1
  376. data/spec/ramaze/template/haml.rb +2 -2
  377. data/spec/ramaze/template/liquid.rb +1 -1
  378. data/spec/ramaze/template/markaby.rb +1 -1
  379. data/spec/ramaze/template/nagoro.rb +1 -1
  380. data/spec/ramaze/template/redcloth.rb +1 -1
  381. data/spec/ramaze/template/remarkably.rb +1 -1
  382. data/spec/ramaze/template/sass.rb +1 -1
  383. data/spec/ramaze/template/tagz.rb +1 -1
  384. data/spec/ramaze/template/tenjin.rb +4 -6
  385. data/spec/ramaze/template/xslt.rb +1 -1
  386. data/spec/snippets/string/unindent.rb +6 -0
  387. data/spec/snippets/struct/values_at.rb +8 -0
  388. metadata +522 -487
  389. data/doc/ProjectInfo +0 -53
  390. data/doc/migrate/1110_to_1111.txt +0 -131
  391. data/lib/ramaze/contrib/route.rb +0 -22
  392. data/lib/ramaze/global.rb +0 -116
  393. data/lib/ramaze/global/dsl.rb +0 -39
  394. data/lib/ramaze/global/globalstruct.rb +0 -147
  395. data/lib/ramaze/helper/inform.rb +0 -40
  396. data/lib/ramaze/inform.rb +0 -4
  397. data/lib/ramaze/snippets/kernel/aquire.rb +0 -1
  398. data/lib/vendor/bacon.rb +0 -323
  399. data/rake_tasks/darcs.rake +0 -5
  400. data/spec/contrib/route.rb +0 -36
@@ -0,0 +1,14 @@
1
+ Ramaze::Route['REST dispatch'] = lambda{|path, request|
2
+ case request.request_method
3
+ when 'GET'
4
+ path << 'show/'
5
+ when 'POST'
6
+ path << 'create/'
7
+ when 'PUT'
8
+ path << 'update/'
9
+ when 'DELETE'
10
+ path << 'destroy/'
11
+ else
12
+ path
13
+ end
14
+ }
@@ -50,7 +50,7 @@ module Ramaze
50
50
  Log.dev("found Controllers: #{Global.controllers.inspect}")
51
51
 
52
52
  check_path("Public root: '%s' doesn't exist", Global.public_root)
53
- check_path("Template root: '%s' doesn't exist", Global.template_root)
53
+ check_path("View root: '%s' doesn't exist", Global.view_root)
54
54
 
55
55
  require 'ramaze/controller/main' if Global.mapping.empty?
56
56
 
@@ -72,8 +72,8 @@ module Ramaze
72
72
  def mapping
73
73
  global_mapping = Global.mapping.invert[self]
74
74
  return global_mapping if global_mapping
75
- if ancestral_trait[:automap]
76
- name = self.to_s.gsub('Controller', '').gsub('::', '/')
75
+ if ancestral_trait[:automap] && self.to_s !~ /#<Class:/
76
+ name = self.to_s.gsub('Controller', '').gsub('::', '/').clone
77
77
  name == 'Main' ? '/' : "/#{name.snake_case}"
78
78
  end
79
79
  end
@@ -126,25 +126,43 @@ module Ramaze
126
126
  end
127
127
  end
128
128
 
129
+ # Deny layout for passed names of actions.
130
+ # Name should be name of the method or template without extension, as
131
+ # String or Symbol
132
+ #
133
+ # Usage:
134
+ # class MainController < Ramaze::Controller
135
+ # deny_layout :atom
136
+ #
137
+ # def atom
138
+ # "I won't have layout"
139
+ # end
140
+ # end
141
+
129
142
  def deny_layout(*actions)
130
143
  actions.each do |action|
131
144
  layout[:deny] << action.to_s
132
145
  end
133
146
  end
134
147
 
135
- # Define a template_root for Controller, returns the current template_root
148
+ # Define a view_root for Controller, returns the current view_root
136
149
  # if no argument is given.
137
150
  # Runs every given path through Controller::check_path
138
151
 
139
- def template_root *args
152
+ def view_root *args
140
153
  if args.empty?
141
- @template_root
154
+ @view_root
142
155
  else
143
- check_path("#{self}.template_root: '%s' doesn't exist", *args)
144
- @template_root = args.flatten
156
+ check_path("#{self}.view_root: '%s' doesn't exist", *args)
157
+ @view_root = args.flatten
145
158
  end
146
159
  end
147
160
 
161
+ def template_root(*args)
162
+ Ramaze.deprecated("Controller::template_root", "Controller::view_root")
163
+ view_root(*args)
164
+ end
165
+
148
166
  # This is used for template rerouting, takes action, optionally a
149
167
  # controller and action to route to.
150
168
  #
@@ -152,8 +170,8 @@ module Ramaze
152
170
  # class MainController
153
171
  # template :index, OtherController, :list
154
172
  # template :foo, :bar
155
- # template :bar, :file => '/absolute/path'
156
- # template :baz, :file => 'relative/path'
173
+ # template :bar, :file => '/absolute/path'
174
+ # template :baz, :file => 'relative/path'
157
175
  # template :abc, :controller => OtherController
158
176
  # template :xyz, :controller => OtherController, :action => 'list'
159
177
  #
@@ -193,7 +211,7 @@ module Ramaze
193
211
  if file
194
212
  file = file.to_s
195
213
  unless Pathname(file).absolute?
196
- root = [template_root || Global.template_root].flatten.first
214
+ root = [view_root || Global.view_root].flatten.first
197
215
  file = File.join(root, file)
198
216
  end
199
217
  info[:file] = file
@@ -207,10 +225,19 @@ module Ramaze
207
225
  else
208
226
  controller, action, *ignored = argv
209
227
  controller, action = self, controller unless action
210
- trait "#{this}_template" => {:controller => controller, :action => action}
228
+ trait "#{this}_template" => {:controller => controller, :action => action}
211
229
  end
212
230
  end
213
231
 
232
+ # This is a method to specify the templating engine for your controller.
233
+ # It basically just is sugar for:
234
+ # trait :engine => Haml
235
+ #
236
+ # Usage:
237
+ # class MainController < Ramaze::Controller
238
+ # engine :Haml
239
+ # end
240
+
214
241
  def engine(name)
215
242
  name = Template.const_get(name)
216
243
  rescue NameError => ex
@@ -235,6 +262,12 @@ module Ramaze
235
262
  Thread.current[:controller] = action.controller
236
263
  action.render
237
264
  end
265
+
266
+ def relevant_ancestors(parent = Ramaze::Controller)
267
+ ancestors.select do |anc|
268
+ anc.ancestors.include?(parent)
269
+ end
270
+ end
238
271
  end
239
272
 
240
273
  private
@@ -26,18 +26,18 @@ module Ramaze
26
26
  end
27
27
 
28
28
  backtrace_size = Global.backtrace_size
29
- @backtrace = error.backtrace[0..20].map do |line|
29
+ @backtrace = error.backtrace[0..20].map{|line|
30
30
  file, lineno, meth = *Ramaze.parse_backtrace(line)
31
31
  lines = Ramaze.caller_lines(file, lineno, backtrace_size)
32
32
 
33
33
  [ lines, lines.object_id.abs, file, lineno, meth ]
34
- end
34
+ }
35
35
 
36
36
  # for backwards-compat with old error.zmr
37
37
  @colors = [255] * @backtrace.size
38
38
 
39
- @title = ::CGI.escapeHTML(title)
40
- @editor = (ENV['EDITOR'] || 'vim')
39
+ @title = h(title)
40
+ @editor = ENV['EDITOR'] || 'vim'
41
41
  title
42
42
  rescue Object => ex
43
43
  Log.error(ex)
@@ -3,7 +3,10 @@
3
3
 
4
4
  module Ramaze
5
5
  class Controller
6
- FILTER = [ :cached, :default ] unless defined?(FILTER)
6
+ # TODO:
7
+ # * fix caching, see todos below
8
+ # FILTER = [ :cached, :default ] unless defined?(FILTER)
9
+ FILTER = [ :default ] unless defined?(FILTER)
7
10
 
8
11
  class << self
9
12
 
@@ -54,14 +57,21 @@ module Ramaze
54
57
 
55
58
  raise_no_controller(path) if controllers.empty? or mapping.empty?
56
59
 
57
- patterns = Cache.patterns[path] ||= pattern_for(path)
60
+ # TODO:
61
+ # * following code is dangerous (DoS):
62
+ # patterns = Cache.patterns[path] ||= pattern_for(path)
63
+
58
64
  first_controller = nil
59
65
 
60
- patterns.each do |controller, method, params|
66
+ # Look through the possible ways of interpreting the path until we find
67
+ # one that matches an existing controller action.
68
+ patterns_for(path) do |controller, method, params|
61
69
  if controller = mapping[controller]
62
70
  first_controller ||= controller
63
71
 
64
72
  action = controller.resolve_action(method, *params)
73
+ next unless action
74
+
65
75
  template = action.template
66
76
 
67
77
  valid_action =
@@ -72,8 +82,10 @@ module Ramaze
72
82
  end
73
83
 
74
84
  if valid_action
75
- Cache.resolved[path] = action
76
- return action.dup
85
+ # TODO:
86
+ # * dangerous as well
87
+ # Cache.resolved[path] = action
88
+ return action
77
89
  end
78
90
  end
79
91
  end
@@ -106,11 +118,14 @@ module Ramaze
106
118
  template ||= resolve_template(path)
107
119
  end
108
120
 
109
- Action.create :path => path,
110
- :method => method,
111
- :params => params,
112
- :template => template,
113
- :controller => self
121
+ action =
122
+ Action.create :path => path,
123
+ :method => method,
124
+ :params => params,
125
+ :template => template,
126
+ :controller => self
127
+ return false unless action.valid_rest?
128
+ action
114
129
  end
115
130
 
116
131
  # Search the #template_paths for a fitting template for path.
@@ -128,14 +143,14 @@ module Ramaze
128
143
  end
129
144
 
130
145
  # Composes an array with the template-paths to look up in the right order.
131
- # Usually this is composed of Global.template_root and the mapping of the
146
+ # Usually this is composed of Global.view_root and the mapping of the
132
147
  # controller.
133
148
 
134
149
  def template_paths
135
- if paths = template_root
150
+ if paths = view_root
136
151
  paths
137
152
  else
138
- template_root(Global.template_root / Global.mapping.invert[self])
153
+ view_root(Global.view_root / Global.mapping.invert[self])
139
154
  end
140
155
  end
141
156
 
@@ -151,15 +166,15 @@ module Ramaze
151
166
  return nil, []
152
167
  end
153
168
 
169
+ # List or create a list of action methods to be cached
170
+
154
171
  def cached_action_methods
155
172
  Cache.action_methods[self] ||= action_methods
156
173
  end
157
174
 
158
175
  # methodnames that may be used for current controller.
159
176
  def action_methods
160
- ancs = ancestors.select{|ancestor|
161
- ancestor <= Ramaze::Controller
162
- } + Helper::LOOKUP.to_a
177
+ ancs = relevant_ancestors + Helper::LOOKUP.to_a
163
178
 
164
179
  ancs.reverse.inject [] do |meths, anc|
165
180
  meths +
@@ -168,34 +183,33 @@ module Ramaze
168
183
  end
169
184
  end
170
185
 
171
- # Generate all possible permutations for given path.
172
- def pattern_for(path)
173
- atoms = path.to_s.split('/').grep(/\S/)
174
- atoms.unshift('')
175
- patterns, joiner = [], '/'
176
-
177
- atoms.size.times do |enum|
178
- enum += 1
179
- pattern = atoms.dup
180
-
181
- controller = pattern[0, enum].join(joiner)
182
- controller.gsub!(/^__/, '/')
183
- controller = "/" if controller == ""
184
-
185
- pattern = pattern[enum..-1]
186
- args, temp = [], []
187
-
188
- patterns << [controller, 'index', atoms[enum..-1]]
189
-
190
- until pattern.empty?
191
- args << pattern.shift
192
- joined = args.join('__')
193
- patterns << [controller, joined, pattern.dup]
194
- patterns << [controller, "#{joined}__index", pattern.dup]
186
+ # Iterator that yields potential ways in which a given path could be mapped
187
+ # to controller, action and params. It produces them in strict order, with
188
+ # longest controller path favoured, then longest action path.
189
+
190
+ def patterns_for path
191
+ # Split into fragments, and remove empty ones (which split may have output).
192
+ # The to_s is vital as sometimes we are passed an array.
193
+ fragments = path.to_s.split '/'
194
+ fragments.delete ''
195
+
196
+ # Work through all the possible splits of controller and 'the rest' (action
197
+ # + params) starting with longest possible controller.
198
+ fragments.length.downto(0) do |ca_split|
199
+ controller = '/' + fragments[0...ca_split].join('/')
200
+
201
+ # Work on the remaining portion, generating all the action/params splits.
202
+ fragments.length.downto(ca_split) do |ap_split|
203
+ action = fragments[ca_split...ap_split].join '__'
204
+ params = fragments[ap_split..-1]
205
+ if action.empty?
206
+ yield controller, 'index', params
207
+ else
208
+ yield controller, "#{action}__index", params
209
+ yield controller, action, params
210
+ end
195
211
  end
196
212
  end
197
-
198
- patterns.reverse!
199
213
  end
200
214
 
201
215
  # Uses custom defined engines and all available engines and throws it
@@ -213,6 +227,11 @@ module Ramaze
213
227
  all_extensions
214
228
  end
215
229
 
230
+ # Raises Ramaze::Error::NoFilter
231
+ # TODO:
232
+ # * is this called at all for anybody?
233
+ # I think everybody does have filters.
234
+
216
235
  def raise_no_filter(path)
217
236
  raise Ramaze::Error::NoFilter, "No Filter found for `#{path}'"
218
237
  end
@@ -44,7 +44,7 @@ module Ramaze
44
44
  begin
45
45
  before.call
46
46
  rescue Object => e
47
- Ramaze::Log.error e
47
+ Ramaze::Log.error e
48
48
  raise
49
49
  end
50
50
  end
@@ -60,7 +60,7 @@ module Ramaze
60
60
  begin
61
61
  after.call
62
62
  rescue Object => e
63
- Ramaze::Log.error e
63
+ Ramaze::Log.error e
64
64
  raise
65
65
  end
66
66
  end
@@ -107,7 +107,14 @@ module Ramaze
107
107
  def params
108
108
  return {} if put?
109
109
  return @ramaze_params if @ramaze_params
110
- @rack_params ||= rack_params
110
+
111
+ begin
112
+ @rack_params ||= rack_params
113
+ rescue EOFError => ex
114
+ @rack_params = {}
115
+ Log.error(ex)
116
+ end
117
+
111
118
  @ramaze_params = {}
112
119
 
113
120
  @rack_params.each do |key, value|
@@ -122,7 +129,13 @@ module Ramaze
122
129
  if i + 1 >= keys.size
123
130
  ref[k] = value
124
131
  else
125
- ref = ref[k] ||= {}
132
+ # in case the value is a string we cannot let it be ref next
133
+ # time, so throw it away
134
+ if ref[k].is_a?(String)
135
+ ref = ref[k] = {}
136
+ else
137
+ ref = ref[k] ||= {}
138
+ end
126
139
  end
127
140
  end
128
141
  else
@@ -177,5 +190,15 @@ module Ramaze
177
190
  keys = keys.map{|k| k.to_s }
178
191
  params.reject{|k,v| not keys.include?(k) }
179
192
  end
193
+
194
+ def domain(path = '/')
195
+ scheme = env['rack.url_scheme'] || 'http'
196
+ host = env['HTTP_HOST']
197
+ URI("#{scheme}://#{host}#{path}")
198
+ end
199
+
200
+ def locales
201
+ env['HTTP_ACCEPT_LANGUAGE'].to_s.split(/(?:,|;q=[\d.,]+)/)
202
+ end
180
203
  end
181
204
  end
@@ -4,9 +4,17 @@
4
4
  module Ramaze
5
5
  class Response < Rack::Response
6
6
  class << self
7
+ # Alias for Current::response
7
8
  def current() Current.response end
8
9
  end
9
10
 
11
+ def initialize(body = [], status = 200, header = {}, &block)
12
+ header['Content-Type'] ||= Global.content_type
13
+ header['Accept-Charset'] = Global.accept_charset if Global.accept_charset
14
+ super
15
+ end
16
+
17
+ # Build/replace this responses data
10
18
  def build(body = body, status = status, header = header)
11
19
  header.each do |key, value|
12
20
  self[key] = value
@@ -1,10 +1,10 @@
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
- if RUBY_VERSION >= "1.9.0"
5
- require 'digest/sha1'
6
- else
4
+ begin
7
5
  require 'digest/sha2'
6
+ rescue LoadError
7
+ require 'digest/sha1'
8
8
  end
9
9
 
10
10
  require 'ramaze/current/session/flash'
@@ -28,6 +28,10 @@ module Ramaze
28
28
 
29
29
  attr_accessor :flash
30
30
 
31
+ # Flag whether or not to drop this session on the floor
32
+
33
+ attr_accessor :dropped
34
+
31
35
  # secret salt for client-side session data
32
36
 
33
37
  trait :secret => 'change_me_please_123'
@@ -46,19 +50,42 @@ module Ramaze
46
50
 
47
51
  # Holds the default cookie used for sessions
48
52
 
49
- COOKIE = { :path => '/' }
53
+ COOKIE = { :path => '/' } unless defined?(COOKIE)
50
54
 
51
- class << self
52
- def current
53
- Current.session
54
- end
55
+ # Shortcut for Current.session
56
+ def self.current
57
+ Current.session
58
+ end
55
59
 
56
- # called from Ramaze::startup and adds Cache.sessions if cookies are
57
- # enabled
60
+ # called from Ramaze::startup and adds Cache.sessions if cookies are
61
+ # enabled
58
62
 
59
- def startup(options = {})
60
- Cache.add(:sessions) if Global.sessions
61
- end
63
+ def self.startup(options = {})
64
+ Cache.add(:sessions) if Global.sessions
65
+ end
66
+
67
+ # retrieve a specific session given a session id
68
+
69
+ def self.[](sess_id)
70
+ Session.new(sess_id)
71
+ end
72
+
73
+ # generate a random (and hopefully unique) id for the current session.
74
+ #
75
+ # It consists of the current time, the current request, the current PID of
76
+ # ruby and object_id of this instance.
77
+ #
78
+ # All this is joined by some calls to Kernel#rand and returned as a
79
+ # Digest::SHA256::hexdigest
80
+
81
+ def self.random_key
82
+ h = [
83
+ Time.now.to_f.to_s, rand,
84
+ Current.request.hash, rand,
85
+ Process.pid, rand,
86
+ object_id, rand
87
+ ].join
88
+ Digest::SHA256.hexdigest(h)
62
89
  end
63
90
 
64
91
  # Initialize a new Session, requires the original Rack::Request instance
@@ -66,17 +93,26 @@ module Ramaze
66
93
  #
67
94
  # sets @session_id and @session_flash
68
95
 
69
- def initialize(request = Current.request)
96
+ def initialize(sess_or_request = Current.request)
70
97
  return unless Global.sessions
71
- @session_id = (request.cookies[SESSION_KEY] || random_key)
72
98
 
73
- unless IP_COUNT.nil?
99
+ if sess_or_request.is_a?(Request)
100
+ request = sess_or_request
101
+ @session_id = request.cookies[SESSION_KEY] || Session.random_key
102
+ else
103
+ request = nil
104
+ @session_id = sess_or_request
105
+ end
106
+
107
+ unless IP_COUNT.nil? or request.nil?
74
108
  ip = request.ip
75
109
  IP_COUNT[ip] << @session_id
76
110
  sessions.delete(IP_COUNT[ip].shift) if IP_COUNT[ip].size > IP_COUNT_LIMIT
77
111
  end
78
112
 
79
- @flash = Ramaze::Session::Flash.new
113
+ @flash = Session::Flash.new(self)
114
+ @current = nil
115
+ @dropped = false
80
116
  end
81
117
 
82
118
  # relay all messages we don't understand to the currently active session
@@ -89,7 +125,10 @@ module Ramaze
89
125
  # existing already, the session itself is an instance of SessionHash
90
126
 
91
127
  def current
92
- sessions[session_id] ||= Session::Hash.new
128
+ unless @current
129
+ @current = ( sessions[session_id] ||= Session::Hash.new(self) )
130
+ end
131
+ @current
93
132
  end
94
133
 
95
134
  # shortcut to Cache.sessions
@@ -98,30 +137,18 @@ module Ramaze
98
137
  Cache.sessions
99
138
  end
100
139
 
101
- # generate a random (and hopefully unique) id for the current session.
102
- #
103
- # It consists of the current time, the current request, the current PID of
104
- # ruby and object_id of this instance.
105
- #
106
- # All this is joined by some calls to Kernel#rand and returned as a
107
- # Digest::SHA256::hexdigest
108
-
109
- def random_key
110
- h = [
111
- Time.now.to_f.to_s, rand,
112
- Current.request.hash, rand,
113
- Process.pid, rand,
114
- object_id, rand
115
- ].join
116
- Digest::SHA256.hexdigest(h)
117
- end
118
-
119
140
  # Inspect on Session.current
120
141
 
121
142
  def inspect
122
143
  current.inspect
123
144
  end
124
145
 
146
+ # don't finish this session
147
+
148
+ def drop!
149
+ self.dropped = true
150
+ end
151
+
125
152
  # at the end of a request delete the current[:FLASH] and assign it to
126
153
  # current[:FLASH_PREVIOUS]
127
154
  #
@@ -133,6 +160,7 @@ module Ramaze
133
160
 
134
161
  def finish
135
162
  return unless Global.sessions
163
+ return if dropped
136
164
 
137
165
  old = current.delete(:FLASH)
138
166
  current[:FLASH_PREVIOUS] = old if old