Pistos-ramaze 2008.09

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 (588) hide show
  1. data/README.markdown +481 -0
  2. data/Rakefile +228 -0
  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 +80 -0
  22. data/doc/AUTHORS +29 -0
  23. data/doc/CHANGELOG +19530 -0
  24. data/doc/COPYING +56 -0
  25. data/doc/FAQ +92 -0
  26. data/doc/GPL +339 -0
  27. data/doc/INSTALL +92 -0
  28. data/doc/LEGAL +26 -0
  29. data/doc/TODO +29 -0
  30. data/doc/meta/announcement.txt +99 -0
  31. data/doc/meta/configuration.txt +163 -0
  32. data/doc/meta/internals.txt +278 -0
  33. data/doc/meta/users.kml +64 -0
  34. data/doc/readme_chunks/appendix.txt +10 -0
  35. data/doc/readme_chunks/examples.txt +38 -0
  36. data/doc/readme_chunks/features.txt +148 -0
  37. data/doc/readme_chunks/getting_help.txt +5 -0
  38. data/doc/readme_chunks/getting_started.txt +18 -0
  39. data/doc/readme_chunks/installing.txt +92 -0
  40. data/doc/readme_chunks/introduction.txt +18 -0
  41. data/doc/readme_chunks/principles.txt +56 -0
  42. data/doc/readme_chunks/thanks.txt +59 -0
  43. data/doc/tutorial/todolist.html +742 -0
  44. data/doc/tutorial/todolist.mkd +787 -0
  45. data/examples/app/auth/auth.rb +54 -0
  46. data/examples/app/auth/template/layout.haml +20 -0
  47. data/examples/app/auth/template/login.haml +16 -0
  48. data/examples/app/blog/README +3 -0
  49. data/examples/app/blog/controller/main.rb +29 -0
  50. data/examples/app/blog/model/entry.rb +30 -0
  51. data/examples/app/blog/public/styles/blog.css +132 -0
  52. data/examples/app/blog/spec/blog.rb +87 -0
  53. data/examples/app/blog/start.rb +7 -0
  54. data/examples/app/blog/view/edit.xhtml +17 -0
  55. data/examples/app/blog/view/index.xhtml +17 -0
  56. data/examples/app/blog/view/layout.xhtml +11 -0
  57. data/examples/app/blog/view/new.xhtml +16 -0
  58. data/examples/app/chat/model/history.rb +36 -0
  59. data/examples/app/chat/model/message.rb +7 -0
  60. data/examples/app/chat/public/css/chat.css +13 -0
  61. data/examples/app/chat/public/js/chat.js +22 -0
  62. data/examples/app/chat/public/js/jquery.js +3436 -0
  63. data/examples/app/chat/start.rb +40 -0
  64. data/examples/app/chat/view/chat.xhtml +9 -0
  65. data/examples/app/chat/view/index.xhtml +7 -0
  66. data/examples/app/chat/view/layout.xhtml +13 -0
  67. data/examples/app/localization/start.rb +35 -0
  68. data/examples/app/rapaste/Rakefile +34 -0
  69. data/examples/app/rapaste/controller/paste.rb +101 -0
  70. data/examples/app/rapaste/model/paste.rb +58 -0
  71. data/examples/app/rapaste/public/css/active4d.css +114 -0
  72. data/examples/app/rapaste/public/css/all_hallows_eve.css +72 -0
  73. data/examples/app/rapaste/public/css/amy.css +147 -0
  74. data/examples/app/rapaste/public/css/blackboard.css +88 -0
  75. data/examples/app/rapaste/public/css/brilliance_black.css +605 -0
  76. data/examples/app/rapaste/public/css/brilliance_dull.css +599 -0
  77. data/examples/app/rapaste/public/css/cobalt.css +149 -0
  78. data/examples/app/rapaste/public/css/dawn.css +121 -0
  79. data/examples/app/rapaste/public/css/display.css +197 -0
  80. data/examples/app/rapaste/public/css/eiffel.css +121 -0
  81. data/examples/app/rapaste/public/css/espresso_libre.css +109 -0
  82. data/examples/app/rapaste/public/css/idle.css +62 -0
  83. data/examples/app/rapaste/public/css/iplastic.css +80 -0
  84. data/examples/app/rapaste/public/css/lazy.css +73 -0
  85. data/examples/app/rapaste/public/css/mac_classic.css +123 -0
  86. data/examples/app/rapaste/public/css/magicwb_amiga.css +104 -0
  87. data/examples/app/rapaste/public/css/pastels_on_dark.css +188 -0
  88. data/examples/app/rapaste/public/css/slush_poppies.css +85 -0
  89. data/examples/app/rapaste/public/css/spacecadet.css +51 -0
  90. data/examples/app/rapaste/public/css/sunburst.css +180 -0
  91. data/examples/app/rapaste/public/css/twilight.css +137 -0
  92. data/examples/app/rapaste/public/css/zenburnesque.css +91 -0
  93. data/examples/app/rapaste/public/js/jquery.js +11 -0
  94. data/examples/app/rapaste/spec/rapaste.rb +51 -0
  95. data/examples/app/rapaste/start.rb +25 -0
  96. data/examples/app/rapaste/view/copy.xhtml +10 -0
  97. data/examples/app/rapaste/view/index.xhtml +9 -0
  98. data/examples/app/rapaste/view/layout.xhtml +25 -0
  99. data/examples/app/rapaste/view/list.xhtml +29 -0
  100. data/examples/app/rapaste/view/search.xhtml +41 -0
  101. data/examples/app/rapaste/view/view.xhtml +37 -0
  102. data/examples/app/sourceview/public/coderay.css +104 -0
  103. data/examples/app/sourceview/public/images/file.gif +0 -0
  104. data/examples/app/sourceview/public/images/folder.gif +0 -0
  105. data/examples/app/sourceview/public/images/tv-collapsable-last.gif +0 -0
  106. data/examples/app/sourceview/public/images/tv-collapsable.gif +0 -0
  107. data/examples/app/sourceview/public/images/tv-expandable-last.gif +0 -0
  108. data/examples/app/sourceview/public/images/tv-expandable.gif +0 -0
  109. data/examples/app/sourceview/public/images/tv-item-last.gif +0 -0
  110. data/examples/app/sourceview/public/images/tv-item.gif +0 -0
  111. data/examples/app/sourceview/public/jquery.js +11 -0
  112. data/examples/app/sourceview/public/jquery.treeview.css +48 -0
  113. data/examples/app/sourceview/public/jquery.treeview.js +223 -0
  114. data/examples/app/sourceview/public/sourceview.js +52 -0
  115. data/examples/app/sourceview/sourceview.rb +77 -0
  116. data/examples/app/sourceview/template/index.haml +59 -0
  117. data/examples/app/todolist/README +1 -0
  118. data/examples/app/todolist/public/favicon.ico +0 -0
  119. data/examples/app/todolist/public/js/jquery.js +1923 -0
  120. data/examples/app/todolist/public/ramaze.png +0 -0
  121. data/examples/app/todolist/spec/todolist.rb +132 -0
  122. data/examples/app/todolist/src/controller/main.rb +70 -0
  123. data/examples/app/todolist/src/element/page.rb +31 -0
  124. data/examples/app/todolist/src/model.rb +14 -0
  125. data/examples/app/todolist/start.rb +11 -0
  126. data/examples/app/todolist/template/index.xhtml +17 -0
  127. data/examples/app/todolist/template/new.xhtml +7 -0
  128. data/examples/app/upload/start.rb +19 -0
  129. data/examples/app/upload/view/index.xhtml +25 -0
  130. data/examples/app/whywiki/spec/whywiki.rb +58 -0
  131. data/examples/app/whywiki/start.rb +46 -0
  132. data/examples/app/whywiki/template/edit.xhtml +14 -0
  133. data/examples/app/whywiki/template/show.xhtml +18 -0
  134. data/examples/app/wikore/spec/wikore.rb +111 -0
  135. data/examples/app/wikore/src/controller.rb +80 -0
  136. data/examples/app/wikore/src/model.rb +53 -0
  137. data/examples/app/wikore/start.rb +9 -0
  138. data/examples/app/wikore/template/index.xhtml +8 -0
  139. data/examples/app/wiktacular/README +2 -0
  140. data/examples/app/wiktacular/mkd/link/2007-07-20_19-45-51.mkd +1 -0
  141. data/examples/app/wiktacular/mkd/link/current.mkd +1 -0
  142. data/examples/app/wiktacular/mkd/main/2007-07-20_16-31-33.mkd +1 -0
  143. data/examples/app/wiktacular/mkd/main/2007-07-20_19-21-12.mkd +1 -0
  144. data/examples/app/wiktacular/mkd/main/2007-07-20_19-23-10.mkd +2 -0
  145. data/examples/app/wiktacular/mkd/main/2007-07-20_19-45-07.mkd +2 -0
  146. data/examples/app/wiktacular/mkd/main/current.mkd +2 -0
  147. data/examples/app/wiktacular/mkd/markdown/current.mkd +3 -0
  148. data/examples/app/wiktacular/mkd/testing/2007-07-20_16-43-46.mkd +2 -0
  149. data/examples/app/wiktacular/mkd/testing/2007-07-20_19-43-50.mkd +3 -0
  150. data/examples/app/wiktacular/mkd/testing/2007-07-21_18-46-01.mkd +11 -0
  151. data/examples/app/wiktacular/mkd/testing/2007-07-21_18-46-32.mkd +13 -0
  152. data/examples/app/wiktacular/mkd/testing/2007-07-21_18-47-08.mkd +17 -0
  153. data/examples/app/wiktacular/mkd/testing/2007-07-21_18-47-54.mkd +17 -0
  154. data/examples/app/wiktacular/mkd/testing/current.mkd +17 -0
  155. data/examples/app/wiktacular/public/favicon.ico +0 -0
  156. data/examples/app/wiktacular/public/screen.css +72 -0
  157. data/examples/app/wiktacular/spec/wiktacular.rb +157 -0
  158. data/examples/app/wiktacular/src/controller.rb +55 -0
  159. data/examples/app/wiktacular/src/model.rb +102 -0
  160. data/examples/app/wiktacular/start.rb +8 -0
  161. data/examples/app/wiktacular/template/edit.xhtml +6 -0
  162. data/examples/app/wiktacular/template/html_layout.xhtml +27 -0
  163. data/examples/app/wiktacular/template/index.xhtml +9 -0
  164. data/examples/app/wiktacular/template/new.xhtml +6 -0
  165. data/examples/basic/element.rb +45 -0
  166. data/examples/basic/gestalt.rb +27 -0
  167. data/examples/basic/hello.rb +15 -0
  168. data/examples/basic/layout.rb +28 -0
  169. data/examples/basic/linking.rb +29 -0
  170. data/examples/basic/simple.rb +56 -0
  171. data/examples/helpers/cache.rb +31 -0
  172. data/examples/helpers/form_with_sequel.rb +24 -0
  173. data/examples/helpers/httpdigest.rb +50 -0
  174. data/examples/helpers/identity.rb +18 -0
  175. data/examples/helpers/nitro_form.rb +23 -0
  176. data/examples/helpers/paginate.rb +71 -0
  177. data/examples/helpers/provide.rb +23 -0
  178. data/examples/helpers/rest.rb +28 -0
  179. data/examples/helpers/simple_captcha.rb +29 -0
  180. data/examples/misc/css.rb +37 -0
  181. data/examples/misc/facebook.rb +159 -0
  182. data/examples/misc/memleak_detector.rb +32 -0
  183. data/examples/misc/nagoro_element.rb +43 -0
  184. data/examples/misc/ramaise.rb +132 -0
  185. data/examples/misc/rapp.rb +45 -0
  186. data/examples/misc/sequel_scaffolding.rb +34 -0
  187. data/examples/misc/simple_auth.rb +35 -0
  188. data/examples/templates/template/external.amrita +19 -0
  189. data/examples/templates/template/external.haml +22 -0
  190. data/examples/templates/template/external.liquid +28 -0
  191. data/examples/templates/template/external.mab +30 -0
  192. data/examples/templates/template/external.nag +28 -0
  193. data/examples/templates/template/external.redcloth +19 -0
  194. data/examples/templates/template/external.rem +30 -0
  195. data/examples/templates/template/external.rhtml +28 -0
  196. data/examples/templates/template/external.tenjin +28 -0
  197. data/examples/templates/template/external.xsl +57 -0
  198. data/examples/templates/template/external.zmr +28 -0
  199. data/examples/templates/template_amrita2.rb +74 -0
  200. data/examples/templates/template_erubis.rb +53 -0
  201. data/examples/templates/template_ezamar.rb +50 -0
  202. data/examples/templates/template_haml.rb +50 -0
  203. data/examples/templates/template_liquid.rb +65 -0
  204. data/examples/templates/template_markaby.rb +58 -0
  205. data/examples/templates/template_nagoro.rb +51 -0
  206. data/examples/templates/template_redcloth.rb +59 -0
  207. data/examples/templates/template_remarkably.rb +55 -0
  208. data/examples/templates/template_tenjin.rb +53 -0
  209. data/examples/templates/template_xslt.rb +49 -0
  210. data/lib/proto/controller/init.rb +10 -0
  211. data/lib/proto/controller/main.rb +20 -0
  212. data/lib/proto/model/init.rb +4 -0
  213. data/lib/proto/public/css/ramaze_error.css +90 -0
  214. data/lib/proto/public/dispatch.fcgi +11 -0
  215. data/lib/proto/public/favicon.ico +0 -0
  216. data/lib/proto/public/js/jquery.js +3549 -0
  217. data/lib/proto/public/ramaze.png +0 -0
  218. data/lib/proto/spec/main.rb +25 -0
  219. data/lib/proto/start.rb +8 -0
  220. data/lib/proto/start.ru +16 -0
  221. data/lib/proto/view/error.xhtml +64 -0
  222. data/lib/proto/view/index.xhtml +34 -0
  223. data/lib/proto/view/page.xhtml +27 -0
  224. data/lib/ramaze/action/render.rb +191 -0
  225. data/lib/ramaze/action.rb +153 -0
  226. data/lib/ramaze/adapter/base.rb +128 -0
  227. data/lib/ramaze/adapter/cgi.rb +20 -0
  228. data/lib/ramaze/adapter/ebb.rb +18 -0
  229. data/lib/ramaze/adapter/evented_mongrel.rb +7 -0
  230. data/lib/ramaze/adapter/fake.rb +12 -0
  231. data/lib/ramaze/adapter/fcgi.rb +18 -0
  232. data/lib/ramaze/adapter/lsws.rb +19 -0
  233. data/lib/ramaze/adapter/mongrel.rb +21 -0
  234. data/lib/ramaze/adapter/scgi.rb +18 -0
  235. data/lib/ramaze/adapter/swiftiplied_mongrel.rb +7 -0
  236. data/lib/ramaze/adapter/thin.rb +17 -0
  237. data/lib/ramaze/adapter/webrick.rb +43 -0
  238. data/lib/ramaze/adapter.rb +97 -0
  239. data/lib/ramaze/cache/memcached.rb +69 -0
  240. data/lib/ramaze/cache/memory.rb +6 -0
  241. data/lib/ramaze/cache/yaml_store.rb +68 -0
  242. data/lib/ramaze/cache.rb +113 -0
  243. data/lib/ramaze/contrib/auto_params/get_args.rb +58 -0
  244. data/lib/ramaze/contrib/auto_params.rb +135 -0
  245. data/lib/ramaze/contrib/email.rb +84 -0
  246. data/lib/ramaze/contrib/facebook/facebook.rb +171 -0
  247. data/lib/ramaze/contrib/facebook.rb +23 -0
  248. data/lib/ramaze/contrib/file_cache.rb +65 -0
  249. data/lib/ramaze/contrib/gems.rb +78 -0
  250. data/lib/ramaze/contrib/gettext/mo.rb +155 -0
  251. data/lib/ramaze/contrib/gettext/parser.rb +46 -0
  252. data/lib/ramaze/contrib/gettext/po.rb +109 -0
  253. data/lib/ramaze/contrib/gettext.rb +113 -0
  254. data/lib/ramaze/contrib/gzip_filter.rb +69 -0
  255. data/lib/ramaze/contrib/maruku_uv.rb +59 -0
  256. data/lib/ramaze/contrib/profiling.rb +36 -0
  257. data/lib/ramaze/contrib/rest.rb +17 -0
  258. data/lib/ramaze/contrib/sequel/create_join.rb +25 -0
  259. data/lib/ramaze/contrib/sequel/fill.rb +12 -0
  260. data/lib/ramaze/contrib/sequel/form_field.rb +129 -0
  261. data/lib/ramaze/contrib/sequel/image.rb +198 -0
  262. data/lib/ramaze/contrib/sequel/relation.rb +82 -0
  263. data/lib/ramaze/contrib/sequel_cache.rb +92 -0
  264. data/lib/ramaze/contrib.rb +82 -0
  265. data/lib/ramaze/controller/error.rb +46 -0
  266. data/lib/ramaze/controller/main.rb +2 -0
  267. data/lib/ramaze/controller/resolve.rb +273 -0
  268. data/lib/ramaze/controller.rb +280 -0
  269. data/lib/ramaze/current/request.rb +205 -0
  270. data/lib/ramaze/current/response.rb +39 -0
  271. data/lib/ramaze/current/session/flash.rb +87 -0
  272. data/lib/ramaze/current/session/hash.rb +66 -0
  273. data/lib/ramaze/current/session.rb +181 -0
  274. data/lib/ramaze/current.rb +110 -0
  275. data/lib/ramaze/dispatcher/action.rb +48 -0
  276. data/lib/ramaze/dispatcher/directory.rb +119 -0
  277. data/lib/ramaze/dispatcher/error.rb +108 -0
  278. data/lib/ramaze/dispatcher/file.rb +95 -0
  279. data/lib/ramaze/dispatcher.rb +145 -0
  280. data/lib/ramaze/error.rb +24 -0
  281. data/lib/ramaze/gestalt.rb +124 -0
  282. data/lib/ramaze/helper/aspect.rb +106 -0
  283. data/lib/ramaze/helper/auth.rb +125 -0
  284. data/lib/ramaze/helper/cache.rb +140 -0
  285. data/lib/ramaze/helper/cgi.rb +39 -0
  286. data/lib/ramaze/helper/flash.rb +59 -0
  287. data/lib/ramaze/helper/form.rb +281 -0
  288. data/lib/ramaze/helper/formatting.rb +158 -0
  289. data/lib/ramaze/helper/gestalt.rb +15 -0
  290. data/lib/ramaze/helper/gravatar.rb +15 -0
  291. data/lib/ramaze/helper/httpdigest.rb +59 -0
  292. data/lib/ramaze/helper/identity.rb +119 -0
  293. data/lib/ramaze/helper/link.rb +122 -0
  294. data/lib/ramaze/helper/markaby.rb +31 -0
  295. data/lib/ramaze/helper/maruku.rb +7 -0
  296. data/lib/ramaze/helper/nitroform.rb +14 -0
  297. data/lib/ramaze/helper/pager.rb +366 -0
  298. data/lib/ramaze/helper/paginate.rb +234 -0
  299. data/lib/ramaze/helper/partial.rb +105 -0
  300. data/lib/ramaze/helper/redirect.rb +82 -0
  301. data/lib/ramaze/helper/rest.rb +43 -0
  302. data/lib/ramaze/helper/sendfile.rb +16 -0
  303. data/lib/ramaze/helper/sequel.rb +55 -0
  304. data/lib/ramaze/helper/simple_captcha.rb +31 -0
  305. data/lib/ramaze/helper/stack.rb +77 -0
  306. data/lib/ramaze/helper/tagz.rb +19 -0
  307. data/lib/ramaze/helper/thread.rb +17 -0
  308. data/lib/ramaze/helper/ultraviolet.rb +44 -0
  309. data/lib/ramaze/helper/user.rb +110 -0
  310. data/lib/ramaze/helper/xhtml.rb +23 -0
  311. data/lib/ramaze/helper.rb +79 -0
  312. data/lib/ramaze/log/analogger.rb +40 -0
  313. data/lib/ramaze/log/growl.rb +38 -0
  314. data/lib/ramaze/log/hub.rb +41 -0
  315. data/lib/ramaze/log/informer.rb +128 -0
  316. data/lib/ramaze/log/knotify.rb +28 -0
  317. data/lib/ramaze/log/logger.rb +26 -0
  318. data/lib/ramaze/log/logging.rb +89 -0
  319. data/lib/ramaze/log/syslog.rb +51 -0
  320. data/lib/ramaze/log/xosd.rb +92 -0
  321. data/lib/ramaze/log.rb +27 -0
  322. data/lib/ramaze/option/dsl.rb +45 -0
  323. data/lib/ramaze/option/holder.rb +131 -0
  324. data/lib/ramaze/option/merger.rb +108 -0
  325. data/lib/ramaze/option.rb +156 -0
  326. data/lib/ramaze/reloader.rb +186 -0
  327. data/lib/ramaze/route.rb +97 -0
  328. data/lib/ramaze/setup.rb +50 -0
  329. data/lib/ramaze/snippets/array/put_within.rb +44 -0
  330. data/lib/ramaze/snippets/binding/locals.rb +25 -0
  331. data/lib/ramaze/snippets/blankslate.rb +7 -0
  332. data/lib/ramaze/snippets/dictionary.rb +504 -0
  333. data/lib/ramaze/snippets/divide.rb +20 -0
  334. data/lib/ramaze/snippets/fiber.rb +63 -0
  335. data/lib/ramaze/snippets/kernel/constant.rb +41 -0
  336. data/lib/ramaze/snippets/kernel/pretty_inspect.rb +21 -0
  337. data/lib/ramaze/snippets/metaid.rb +17 -0
  338. data/lib/ramaze/snippets/numeric/filesize_format.rb +32 -0
  339. data/lib/ramaze/snippets/numeric/time.rb +63 -0
  340. data/lib/ramaze/snippets/object/__dir__.rb +29 -0
  341. data/lib/ramaze/snippets/object/acquire.rb +40 -0
  342. data/lib/ramaze/snippets/object/instance_variable_defined.rb +19 -0
  343. data/lib/ramaze/snippets/object/pretty.rb +16 -0
  344. data/lib/ramaze/snippets/object/scope.rb +18 -0
  345. data/lib/ramaze/snippets/object/traits.rb +76 -0
  346. data/lib/ramaze/snippets/ordered_set.rb +51 -0
  347. data/lib/ramaze/snippets/proc/locals.rb +19 -0
  348. data/lib/ramaze/snippets/ramaze/caller_info.rb +30 -0
  349. data/lib/ramaze/snippets/ramaze/caller_lines.rb +51 -0
  350. data/lib/ramaze/snippets/ramaze/deprecated.rb +20 -0
  351. data/lib/ramaze/snippets/ramaze/fiber.rb +24 -0
  352. data/lib/ramaze/snippets/ramaze/state.rb +86 -0
  353. data/lib/ramaze/snippets/ramaze/struct.rb +45 -0
  354. data/lib/ramaze/snippets/string/camel_case.rb +21 -0
  355. data/lib/ramaze/snippets/string/color.rb +31 -0
  356. data/lib/ramaze/snippets/string/each.rb +19 -0
  357. data/lib/ramaze/snippets/string/end_with.rb +20 -0
  358. data/lib/ramaze/snippets/string/esc.rb +34 -0
  359. data/lib/ramaze/snippets/string/ord.rb +21 -0
  360. data/lib/ramaze/snippets/string/snake_case.rb +21 -0
  361. data/lib/ramaze/snippets/string/start_with.rb +19 -0
  362. data/lib/ramaze/snippets/string/unindent.rb +28 -0
  363. data/lib/ramaze/snippets/thread/into.rb +18 -0
  364. data/lib/ramaze/snippets.rb +22 -0
  365. data/lib/ramaze/spec/helper/bacon.rb +7 -0
  366. data/lib/ramaze/spec/helper/browser.rb +88 -0
  367. data/lib/ramaze/spec/helper/mock_http.rb +63 -0
  368. data/lib/ramaze/spec/helper/pretty_output.rb +82 -0
  369. data/lib/ramaze/spec/helper/requester.rb +63 -0
  370. data/lib/ramaze/spec/helper/simple_http.rb +434 -0
  371. data/lib/ramaze/spec/helper/snippets.rb +14 -0
  372. data/lib/ramaze/spec/helper.rb +135 -0
  373. data/lib/ramaze/spec.rb +1 -0
  374. data/lib/ramaze/store/default.rb +109 -0
  375. data/lib/ramaze/template/amrita2.rb +45 -0
  376. data/lib/ramaze/template/builder.rb +28 -0
  377. data/lib/ramaze/template/erubis.rb +41 -0
  378. data/lib/ramaze/template/ezamar/element.rb +169 -0
  379. data/lib/ramaze/template/ezamar/engine.rb +76 -0
  380. data/lib/ramaze/template/ezamar/morpher.rb +135 -0
  381. data/lib/ramaze/template/ezamar/render_partial.rb +31 -0
  382. data/lib/ramaze/template/ezamar/textpow.syntax +34 -0
  383. data/lib/ramaze/template/ezamar.rb +42 -0
  384. data/lib/ramaze/template/haml.rb +37 -0
  385. data/lib/ramaze/template/liquid.rb +36 -0
  386. data/lib/ramaze/template/markaby.rb +52 -0
  387. data/lib/ramaze/template/maruku.rb +34 -0
  388. data/lib/ramaze/template/nagoro.rb +52 -0
  389. data/lib/ramaze/template/none.rb +14 -0
  390. data/lib/ramaze/template/redcloth.rb +25 -0
  391. data/lib/ramaze/template/remarkably.rb +38 -0
  392. data/lib/ramaze/template/sass.rb +37 -0
  393. data/lib/ramaze/template/tagz.rb +79 -0
  394. data/lib/ramaze/template/tenjin.rb +74 -0
  395. data/lib/ramaze/template/xslt.rb +100 -0
  396. data/lib/ramaze/template.rb +87 -0
  397. data/lib/ramaze/tool/create.rb +48 -0
  398. data/lib/ramaze/tool/daemonize.rb +37 -0
  399. data/lib/ramaze/tool/localize.rb +202 -0
  400. data/lib/ramaze/tool/mime.rb +35 -0
  401. data/lib/ramaze/tool/mime_types.yaml +615 -0
  402. data/lib/ramaze/tool/project_creator.rb +110 -0
  403. data/lib/ramaze/tool/record.rb +6 -0
  404. data/lib/ramaze/tool.rb +9 -0
  405. data/lib/ramaze/trinity.rb +16 -0
  406. data/lib/ramaze/version.rb +6 -0
  407. data/lib/ramaze.rb +133 -0
  408. data/lib/vendor/bacon.rb +323 -0
  409. data/rake_tasks/conf.rake +71 -0
  410. data/rake_tasks/coverage.rake +46 -0
  411. data/rake_tasks/gem.rake +74 -0
  412. data/rake_tasks/git.rake +41 -0
  413. data/rake_tasks/maintenance.rake +386 -0
  414. data/rake_tasks/metric.rake +24 -0
  415. data/rake_tasks/release.rake +76 -0
  416. data/rake_tasks/spec.rake +61 -0
  417. data/ramaze.gemspec +773 -0
  418. data/spec/contrib/auto_params.rb +121 -0
  419. data/spec/contrib/profiling.rb +29 -0
  420. data/spec/contrib/sequel/fill.rb +47 -0
  421. data/spec/examples/caching.rb +19 -0
  422. data/spec/examples/css.rb +15 -0
  423. data/spec/examples/element.rb +15 -0
  424. data/spec/examples/hello.rb +11 -0
  425. data/spec/examples/linking.rb +18 -0
  426. data/spec/examples/simple.rb +45 -0
  427. data/spec/examples/simple_auth.rb +32 -0
  428. data/spec/examples/templates/template_amrita2.rb +16 -0
  429. data/spec/examples/templates/template_erubis.rb +23 -0
  430. data/spec/examples/templates/template_ezamar.rb +23 -0
  431. data/spec/examples/templates/template_haml.rb +23 -0
  432. data/spec/examples/templates/template_liquid.rb +29 -0
  433. data/spec/examples/templates/template_markaby.rb +23 -0
  434. data/spec/examples/templates/template_redcloth.rb +28 -0
  435. data/spec/examples/templates/template_remarkably.rb +23 -0
  436. data/spec/examples/templates/template_tenjin.rb +28 -0
  437. data/spec/helper.rb +3 -0
  438. data/spec/ramaze/action/basics.rb +36 -0
  439. data/spec/ramaze/action/cache.rb +87 -0
  440. data/spec/ramaze/action/file_cache.rb +70 -0
  441. data/spec/ramaze/action/layout.rb +190 -0
  442. data/spec/ramaze/action/render.rb +31 -0
  443. data/spec/ramaze/action/view/bar.xhtml +1 -0
  444. data/spec/ramaze/action/view/instancevars/layout.xhtml +1 -0
  445. data/spec/ramaze/action/view/other_wrapper.xhtml +1 -0
  446. data/spec/ramaze/action/view/single_wrapper.xhtml +1 -0
  447. data/spec/ramaze/action/view/sub/sub_wrapper.xhtml +1 -0
  448. data/spec/ramaze/adapter/ebb.rb +12 -0
  449. data/spec/ramaze/adapter/mongrel.rb +12 -0
  450. data/spec/ramaze/adapter/record.rb +31 -0
  451. data/spec/ramaze/adapter/webrick.rb +12 -0
  452. data/spec/ramaze/adapter.rb +49 -0
  453. data/spec/ramaze/cache.rb +140 -0
  454. data/spec/ramaze/controller/actionless_templates.rb +32 -0
  455. data/spec/ramaze/controller/resolve.rb +32 -0
  456. data/spec/ramaze/controller/subclass.rb +36 -0
  457. data/spec/ramaze/controller/template_resolving.rb +113 -0
  458. data/spec/ramaze/controller/view/bar.xhtml +1 -0
  459. data/spec/ramaze/controller/view/base/another.xhtml +1 -0
  460. data/spec/ramaze/controller/view/greet.xhtml +1 -0
  461. data/spec/ramaze/controller/view/list.xhtml +1 -0
  462. data/spec/ramaze/controller/view/other/greet/other.xhtml +1 -0
  463. data/spec/ramaze/controller/view/other_wrapper.xhtml +1 -0
  464. data/spec/ramaze/controller.rb +180 -0
  465. data/spec/ramaze/current/request.rb +30 -0
  466. data/spec/ramaze/current/session.rb +97 -0
  467. data/spec/ramaze/dispatcher/directory.rb +55 -0
  468. data/spec/ramaze/dispatcher/file.rb +60 -0
  469. data/spec/ramaze/dispatcher/public/favicon.ico +0 -0
  470. data/spec/ramaze/dispatcher/public/file name.txt +1 -0
  471. data/spec/ramaze/dispatcher/public/test_download.css +141 -0
  472. data/spec/ramaze/dispatcher.rb +31 -0
  473. data/spec/ramaze/element.rb +107 -0
  474. data/spec/ramaze/error.rb +94 -0
  475. data/spec/ramaze/gestalt.rb +131 -0
  476. data/spec/ramaze/helper/aspect.rb +101 -0
  477. data/spec/ramaze/helper/auth.rb +66 -0
  478. data/spec/ramaze/helper/cache.rb +160 -0
  479. data/spec/ramaze/helper/cgi.rb +43 -0
  480. data/spec/ramaze/helper/file.rb +18 -0
  481. data/spec/ramaze/helper/flash.rb +133 -0
  482. data/spec/ramaze/helper/form.rb +118 -0
  483. data/spec/ramaze/helper/formatting.rb +54 -0
  484. data/spec/ramaze/helper/link.rb +124 -0
  485. data/spec/ramaze/helper/pager.rb +99 -0
  486. data/spec/ramaze/helper/partial.rb +88 -0
  487. data/spec/ramaze/helper/redirect.rb +112 -0
  488. data/spec/ramaze/helper/simple_captcha.rb +22 -0
  489. data/spec/ramaze/helper/stack.rb +73 -0
  490. data/spec/ramaze/helper/user.rb +43 -0
  491. data/spec/ramaze/helper/view/locals.xhtml +1 -0
  492. data/spec/ramaze/helper/view/loop.xhtml +4 -0
  493. data/spec/ramaze/helper/view/num.xhtml +1 -0
  494. data/spec/ramaze/helper/view/partial.xhtml +1 -0
  495. data/spec/ramaze/helper/view/recursive.xhtml +8 -0
  496. data/spec/ramaze/helper/view/recursive_local_ivars.xhtml +7 -0
  497. data/spec/ramaze/helper/view/recursive_locals.xhtml +7 -0
  498. data/spec/ramaze/helper/view/test_template.xhtml +1 -0
  499. data/spec/ramaze/localize.rb +89 -0
  500. data/spec/ramaze/log/informer.rb +72 -0
  501. data/spec/ramaze/log/syslog.rb +73 -0
  502. data/spec/ramaze/morpher.rb +111 -0
  503. data/spec/ramaze/params.rb +157 -0
  504. data/spec/ramaze/public/error404.xhtml +1 -0
  505. data/spec/ramaze/public/favicon.ico +0 -0
  506. data/spec/ramaze/public/ramaze.png +0 -0
  507. data/spec/ramaze/public/test_download.css +141 -0
  508. data/spec/ramaze/request/ebb.rb +9 -0
  509. data/spec/ramaze/request/mongrel.rb +9 -0
  510. data/spec/ramaze/request/thin.rb +9 -0
  511. data/spec/ramaze/request/webrick.rb +5 -0
  512. data/spec/ramaze/request.rb +185 -0
  513. data/spec/ramaze/rewrite/file.css +1 -0
  514. data/spec/ramaze/rewrite.rb +36 -0
  515. data/spec/ramaze/route.rb +131 -0
  516. data/spec/ramaze/session.rb +94 -0
  517. data/spec/ramaze/store/default.rb +71 -0
  518. data/spec/ramaze/struct.rb +47 -0
  519. data/spec/ramaze/template/amrita2/external.amrita +6 -0
  520. data/spec/ramaze/template/amrita2/sum.amrita +1 -0
  521. data/spec/ramaze/template/amrita2.rb +50 -0
  522. data/spec/ramaze/template/builder/external.rxml +3 -0
  523. data/spec/ramaze/template/builder.rb +51 -0
  524. data/spec/ramaze/template/erubis/sum.rhtml +1 -0
  525. data/spec/ramaze/template/erubis.rb +41 -0
  526. data/spec/ramaze/template/ezamar/another/long/action.zmr +1 -0
  527. data/spec/ramaze/template/ezamar/combined.zmr +1 -0
  528. data/spec/ramaze/template/ezamar/file_only.zmr +1 -0
  529. data/spec/ramaze/template/ezamar/index.zmr +1 -0
  530. data/spec/ramaze/template/ezamar/nested.zmr +1 -0
  531. data/spec/ramaze/template/ezamar/other__index.xhtml +1 -0
  532. data/spec/ramaze/template/ezamar/some__long__action.zmr +1 -0
  533. data/spec/ramaze/template/ezamar/sum.zmr +1 -0
  534. data/spec/ramaze/template/ezamar.rb +63 -0
  535. data/spec/ramaze/template/haml/index.haml +5 -0
  536. data/spec/ramaze/template/haml/locals.haml +2 -0
  537. data/spec/ramaze/template/haml/with_vars.haml +4 -0
  538. data/spec/ramaze/template/haml.rb +66 -0
  539. data/spec/ramaze/template/liquid/index.liquid +1 -0
  540. data/spec/ramaze/template/liquid/products.liquid +45 -0
  541. data/spec/ramaze/template/liquid.rb +99 -0
  542. data/spec/ramaze/template/markaby/external.mab +8 -0
  543. data/spec/ramaze/template/markaby/sum.mab +1 -0
  544. data/spec/ramaze/template/markaby.rb +61 -0
  545. data/spec/ramaze/template/nagoro/another/long/action.nag +1 -0
  546. data/spec/ramaze/template/nagoro/combined.nag +1 -0
  547. data/spec/ramaze/template/nagoro/file_only.nag +1 -0
  548. data/spec/ramaze/template/nagoro/index.nag +1 -0
  549. data/spec/ramaze/template/nagoro/nested.nag +1 -0
  550. data/spec/ramaze/template/nagoro/some__long__action.nag +1 -0
  551. data/spec/ramaze/template/nagoro/sum.nag +1 -0
  552. data/spec/ramaze/template/nagoro.rb +64 -0
  553. data/spec/ramaze/template/ramaze/external.test +1 -0
  554. data/spec/ramaze/template/redcloth/external.redcloth +1 -0
  555. data/spec/ramaze/template/redcloth.rb +38 -0
  556. data/spec/ramaze/template/remarkably/external.rem +8 -0
  557. data/spec/ramaze/template/remarkably/sum.rem +1 -0
  558. data/spec/ramaze/template/remarkably.rb +58 -0
  559. data/spec/ramaze/template/sass/file.css.sass +5 -0
  560. data/spec/ramaze/template/sass.rb +69 -0
  561. data/spec/ramaze/template/tagz/external.tagz +8 -0
  562. data/spec/ramaze/template/tagz/sum.tagz +1 -0
  563. data/spec/ramaze/template/tagz.rb +62 -0
  564. data/spec/ramaze/template/tenjin/external.tenjin +1 -0
  565. data/spec/ramaze/template/tenjin.rb +47 -0
  566. data/spec/ramaze/template/xslt/concat_words.xsl +16 -0
  567. data/spec/ramaze/template/xslt/index.xsl +14 -0
  568. data/spec/ramaze/template/xslt/products.xsl +32 -0
  569. data/spec/ramaze/template/xslt/ruby_version.xsl +14 -0
  570. data/spec/ramaze/template/xslt.rb +90 -0
  571. data/spec/ramaze/template.rb +128 -0
  572. data/spec/snippets/array/put_within.rb +33 -0
  573. data/spec/snippets/binding/locals.rb +9 -0
  574. data/spec/snippets/divide.rb +19 -0
  575. data/spec/snippets/kernel/constant.rb +23 -0
  576. data/spec/snippets/numeric/filesize_format.rb +12 -0
  577. data/spec/snippets/numeric/time.rb +12 -0
  578. data/spec/snippets/object/__dir__.rb +8 -0
  579. data/spec/snippets/object/acquire.rb +71 -0
  580. data/spec/snippets/ordered_set.rb +63 -0
  581. data/spec/snippets/ramaze/caller_info.rb +39 -0
  582. data/spec/snippets/ramaze/caller_lines.rb +30 -0
  583. data/spec/snippets/string/camel_case.rb +25 -0
  584. data/spec/snippets/string/color.rb +11 -0
  585. data/spec/snippets/string/snake_case.rb +24 -0
  586. data/spec/snippets/string/unindent.rb +43 -0
  587. data/spec/snippets/thread/into.rb +20 -0
  588. metadata +823 -0
@@ -0,0 +1,205 @@
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
+ require 'rack/request'
5
+
6
+ module Ramaze
7
+
8
+ # The purpose of this class is to act as a simple wrapper for Rack::Request
9
+ # and provide some convinient methods for our own use.
10
+
11
+ class Request < ::Rack::Request
12
+ class << self
13
+
14
+ # get the current request out of STATE[:request]
15
+ #
16
+ # You can call this from everywhere with Ramaze::Request.current
17
+
18
+ def current() Current.request end
19
+ end
20
+
21
+ # you can access the original @request via this method_missing,
22
+ # first it tries to match your method with any of the HTTP parameters
23
+ # then, in case that fails, it will relay to @request
24
+
25
+ def method_missing meth, *args
26
+ key = meth.to_s.upcase
27
+ return env[key] if env.has_key?(key)
28
+ super
29
+ end
30
+
31
+ def request_uri
32
+ env['REQUEST_URI'] || path_info
33
+ end
34
+
35
+ def ip
36
+ if addr = env['HTTP_X_FORWARDED_FOR']
37
+ addr.split(',').last.strip
38
+ else
39
+ env['REMOTE_ADDR']
40
+ end
41
+ end
42
+
43
+ # Request is from a local network?
44
+ # Checks both IPv4 and IPv6
45
+
46
+ 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 ]
47
+ ipv6 = %w[ fc00::/7 fe80::/10 fec0::/10 ::1 ]
48
+ LOCAL = (ipv4 + ipv6).map{|a| IPAddr.new(a)} unless defined?(LOCAL)
49
+
50
+ # --
51
+ # Mongrel somehow puts together multiple IPs when proxy is involved.
52
+ # ++
53
+
54
+ def local_net?(address = ip)
55
+ addr = IPAddr.new(address)
56
+ LOCAL.find{|range| range.include?(addr) }
57
+ rescue ArgumentError => ex
58
+ raise ArgumentError, ex unless ex.message == 'invalid address'
59
+ end
60
+
61
+ def [](key, *rest)
62
+ return params[key.to_s] if rest.empty?
63
+ [key, *rest].map{|k| params[k.to_s] }
64
+ end
65
+
66
+ def to_ivs(*args)
67
+ instance = Action.current.instance
68
+ args.each do |arg|
69
+ next unless value = self[arg]
70
+ instance.instance_variable_set("@#{arg}", value)
71
+ end
72
+ end
73
+
74
+ unless method_defined?(:rack_params)
75
+ alias rack_params params
76
+
77
+ # Wrapping Request#params to support a one-level hash notation.
78
+ # It doesn't support anything really fancy, so be conservative in its use.
79
+ #
80
+ # See if following provides something useful for us:
81
+ # http://redhanded.hobix.com/2006/01/25.html
82
+ #
83
+ # Example Usage:
84
+ #
85
+ # # Template:
86
+ #
87
+ # <form action="/paste">
88
+ # <input type="text" name="paste[name]" />
89
+ # <input type="text" name="paste[syntax]" />
90
+ # <input type="submit" />
91
+ # </form>
92
+ #
93
+ # # In your Controller:
94
+ #
95
+ # def paste
96
+ # name, syntax = request['paste'].values_at('name', 'syntax')
97
+ # paste = Paste.create_with(:name => name, :syntax => syntax)
98
+ # redirect '/'
99
+ # end
100
+ #
101
+ # # Or, easier:
102
+ #
103
+ # def paste
104
+ # paste = Paste.create_with(request['paste'])
105
+ # redirect '/'
106
+ # end
107
+
108
+ def params
109
+ return {} if put?
110
+ return @ramaze_params if @ramaze_params
111
+
112
+ begin
113
+ @rack_params ||= rack_params
114
+ rescue EOFError => ex
115
+ @rack_params = {}
116
+ Log.error(ex)
117
+ end
118
+
119
+ @ramaze_params = {}
120
+
121
+ @rack_params.each do |key, value|
122
+ if key =~ /^(.*?)(\[.*\])/
123
+ prim, nested = $~.captures
124
+ ref = @ramaze_params
125
+
126
+ keys = nested.scan(/\[([^\]]+)\]/).flatten
127
+ keys.unshift prim
128
+
129
+ keys.each_with_index do |k, i|
130
+ if i + 1 >= keys.size
131
+ ref[k] = value
132
+ else
133
+ # in case the value is a string we cannot let it be ref next
134
+ # time, so throw it away
135
+ if ref[k].is_a?(String)
136
+ ref = ref[k] = {}
137
+ else
138
+ ref = ref[k] ||= {}
139
+ end
140
+ end
141
+ end
142
+ else
143
+ @ramaze_params[key] = value
144
+ end
145
+ end
146
+
147
+ @ramaze_params
148
+ end
149
+ end
150
+
151
+ # Interesting HTTP variables from env
152
+
153
+ def http_vars
154
+ env.reject{ |k,v|
155
+ k.to_s !~ /USER|HOST|REQUEST|REMOTE|FORWARD|REFER|PATH|QUERY|VERSION|KEEP|CACHE/
156
+ }
157
+ end
158
+
159
+ def to_s
160
+ p, c, e = params.inspect, cookies.inspect, http_vars.inspect
161
+ %{#<Ramaze::Request params=#{p} cookies=#{c} env=#{e}>}
162
+ end
163
+ alias inspect to_s
164
+
165
+ def pretty_print pp
166
+ p, c, e = params, cookies, http_vars
167
+ pp.object_group(self){
168
+ { 'params' => params,
169
+ 'cookies' => cookies,
170
+ 'env' => http_vars }.each do |name, hash|
171
+ pp.breakable
172
+ pp.text " @#{name}="
173
+ pp.nest(name.length+3){ pp.pp_hash hash }
174
+ end
175
+ }
176
+ end
177
+
178
+ # Answers with a subset of request.params with only the key/value pairs for
179
+ # which you pass the keys.
180
+ # Valid keys are objects that respond to :to_s
181
+ #
182
+ # Example:
183
+ # request.params
184
+ # # => {'name' => 'jason', 'age' => '45', 'job' => 'lumberjack'}
185
+ # request.sub('name')
186
+ # # => {'name' => 'jason'}
187
+ # request.sub(:name, :job)
188
+ # # => {'name' => 'jason', 'job' => 'lumberjack'}
189
+
190
+ def subset(*keys)
191
+ keys = keys.map{|k| k.to_s }
192
+ params.reject{|k,v| not keys.include?(k) }
193
+ end
194
+
195
+ def domain(path = '/')
196
+ scheme = env['rack.url_scheme'] || 'http'
197
+ host = env['HTTP_HOST']
198
+ URI("#{scheme}://#{host}#{path}")
199
+ end
200
+
201
+ def locales
202
+ env['HTTP_ACCEPT_LANGUAGE'].to_s.split(/(?:,|;q=[\d.,]+)/)
203
+ end
204
+ end
205
+ end
@@ -0,0 +1,39 @@
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
+ # Alias for Current::response
8
+ def current() Current.response end
9
+ end
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
18
+ def build(new_body = body, status = status, header = header)
19
+ header.each do |key, value|
20
+ self[key] = value
21
+ end
22
+
23
+ self.body, self.status = new_body, status
24
+ end
25
+
26
+ def body=(obj)
27
+ if obj.respond_to?(:stat)
28
+ @length = obj.stat.size
29
+ @body = obj
30
+ elsif obj.respond_to?(:size)
31
+ @body = []
32
+ @length = 0
33
+ write(obj)
34
+ else
35
+ raise(ArgumentError, "Invalid body: %p" % obj)
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,87 @@
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
+
15
+ def initialize sess
16
+ @session = sess
17
+ end
18
+
19
+ # iterate over the combined session
20
+ def each(&block)
21
+ combined.each(&block)
22
+ end
23
+
24
+ # the current session[:FLASH_PREVIOUS]
25
+ def previous
26
+ session[:FLASH_PREVIOUS] || {}
27
+ end
28
+
29
+ # the current session[:FLASH]
30
+ def current
31
+ session[:FLASH] ||= {}
32
+ end
33
+
34
+ # combined key/value pairs of previous and current
35
+ # current keys overshadow the old ones.
36
+ def combined
37
+ previous.merge(current)
38
+ end
39
+
40
+ # flash[key] in your Controller
41
+ def [](key)
42
+ combined[key]
43
+ end
44
+
45
+ # flash[key] = value in your Controller
46
+ def []=(key, value)
47
+ prev = session[:FLASH] || {}
48
+ prev[key] = value
49
+ session[:FLASH] = prev
50
+ end
51
+
52
+ # Inspects the combined SessionFlash
53
+
54
+ def inspect
55
+ combined.inspect
56
+ end
57
+
58
+ # Delete a key
59
+
60
+ def delete(key)
61
+ current.delete(key)
62
+ end
63
+
64
+ # check if combined is empty
65
+
66
+ def empty?
67
+ combined.empty?
68
+ end
69
+
70
+ def merge!(hash)
71
+ current.merge!(hash)
72
+ end
73
+
74
+ def merge(hash)
75
+ current.merge(hash)
76
+ end
77
+
78
+ private
79
+
80
+ # Associated session object
81
+
82
+ def session
83
+ @session
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,66 @@
1
+ module Ramaze
2
+ class Session
3
+
4
+ # The Session::Hash acts as the wrapper for a simple Hash
5
+ #
6
+ # Its purpose is to notify the underlying cache, in which the sessions
7
+ # are stored, about updates.
8
+ class Hash
9
+
10
+ # Sets @hash to an empty Hash
11
+
12
+ def initialize sess
13
+ @session = sess
14
+ @hash = {}
15
+ end
16
+
17
+ # relays all the methods to the @hash and updates the session_cache in
18
+ # Session.current.sessions if anything changes.
19
+
20
+ def method_missing(*args, &block)
21
+ old = @hash.dup
22
+ result = @hash.send(*args, &block)
23
+ unless old == @hash
24
+ Cache.sessions[@session.session_id] = self
25
+ end
26
+ result
27
+ end
28
+
29
+ # Calls #inspect on the wrapped @hash
30
+
31
+ def inspect
32
+ @hash.inspect
33
+ end
34
+
35
+ # Use client side session variables
36
+
37
+ def client
38
+ Request.current['session.client'] ||= unmarshal(Request.current.cookies["#{Session::SESSION_KEY}-client"]) || {}
39
+ end
40
+
41
+ private
42
+
43
+ # Marshal a session hash into safe cookie data. Include an integrity hash.
44
+ def marshal(session)
45
+ data = [ Marshal.dump(session) ].pack('m').chop
46
+ "#{data}--#{generate_digest(data)}"
47
+ end
48
+
49
+ # Unmarshal cookie data to a hash and verify its integrity.
50
+ def unmarshal(cookie)
51
+ if cookie
52
+ data, digest = cookie.split('--')
53
+ return nil unless digest == generate_digest(data)
54
+ Marshal.load(data.unpack('m').first)
55
+ end
56
+ end
57
+
58
+ # Generate the inline SHA512 message digest. Larger (128 bytes) than SHA256
59
+ # (64 bytes) or RMD160 (40 bytes), but small relative to the 4096 byte
60
+ # max cookie size.
61
+ def generate_digest(data)
62
+ Digest::SHA512.hexdigest "#{data}#{Session.trait[:secret]}"
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,181 @@
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
+ begin
5
+ require 'digest/sha2'
6
+ rescue LoadError
7
+ require 'digest/sha1'
8
+ end
9
+
10
+ require 'ramaze/current/session/flash'
11
+ require 'ramaze/current/session/hash'
12
+
13
+ module Ramaze
14
+
15
+ # The purpose of Session is to hold key/value pairs like a Hash for a series
16
+ # of # request/response cycles from the same client.
17
+ #
18
+ # The persistence is achieved by setting a cookie with the session_id to
19
+ # the client, which is then passed back and forth until the cookie is either
20
+ # deleted or expires.
21
+
22
+ class Session
23
+ # The unique id for the current session which is also passed on to the cookie.
24
+
25
+ attr_accessor :session_id
26
+
27
+ # This variable holds the current SessionFlash
28
+
29
+ attr_accessor :flash
30
+
31
+ # Flag whether or not to drop this session on the floor
32
+
33
+ attr_accessor :dropped
34
+
35
+ # secret salt for client-side session data
36
+
37
+ trait :secret => 'change_me_please_123'
38
+
39
+ # the key used for the cookie
40
+
41
+ SESSION_KEY = '_ramaze_session_id' unless defined?(SESSION_KEY)
42
+
43
+ # Holds counter for IPs
44
+
45
+ IP_COUNT = ::Hash.new{|h,k| h[k] = OrderedSet.new} unless defined?(IP_COUNT)
46
+
47
+ # Limit the number of sessions one IP is allowed to hold.
48
+
49
+ IP_COUNT_LIMIT = 1000 unless defined?(IP_COUNT_LIMIT)
50
+
51
+ # Holds the default cookie used for sessions
52
+
53
+ COOKIE = { :path => '/' } unless defined?(COOKIE)
54
+
55
+ # Shortcut for Current.session
56
+ def self.current
57
+ Current.session
58
+ end
59
+
60
+ # called from Ramaze::startup and adds Cache.sessions if cookies are
61
+ # enabled
62
+
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)
89
+ end
90
+
91
+ # Initialize a new Session, requires the original Rack::Request instance
92
+ # given to us from Dispatcher#setup_environment.
93
+ #
94
+ # sets @session_id and @session_flash
95
+
96
+ def initialize(sess_or_request = Current.request)
97
+ return unless Global.sessions
98
+
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?
108
+ ip = request.ip
109
+ IP_COUNT[ip] << @session_id
110
+ sessions.delete(IP_COUNT[ip].shift) if IP_COUNT[ip].size > IP_COUNT_LIMIT
111
+ end
112
+
113
+ @flash = Session::Flash.new(self)
114
+ @current = nil
115
+ @dropped = false
116
+ end
117
+
118
+ # relay all messages we don't understand to the currently active session
119
+
120
+ def method_missing(*args, &block)
121
+ current.send(*args, &block)
122
+ end
123
+
124
+ # answers with the currently active session, which is set unless it is
125
+ # existing already, the session itself is an instance of SessionHash
126
+
127
+ def current
128
+ unless @current
129
+ @current = ( sessions[session_id] ||= Session::Hash.new(self) )
130
+ end
131
+ @current
132
+ end
133
+
134
+ # shortcut to Cache.sessions
135
+
136
+ def sessions
137
+ Cache.sessions
138
+ end
139
+
140
+ # Inspect on Session.current
141
+
142
+ def inspect
143
+ current.inspect
144
+ end
145
+
146
+ # don't finish this session
147
+
148
+ def drop!
149
+ self.dropped = true
150
+ end
151
+
152
+ # at the end of a request delete the current[:FLASH] and assign it to
153
+ # current[:FLASH_PREVIOUS]
154
+ #
155
+ # this is needed so flash can iterate over requests
156
+ # and always just keep the current and previous key/value pairs.
157
+ #
158
+ # finalizes the session and assigns the key to the response via
159
+ # set_cookie.
160
+
161
+ def finish
162
+ return unless Global.sessions
163
+ return if dropped
164
+
165
+ old = current.delete(:FLASH)
166
+ current[:FLASH_PREVIOUS] = old if old
167
+
168
+ request, response = Current.request, Current.response
169
+
170
+ hash = {:value => session_id}.merge(COOKIE)
171
+ response.set_cookie(SESSION_KEY, hash)
172
+
173
+ # set client side session cookie
174
+ if val = request['session.client'] and
175
+ (!val.empty? or request.cookies["#{SESSION_KEY}-client"])
176
+ cookie = hash.merge(:value => marshal(val))
177
+ response.set_cookie("#{SESSION_KEY}-client", cookie)
178
+ end
179
+ end
180
+ end
181
+ end
@@ -0,0 +1,110 @@
1
+ require 'ramaze/current/request'
2
+ require 'ramaze/current/response'
3
+ require 'ramaze/current/session'
4
+
5
+ module Ramaze
6
+ class Current
7
+ include Trinity
8
+ extend Trinity
9
+
10
+ def initialize(app)
11
+ @app = app
12
+ end
13
+
14
+ def call(env)
15
+ setup(env)
16
+ before_call
17
+ record
18
+
19
+ @app.call(env)
20
+ finish
21
+ ensure
22
+ after_call
23
+ end
24
+
25
+ def record
26
+ return unless filter = Global.record
27
+ request = Current.request
28
+ Record << request if filter.call(request)
29
+ end
30
+
31
+ def setup(env)
32
+ self.request = Request.new(env)
33
+ self.response = Response.new
34
+ self.session = Session.new
35
+ end
36
+
37
+ def finish
38
+ session.finish if session
39
+ response.finish
40
+ end
41
+
42
+ def self.call(env)
43
+ end
44
+
45
+ def before_call
46
+ end
47
+
48
+ def after_call
49
+ end
50
+ end
51
+ end
52
+ __END__
53
+
54
+ module Current
55
+ class << self
56
+ include Trinity
57
+
58
+ def call(env)
59
+ setup(env)
60
+ before_call
61
+
62
+ if filter = Global.record
63
+ request = Current.request
64
+ Record << request if filter[request]
65
+ end
66
+
67
+ Dispatcher.handle
68
+
69
+ finish
70
+ ensure
71
+ after_call
72
+ end
73
+
74
+ def setup(env)
75
+ self.request = Request.new(env)
76
+ self.response = Response.new
77
+ self.session = Session.new
78
+ end
79
+
80
+ def finish
81
+ session.finish if session
82
+ response.finish
83
+ end
84
+
85
+ def before(&block)
86
+ @before = block_given? ? block : @before
87
+ end
88
+
89
+ def before_call
90
+ return unless before
91
+ before.call
92
+ rescue Object => e
93
+ Ramaze::Log.error e
94
+ raise e
95
+ end
96
+
97
+ def after(&block)
98
+ @after = block_given? ? block : @after
99
+ end
100
+
101
+ def after_call
102
+ return unless after
103
+ after.call
104
+ rescue Object => e
105
+ Ramaze::Log.error e
106
+ raise e
107
+ end
108
+ end
109
+ end
110
+ end